legacy-adapter.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { AsnSerializer, AsnParser } from "@peculiar/asn1-codec";
  2. import * as asn1js from "asn1js";
  3. export function asnNodeToLegacyType(node) {
  4. if (node.ctx && node.start !== undefined && node.end !== undefined) {
  5. const contextData = node.ctx.data.slice(node.start, node.end);
  6. const parsed = asn1js.fromBER(contextData.buffer);
  7. if (parsed.offset === -1) {
  8. throw new Error("Error parsing ASN.1 with asn1js: " + parsed.result.error);
  9. }
  10. return parsed.result;
  11. }
  12. const derBytes = AsnSerializer.nodeToBytes(node);
  13. const parsed = asn1js.fromBER(derBytes.buffer);
  14. if (parsed.offset === -1) {
  15. throw new Error("Error parsing ASN.1 with asn1js: " + parsed.result.error);
  16. }
  17. return parsed.result;
  18. }
  19. function legacyTypeToAsnNode(value) {
  20. const derBytes = value.toBER();
  21. const parseResult = AsnParser.parse(new Uint8Array(derBytes), { captureRaw: true });
  22. if (parseResult.errors?.length) {
  23. throw new Error(`Failed to parse serialized ASN.1: ${parseResult.errors[0].message}`);
  24. }
  25. return parseResult.root;
  26. }
  27. export function createLegacyConverterAdapter(legacyConverter) {
  28. return {
  29. fromASN: (value) => {
  30. const legacyValue = asnNodeToLegacyType(value);
  31. return legacyConverter.fromASN(legacyValue);
  32. },
  33. toASN: (value) => {
  34. const legacyResult = legacyConverter.toASN(value);
  35. return legacyTypeToAsnNode(legacyResult);
  36. },
  37. };
  38. }