UNPKG

node-opcua-crypto

Version:

Crypto tools for Node-OPCUA

1,007 lines (998 loc) 227 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // source/index_web.ts var index_web_exports = {}; __export(index_web_exports, { CertificatePurpose: () => CertificatePurpose, PaddingAlgorithm: () => PaddingAlgorithm, RSA_PKCS1_OAEP_PADDING: () => RSA_PKCS1_OAEP_PADDING, RSA_PKCS1_PADDING: () => RSA_PKCS1_PADDING, Subject: () => Subject, _coercePrivateKey: () => _coercePrivateKey, asn1: () => asn1, certificateMatchesPrivateKey: () => certificateMatchesPrivateKey, coerceCertificate: () => coerceCertificate, coerceCertificatePem: () => coerceCertificatePem, coercePEMorDerToPrivateKey: () => coercePEMorDerToPrivateKey, coercePrivateKeyPem: () => coercePrivateKeyPem, coercePublicKeyPem: () => coercePublicKeyPem, coerceRsaPublicKeyPem: () => coerceRsaPublicKeyPem, combine_der: () => combine_der, computeDerivedKeys: () => computeDerivedKeys, computePaddingFooter: () => computePaddingFooter, convertPEMtoDER: () => convertPEMtoDER, createCertificateSigningRequest: () => createCertificateSigningRequest, createPrivateKeyFromNodeJSCrypto: () => createPrivateKeyFromNodeJSCrypto, createSelfSignedCertificate: () => createSelfSignedCertificate, decryptBufferWithDerivedKeys: () => decryptBufferWithDerivedKeys, derToPrivateKey: () => derToPrivateKey, encryptBufferWithDerivedKeys: () => encryptBufferWithDerivedKeys, exploreAsn1: () => exploreAsn1, exploreCertificate: () => exploreCertificate, exploreCertificateInfo: () => exploreCertificateInfo, exploreCertificateRevocationList: () => exploreCertificateRevocationList, exploreCertificateSigningRequest: () => exploreCertificateSigningRequest, explorePrivateKey: () => explorePrivateKey, extractPublicKeyFromCertificate: () => extractPublicKeyFromCertificate, extractPublicKeyFromCertificateSync: () => extractPublicKeyFromCertificateSync, generateKeyPair: () => generateKeyPair, generatePrivateKey: () => generatePrivateKey, hexDump: () => hexDump, identifyPemType: () => identifyPemType, isKeyObject: () => isKeyObject, makeMessageChunkSignature: () => makeMessageChunkSignature, makeMessageChunkSignatureWithDerivedKeys: () => makeMessageChunkSignatureWithDerivedKeys, makePrivateKeyFromPem: () => makePrivateKeyFromPem, makePrivateKeyThumbPrint: () => makePrivateKeyThumbPrint, makePseudoRandomBuffer: () => makePseudoRandomBuffer, makeSHA1Thumbprint: () => makeSHA1Thumbprint, pemToPrivateKey: () => pemToPrivateKey, privateDecrypt: () => privateDecrypt, privateDecrypt_long: () => privateDecrypt_long, privateDecrypt_native: () => privateDecrypt_native, privateKeyToPEM: () => privateKeyToPEM, publicEncrypt: () => publicEncrypt, publicEncrypt_long: () => publicEncrypt_long, publicEncrypt_native: () => publicEncrypt_native, publicKeyAndPrivateKeyMatches: () => publicKeyAndPrivateKeyMatches, readCertificationRequestInfo: () => readCertificationRequestInfo, readExtension: () => readExtension, readNameForCrl: () => readNameForCrl, readTbsCertificate: () => readTbsCertificate, reduceLength: () => reduceLength, removePadding: () => removePadding, removeTrailingLF: () => removeTrailingLF, rsaLengthPrivateKey: () => rsaLengthPrivateKey, rsaLengthPublicKey: () => rsaLengthPublicKey, rsaLengthRsaPublicKey: () => rsaLengthRsaPublicKey, split_der: () => split_der, toPem: () => toPem, toPem2: () => toPem2, verifyCertificateChain: () => verifyCertificateChain, verifyCertificateOrClrSignature: () => verifyCertificateOrClrSignature, verifyCertificateRevocationListSignature: () => verifyCertificateRevocationListSignature, verifyCertificateSignature: () => verifyCertificateSignature, verifyChunkSignature: () => verifyChunkSignature, verifyChunkSignatureWithDerivedKeys: () => verifyChunkSignatureWithDerivedKeys, verifyMessageChunkSignature: () => verifyMessageChunkSignature }); module.exports = __toCommonJS(index_web_exports); // source/asn1.ts var import_assert = __toESM(require("assert")); // source/oid_map.ts var oid_map = { "0.9.2342.19200300.100.1.1": { d: "userID", c: "Some oddball X.500 attribute collection" }, "0.9.2342.19200300.100.1.3": { d: "rfc822Mailbox", c: "Some oddball X.500 attribute collection" }, "0.9.2342.19200300.100.1.25": { d: "domainComponent", c: "Men are from Mars, this OID is from Pluto" }, "1.2.840.10045.2": { d: "publicKeyType", c: "ANSI X9.62" }, "1.2.840.10045.2.1": { d: "ecPublicKey", c: "ANSI X9.62 public key type" }, "1.2.840.10045.3.0.1": { d: "c2pnb163v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.2": { d: "c2pnb163v2", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.3": { d: "c2pnb163v3", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.5": { d: "c2tnb191v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.6": { d: "c2tnb191v2", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.7": { d: "c2tnb191v3", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.10": { d: "c2pnb208w1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.11": { d: "c2tnb239v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.12": { d: "c2tnb239v2", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.13": { d: "c2tnb239v3", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.16": { d: "c2pnb272w1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.18": { d: "c2tnb359v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.19": { d: "c2pnb368w1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.0.20": { d: "c2tnb431r1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.1": { d: "prime192v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.2": { d: "prime192v2", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.3": { d: "prime192v3", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.4": { d: "prime239v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.5": { d: "prime239v2", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.6": { d: "prime239v3", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.10045.3.1.7": { d: "prime256v1", c: "ANSI X9.62 named elliptic curve" }, "1.2.840.113549.1.1": { d: "pkcs-1", c: "", w: false }, "1.2.840.113549.1.1.1": { d: "rsaEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.2": { d: "md2WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.3": { d: "md4WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.4": { d: "md5WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.5": { d: "sha1WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.7": { d: "rsaOAEP", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.8": { d: "pkcs1-MGF", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.9": { d: "rsaOAEP-pSpecified", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.10": { d: "rsaPSS", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.11": { d: "sha256WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.12": { d: "sha384WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.13": { d: "sha512WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.1.14": { d: "sha224WithRSAEncryption", c: "PKCS #1", w: false }, "1.2.840.113549.1.9.1": { d: "emailAddress", c: "PKCS #9. Deprecated, use an altName extension instead", w: false }, "1.2.840.113549.1.9.2": { d: "unstructuredName", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.3": { d: "contentType", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.4": { d: "messageDigest", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.5": { d: "signingTime", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.6": { d: "countersignature", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.7": { d: "challengePassword", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.8": { d: "unstructuredAddress", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.9": { d: "extendedCertificateAttributes", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.10": { d: "issuerAndSerialNumber", c: "PKCS #9 experimental", w: true }, "1.2.840.113549.1.9.11": { d: "passwordCheck", c: "PKCS #9 experimental", w: true }, "1.2.840.113549.1.9.12": { d: "publicKey", c: "PKCS #9 experimental", w: true }, "1.2.840.113549.1.9.13": { d: "signingDescription", c: "PKCS #9", w: false }, "1.2.840.113549.1.9.14": { d: "extensionRequest", c: "PKCS #9 via CRMF", w: false }, "1.3.6.1.4.1.311.2.1.21": { d: "1.3.6.1.4.1.311.2.1.21", c: "SPC_INDIVIDUAL_SP_KEY_PURPOSE_OBJID" }, "1.3.6.1.4.1.311.2.1.22": { d: "1.3.6.1.4.1.311.2.1.22", c: "SPC_COMMERCIAL_SP_KEY_PURPOSE_OBJID" }, "1.3.6.1.4.1.311.10.3.1": { d: "1.3.6.1.4.1.311.10.3.1", c: "Signer of CTLs -- szOID_KP_CTL_USAGE_SIGNING" }, "1.3.6.1.4.1.311.10.3.4": { d: "1.3.6.1.4.1.311.10.3.4", c: "szOID_EFS_RECOVERY (Encryption File System)" }, "1.3.6.1.4.1.311.20.2.3": { d: "1.3.6.1.4.1.311.20.2.3", c: "id-on-personalData" }, "1.3.6.1.5.5.7.3.17": { d: "1.3.6.1.5.5.7.3.17", c: "Internet Key Exchange (IKE)" }, "1.3.6.1.5.5.7.3.1": { d: "serverAuth", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.2": { d: "clientAuth", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.3": { d: "codeSigning", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.4": { d: "emailProtection", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.5": { d: "ipsecEndSystem", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.6": { d: "ipsecTunnel", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.7": { d: "ipsecUser", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.8": { d: "timeStamping", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.9": { d: "ocspSigning", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.10": { d: "dvcs", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.11": { d: "sbgpCertAAServerAuth", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.13": { d: "eapOverPPP", c: "PKIX key purpose" }, "1.3.6.1.5.5.7.3.14": { d: "eapOverLAN", c: "PKIX key purpose" }, "1.3.36.3.3.2.8.1.1.1": { d: "brainpoolP160r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.2": { d: "brainpoolP160t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.3": { d: "brainpoolP192r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.4": { d: "brainpoolP192t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.5": { d: "brainpoolP224r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.6": { d: "brainpoolP224t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.7": { d: "brainpoolP256r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.8": { d: "brainpoolP256t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.9": { d: "brainpoolP320r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.10": { d: "brainpoolP320t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.11": { d: "brainpoolP384r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.12": { d: "brainpoolP384t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.13": { d: "brainpoolP512r1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "1.3.36.3.3.2.8.1.1.14": { d: "brainpoolP512t1", c: "ECC Brainpool Standard Curves and Curve Generation" }, "2.5.4.0": { d: "objectClass", c: "X.520 DN component", w: false }, "2.5.4.1": { d: "aliasedEntryName", c: "X.520 DN component", w: false }, "2.5.4.2": { d: "knowledgeInformation", c: "X.520 DN component", w: false }, "2.5.4.3": { d: "commonName", c: "X.520 DN component", w: false }, "2.5.4.4": { d: "surname", c: "X.520 DN component", w: false }, "2.5.4.5": { d: "serialNumber", c: "X.520 DN component", w: false }, "2.5.4.6": { d: "countryName", c: "X.520 DN component", w: false }, "2.5.4.7": { d: "localityName", c: "X.520 DN component", w: false }, "2.5.4.7.1": { d: "collectiveLocalityName", c: "X.520 DN component", w: false }, "2.5.4.8": { d: "stateOrProvinceName", c: "X.520 DN component", w: false }, "2.5.4.8.1": { d: "collectiveStateOrProvinceName", c: "X.520 DN component", w: false }, "2.5.4.9": { d: "streetAddress", c: "X.520 DN component", w: false }, "2.5.4.9.1": { d: "collectiveStreetAddress", c: "X.520 DN component", w: false }, "2.5.4.10": { d: "organizationName", c: "X.520 DN component", w: false }, "2.5.4.10.1": { d: "collectiveOrganizationName", c: "X.520 DN component", w: false }, "2.5.4.11": { d: "organizationalUnitName", c: "X.520 DN component", w: false }, "2.5.4.11.1": { d: "collectiveOrganizationalUnitName", c: "X.520 DN component", w: false }, "2.5.4.12": { d: "title", c: "X.520 DN component", w: false }, "2.5.4.13": { d: "description", c: "X.520 DN component", w: false }, "2.5.4.14": { d: "searchGuide", c: "X.520 DN component", w: false }, "2.5.4.15": { d: "businessCategory", c: "X.520 DN component", w: false }, "2.5.4.16": { d: "postalAddress", c: "X.520 DN component", w: false }, "2.5.4.16.1": { d: "collectivePostalAddress", c: "X.520 DN component", w: false }, "2.5.4.17": { d: "postalCode", c: "X.520 DN component", w: false }, "2.5.4.17.1": { d: "collectivePostalCode", c: "X.520 DN component", w: false }, "2.5.4.18": { d: "postOfficeBox", c: "X.520 DN component", w: false }, "2.5.4.18.1": { d: "collectivePostOfficeBox", c: "X.520 DN component", w: false }, "2.5.4.19": { d: "physicalDeliveryOfficeName", c: "X.520 DN component", w: false }, "2.5.4.19.1": { d: "collectivePhysicalDeliveryOfficeName", c: "X.520 DN component", w: false }, "2.5.4.20": { d: "telephoneNumber", c: "X.520 DN component", w: false }, "2.5.4.20.1": { d: "collectiveTelephoneNumber", c: "X.520 DN component", w: false }, "2.5.4.21": { d: "telexNumber", c: "X.520 DN component", w: false }, "2.5.4.21.1": { d: "collectiveTelexNumber", c: "X.520 DN component", w: false }, "2.5.4.22": { d: "teletexTerminalIdentifier", c: "X.520 DN component", w: false }, "2.5.4.22.1": { d: "collectiveTeletexTerminalIdentifier", c: "X.520 DN component", w: false }, "2.5.4.23": { d: "facsimileTelephoneNumber", c: "X.520 DN component", w: false }, "2.5.4.23.1": { d: "collectiveFacsimileTelephoneNumber", c: "X.520 DN component", w: false }, "2.5.4.24": { d: "x121Address", c: "X.520 DN component", w: false }, "2.5.4.25": { d: "internationalISDNNumber", c: "X.520 DN component", w: false }, "2.5.4.25.1": { d: "collectiveInternationalISDNNumber", c: "X.520 DN component", w: false }, "2.5.4.26": { d: "registeredAddress", c: "X.520 DN component", w: false }, "2.5.4.27": { d: "destinationIndicator", c: "X.520 DN component", w: false }, "2.5.4.28": { d: "preferredDeliveryMehtod", c: "X.520 DN component", w: false }, "2.5.4.29": { d: "presentationAddress", c: "X.520 DN component", w: false }, "2.5.4.30": { d: "supportedApplicationContext", c: "X.520 DN component", w: false }, "2.5.4.31": { d: "member", c: "X.520 DN component", w: false }, "2.5.4.32": { d: "owner", c: "X.520 DN component", w: false }, "2.5.4.33": { d: "roleOccupant", c: "X.520 DN component", w: false }, "2.5.4.34": { d: "seeAlso", c: "X.520 DN component", w: false }, "2.5.4.35": { d: "userPassword", c: "X.520 DN component", w: false }, "2.5.4.36": { d: "userCertificate", c: "X.520 DN component", w: false }, "2.5.4.37": { d: "caCertificate", c: "X.520 DN component", w: false }, "2.5.4.38": { d: "authorityRevocationList", c: "X.520 DN component", w: false }, "2.5.4.39": { d: "certificateRevocationList", c: "X.520 DN component", w: false }, "2.5.4.40": { d: "crossCertificatePair", c: "X.520 DN component", w: false }, "2.5.4.41": { d: "name", c: "X.520 DN component", w: false }, "2.5.4.42": { d: "givenName", c: "X.520 DN component", w: false }, "2.5.4.43": { d: "initials", c: "X.520 DN component", w: false }, "2.5.4.44": { d: "generationQualifier", c: "X.520 DN component", w: false }, "2.5.4.45": { d: "uniqueIdentifier", c: "X.520 DN component", w: false }, "2.5.4.46": { d: "dnQualifier", c: "X.520 DN component", w: false }, "2.5.4.47": { d: "enhancedSearchGuide", c: "X.520 DN component", w: false }, "2.5.4.48": { d: "protocolInformation", c: "X.520 DN component", w: false }, "2.5.4.49": { d: "distinguishedName", c: "X.520 DN component", w: false }, "2.5.4.50": { d: "uniqueMember", c: "X.520 DN component", w: false }, "2.5.4.51": { d: "houseIdentifier", c: "X.520 DN component", w: false }, "2.5.4.52": { d: "supportedAlgorithms", c: "X.520 DN component", w: false }, "2.5.4.53": { d: "deltaRevocationList", c: "X.520 DN component", w: false }, "2.5.4.54": { d: "dmdName", c: "X.520 DN component", w: false }, "2.5.4.55": { d: "clearance", c: "X.520 DN component", w: false }, "2.5.4.56": { d: "defaultDirQop", c: "X.520 DN component", w: false }, "2.5.4.57": { d: "attributeIntegrityInfo", c: "X.520 DN component", w: false }, "2.5.4.58": { d: "attributeCertificate", c: "X.520 DN component", w: false }, "2.5.4.59": { d: "attributeCertificateRevocationList", c: "X.520 DN component", w: false }, "2.5.4.60": { d: "confKeyInfo", c: "X.520 DN component", w: false }, "2.5.4.61": { d: "aACertificate", c: "X.520 DN component", w: false }, "2.5.4.62": { d: "attributeDescriptorCertificate", c: "X.520 DN component", w: false }, "2.5.4.63": { d: "attributeAuthorityRevocationList", c: "X.520 DN component", w: false }, "2.5.4.64": { d: "familyInformation", c: "X.520 DN component", w: false }, "2.5.4.65": { d: "pseudonym", c: "X.520 DN component", w: false }, "2.5.4.66": { d: "communicationsService", c: "X.520 DN component", w: false }, "2.5.4.67": { d: "communicationsNetwork", c: "X.520 DN component", w: false }, "2.5.4.68": { d: "certificationPracticeStmt", c: "X.520 DN component", w: false }, "2.5.4.69": { d: "certificatePolicy", c: "X.520 DN component", w: false }, "2.5.4.70": { d: "pkiPath", c: "X.520 DN component", w: false }, "2.5.4.71": { d: "privPolicy", c: "X.520 DN component", w: false }, "2.5.4.72": { d: "role", c: "X.520 DN component", w: false }, "2.5.4.73": { d: "delegationPath", c: "X.520 DN component", w: false }, "2.5.4.74": { d: "protPrivPolicy", c: "X.520 DN component", w: false }, "2.5.4.75": { d: "xMLPrivilegeInfo", c: "X.520 DN component", w: false }, "2.5.4.76": { d: "xmlPrivPolicy", c: "X.520 DN component", w: false }, "2.5.4.82": { d: "permission", c: "X.520 DN component", w: false }, "2.5.6.0": { d: "top", c: "X.520 objectClass", w: false }, "2.5.6.1": { d: "alias", c: "X.520 objectClass", w: false }, "2.5.6.2": { d: "country", c: "X.520 objectClass", w: false }, "2.5.6.3": { d: "locality", c: "X.520 objectClass", w: false }, "2.5.6.4": { d: "organization", c: "X.520 objectClass", w: false }, "2.5.6.5": { d: "organizationalUnit", c: "X.520 objectClass", w: false }, "2.5.6.6": { d: "person", c: "X.520 objectClass", w: false }, "2.5.6.7": { d: "organizationalPerson", c: "X.520 objectClass", w: false }, "2.5.6.8": { d: "organizationalRole", c: "X.520 objectClass", w: false }, "2.5.6.9": { d: "groupOfNames", c: "X.520 objectClass", w: false }, "2.5.6.10": { d: "residentialPerson", c: "X.520 objectClass", w: false }, "2.5.6.11": { d: "applicationProcess", c: "X.520 objectClass", w: false }, "2.5.6.12": { d: "applicationEntity", c: "X.520 objectClass", w: false }, "2.5.6.13": { d: "dSA", c: "X.520 objectClass", w: false }, "2.5.6.14": { d: "device", c: "X.520 objectClass", w: false }, "2.5.6.15": { d: "strongAuthenticationUser", c: "X.520 objectClass", w: false }, "2.5.6.16": { d: "certificateAuthority", c: "X.520 objectClass", w: false }, "2.5.6.17": { d: "groupOfUniqueNames", c: "X.520 objectClass", w: false }, "2.5.6.21": { d: "pkiUser", c: "X.520 objectClass", w: false }, "2.5.6.22": { d: "pkiCA", c: "X.520 objectClass", w: false }, "2.5.29.1": { d: "authorityKeyIdentifier", c: "X.509 extension. Deprecated, use 2 5 29 35 instead", w: true }, "2.5.29.2": { d: "keyAttributes", c: "X.509 extension. Obsolete, use keyUsage/extKeyUsage instead", w: true }, "2.5.29.3": { d: "certificatePolicies", c: "X.509 extension. Deprecated, use 2 5 29 32 instead", w: true }, "2.5.29.4": { d: "keyUsageRestriction", c: "X.509 extension. Obsolete, use keyUsage/extKeyUsage instead", w: true }, "2.5.29.5": { d: "policyMapping", c: "X.509 extension. Deprecated, use 2 5 29 33 instead", w: true }, "2.5.29.6": { d: "subtreesConstraint", c: "X.509 extension. Obsolete, use nameConstraints instead", w: true }, "2.5.29.7": { d: "subjectAltName", c: "X.509 extension. Deprecated, use 2 5 29 17 instead", w: true }, "2.5.29.8": { d: "issuerAltName", c: "X.509 extension. Deprecated, use 2 5 29 18 instead", w: true }, "2.5.29.9": { d: "subjectDirectoryAttributes", c: "X.509 extension", w: false }, "2.5.29.10": { d: "basicConstraints", c: "X.509 extension. Deprecated, use 2 5 29 19 instead", w: true }, "2.5.29.11": { d: "nameConstraints", c: "X.509 extension. Deprecated, use 2 5 29 30 instead", w: true }, "2.5.29.12": { d: "policyConstraints", c: "X.509 extension. Deprecated, use 2 5 29 36 instead", w: true }, "2.5.29.13": { d: "basicConstraints", c: "X.509 extension. Deprecated, use 2 5 29 19 instead", w: true }, "2.5.29.14": { d: "subjectKeyIdentifier", c: "X.509 extension", w: false }, "2.5.29.15": { d: "keyUsage", c: "X.509 extension", w: false }, "2.5.29.16": { d: "privateKeyUsagePeriod", c: "X.509 extension", w: false }, "2.5.29.17": { d: "subjectAltName", c: "X.509 extension", w: false }, "2.5.29.18": { d: "issuerAltName", c: "X.509 extension", w: false }, "2.5.29.19": { d: "basicConstraints", c: "X.509 extension", w: false }, "2.5.29.20": { d: "cRLNumber", c: "X.509 extension", w: false }, "2.5.29.21": { d: "cRLReason", c: "X.509 extension", w: false }, "2.5.29.22": { d: "expirationDate", c: "X.509 extension. Deprecated, alternative OID uncertain", w: true }, "2.5.29.23": { d: "instructionCode", c: "X.509 extension", w: false }, "2.5.29.24": { d: "invalidityDate", c: "X.509 extension", w: false }, "2.5.29.25": { d: "cRLDistributionPoints", c: "X.509 extension. Deprecated, use 2 5 29 31 instead", w: true }, "2.5.29.26": { d: "issuingDistributionPoint", c: "X.509 extension. Deprecated, use 2 5 29 28 instead", w: true }, "2.5.29.27": { d: "deltaCRLIndicator", c: "X.509 extension", w: false }, "2.5.29.28": { d: "issuingDistributionPoint", c: "X.509 extension", w: false }, "2.5.29.29": { d: "certificateIssuer", c: "X.509 extension", w: false }, "2.5.29.30": { d: "nameConstraints", c: "X.509 extension", w: false }, "2.5.29.31": { d: "cRLDistributionPoints", c: "X.509 extension", w: false }, "2.5.29.32": { d: "certificatePolicies", c: "X.509 extension", w: false }, "2.5.29.32.0": { d: "anyPolicy", c: "X.509 certificate policy", w: false }, "2.5.29.33": { d: "policyMappings", c: "X.509 extension", w: false }, "2.5.29.34": { d: "policyConstraints", c: "X.509 extension. Deprecated, use 2 5 29 36 instead", w: true }, "2.5.29.35": { d: "authorityKeyIdentifier", c: "X.509 extension", w: false }, "2.5.29.36": { d: "policyConstraints", c: "X.509 extension", w: false }, "2.5.29.37": { d: "extKeyUsage", c: "X.509 extension", w: false }, "2.5.29.37.0": { d: "anyExtendedKeyUsage", c: "X.509 extended key usage", w: false }, "2.5.29.38": { d: "authorityAttributeIdentifier", c: "X.509 extension", w: false }, "2.5.29.39": { d: "roleSpecCertIdentifier", c: "X.509 extension", w: false }, "2.5.29.40": { d: "cRLStreamIdentifier", c: "X.509 extension", w: false }, "2.5.29.41": { d: "basicAttConstraints", c: "X.509 extension", w: false }, "2.5.29.42": { d: "delegatedNameConstraints", c: "X.509 extension", w: false }, "2.5.29.43": { d: "timeSpecification", c: "X.509 extension", w: false }, "2.5.29.44": { d: "cRLScope", c: "X.509 extension", w: false }, "2.5.29.45": { d: "statusReferrals", c: "X.509 extension", w: false }, "2.5.29.46": { d: "freshestCRL", c: "X.509 extension", w: false }, "2.5.29.47": { d: "orderedList", c: "X.509 extension", w: false }, "2.5.29.48": { d: "attributeDescriptor", c: "X.509 extension", w: false }, "2.5.29.49": { d: "userNotice", c: "X.509 extension", w: false }, "2.5.29.50": { d: "sOAIdentifier", c: "X.509 extension", w: false }, "2.5.29.51": { d: "baseUpdateTime", c: "X.509 extension", w: false }, "2.5.29.52": { d: "acceptableCertPolicies", c: "X.509 extension", w: false }, "2.5.29.53": { d: "deltaInfo", c: "X.509 extension", w: false }, "2.5.29.54": { d: "inhibitAnyPolicy", c: "X.509 extension", w: false }, "2.5.29.55": { d: "targetInformation", c: "X.509 extension", w: false }, "2.5.29.56": { d: "noRevAvail", c: "X.509 extension", w: false }, "2.5.29.57": { d: "acceptablePrivilegePolicies", c: "X.509 extension", w: false }, "2.5.29.58": { d: "toBeRevoked", c: "X.509 extension", w: false }, "2.5.29.59": { d: "revokedGroups", c: "X.509 extension", w: false }, "2.5.29.60": { d: "expiredCertsOnCRL", c: "X.509 extension", w: false }, "2.5.29.61": { d: "indirectIssuer", c: "X.509 extension", w: false }, "2.5.29.62": { d: "noAssertion", c: "X.509 extension", w: false }, "2.5.29.63": { d: "aAissuingDistributionPoint", c: "X.509 extension", w: false }, "2.5.29.64": { d: "issuedOnBehalfOf", c: "X.509 extension", w: false }, "2.5.29.65": { d: "singleUse", c: "X.509 extension", w: false }, "2.5.29.66": { d: "groupAC", c: "X.509 extension", w: false }, "2.5.29.67": { d: "allowedAttAss", c: "X.509 extension", w: false }, "2.5.29.68": { d: "attributeMappings", c: "X.509 extension", w: false }, "2.5.29.69": { d: "holderNameConstraints", c: "X.509 extension", w: false }, // Netscape certificate type // An X.509 v3 certificate extension used to identify whether // the certificate subject is an SSL client, … "2.16.840.1.113730.1": { d: "certExtension", c: "Netscape" }, "2.16.840.1.113730.1.1": { d: "netscapeCertType", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.2": { d: "netscapeBaseUrl", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.3": { d: "netscapeRevocationUrl", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.4": { d: "netscapeCaRevocationUrl", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.7": { d: "netscapeCertRenewalUrl", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.8": { d: "netscapeCaPolicyUrl", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.9": { d: "HomePageUrl", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.10": { d: "EntityLogo", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.11": { d: "UserPicture", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.12": { d: "netscapeSslServerName", c: "Netscape certificate extension" }, "2.16.840.1.113730.1.13": { d: "netscapeComment", c: "Netscape certificate extension" }, done: { d: "", c: "" } }; // source/asn1.ts var TagType = /* @__PURE__ */ ((TagType2) => { TagType2[TagType2["BOOLEAN"] = 1] = "BOOLEAN"; TagType2[TagType2["INTEGER"] = 2] = "INTEGER"; TagType2[TagType2["BIT_STRING"] = 3] = "BIT_STRING"; TagType2[TagType2["OCTET_STRING"] = 4] = "OCTET_STRING"; TagType2[TagType2["NULL"] = 5] = "NULL"; TagType2[TagType2["OBJECT_IDENTIFIER"] = 6] = "OBJECT_IDENTIFIER"; TagType2[TagType2["UTF8String"] = 12] = "UTF8String"; TagType2[TagType2["NumericString"] = 18] = "NumericString"; TagType2[TagType2["PrintableString"] = 19] = "PrintableString"; TagType2[TagType2["TeletexString"] = 20] = "TeletexString"; TagType2[TagType2["IA5String"] = 22] = "IA5String"; TagType2[TagType2["UTCTime"] = 23] = "UTCTime"; TagType2[TagType2["GeneralizedTime"] = 24] = "GeneralizedTime"; TagType2[TagType2["GraphicString"] = 25] = "GraphicString"; TagType2[TagType2["VisibleString"] = 26] = "VisibleString"; TagType2[TagType2["GeneralString"] = 27] = "GeneralString"; TagType2[TagType2["UniversalString"] = 28] = "UniversalString"; TagType2[TagType2["BMPString"] = 30] = "BMPString"; TagType2[TagType2["SEQUENCE"] = 48] = "SEQUENCE"; TagType2[TagType2["SET"] = 49] = "SET"; TagType2[TagType2["CONTEXT_SPECIFIC0"] = 160] = "CONTEXT_SPECIFIC0"; TagType2[TagType2["CONTEXT_SPECIFIC1"] = 161] = "CONTEXT_SPECIFIC1"; TagType2[TagType2["CONTEXT_SPECIFIC2"] = 162] = "CONTEXT_SPECIFIC2"; TagType2[TagType2["CONTEXT_SPECIFIC3"] = 163] = "CONTEXT_SPECIFIC3"; TagType2[TagType2["A4"] = 164] = "A4"; return TagType2; })(TagType || {}); function readTag(buf, pos) { const start = pos; if (buf.length <= pos) { throw new Error("Invalid position : buf.length=" + buf.length + " pos =" + pos); } const tag = buf.readUInt8(pos); pos += 1; let length = buf.readUInt8(pos); pos += 1; if (length > 127) { const nbBytes = length & 127; length = 0; for (let i = 0; i < nbBytes; i++) { length = length * 256 + buf.readUInt8(pos); pos += 1; } } return { start, tag, position: pos, length }; } function readStruct(buf, blockInfo) { const length = blockInfo.length; let cursor = blockInfo.position; const end = blockInfo.position + length; const blocks = []; while (cursor < end) { const inner = readTag(buf, cursor); cursor = inner.position + inner.length; blocks.push(inner); } return blocks; } function parseBitString(buffer, start, end, maxLength) { const unusedBit = buffer.readUInt8(start), lenBit = (end - start - 1 << 3) - unusedBit, intro = "(" + lenBit + " bit)\n"; let s = "", skip = unusedBit; for (let i = end - 1; i > start; --i) { const b = buffer.readUInt8(i); for (let j = skip; j < 8; ++j) { s += b >> j & 1 ? "1" : "0"; } skip = 0; (0, import_assert.default)(s.length <= maxLength); } return intro + s; } function readBitString(buffer, block) { (0, import_assert.default)(block.tag === 3 /* BIT_STRING */); const data = getBlock(buffer, block); const ignore_bits = data.readUInt8(0); return { lengthInBits: data.length * 8 - ignore_bits, lengthInBytes: data.length - 1, data: data.subarray(1), debug: parseBitString(buffer, block.position, block.length + block.position, 4 * 16 * 1024) }; } function formatBuffer2DigitHexWithColum(buffer) { const value = []; for (let i = 0; i < buffer.length; i++) { value.push(("00" + buffer.readUInt8(i).toString(16)).substr(-2, 2)); } return value.join(":").toUpperCase().replace(/^(00:)*/, ""); } function readOctetString(buffer, block) { (0, import_assert.default)(block.tag === 4 /* OCTET_STRING */); const tag = readTag(buffer, block.position); (0, import_assert.default)(tag.tag === 4 /* OCTET_STRING */); const nbBytes = tag.length; const pos = tag.position; const b = buffer.subarray(pos, pos + nbBytes); return b; } function getBlock(buffer, block) { const start = block.position; const end = block.position + block.length; return buffer.subarray(start, end); } function readIntegerAsByteString(buffer, block) { return getBlock(buffer, block); } function readListOfInteger(buffer) { const block = readTag(buffer, 0); const inner_blocks = readStruct(buffer, block); return inner_blocks.map((innerBlock) => { return readIntegerAsByteString(buffer, innerBlock); }); } function parseOID(buffer, start, end) { let s = "", n = 0, bits = 0; for (let i = start; i < end; ++i) { const v = buffer.readUInt8(i); n = n * 128 + (v & 127); bits += 7; if (!(v & 128)) { if (s === "") { const m = n < 80 ? n < 40 ? 0 : 1 : 2; s = m + "." + (n - m * 40); } else { s += "." + n.toString(); } n = 0; bits = 0; } } (0, import_assert.default)(bits === 0); return s; } function readObjectIdentifier(buffer, block) { (0, import_assert.default)(block.tag === 6 /* OBJECT_IDENTIFIER */); const b = buffer.subarray(block.position, block.position + block.length); const oid = parseOID(b, 0, block.length); return { oid, name: oid_map[oid] ? oid_map[oid].d : oid }; } function readAlgorithmIdentifier(buffer, block) { const inner_blocks = readStruct(buffer, block); return { identifier: readObjectIdentifier(buffer, inner_blocks[0]).name }; } function readECCAlgorithmIdentifier(buffer, block) { const inner_blocks = readStruct(buffer, block); return { identifier: readObjectIdentifier(buffer, inner_blocks[1]).name // difference with RSA as algorithm is second element of nested block }; } function readSignatureValueBin(buffer, block) { return readBitString(buffer, block).data; } function readSignatureValue(buffer, block) { return readSignatureValueBin(buffer, block).toString("hex"); } function readLongIntegerValue(buffer, block) { (0, import_assert.default)(block.tag === 2 /* INTEGER */, "expecting a INTEGER tag"); const pos = block.position; const nbBytes = block.length; const buf = buffer.subarray(pos, pos + nbBytes); return buf; } function readIntegerValue(buffer, block) { (0, import_assert.default)(block.tag === 2 /* INTEGER */, "expecting a INTEGER tag"); let pos = block.position; const nbBytes = block.length; (0, import_assert.default)(nbBytes < 4); let value = 0; for (let i = 0; i < nbBytes; i++) { value = value * 256 + buffer.readUInt8(pos); pos += 1; } return value; } function readBooleanValue(buffer, block) { (0, import_assert.default)(block.tag === 1 /* BOOLEAN */, "expecting a BOOLEAN tag. got " + TagType[block.tag]); const pos = block.position; const nbBytes = block.length; (0, import_assert.default)(nbBytes < 4); const value = buffer.readUInt8(pos) ? true : false; return value; } function readVersionValue(buffer, block) { block = readTag(buffer, block.position); return readIntegerValue(buffer, block); } function convertGeneralizedTime(str) { const year = parseInt(str.substr(0, 4), 10); const month = parseInt(str.substr(4, 2), 10) - 1; const day = parseInt(str.substr(6, 2), 10); const hours = parseInt(str.substr(8, 2), 10); const mins = parseInt(str.substr(10, 2), 10); const secs = parseInt(str.substr(12, 2), 10); return new Date(Date.UTC(year, month, day, hours, mins, secs)); } function _readBMPString(buffer, block) { const strBuff = getBlock(buffer, block); let str = ""; for (let i = 0; i < strBuff.length; i += 2) { const word = strBuff.readUInt16BE(i); str += String.fromCharCode(word); } return str; } function convertUTCTime(str) { let year = parseInt(str.substr(0, 2), 10); const month = parseInt(str.substr(2, 2), 10) - 1; const day = parseInt(str.substr(4, 2), 10); const hours = parseInt(str.substr(6, 2), 10); const mins = parseInt(str.substr(8, 2), 10); const secs = parseInt(str.substr(10, 2), 10); year += year >= 50 ? 1900 : 2e3; return new Date(Date.UTC(year, month, day, hours, mins, secs)); } function readValue(buffer, block) { switch (block.tag) { case 1 /* BOOLEAN */: return readBooleanValue(buffer, block); case 30 /* BMPString */: return _readBMPString(buffer, block); case 19 /* PrintableString */: case 20 /* TeletexString */: case 12 /* UTF8String */: case 18 /* NumericString */: case 22 /* IA5String */: return getBlock(buffer, block).toString("ascii"); case 23 /* UTCTime */: return convertUTCTime(getBlock(buffer, block).toString("ascii")); case 24 /* GeneralizedTime */: return convertGeneralizedTime(getBlock(buffer, block).toString("ascii")); default: throw new Error("Invalid tag 0x" + block.tag.toString(16)); } } function findBlockAtIndex(blocks, index) { const tmp = blocks.filter((b) => b.tag === 160 + index || b.tag === 128 + index); if (tmp.length === 0) { return null; } return tmp[0]; } function readTime(buffer, block) { return readValue(buffer, block); } // source/crypto_utils.ts var import_constants = __toESM(require("constants")); var import_assert4 = __toESM(require("assert")); var import_crypto = require("crypto"); var import_hexy = __toESM(require("hexy")); // source/buffer_utils.ts var createFastUninitializedBuffer = Buffer.allocUnsafe ? Buffer.allocUnsafe : (size) => { return new Buffer(size); }; // source/crypto_explore_certificate.ts var import_assert3 = __toESM(require("assert")); // source/directory_name.ts var import_assert2 = __toESM(require("assert")); function readDirectoryName(buffer, block) { const set_blocks = readStruct(buffer, block); const names = {}; for (const set_block of set_blocks) { (0, import_assert2.default)(set_block.tag === 49); const blocks = readStruct(buffer, set_block); (0, import_assert2.default)(blocks.length === 1); (0, import_assert2.default)(blocks[0].tag === 48); const sequenceBlock = readStruct(buffer, blocks[0]); (0, import_assert2.default)(sequenceBlock.length === 2); const type = readObjectIdentifier(buffer, sequenceBlock[0]); names[type.name] = readValue(buffer, sequenceBlock[1]); } return names; } // source/crypto_explore_certificate.ts var doDebug = false; function _readAttributeTypeAndValue(buffer, block) { let inner_blocks = readStruct(buffer, block); inner_blocks = readStruct(buffer, inner_blocks[0]); const data = { identifier: readObjectIdentifier(buffer, inner_blocks[0]).name, value: readValue(buffer, inner_blocks[1]) }; const result = {}; for (const [key, value] of Object.entries(data)) { result[key] = value; } return result; } function _readRelativeDistinguishedName(buffer, block) { const inner_blocks = readStruct(buffer, block); const data = inner_blocks.map((block2) => _readAttributeTypeAndValue(buffer, block2)); const result = {}; for (const e of data) { result[e.identifier] = e.value; } return result; } function _readName(buffer, block) { return _readRelativeDistinguishedName(buffer, block); } function _readValidity(buffer, block) { const inner_blocks = readStruct(buffer, block); return { notBefore: readTime(buffer, inner_blocks[0]), notAfter: readTime(buffer, inner_blocks[1]) }; } function _readAuthorityKeyIdentifier(buffer) { const block_info = readTag(buffer, 0); const blocks = readStruct(buffer, block_info); const keyIdentifier_block = findBlockAtIndex(blocks, 0); const authorityCertIssuer_block = findBlockAtIndex(blocks, 1); const authorityCertSerialNumber_block = findBlockAtIndex(blocks, 2); function _readAuthorityCertIssuer(block) { const inner_blocks = readStruct(buffer, block); const directoryName_block = findBlockAtIndex(inner_blocks, 4); if (directoryName_block) { const a = readStruct(buffer, directoryName_block); return readDirectoryName(buffer, a[0]); } else { throw new Error("Invalid _readAuthorityCertIssuer"); } } function _readAuthorityCertIssuerFingerPrint(block) { const inner_blocks = readStruct(buffer, block); const directoryName_block = findBlockAtIndex(inner_blocks, 4); if (!directoryName_block) { return ""; } const a = readStruct(buffer, directoryName_block); if (a.length < 1) { return ""; } return directoryName_block ? formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, a[0]))) : ""; } const authorityCertIssuer = authorityCertIssuer_block ? _readAuthorityCertIssuer(authorityCertIssuer_block) : null; const authorityCertIssuerFingerPrint = authorityCertIssuer_block ? _readAuthorityCertIssuerFingerPrint(authorityCertIssuer_block) : ""; return { authorityCertIssuer, authorityCertIssuerFingerPrint, serial: authorityCertSerialNumber_block ? formatBuffer2DigitHexWithColum(getBlock(buffer, authorityCertSerialNumber_block)) : null, // can be null for self-signed cert keyIdentifier: keyIdentifier_block ? formatBuffer2DigitHexWithColum(getBlock(buffer, keyIdentifier_block)) : null // can be null for self-signed certf }; } function readBasicConstraint2_5_29_19(buffer, block) { const block_info = readTag(buffer, 0); const inner_blocks = readStruct(buffer, block_info).slice(0, 2); let cA = false; let pathLengthConstraint = 0; let breakControl = 0; for (const inner_block of inner_blocks) { switch (inner_block.tag) { case 1 /* BOOLEAN */: cA = readBooleanValue(buffer, inner_block); break; case 2 /* INTEGER */: pathLengthConstraint = readIntegerValue(buffer, inner_block); breakControl = 1; break; } if (breakControl) { break; } } return { critical: true, cA, pathLengthConstraint }; } function _readGeneralNames(buffer, block) { const _data = { 1: { name: "rfc822Name", type: "IA5String" }, 2: { name: "dNSName", type: "IA5String" }, 3: { name: "x400Address", type: "ORAddress" }, 4: { name: "directoryName", type: "Name" }, 5: { name: "ediPartyName", type: "EDIPartyName" }, 6: { name: "uniformResourceIdentifier", type: "IA5String" }, 7: { name: "iPAddress", type: "OCTET_STRING" }, 8: { name: "registeredID", type: "OBJECT_IDENTIFIER" }, 32: { name: "otherName", type: "AnotherName" } }; const blocks = readStruct(buffer, block); function _readFromType(buffer2, block2, type) { switch (type) { case "IA5String": return buffer2.subarray(block2.position, block2.position + block2.length).toString("ascii"); default: return buffer2.subarray(block2.position, block2.position + block2.length).toString("hex"); } } const n = {}; for (const block2 of blocks) { (0, import_assert3.default)((block2.tag & 128) === 128); const t2 = block2.tag & 127; const type = _data[t2]; if (!type) { console.log("_readGeneralNames: INVALID TYPE => " + t2 + " 0x" + t2.toString(16)); continue; } if (t2 == 32) { n[type.name] = n[type.name] || []; const blocks2 = readStruct(buffer, block2); const name = readObjectIdentifier(buffer, blocks2[0]).name; const buf = getBlock(buffer, blocks2[1]); const b = readTag(buf, 0); const nn = readValue(buf, b); const data = { identifier: name, value: nn }; n[type.name].push(data.value); } else { n[type.name] = n[type.name] || []; n[type.name].push(_readFromType(buffer, block2, type.type)); } } return n; } function _readSubjectAltNames(buffer) { const block_info = readTag(buffer, 0); return _readGeneralNames(buffer, block_info); } function readKeyUsage(oid, buffer) { const block_info = readTag(buffer, 0); let b2 = 0; let b3 = 0; if (block_info.length > 1) { b2 = buffer[block_info.position + 1]; b3 = block_info.length > 2 ? buffer[block_info.position + 2] : 0; } return { // tslint:disable-next-line: no-bitwise digitalSignature: (b2 & 128) === 128, // tslint:disable-next-line: no-bitwise nonRepudiation: (b2 & 64) === 64, // tslint:disable-next-line: no-bitwise keyEncipherment: (b2 & 32) === 32, // tslint:disable-next-line: no-bitwise dataEncipherment: (b2 & 16) === 16, // tslint:disable-next-line: no-bitwise keyAgreement: (b2 & 8) === 8, // tslint:disable-next-line: no-bitwise keyCertSign: (b2 & 4) === 4, // tslint:disable-next-line: no-bitwise cRLSign: (b2 & 2) === 2, // tslint:disable-next-line: no-bitwise encipherOnly: (b2 & 1) === 1, // tslint:disable-next-line: no-bitwise decipherOnly: (b3 & 128) === 128 }; } function readExtKeyUsage(oid, buffer) { (0, import_assert3.default)(oid === "2.5.29.37"); const block_info = readTag(buffer, 0); const inner_blocks = readStruct(buffer, block_info); const extKeyUsage = { serverAuth: false, clientAuth: false, codeSigning: false, emailProtection: false, timeStamping: false, ipsecEndSystem: false, ipsecTunnel: false, ipsecUser: false, ocspSigning: false }; for (const block of inner_blocks) { const identifier = readObjectIdentifier(buffer, block); extKeyUsage[identifier.name] = true; } return extKeyUsage; } function _readSubjectPublicKey(buffer) { const block_info = readTag(buffer, 0); const blocks = readStruct(buffer, block_info); return { modulus: buffer.subarray(blocks[0].position + 1, blocks[0].position + blocks[0].length) }; } function readExtension(buffer, block) { const inner_blocks = readStruct(buffer, block); if (inner_blocks.length === 3) { (0, import_assert3.default)(inner_blocks[1].tag === 1 /* BOOLEAN */); inner_blocks[1] = inner_blocks[2]; } const identifier = readObjectIdentifier(buffer, inner_blocks[0]); const buf = getBlock(buffer, inner_blocks[1]); let value = null; switch (identifier.name) { case "subjectKeyIdentifier": value = formatBuffer2DigitHexWithColum(readOctetString(buffer, inner_blocks[1])); break; case "subjectAltName": value = _readSubjectAltNames(buf); break; case "authorityKeyIdentifier": value = _readAuthorityKeyIdentifier(buf); break; case "basicConstraints": value = readBasicConstraint2_5_29_19(buf, inner_blocks[1]); break; case "certExtension": value = "basicConstraints ( not implemented yet) " + buf.toString("hex"); break; case "extKeyUsage": value = readExtKeyUsage(identifier.oid, buf); break; case "keyUsage": value = readKeyUsage(identifier.oid, buf); break; default: value = "Unknown " + identifier.name + buf.toString("hex"); } return { identifier, value }; } function _readExtensions(buffer, block) { (0, import_assert3.default)(block.tag === 163); let inner_blocks = readStruct(buffer, block); inner_blocks = readStruct(buffer, inner_blocks[0]); const extensions = inner_blocks.map((block2) => readExtension(buffer, block2)); const result = {}; for (const e of extensions) { result[e.identifier.name] = e.value; } return result; } function _readSubjectPublicKeyInfo(buffer, block) { const inner_blocks = readStruct(buffer, block); const algorithm = readAlgorithmIdentifier(buffer, inner_blocks[0]); const subjectPublicKey = readBitString(buffer, inner_blocks[1]); const data = subjectPublicKey.data; const values = readListOfInteger(data); return { algorithm: algorithm.identifier, keyLength: values[0].length - 1, subjectPublicKey: _readSubjectPublicKey(subjectPublicKey.data) //xx values: values, //xx values_length : values.map(function (a){ return a.length; }) }; } function _readSubjectECCPublicKeyInfo(buffer, block) { const inner_blocks = readStruct(buffer, block); const algorithm = readECCAlgorithmIdentifier(buffer, inner_blocks[0]); const subjectPublicKey = readBitString(buffer, inner_blocks[1]); const data = subjectPublicKey.data; return { algorithm: algorithm.identifier, keyLength: data.length - 1, subjectPublicKey: { modulus: data } }; } function readTbsCertificate(buffer, block) { const blocks = readStruct(buffer, block); let version, serialNumber, signature, issuer, validity, subject, subjectFingerPrint, extensions; let subjectPublicKeyInfo; if (blocks.length === 6) { version = 1; serialNumber = formatBuffer2DigitHexWithColum(readLongIntegerValue(buffer, blocks[0])); signature = readAlgorithmIdentifier(buffer, blocks[1]); issuer = _readName(buffer, blocks[2]); validity = _readValidity(buffer, blocks[3]); subject = _readName(buffer, blocks[4]); subjectFingerPrint = formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, blocks[4]))); subjectPublicKeyInfo = _readSubjectPublicKeyInfo(buffer, blocks[5]); extensions = null; } else { const version_block = findBlockAtIndex(blocks, 0); if (!version_block) { throw new Error("cannot find version block"); } version = readVersionValue(buffer, version_block) + 1; serialNumber = formatBuffer2DigitHexWithColum(readLongIntegerValue(buffer, blocks[1])); signature = readAlgorithmIdentifier(buffer, blocks[2]); issuer = _readName(buffer, blocks[3]); validity = _readValidity(buffer, blocks[4]); subject = _readName(buffer, blocks[5]); subjectFingerPrint = formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, blocks[5]))); const inner_block = readStruct(buffer, blocks[6]); const what_type = readAlgorithmIdent