asn1-ts
Version:
ASN.1 encoding and decoding, including BER, CER, and DER.
25 lines (24 loc) • 1.15 kB
JavaScript
import convertBytesToText from "../../../utils/convertBytesToText.mjs";
import * as errors from "../../../errors.mjs";
import validateDateTime from "../../../validators/validateDateTime.mjs";
const DER_UTC_TIME_LENGTH = "920521000000Z".length;
export default function decodeUTCTime(value) {
if (value.length !== DER_UTC_TIME_LENGTH) {
throw new errors.ASN1Error("Malformed DER UTCTime string: not a valid length");
}
const dateString = convertBytesToText(value);
if (!dateString.endsWith("Z")) {
throw new errors.ASN1Error("Malformed DER UTCTime string: not UTC timezone");
}
let year = Number(dateString.slice(0, 2));
const month = (Number(dateString.slice(2, 4)) - 1);
const date = Number(dateString.slice(4, 6));
const hours = Number(dateString.slice(6, 8));
const minutes = Number(dateString.slice(8, 10));
const seconds = Number(dateString.slice(10, 12));
year = (year <= 49)
? (2000 + year)
: (1900 + year);
validateDateTime("UTCTime", year, month, date, hours, minutes, seconds);
return new Date(Date.UTC(year, month, date, hours, minutes, seconds));
}