converters.js 5.4 KB

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