converters.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import * as asn1js from "asn1js";
  2. import { toArrayBuffer } from "@peculiar/utils";
  3. import { AsnPropTypes } from "./enums.js";
  4. import { OctetString } from "./types/index.js";
  5. export const AsnAnyConverter = {
  6. fromASN: (value) => (value instanceof asn1js.Null ? null : toArrayBuffer(value.valueBeforeDecodeView)),
  7. toASN: (value) => {
  8. if (value === null) {
  9. return new asn1js.Null();
  10. }
  11. const schema = asn1js.fromBER(value);
  12. if (schema.result.error) {
  13. throw new Error(schema.result.error);
  14. }
  15. return schema.result;
  16. },
  17. };
  18. export const AsnIntegerConverter = {
  19. fromASN: (value) => value.valueBlock.valueHexView.byteLength >= 4
  20. ? value.valueBlock.toString()
  21. : value.valueBlock.valueDec,
  22. toASN: (value) => new asn1js.Integer({ value: +value }),
  23. };
  24. export const AsnEnumeratedConverter = {
  25. fromASN: (value) => value.valueBlock.valueDec,
  26. toASN: (value) => new asn1js.Enumerated({ value }),
  27. };
  28. export const AsnIntegerArrayBufferConverter = {
  29. fromASN: (value) => toArrayBuffer(value.valueBlock.valueHexView),
  30. toASN: (value) => new asn1js.Integer({ valueHex: value }),
  31. };
  32. export const AsnIntegerBigIntConverter = {
  33. fromASN: (value) => value.toBigInt(),
  34. toASN: (value) => asn1js.Integer.fromBigInt(value),
  35. };
  36. export const AsnBitStringConverter = {
  37. fromASN: (value) => toArrayBuffer(value.valueBlock.valueHexView),
  38. toASN: (value) => new asn1js.BitString({ valueHex: value }),
  39. };
  40. export const AsnObjectIdentifierConverter = {
  41. fromASN: (value) => value.valueBlock.toString(),
  42. toASN: (value) => new asn1js.ObjectIdentifier({ value }),
  43. };
  44. export const AsnRelativeObjectIdentifierConverter = {
  45. fromASN: (value) => value.valueBlock.toString(),
  46. toASN: (value) => new asn1js.RelativeObjectIdentifier({ value }),
  47. };
  48. export const AsnBooleanConverter = {
  49. fromASN: (value) => value.valueBlock.value,
  50. toASN: (value) => new asn1js.Boolean({ value }),
  51. };
  52. export const AsnOctetStringConverter = {
  53. fromASN: (value) => toArrayBuffer(value.valueBlock.valueHexView),
  54. toASN: (value) => new asn1js.OctetString({ valueHex: value }),
  55. };
  56. export const AsnConstructedOctetStringConverter = {
  57. fromASN: (value) => new OctetString(value.getValue()),
  58. toASN: (value) => value.toASN(),
  59. };
  60. function createStringConverter(Asn1Type) {
  61. return {
  62. fromASN: (value) => value.valueBlock.value,
  63. toASN: (value) => new Asn1Type({ value }),
  64. };
  65. }
  66. export const AsnUtf8StringConverter = createStringConverter(asn1js.Utf8String);
  67. export const AsnBmpStringConverter = createStringConverter(asn1js.BmpString);
  68. export const AsnUniversalStringConverter = createStringConverter(asn1js.UniversalString);
  69. export const AsnNumericStringConverter = createStringConverter(asn1js.NumericString);
  70. export const AsnPrintableStringConverter = createStringConverter(asn1js.PrintableString);
  71. export const AsnTeletexStringConverter = createStringConverter(asn1js.TeletexString);
  72. export const AsnVideotexStringConverter = createStringConverter(asn1js.VideotexString);
  73. export const AsnIA5StringConverter = createStringConverter(asn1js.IA5String);
  74. export const AsnGraphicStringConverter = createStringConverter(asn1js.GraphicString);
  75. export const AsnVisibleStringConverter = createStringConverter(asn1js.VisibleString);
  76. export const AsnGeneralStringConverter = createStringConverter(asn1js.GeneralString);
  77. export const AsnCharacterStringConverter = createStringConverter(asn1js.CharacterString);
  78. export const AsnUTCTimeConverter = {
  79. fromASN: (value) => value.toDate(),
  80. toASN: (value) => new asn1js.UTCTime({ valueDate: value }),
  81. };
  82. export const AsnGeneralizedTimeConverter = {
  83. fromASN: (value) => value.toDate(),
  84. toASN: (value) => new asn1js.GeneralizedTime({ valueDate: value }),
  85. };
  86. export const AsnNullConverter = {
  87. fromASN: () => null,
  88. toASN: () => {
  89. return new asn1js.Null();
  90. },
  91. };
  92. export function defaultConverter(type) {
  93. switch (type) {
  94. case AsnPropTypes.Any:
  95. return AsnAnyConverter;
  96. case AsnPropTypes.BitString:
  97. return AsnBitStringConverter;
  98. case AsnPropTypes.BmpString:
  99. return AsnBmpStringConverter;
  100. case AsnPropTypes.Boolean:
  101. return AsnBooleanConverter;
  102. case AsnPropTypes.CharacterString:
  103. return AsnCharacterStringConverter;
  104. case AsnPropTypes.Enumerated:
  105. return AsnEnumeratedConverter;
  106. case AsnPropTypes.GeneralString:
  107. return AsnGeneralStringConverter;
  108. case AsnPropTypes.GeneralizedTime:
  109. return AsnGeneralizedTimeConverter;
  110. case AsnPropTypes.GraphicString:
  111. return AsnGraphicStringConverter;
  112. case AsnPropTypes.IA5String:
  113. return AsnIA5StringConverter;
  114. case AsnPropTypes.Integer:
  115. return AsnIntegerConverter;
  116. case AsnPropTypes.Null:
  117. return AsnNullConverter;
  118. case AsnPropTypes.NumericString:
  119. return AsnNumericStringConverter;
  120. case AsnPropTypes.ObjectIdentifier:
  121. return AsnObjectIdentifierConverter;
  122. case AsnPropTypes.RelativeObjectIdentifier:
  123. return AsnRelativeObjectIdentifierConverter;
  124. case AsnPropTypes.OctetString:
  125. return AsnOctetStringConverter;
  126. case AsnPropTypes.PrintableString:
  127. return AsnPrintableStringConverter;
  128. case AsnPropTypes.TeletexString:
  129. return AsnTeletexStringConverter;
  130. case AsnPropTypes.UTCTime:
  131. return AsnUTCTimeConverter;
  132. case AsnPropTypes.UniversalString:
  133. return AsnUniversalStringConverter;
  134. case AsnPropTypes.Utf8String:
  135. return AsnUtf8StringConverter;
  136. case AsnPropTypes.VideotexString:
  137. return AsnVideotexStringConverter;
  138. case AsnPropTypes.VisibleString:
  139. return AsnVisibleStringConverter;
  140. default:
  141. return null;
  142. }
  143. }