converters.js 5.6 KB

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