asn1-ts 8.0.3 → 8.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,7 @@ import type Long from "./interfaces/Long";
5
5
  import type CharacterString from "./types/CharacterString";
6
6
  import type Elementable from "./interfaces/Elementable";
7
7
  import type { BOOLEAN, INTEGER, BIT_STRING, OCTET_STRING, OBJECT_IDENTIFIER, ObjectDescriptor, EXTERNAL, REAL, ENUMERATED, EMBEDDED_PDV, UTF8String, RELATIVE_OID, SEQUENCE, SET, GraphicString, NumericString, VisibleString, PrintableString, TeletexString, GeneralString, UniversalString, VideotexString, BMPString, IA5String, UTCTime, GeneralizedTime, TIME, DATE, TIME_OF_DAY, DATE_TIME, DURATION, OID_IRI, RELATIVE_OID_IRI } from "./macros";
8
+ import { Buffer } from "node:buffer";
8
9
  export default abstract class ASN1Element implements Byteable, Elementable, Named, Long {
9
10
  recursionCount: number;
10
11
  protected static readonly nestingRecursionLimit: number;
package/dist/node/asn1.js CHANGED
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const errors = __importStar(require("./errors"));
40
40
  const values_1 = require("./values");
41
41
  const packBits_1 = __importDefault(require("./utils/packBits"));
42
+ const node_buffer_1 = require("node:buffer");
42
43
  class ASN1Element {
43
44
  constructor() {
44
45
  this.recursionCount = 0;
@@ -69,7 +70,7 @@ class ASN1Element {
69
70
  return i;
70
71
  }
71
72
  toBytes() {
72
- return Buffer.concat(this.toBuffers());
73
+ return node_buffer_1.Buffer.concat(this.toBuffers());
73
74
  }
74
75
  get length() {
75
76
  return this.value.length;
@@ -39,20 +39,117 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.default = decodeGeneralizedTime;
40
40
  const errors = __importStar(require("../../../errors"));
41
41
  const convertBytesToText_1 = __importDefault(require("../../../utils/convertBytesToText"));
42
- const values_1 = require("../../../values");
43
42
  const validateDateTime_1 = __importDefault(require("../../../validators/validateDateTime"));
43
+ const SMALLEST_CORRECT_GENERALIZED_TIME = "2000120123".length;
44
+ const PERIOD = ".".charCodeAt(0);
45
+ const COMMA = ",".charCodeAt(0);
46
+ const Z = "Z".charCodeAt(0);
47
+ const PLUS = "+".charCodeAt(0);
48
+ const MINUS = "-".charCodeAt(0);
49
+ ;
50
+ function isStop(s, i) {
51
+ const char = s.charCodeAt(i);
52
+ return (char === PERIOD) || (char === COMMA);
53
+ }
44
54
  function decodeGeneralizedTime(value) {
55
+ if (value.length < SMALLEST_CORRECT_GENERALIZED_TIME) {
56
+ throw new errors.ASN1Error("Malformed GeneralizedTime string.");
57
+ }
58
+ if (value.length > 32) {
59
+ throw new errors.ASN1Error("Outrageously large GeneralizedTime string.");
60
+ }
45
61
  const dateString = (0, convertBytesToText_1.default)(value);
46
- const match = values_1.generalizedTimeRegex.exec(dateString);
47
- if (match === null) {
62
+ const year = Number(dateString.slice(0, 4));
63
+ const month = (Number(dateString.slice(4, 6)) - 1);
64
+ const date = Number(dateString.slice(6, 8));
65
+ const hours = Number(dateString.slice(8, 10));
66
+ if (value.length === 10) {
67
+ (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, 0, 0);
68
+ return new Date(year, month, date, hours, 0, 0);
69
+ }
70
+ let i = 10;
71
+ while (value[i] && value[i] >= 0x30 && value[i] <= 0x39)
72
+ i++;
73
+ let minutes = 0;
74
+ let seconds = 0;
75
+ let milliseconds = 0;
76
+ let fractionUnits = 0;
77
+ if (i == 14) {
78
+ minutes = Number.parseInt(dateString.slice(10, 12), 10);
79
+ seconds = Number.parseInt(dateString.slice(12, 14), 10);
80
+ fractionUnits = 2;
81
+ }
82
+ else if (i == 12) {
83
+ minutes = Number.parseInt(dateString.slice(10, 12), 10);
84
+ fractionUnits = 1;
85
+ }
86
+ else if (i != 10) {
87
+ throw new errors.ASN1Error("Malformed GeneralizedTime string.");
88
+ }
89
+ if (value[i] === undefined) {
90
+ (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, minutes, seconds);
91
+ return new Date(year, month, date, hours, minutes, seconds);
92
+ }
93
+ if (isStop(dateString, i)) {
94
+ i++;
95
+ let j = i;
96
+ while (value[j] && value[j] >= 0x30 && value[j] <= 0x39)
97
+ j++;
98
+ const fractionString = `0.${dateString.slice(i, j)}`;
99
+ i = j;
100
+ const fraction = Number.parseFloat(fractionString);
101
+ if (fractionUnits === 0) {
102
+ minutes = Math.floor(60 * fraction);
103
+ seconds = Math.floor((60 * 60 * fraction) % 60);
104
+ }
105
+ else if (fractionUnits === 1) {
106
+ seconds = Math.floor(60 * fraction);
107
+ }
108
+ else if (fractionUnits === 2) {
109
+ milliseconds = Math.floor(1000 * fraction);
110
+ }
111
+ else {
112
+ throw new Error("internal asn1-ts error: invalid FractionalUnits");
113
+ }
114
+ }
115
+ if (value[i] === undefined) {
116
+ (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, minutes, seconds);
117
+ return new Date(year, month, date, hours, minutes, seconds, milliseconds);
118
+ }
119
+ if (value[i] === Z) {
120
+ (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, minutes, seconds);
121
+ return new Date(Date.UTC(year, month, date, hours, minutes, seconds, milliseconds));
122
+ }
123
+ if (value[i] === PLUS || value[i] === MINUS) {
124
+ const isPositive = value[i] === PLUS;
125
+ i++;
126
+ let j = i;
127
+ while (value[j] && value[j] >= 0x30 && value[j] <= 0x39)
128
+ j++;
129
+ const offsetSize = j - i;
130
+ if (value[j] !== undefined) {
131
+ throw new errors.ASN1Error("Malformed GeneralizedTime string.");
132
+ }
133
+ let offsetHour = 0;
134
+ let offsetMinute = 0;
135
+ if (offsetSize === 4) {
136
+ offsetHour = Number.parseInt(dateString.slice(j - 4, j - 2), 10);
137
+ offsetMinute = Number.parseInt(dateString.slice(j - 2, j), 10);
138
+ }
139
+ else if (offsetSize === 2) {
140
+ offsetHour = Number.parseInt(dateString.slice(j - 2, j));
141
+ }
142
+ else {
143
+ throw new errors.ASN1Error("Malformed GeneralizedTime string.");
144
+ }
145
+ let epochTimeInMS = Date.UTC(year, month, date, hours, minutes, seconds, milliseconds);
146
+ const sign = isPositive ? -1 : 1;
147
+ epochTimeInMS += sign * ((offsetHour * 60 * 60 * 1000) + (offsetMinute * 60 * 1000));
148
+ return new Date(epochTimeInMS);
149
+ }
150
+ if (value[i] !== undefined) {
48
151
  throw new errors.ASN1Error("Malformed GeneralizedTime string.");
49
152
  }
50
- const year = Number(match[1]);
51
- const month = (Number(match[2]) - 1);
52
- const date = Number(match[3]);
53
- const hours = Number(match[4]);
54
- const minutes = Number(match[5]);
55
- const seconds = Number(match[6]);
56
153
  (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, minutes, seconds);
57
- return new Date(Date.UTC(year, month, date, hours, minutes, seconds));
154
+ return new Date(Date.UTC(year, month, date, hours, minutes, seconds, milliseconds));
58
155
  }
@@ -39,23 +39,46 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.default = decodeUTCTime;
40
40
  const convertBytesToText_1 = __importDefault(require("../../../utils/convertBytesToText"));
41
41
  const errors = __importStar(require("../../../errors"));
42
- const values_1 = require("../../../values");
43
42
  const validateDateTime_1 = __importDefault(require("../../../validators/validateDateTime"));
44
43
  function decodeUTCTime(value) {
45
44
  const dateString = (0, convertBytesToText_1.default)(value);
46
- const match = values_1.utcTimeRegex.exec(dateString);
47
- if (match === null) {
48
- throw new errors.ASN1Error("Malformed UTCTime string.");
49
- }
50
- let year = Number(match[1]);
45
+ let year = Number(dateString.slice(0, 2));
51
46
  year = (year <= 49)
52
47
  ? (2000 + year)
53
48
  : (1900 + year);
54
- const month = (Number(match[2]) - 1);
55
- const date = Number(match[3]);
56
- const hours = Number(match[4]);
57
- const minutes = Number(match[5]);
58
- const seconds = Number(match[6]);
59
- (0, validateDateTime_1.default)("UTCTime", year, month, date, hours, minutes, seconds);
60
- return new Date(Date.UTC(year, month, date, hours, minutes, seconds));
49
+ const month = (Number(dateString.slice(2, 4)) - 1);
50
+ const date = Number(dateString.slice(4, 6));
51
+ const hours = Number(dateString.slice(6, 8));
52
+ const minutes = Number(dateString.slice(8, 10));
53
+ const char10 = dateString.charCodeAt(10);
54
+ const secondsFieldPresent = (char10 >= 0x30 && char10 <= 0x39);
55
+ const seconds = secondsFieldPresent
56
+ ? Number(dateString.slice(10, 12))
57
+ : 0;
58
+ let i = secondsFieldPresent ? 12 : 10;
59
+ if (dateString[i] === 'Z') {
60
+ (0, validateDateTime_1.default)("UTCTime", year, month, date, hours, minutes, seconds);
61
+ return new Date(Date.UTC(year, month, date, hours, minutes, seconds));
62
+ }
63
+ if ((dateString[i] !== '+') && (dateString[i] !== '-')) {
64
+ throw new errors.ASN1Error(`Malformed BER UTCTime: non +/- offset: ${dateString[i]}`);
65
+ }
66
+ const isPositive = dateString[i] === '+';
67
+ i++;
68
+ let j = 0;
69
+ while (value[i + j] && value[i + j] >= 0x30 && value[i + j] <= 0x39)
70
+ j++;
71
+ if (j !== 4) {
72
+ throw new errors.ASN1Error("Malformed BER UTCTime: non four-digit offset");
73
+ }
74
+ i += j;
75
+ if (dateString[i] !== undefined) {
76
+ throw new errors.ASN1Error("Malformed BER UTCTime: trailing data");
77
+ }
78
+ const offsetHour = Number.parseInt(dateString.slice(i - 4, i - 2), 10);
79
+ const offsetMinute = Number.parseInt(dateString.slice(i - 2, i), 10);
80
+ let epochTimeInMS = Date.UTC(year, month, date, hours, minutes, seconds);
81
+ const sign = isPositive ? -1 : 1;
82
+ epochTimeInMS += sign * ((offsetHour * 60 * 60 * 1000) + (offsetMinute * 60 * 1000));
83
+ return new Date(epochTimeInMS);
61
84
  }
@@ -77,6 +77,7 @@ const encodeDuration_1 = __importDefault(require("../codecs/x690/encoders/encode
77
77
  const decodeDuration_1 = __importDefault(require("../codecs/ber/decoders/decodeDuration"));
78
78
  const macros_1 = require("../macros");
79
79
  const utils_1 = require("../utils");
80
+ const node_buffer_1 = require("node:buffer");
80
81
  class BERElement extends x690_1.default {
81
82
  get value() {
82
83
  if (this._value instanceof Uint8Array) {
@@ -325,8 +326,8 @@ class BERElement extends x690_1.default {
325
326
  const valueBytes = this.deconstruct("BMPString");
326
327
  if (valueBytes.length % 2)
327
328
  throw new errors.ASN1Error("BMPString encoded on non-mulitple of two bytes.", this);
328
- if (typeof Buffer !== "undefined") {
329
- const swappedEndianness = Buffer.allocUnsafe(valueBytes.length);
329
+ if (typeof node_buffer_1.Buffer !== "undefined") {
330
+ const swappedEndianness = node_buffer_1.Buffer.allocUnsafe(valueBytes.length);
330
331
  for (let i = 0; i < valueBytes.length; i += 2) {
331
332
  swappedEndianness[i] = valueBytes[i + 1];
332
333
  swappedEndianness[i + 1] = valueBytes[i];
@@ -539,12 +540,6 @@ class BERElement extends x690_1.default {
539
540
  throw new errors.ASN1UndefinedError("Length byte with undefined meaning encountered.", this);
540
541
  }
541
542
  if (numberOfLengthOctets > 4) {
542
- if (bytes instanceof Buffer) {
543
- console.log(bytes.toString("hex"));
544
- }
545
- else {
546
- console.log(Buffer.from(bytes).toString("hex"));
547
- }
548
543
  throw new errors.ASN1OverflowError(`Element length too long to decode to an integer. Content octets occupied ${numberOfLengthOctets} bytes.`, this);
549
544
  }
550
545
  if (cursor + numberOfLengthOctets >= bytes.length) {
@@ -731,7 +726,7 @@ class BERElement extends x690_1.default {
731
726
  const deconstructed = substring.deconstruct(dataType);
732
727
  appendy.push(deconstructed);
733
728
  }
734
- return Buffer.concat(appendy);
729
+ return node_buffer_1.Buffer.concat(appendy);
735
730
  }
736
731
  }
737
732
  get components() {
@@ -79,6 +79,7 @@ const encodeDuration_1 = __importDefault(require("../codecs/x690/encoders/encode
79
79
  const decodeDuration_1 = __importDefault(require("../codecs/der/decoders/decodeDuration"));
80
80
  const macros_1 = require("../macros");
81
81
  const utils_1 = require("../utils");
82
+ const node_buffer_1 = require("node:buffer");
82
83
  class CERElement extends x690_1.default {
83
84
  get value() {
84
85
  if (this._value instanceof Uint8Array) {
@@ -338,8 +339,8 @@ class CERElement extends x690_1.default {
338
339
  const valueBytes = this.deconstruct("BMPString");
339
340
  if (valueBytes.length % 2)
340
341
  throw new errors.ASN1Error("BMPString encoded on non-mulitple of two bytes.", this);
341
- if (typeof Buffer !== "undefined") {
342
- const swappedEndianness = Buffer.allocUnsafe(valueBytes.length);
342
+ if (typeof node_buffer_1.Buffer !== "undefined") {
343
+ const swappedEndianness = node_buffer_1.Buffer.allocUnsafe(valueBytes.length);
343
344
  for (let i = 0; i < valueBytes.length; i += 2) {
344
345
  swappedEndianness[i] = valueBytes[i + 1];
345
346
  swappedEndianness[i + 1] = valueBytes[i];
@@ -695,7 +696,7 @@ class CERElement extends x690_1.default {
695
696
  const deconstructed = substring.deconstruct(dataType);
696
697
  appendy.push(deconstructed);
697
698
  }
698
- return Buffer.concat(appendy);
699
+ return node_buffer_1.Buffer.concat(appendy);
699
700
  }
700
701
  }
701
702
  get components() {
@@ -38,21 +38,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.default = decodeGeneralizedTime;
40
40
  const convertBytesToText_1 = __importDefault(require("../../../utils/convertBytesToText"));
41
- const values_1 = require("../../../values");
42
41
  const errors = __importStar(require("../../../errors"));
43
42
  const validateDateTime_1 = __importDefault(require("../../../validators/validateDateTime"));
44
43
  function decodeGeneralizedTime(value) {
45
44
  const dateString = (0, convertBytesToText_1.default)(value);
46
- const match = values_1.distinguishedGeneralizedTimeRegex.exec(dateString);
47
- if (match === null) {
48
- throw new errors.ASN1Error("Malformed GeneralizedTime string.");
45
+ if (!dateString.endsWith("Z")) {
46
+ throw new errors.ASN1Error("Malformed DER GeneralizedTime string: must use UTC timezone");
47
+ }
48
+ const year = Number(dateString.slice(0, 4));
49
+ const month = (Number(dateString.slice(4, 6)) - 1);
50
+ const date = Number(dateString.slice(6, 8));
51
+ const hours = Number(dateString.slice(8, 10));
52
+ const minutes = Number(dateString.slice(10, 12));
53
+ const seconds = Number(dateString.slice(12, 14));
54
+ if (dateString[14] === '.') {
55
+ let i = 15;
56
+ while (value[i] && value[i] >= 0x30 && value[i] <= 0x39)
57
+ i++;
58
+ if (i === 15) {
59
+ throw new errors.ASN1Error("Malformed DER GeneralizedTime string: trailing stop character");
60
+ }
61
+ if (dateString[i] === 'Z') {
62
+ i++;
63
+ }
64
+ if (dateString[i] !== undefined) {
65
+ throw new errors.ASN1Error("Malformed DER GeneralizedTime string: trailing data");
66
+ }
67
+ const fractionString = `0.${dateString.slice(15, i)}`;
68
+ if (fractionString.endsWith("0")) {
69
+ throw new errors.ASN1Error("Malformed DER GeneralizedTime string: trailing 0 in milliseconds");
70
+ }
71
+ const fraction = Number.parseFloat(fractionString);
72
+ const milliseconds = Math.floor(1000 * fraction);
73
+ (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, minutes, seconds);
74
+ return new Date(Date.UTC(year, month, date, hours, minutes, seconds, milliseconds));
75
+ }
76
+ else if (dateString[14] !== 'Z') {
77
+ throw new errors.ASN1Error("Malformed DER GeneralizedTime string: trailing data");
49
78
  }
50
- const year = Number(match[1]);
51
- const month = (Number(match[2]) - 1);
52
- const date = Number(match[3]);
53
- const hours = Number(match[4]);
54
- const minutes = Number(match[5]);
55
- const seconds = Number(match[6]);
56
79
  (0, validateDateTime_1.default)("GeneralizedTime", year, month, date, hours, minutes, seconds);
57
80
  return new Date(Date.UTC(year, month, date, hours, minutes, seconds));
58
81
  }
@@ -38,24 +38,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.default = decodeUTCTime;
40
40
  const convertBytesToText_1 = __importDefault(require("../../../utils/convertBytesToText"));
41
- const values_1 = require("../../../values");
42
41
  const errors = __importStar(require("../../../errors"));
43
42
  const validateDateTime_1 = __importDefault(require("../../../validators/validateDateTime"));
43
+ const DER_UTC_TIME_LENGTH = "920521000000Z".length;
44
44
  function decodeUTCTime(value) {
45
+ if (value.length !== DER_UTC_TIME_LENGTH) {
46
+ throw new errors.ASN1Error("Malformed DER UTCTime string: not a valid length");
47
+ }
45
48
  const dateString = (0, convertBytesToText_1.default)(value);
46
- const match = values_1.distinguishedUTCTimeRegex.exec(dateString);
47
- if (match === null) {
48
- throw new errors.ASN1Error("Malformed UTCTime string.");
49
+ if (!dateString.endsWith("Z")) {
50
+ throw new errors.ASN1Error("Malformed DER UTCTime string: not UTC timezone");
49
51
  }
50
- let year = Number(match[1]);
52
+ let year = Number(dateString.slice(0, 2));
53
+ const month = (Number(dateString.slice(2, 4)) - 1);
54
+ const date = Number(dateString.slice(4, 6));
55
+ const hours = Number(dateString.slice(6, 8));
56
+ const minutes = Number(dateString.slice(8, 10));
57
+ const seconds = Number(dateString.slice(10, 12));
51
58
  year = (year <= 49)
52
59
  ? (2000 + year)
53
60
  : (1900 + year);
54
- const month = (Number(match[2]) - 1);
55
- const date = Number(match[3]);
56
- const hours = Number(match[4]);
57
- const minutes = Number(match[5]);
58
- const seconds = Number(match[6]);
59
61
  (0, validateDateTime_1.default)("UTCTime", year, month, date, hours, minutes, seconds);
60
62
  return new Date(Date.UTC(year, month, date, hours, minutes, seconds));
61
63
  }
@@ -77,6 +77,7 @@ const encodeDuration_1 = __importDefault(require("../codecs/x690/encoders/encode
77
77
  const decodeDuration_1 = __importDefault(require("../codecs/der/decoders/decodeDuration"));
78
78
  const x690_1 = __importDefault(require("../x690"));
79
79
  const utils_1 = require("../utils");
80
+ const node_buffer_1 = require("node:buffer");
80
81
  class DERElement extends x690_1.default {
81
82
  get value() {
82
83
  if (this._value instanceof Uint8Array) {
@@ -339,8 +340,8 @@ class DERElement extends x690_1.default {
339
340
  }
340
341
  if (this.value.length % 2)
341
342
  throw new errors.ASN1Error("BMPString encoded on non-mulitple of two bytes.", this);
342
- if (typeof Buffer !== "undefined") {
343
- const swappedEndianness = Buffer.allocUnsafe(this.value.length);
343
+ if (typeof node_buffer_1.Buffer !== "undefined") {
344
+ const swappedEndianness = node_buffer_1.Buffer.allocUnsafe(this.value.length);
344
345
  for (let i = 0; i < this.value.length; i += 2) {
345
346
  swappedEndianness[i] = this.value[i + 1];
346
347
  swappedEndianness[i + 1] = this.value[i];
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = decodeInteger;
37
37
  const errors = __importStar(require("../../../errors"));
38
38
  const bigint_1 = require("../../../utils/bigint");
39
+ const node_buffer_1 = require("node:buffer");
39
40
  function decodeInteger(value) {
40
41
  if (value.length === 0) {
41
42
  throw new errors.ASN1SizeError("INTEGER or ENUMERATED encoded on zero bytes");
@@ -43,7 +44,7 @@ function decodeInteger(value) {
43
44
  if (value.length > 2
44
45
  && ((value[0] === 0xFF && value[1] >= 0b10000000)
45
46
  || (value[0] === 0x00 && value[1] < 0b10000000))) {
46
- const buf = Buffer.from(value.slice(0, 16));
47
+ const buf = node_buffer_1.Buffer.from(value.slice(0, 16));
47
48
  throw new errors.ASN1PaddingError("Unnecessary padding bytes on INTEGER or ENUMERATED. "
48
49
  + `First 16 bytes of the offending value were: 0x${buf.toString("hex")}`);
49
50
  }
@@ -1,2 +1,3 @@
1
1
  import { OBJECT_IDENTIFIER } from "../../../macros";
2
+ import { Buffer } from "node:buffer";
2
3
  export default function encodeObjectIdentifier(value: OBJECT_IDENTIFIER): Buffer;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = encodeObjectIdentifier;
4
+ const node_buffer_1 = require("node:buffer");
4
5
  function encodeObjectIdentifier(value) {
5
6
  const arcs = value.uint32ArrayRef;
6
7
  const node0 = arcs[0];
@@ -27,5 +28,5 @@ function encodeObjectIdentifier(value) {
27
28
  ret.push(o);
28
29
  }
29
30
  }
30
- return Buffer.from(ret);
31
+ return node_buffer_1.Buffer.from(ret);
31
32
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = encodeRelativeObjectIdentifier;
4
+ const node_buffer_1 = require("node:buffer");
4
5
  function encodeRelativeObjectIdentifier(value) {
5
6
  const ret = [];
6
7
  for (const arc of value) {
@@ -23,5 +24,5 @@ function encodeRelativeObjectIdentifier(value) {
23
24
  ret.push(o);
24
25
  }
25
26
  }
26
- return Buffer.from(ret);
27
+ return node_buffer_1.Buffer.from(ret);
27
28
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = encodeSequence;
4
+ const node_buffer_1 = require("node:buffer");
4
5
  function encodeSequence(value) {
5
- return Buffer.concat(value.map((v) => v.toBytes()));
6
+ return node_buffer_1.Buffer.concat(value.map((v) => v.toBytes()));
6
7
  }
@@ -1,3 +1,4 @@
1
+ import type { Buffer } from "node:buffer";
1
2
  export default class ObjectIdentifier {
2
3
  private _nodes;
3
4
  constructor(nodes: number[], prefix?: ObjectIdentifier | number);
@@ -1,3 +1,4 @@
1
1
  import type { INTEGER } from "../macros";
2
+ import { Buffer } from "node:buffer";
2
3
  export declare function bufferToInteger(input: Buffer | Uint8Array): INTEGER;
3
4
  export declare function integerToBuffer(int: INTEGER): Buffer;
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bufferToInteger = bufferToInteger;
4
4
  exports.integerToBuffer = integerToBuffer;
5
5
  const values_1 = require("../values");
6
+ const node_buffer_1 = require("node:buffer");
6
7
  function bufferToInteger(input) {
7
- const buf = (input instanceof Buffer)
8
+ const buf = (input instanceof node_buffer_1.Buffer)
8
9
  ? input
9
- : Buffer.from(input.buffer);
10
+ : node_buffer_1.Buffer.from(input.buffer);
10
11
  switch (buf.length) {
11
12
  case (0): return 0;
12
13
  case (1): return buf.readInt8();
@@ -26,27 +27,27 @@ function bufferToInteger(input) {
26
27
  function integerToBuffer(int) {
27
28
  if (typeof int === "number") {
28
29
  if ((int <= 127) && (int >= -128)) {
29
- const buf = Buffer.allocUnsafe(1);
30
+ const buf = node_buffer_1.Buffer.allocUnsafe(1);
30
31
  buf.writeInt8(int);
31
32
  return buf;
32
33
  }
33
34
  else if ((int <= 32767) && (int >= -32768)) {
34
- const buf = Buffer.allocUnsafe(2);
35
+ const buf = node_buffer_1.Buffer.allocUnsafe(2);
35
36
  buf.writeInt16BE(int);
36
37
  return buf;
37
38
  }
38
39
  else if ((int <= 8388607) && (int >= -8388608)) {
39
- const buf = Buffer.allocUnsafe(4);
40
+ const buf = node_buffer_1.Buffer.allocUnsafe(4);
40
41
  buf.writeInt32BE(int);
41
42
  return buf.subarray(1);
42
43
  }
43
44
  else if ((int >= values_1.MIN_SINT_32) && (int <= values_1.MAX_SINT_32)) {
44
- const buf = Buffer.allocUnsafe(4);
45
+ const buf = node_buffer_1.Buffer.allocUnsafe(4);
45
46
  buf.writeInt32BE(int);
46
47
  return buf;
47
48
  }
48
49
  else {
49
- const ret = Buffer.allocUnsafe(8);
50
+ const ret = node_buffer_1.Buffer.allocUnsafe(8);
50
51
  ret.writeBigInt64BE(BigInt(int));
51
52
  let startOfNonPadding = 0;
52
53
  if (int >= 0) {
@@ -74,27 +75,27 @@ function integerToBuffer(int) {
74
75
  }
75
76
  else {
76
77
  let startOfNonPadding = 0;
77
- let ret = Buffer.allocUnsafe(8);
78
+ let ret = node_buffer_1.Buffer.allocUnsafe(8);
78
79
  if ((int >= Number.MIN_SAFE_INTEGER)
79
80
  && (int <= Number.MAX_SAFE_INTEGER)) {
80
81
  ret.writeBigInt64BE(int);
81
82
  }
82
83
  else if (int >= 0) {
83
84
  const hex = int.toString(16);
84
- ret = Buffer.from(((hex.length % 2) ? `0${hex}` : hex), "hex");
85
+ ret = node_buffer_1.Buffer.from(((hex.length % 2) ? `0${hex}` : hex), "hex");
85
86
  if (ret[0] & 128) {
86
- ret = Buffer.concat([
87
- Buffer.from([0x00]),
87
+ ret = node_buffer_1.Buffer.concat([
88
+ node_buffer_1.Buffer.from([0x00]),
88
89
  ret,
89
90
  ]);
90
91
  }
91
92
  }
92
93
  else {
93
94
  const hex = BigInt.asUintN(100000000, int).toString(16);
94
- ret = Buffer.from(((hex.length % 2) ? `0${hex}` : hex), "hex");
95
+ ret = node_buffer_1.Buffer.from(((hex.length % 2) ? `0${hex}` : hex), "hex");
95
96
  if (!(ret[0] & 128)) {
96
- ret = Buffer.concat([
97
- Buffer.from([0xFF]),
97
+ ret = node_buffer_1.Buffer.concat([
98
+ node_buffer_1.Buffer.from([0xFF]),
98
99
  ret,
99
100
  ]);
100
101
  }
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = convertBytesToText;
4
4
  const errors_1 = require("../errors");
5
+ const node_buffer_1 = require("node:buffer");
5
6
  function convertBytesToText(bytes, codec = "utf-8") {
6
- if (typeof Buffer !== "undefined") {
7
- if (bytes instanceof Buffer) {
7
+ if (typeof node_buffer_1.Buffer !== "undefined") {
8
+ if (bytes instanceof node_buffer_1.Buffer) {
8
9
  return bytes.toString(codec);
9
10
  }
10
- return (Buffer.from(bytes.buffer, bytes.byteOffset, bytes.length)).toString(codec);
11
+ return (node_buffer_1.Buffer.from(bytes.buffer, bytes.byteOffset, bytes.length)).toString(codec);
11
12
  }
12
13
  else if (typeof TextEncoder !== "undefined") {
13
14
  return (new TextDecoder(codec)).decode(bytes);
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = convertTextToBytes;
4
4
  const errors_1 = require("../errors");
5
+ const node_buffer_1 = require("node:buffer");
5
6
  function convertTextToBytes(text, codec = "utf-8") {
6
7
  if (typeof TextEncoder !== "undefined") {
7
8
  return (new TextEncoder()).encode(text);
8
9
  }
9
- else if (typeof Buffer !== "undefined") {
10
- return Buffer.from(text, codec);
10
+ else if (typeof node_buffer_1.Buffer !== "undefined") {
11
+ return node_buffer_1.Buffer.from(text, codec);
11
12
  }
12
13
  throw new errors_1.ASN1Error("Neither TextEncoder nor Buffer are defined to encode text into bytes.");
13
14
  }
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = decodeSignedBigEndianInteger;
37
37
  const errors = __importStar(require("../errors"));
38
+ const node_buffer_1 = require("node:buffer");
38
39
  function decodeSignedBigEndianInteger(value) {
39
40
  if (value.length === 0) {
40
41
  return 0;
@@ -42,7 +43,7 @@ function decodeSignedBigEndianInteger(value) {
42
43
  if (value.length > 4) {
43
44
  throw new errors.ASN1OverflowError("Number too long to decode.");
44
45
  }
45
- const ret = Buffer.alloc(4, (value[0] >= 0b10000000) ? 0xFF : 0x00);
46
+ const ret = node_buffer_1.Buffer.alloc(4, (value[0] >= 0b10000000) ? 0xFF : 0x00);
46
47
  ret.set(value, (4 - value.length));
47
48
  return ret.readInt32BE();
48
49
  }
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = decodeUnsignedBigEndianInteger;
37
37
  const errors = __importStar(require("../errors"));
38
+ const node_buffer_1 = require("node:buffer");
38
39
  function decodeUnsignedBigEndianInteger(value) {
39
40
  if (value.length === 0) {
40
41
  return 0;
@@ -42,7 +43,7 @@ function decodeUnsignedBigEndianInteger(value) {
42
43
  if (value.length > 4) {
43
44
  throw new errors.ASN1OverflowError(`Number on ${value.length} bytes is too long to decode.`);
44
45
  }
45
- const ret = Buffer.alloc(4);
46
+ const ret = node_buffer_1.Buffer.alloc(4);
46
47
  ret.set(value, (4 - value.length));
47
48
  return ret.readUInt32BE();
48
49
  }
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = encodeUnsignedBigEndianInteger;
37
37
  const errors = __importStar(require("../errors"));
38
38
  const values_1 = require("../values");
39
+ const node_buffer_1 = require("node:buffer");
39
40
  function encodeUnsignedBigEndianInteger(value) {
40
41
  if (value < values_1.MIN_UINT_32) {
41
42
  throw new errors.ASN1OverflowError(`Number ${value} too small to be encoded as a big-endian unsigned integer.`);
@@ -43,7 +44,7 @@ function encodeUnsignedBigEndianInteger(value) {
43
44
  if (value > values_1.MAX_UINT_32) {
44
45
  throw new errors.ASN1OverflowError(`Number ${value} too big to be encoded as a big-endian unsigned integer.`);
45
46
  }
46
- const bytes = Buffer.alloc(4);
47
+ const bytes = node_buffer_1.Buffer.alloc(4);
47
48
  bytes.writeUInt32BE(value);
48
49
  let startOfNonPadding = 0;
49
50
  for (let i = 0; i < bytes.length - 1; i++) {
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = sortCanonically;
4
+ const node_buffer_1 = require("node:buffer");
4
5
  function sortCanonically(elements) {
5
6
  return elements.sort((a, b) => {
6
7
  const aClassOrder = a.tagClass;
@@ -8,6 +9,6 @@ function sortCanonically(elements) {
8
9
  if (aClassOrder !== bClassOrder) {
9
10
  return (aClassOrder - bClassOrder);
10
11
  }
11
- return Buffer.compare(a.toBytes(), b.toBytes());
12
+ return node_buffer_1.Buffer.compare(a.toBytes(), b.toBytes());
12
13
  });
13
14
  }
@@ -36,6 +36,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = validateDate;
37
37
  const errors = __importStar(require("../errors"));
38
38
  function validateDate(dataType, year, month, date) {
39
+ if (!Number.isSafeInteger(year)) {
40
+ throw new errors.ASN1Error(`Invalid year in ${dataType}`);
41
+ }
42
+ if (!Number.isSafeInteger(month)) {
43
+ throw new errors.ASN1Error(`Invalid month in ${dataType}`);
44
+ }
45
+ if (!Number.isSafeInteger(date) || (date < 1)) {
46
+ throw new errors.ASN1Error(`Invalid day in ${dataType}`);
47
+ }
39
48
  switch (month) {
40
49
  case 0:
41
50
  case 2:
@@ -71,6 +80,6 @@ function validateDate(dataType, year, month, date) {
71
80
  break;
72
81
  }
73
82
  default:
74
- throw new errors.ASN1Error(`Month greater than 12 encountered in ${dataType}.`);
83
+ throw new errors.ASN1Error(`Invalid month in ${dataType}`);
75
84
  }
76
85
  }
@@ -36,6 +36,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.default = validateTime;
37
37
  const errors = __importStar(require("../errors"));
38
38
  function validateTime(dataType, hours, minutes, seconds) {
39
+ if (!Number.isSafeInteger(hours)) {
40
+ throw new errors.ASN1Error(`Invalid hours in ${dataType}`);
41
+ }
42
+ if (!Number.isSafeInteger(minutes)) {
43
+ throw new errors.ASN1Error(`Invalid minutes in ${dataType}`);
44
+ }
45
+ if (!Number.isSafeInteger(seconds) || (seconds < 0)) {
46
+ throw new errors.ASN1Error(`Invalid seconds in ${dataType}`);
47
+ }
39
48
  if (hours > 23) {
40
49
  throw new errors.ASN1Error(`Hours > 23 encountered in ${dataType}.`);
41
50
  }
package/package.json CHANGED
@@ -47,5 +47,5 @@
47
47
  "test": "npx jest --ci --reporters=default --coverage"
48
48
  },
49
49
  "types": "./dist/node/index.d.ts",
50
- "version": "8.0.3"
50
+ "version": "8.0.5"
51
51
  }