node-opcua-crypto 5.3.1 → 5.3.2
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.
- package/dist/{chunk-MUTGGDEL.cjs → chunk-IKQT3ICS.cjs} +22 -22
- package/dist/{chunk-MUTGGDEL.cjs.map → chunk-IKQT3ICS.cjs.map} +1 -1
- package/dist/{chunk-Z4PNMXBN.js → chunk-ODR4HUB7.js} +64 -13
- package/dist/chunk-ODR4HUB7.js.map +1 -0
- package/dist/{chunk-3KSBDOQT.cjs → chunk-TSW463FI.cjs} +66 -15
- package/dist/chunk-TSW463FI.cjs.map +1 -0
- package/dist/{chunk-ISWOJ526.js → chunk-UEEZA3YS.js} +2 -2
- package/dist/index.cjs +7 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -3
- package/dist/source/index_web.cjs +6 -2
- package/dist/source/index_web.cjs.map +1 -1
- package/dist/source/index_web.d.cts +10 -1
- package/dist/source/index_web.d.ts +10 -1
- package/dist/source/index_web.js +7 -3
- package/dist/source_nodejs/index.cjs +3 -3
- package/dist/source_nodejs/index.js +2 -2
- package/package.json +5 -5
- package/dist/chunk-3KSBDOQT.cjs.map +0 -1
- package/dist/chunk-Z4PNMXBN.js.map +0 -1
- /package/dist/{chunk-ISWOJ526.js.map → chunk-UEEZA3YS.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/node-opcua-crypto/node-opcua-crypto/packages/node-opcua-crypto/dist/chunk-3KSBDOQT.cjs","../source/common.ts","../source/crypto_explore_certificate.ts","../source/asn1.ts","../source/oid_map.ts","../source/crypto_utils.ts","../source/buffer_utils.ts","../source/hexy.ts","../source/directory_name.ts","../source/explore_certificate_revocation_list.ts","../source/verify_certificate_signature.ts","../source/crl_utils.ts","../source/explore_asn1.ts","../source/explore_certificate.ts","../source/explore_certificate_signing_request.ts","../source/explore_private_key.ts","../source/identify_der.ts","../source/subject.ts","../source/x509/_crypto.ts","../source/x509/create_key_pair.ts","../source/x509/coerce_private_key.ts","../source/x509/_build_public_key.ts","../source/x509/_get_attributes.ts","../source/x509/create_certificate_signing_request.ts","../../../node_modules/asn1js/build/index.es.js","../../../node_modules/pvtsutils/build/index.es.js","../../../node_modules/pvutils/build/utils.es.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/enums.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/converters.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/helper.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/schema.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/storage.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/parser.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/serializer.js","../../../node_modules/@peculiar/asn1-schema/build/es2015/convert.js","../source/x509/create_self_signed_certificate.ts","../source/crypto_utils2.ts","../source/derived_keys.ts","../source/make_private_key_from_pem.ts","../source/make_private_key_thumbprint.ts","../source/public_private_match.ts","../source/index_web.ts"],"names":["CertificatePurpose","TagType","PaddingAlgorithm","block","version","modulus","publicExponent","privateExponent","prime1","prime2","exponent1","exponent2","t","crypto","retBuf","_a","plus"],"mappings":"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AACO,EAAA;AACP,EAAA;AACC,EAAA;AACzC;AAE+F;AACxC,EAAA;AAC3B,EAAA;AACO,EAAA;AAC2B,EAAA;AAE/B,EAAA;AAES,EAAA;AACO,EAAA;AACP,EAAA;AAEC,EAAA;AACzC;AAQ4G;AACzE,EAAA;AACe,EAAA;AACE,EAAA;AACqB,EAAA;AACL,EAAA;AACT,EAAA;AAChD,EAAA;AACX;AAQsG;AACrC,EAAA;AACO,EAAA;AACD,EAAA;AACK,EAAA;AAC5E;AtCg8L2E;AACA;AuCrvMA;AACtC,EAAA;AACrC;AvCuvM2E;AACA;AwC1vMD;AAQjD,EAAA;AACzB;AxCqvM2E;AACA;AyCpuM8B;AAC7D,EAAA;AACF,EAAA;AAEkC,EAAA;AACrD,EAAA;AAEsB,EAAA;AAC9B,IAAA;AACX,EAAA;AAC2D,EAAA;AAC/D;AAO8F;AAC3C,EAAA;AACwB,EAAA;AACE,EAAA;AACrB,EAAA;AACT,EAAA;AAC/C;AAEwG;AAC9D,EAAA;AACV,EAAA;AAC2B,EAAA;AACY,EAAA;AACvE;AzC6tM2E;AACA;A0CttMb;A1CwtMa;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/node-opcua-crypto/node-opcua-crypto/packages/node-opcua-crypto/dist/chunk-3KSBDOQT.cjs","sourcesContent":[null,"// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\nimport __crypto from \"node:crypto\";\n\nconst KeyObjectOrig = __crypto.KeyObject;\n\nexport const { createPrivateKey: createPrivateKeyFromNodeJSCrypto } = __crypto;\n\ntype KeyFormat = \"pem\" | \"der\" | \"jwk\";\ntype KeyObjectType = \"secret\" | \"public\" | \"private\";\ninterface KeyExportOptions<T extends KeyFormat> {\n type: \"pkcs1\" | \"spki\" | \"pkcs8\" | \"sec1\";\n format: T;\n cipher?: string | undefined;\n passphrase?: string | Buffer | undefined;\n}\ninterface JwkKeyExportOptions {\n format: \"jwk\";\n}\nexport interface KeyObject {\n export(options: KeyExportOptions<\"pem\">): string | Buffer;\n export(options: KeyExportOptions<\"der\">): Buffer;\n export(options: JwkKeyExportOptions): JsonWebKey;\n\n type: KeyObjectType;\n}\nexport function isKeyObject(mayBeKeyObject: unknown): boolean {\n if (KeyObjectOrig) {\n return mayBeKeyObject instanceof KeyObjectOrig;\n }\n return typeof mayBeKeyObject === \"object\" && typeof (mayBeKeyObject as { type?: unknown }).type === \"string\"; /// .constructor?.name === \"KeyObject\";\n}\nexport type PrivateKey = { hidden: string } | { hidden: KeyObject };\nexport type PublicKey = KeyObject;\n\nexport type Nonce = Buffer;\nexport type PEM = string;\nexport type DER = Buffer;\nexport type Certificate = DER;\nexport type CertificatePEM = PEM; // certificate as a PEM string\nexport type PrivateKeyPEM = PEM;\nexport type PublicKeyPEM = PEM;\n\nexport type Signature = Buffer;\nexport type CertificateRevocationList = Buffer;\n\nexport enum CertificatePurpose {\n NotSpecified = 0,\n ForCertificateAuthority = 1,\n ForApplication = 2,\n ForUserAuthentication = 3, // X509\n}\n","/**\n * @module node_opcua_crypto\n */\n// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\n// portion of this code has been ported from :\n//\n// ASN.1 JavaScript decoder Copyright (c) 2008-2014 Lapo Luchini lapo@lapo.it\n// Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby\n// granted, provided that the above copyright notice and this permission notice appear in all copies.\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n// AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n// PERFORMANCE OF THIS SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n/*jslint bitwise: true */\n// tslint:disable:no-shadowed-variable\n\n// references:\n// - http://tools.ietf.org/html/rfc5280\n// - http://www-lor.int-evry.fr/~michel/Supports/presentation.pdf\n// - ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n// - pubs.opengroup.org/onlinepubs/009609799/7a_nch02.htm#tagcjh_49_03\n// - https://github.com/lapo-luchini/asn1js/blob/master/asn1.js\n// - http://lapo.it/asn1js\n// - https://www.cs.auckland.ac.nz/~pgut001/dumpasn1.cfg\n// - http://pubs.opengroup.org/onlinepubs/009609799/7a_nch02.htm\n// - http://stackoverflow.com/questions/5929050/how-does-asn-1-encode-an-object-identifier\n// - http://luca.ntop.org/Teaching/Appunti/asn1.html\n\n// note:\n// - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art030\n// openssl can be also used to discover the content of a DER file\n// $ openssl asn1parse -in cert.pem\nimport assert from \"node:assert\";\n\nimport {\n type AlgorithmIdentifier,\n type BlockInfo,\n findBlockAtIndex,\n formatBuffer2DigitHexWithColum,\n getBlock,\n readAlgorithmIdentifier,\n readBitString,\n readBooleanValue,\n readECCAlgorithmIdentifier,\n readIntegerValue,\n readListOfInteger,\n readLongIntegerValue,\n readObjectIdentifier,\n readOctetString,\n readSignatureValue,\n readStruct,\n readTag,\n readTime,\n readValue,\n readVersionValue,\n type SignatureValue,\n TagType,\n} from \"./asn1.js\";\nimport type { Certificate } from \"./common.js\";\nimport { makeSHA1Thumbprint } from \"./crypto_utils.js\";\nimport { type DirectoryName, readDirectoryName } from \"./directory_name.js\";\nimport type { PublicKeyLength } from \"./explore_certificate.js\";\n\n// Converted from: https://www.cs.auckland.ac.nz/~pgut001/dumpasn1.cfg\n// which is made by Peter Gutmann and whose license states:\n// You can use this code in whatever way you want,\n// as long as you don't try to claim you wrote it.\n\nconst doDebug = false;\n\nexport interface AttributeTypeAndValue {\n [key: string]: unknown;\n}\n\nfunction _readAttributeTypeAndValue(buffer: Buffer, block: BlockInfo): AttributeTypeAndValue {\n let inner_blocks = readStruct(buffer, block);\n inner_blocks = readStruct(buffer, inner_blocks[0]);\n\n const data = {\n identifier: readObjectIdentifier(buffer, inner_blocks[0]).name,\n value: readValue(buffer, inner_blocks[1]),\n };\n\n const result: AttributeTypeAndValue = {};\n\n for (const [key, value] of Object.entries(data)) {\n result[key] = value;\n }\n return result;\n}\n\ninterface RelativeDistinguishedName {\n [prop: string]: unknown;\n}\n\nfunction _readRelativeDistinguishedName(buffer: Buffer, block: BlockInfo): RelativeDistinguishedName {\n const inner_blocks = readStruct(buffer, block);\n const data = inner_blocks.map((block) => _readAttributeTypeAndValue(buffer, block));\n const result: RelativeDistinguishedName = {};\n for (const e of data) {\n result[e.identifier as string] = e.value;\n }\n return result;\n}\n\nfunction _readName(buffer: Buffer, block: BlockInfo): RelativeDistinguishedName {\n return _readRelativeDistinguishedName(buffer, block);\n}\n\nexport interface Validity {\n notBefore: Date;\n notAfter: Date;\n}\n\nfunction _readValidity(buffer: Buffer, block: BlockInfo): Validity {\n const inner_blocks = readStruct(buffer, block);\n return {\n notBefore: readTime(buffer, inner_blocks[0]) as Date,\n notAfter: readTime(buffer, inner_blocks[1]) as Date,\n };\n}\n\nfunction _readAuthorityKeyIdentifier(buffer: Buffer): AuthorityKeyIdentifier {\n /**\n * where a CA distributes its public key in the form of a \"self-signed\"\n * certificate, the authority key identifier MAY be omitted. Th\n * signature on a self-signed certificate is generated with the private\n * key associated with the certificate's subject public key. (This\n * proves that the issuer possesses both the public and private keys.)\n * In this case, the subject and authority key identifiers would be\n * identical, but only the subject key identifier is needed for\n * certification path building.\n */\n // see: https://www.ietf.org/rfc/rfc3280.txt page 25\n // AuthorityKeyIdentifier ::= SEQUENCE {\n // keyIdentifier [0] KeyIdentifier OPTIONAL,\n // authorityCertIssuer [1] GeneralNames OPTIONAL,\n // authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL }\n // KeyIdentifier ::= OCTET STRING\n\n const block_info = readTag(buffer, 0);\n const blocks = readStruct(buffer, block_info);\n\n const keyIdentifier_block = findBlockAtIndex(blocks, 0);\n const authorityCertIssuer_block = findBlockAtIndex(blocks, 1);\n const authorityCertSerialNumber_block = findBlockAtIndex(blocks, 2);\n\n function _readAuthorityCertIssuer(block: BlockInfo): DirectoryName {\n const inner_blocks = readStruct(buffer, block);\n const directoryName_block = findBlockAtIndex(inner_blocks, 4);\n if (directoryName_block) {\n const a = readStruct(buffer, directoryName_block);\n return readDirectoryName(buffer, a[0]);\n } else {\n throw new Error(\"Invalid _readAuthorityCertIssuer\");\n }\n }\n function _readAuthorityCertIssuerFingerPrint(block: BlockInfo): string {\n const inner_blocks = readStruct(buffer, block);\n const directoryName_block = findBlockAtIndex(inner_blocks, 4);\n if (!directoryName_block) {\n return \"\";\n }\n const a = readStruct(buffer, directoryName_block);\n if (a.length < 1) {\n return \"\";\n }\n return directoryName_block ? formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, a[0]))) : \"\";\n }\n\n const authorityCertIssuer = authorityCertIssuer_block ? _readAuthorityCertIssuer(authorityCertIssuer_block) : null;\n const authorityCertIssuerFingerPrint = authorityCertIssuer_block\n ? _readAuthorityCertIssuerFingerPrint(authorityCertIssuer_block)\n : \"\";\n\n return {\n authorityCertIssuer,\n authorityCertIssuerFingerPrint,\n serial: authorityCertSerialNumber_block\n ? formatBuffer2DigitHexWithColum(getBlock(buffer, authorityCertSerialNumber_block))\n : null, // can be null for self-signed cert\n keyIdentifier: keyIdentifier_block ? formatBuffer2DigitHexWithColum(getBlock(buffer, keyIdentifier_block)) : null, // can be null for self-signed certf\n };\n}\n\n/*\n Extension ::= SEQUENCE {\n extnID OBJECT IDENTIFIER,\n critical BOOLEAN DEFAULT FALSE,\n extnValue OCTET STRING\n -- contains the DER encoding of an ASN.1 value\n -- corresponding to the extension type identified\n -- by extnID\n }\n\n id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 }\n\n KeyUsage ::= BIT STRING {\n digitalSignature (0),\n nonRepudiation (1), -- recent editions of X.509 have\n -- renamed this bit to contentCommitment\n keyEncipherment (2),\n dataEncipherment (3),\n keyAgreement (4),\n keyCertSign (5),\n cRLSign (6),\n encipherOnly (7),\n decipherOnly (8) }\n\nextKeyUsage\n*/\n\nfunction readBasicConstraint2_5_29_19(buffer: Buffer, _block: BlockInfo): BasicConstraints {\n const block_info = readTag(buffer, 0);\n const inner_blocks = readStruct(buffer, block_info).slice(0, 2);\n let cA = false;\n let pathLengthConstraint = 0;\n let breakControl = 0;\n\n for (const inner_block of inner_blocks) {\n switch (inner_block.tag) {\n case TagType.BOOLEAN:\n cA = readBooleanValue(buffer, inner_block);\n break;\n case TagType.INTEGER:\n pathLengthConstraint = readIntegerValue(buffer, inner_block);\n breakControl = 1;\n break;\n }\n\n if (breakControl) {\n break;\n }\n }\n\n return { critical: true, cA, pathLengthConstraint };\n}\n\n// GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName\n// GeneralName ::= CHOICE {\n// otherName [0] AnotherName,\n// rfc822Name [1] IA5String,\n// dNSName [2] IA5String,\n// x400Address [3] ORAddress,\n// directoryName [4] Name,\n// ediPartyName [5] EDIPartyName,\n// uniformResourceIdentifier [6] IA5String,\n// iPAddress [7] OCTET STRING,\n// registeredID [8] OBJECT IDENTIFIER }\nfunction _readGeneralNames(buffer: Buffer, block: BlockInfo) {\n const _data: { [key: number]: { name: string; type: string } } = {\n 1: { name: \"rfc822Name\", type: \"IA5String\" },\n 2: { name: \"dNSName\", type: \"IA5String\" },\n 3: { name: \"x400Address\", type: \"ORAddress\" },\n 4: { name: \"directoryName\", type: \"Name\" },\n 5: { name: \"ediPartyName\", type: \"EDIPartyName\" },\n 6: { name: \"uniformResourceIdentifier\", type: \"IA5String\" },\n 7: { name: \"iPAddress\", type: \"OCTET_STRING\" },\n 8: { name: \"registeredID\", type: \"OBJECT_IDENTIFIER\" },\n 32: { name: \"otherName\", type: \"AnotherName\" },\n };\n const blocks = readStruct(buffer, block);\n\n function _readFromType(buffer: Buffer, block: BlockInfo, type: string) {\n switch (type) {\n case \"IA5String\":\n return buffer.subarray(block.position, block.position + block.length).toString(\"ascii\");\n default:\n return buffer.subarray(block.position, block.position + block.length).toString(\"hex\");\n }\n }\n\n const n: { [key: string]: string[] } = {};\n for (const block of blocks) {\n // tslint:disable-next-line: no-bitwise\n assert((block.tag & 0x80) === 0x80);\n // tslint:disable-next-line: no-bitwise\n const t = block.tag & 0x7f;\n const type = _data[t] as { name: string; type: string } | undefined;\n // istanbul ignore next\n if (!type) {\n console.log(`_readGeneralNames: INVALID TYPE => ${t} 0x${t.toString(16)}`);\n continue;\n }\n\n if (t === 32) {\n // console.log(buffer.subarray(block.start, block.position+ block.length).toString(\"hex\"));\n n[type.name] = n[type.name] || [];\n\n const blocks2 = readStruct(buffer, block);\n const name = readObjectIdentifier(buffer, blocks2[0]).name;\n const buf = getBlock(buffer, blocks2[1]);\n const b = readTag(buf, 0);\n const nn = readValue(buf, b);\n // console.log(buf.toString(\"hex\"), buf.toString(\"ascii\"));\n // console.log(\"name = \", name, nn);\n const data = {\n identifier: name,\n value: nn,\n };\n n[type.name].push(data.value as string);\n } else {\n n[type.name] = n[type.name] || [];\n n[type.name].push(_readFromType(buffer, block, type.type));\n }\n }\n return n;\n}\n\nfunction _readSubjectAltNames(buffer: Buffer) {\n const block_info = readTag(buffer, 0);\n return _readGeneralNames(buffer, block_info);\n}\n\n// named X509KeyUsage not to confuse with DOM KeyUsage\nexport interface X509KeyUsage {\n digitalSignature: boolean;\n nonRepudiation: boolean;\n keyEncipherment: boolean;\n dataEncipherment: boolean;\n keyAgreement: boolean;\n keyCertSign: boolean;\n cRLSign: boolean;\n encipherOnly: boolean;\n decipherOnly: boolean;\n}\nexport interface X509ExtKeyUsage {\n clientAuth: boolean;\n serverAuth: boolean;\n codeSigning: boolean;\n emailProtection: boolean;\n timeStamping: boolean;\n ocspSigning: boolean;\n ipsecEndSystem: boolean;\n ipsecTunnel: boolean;\n ipsecUser: boolean;\n // etc ... to be completed\n}\n\nfunction readKeyUsage(_oid: string, buffer: Buffer): X509KeyUsage {\n const block_info = readTag(buffer, 0);\n\n // get value as BIT STRING\n let b2 = 0x00;\n let b3 = 0x00;\n if (block_info.length > 1) {\n // skip first byte, just indicates unused bits which\n // will be padded with 0s anyway\n // get bytes with flag bits\n b2 = buffer[block_info.position + 1];\n b3 = block_info.length > 2 ? buffer[block_info.position + 2] : 0;\n }\n\n // set flags\n return {\n // tslint:disable-next-line: no-bitwise\n digitalSignature: (b2 & 0x80) === 0x80,\n // tslint:disable-next-line: no-bitwise\n nonRepudiation: (b2 & 0x40) === 0x40,\n // tslint:disable-next-line: no-bitwise\n keyEncipherment: (b2 & 0x20) === 0x20,\n // tslint:disable-next-line: no-bitwise\n dataEncipherment: (b2 & 0x10) === 0x10,\n // tslint:disable-next-line: no-bitwise\n keyAgreement: (b2 & 0x08) === 0x08,\n // tslint:disable-next-line: no-bitwise\n keyCertSign: (b2 & 0x04) === 0x04,\n // tslint:disable-next-line: no-bitwise\n cRLSign: (b2 & 0x02) === 0x02,\n // tslint:disable-next-line: no-bitwise\n encipherOnly: (b2 & 0x01) === 0x01,\n // tslint:disable-next-line: no-bitwise\n decipherOnly: (b3 & 0x80) === 0x80,\n };\n}\n\nfunction readExtKeyUsage(oid: string, buffer: Buffer): X509ExtKeyUsage {\n assert(oid === \"2.5.29.37\");\n // see https://tools.ietf.org/html/rfc5280#section-4.2.1.12\n const block_info = readTag(buffer, 0);\n\n const inner_blocks = readStruct(buffer, block_info);\n\n const extKeyUsage: X509ExtKeyUsage = {\n serverAuth: false,\n clientAuth: false,\n codeSigning: false,\n emailProtection: false,\n timeStamping: false,\n ipsecEndSystem: false,\n ipsecTunnel: false,\n ipsecUser: false,\n ocspSigning: false,\n };\n for (const block of inner_blocks) {\n const identifier = readObjectIdentifier(buffer, block);\n // verify that identifier is one of the expected ones\n // to do\n\n // set flag\n extKeyUsage[identifier.name as keyof X509ExtKeyUsage] = true;\n }\n /*\n \n id-kp OBJECT IDENTIFIER ::= { id-pkix 3 }\n\n id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 }\n -- TLS WWW server authentication\n -- Key usage bits that may be consistent: digitalSignature,\n -- keyEncipherment or keyAgreement\n\n id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 }\n -- TLS WWW client authentication\n -- Key usage bits that may be consistent: digitalSignature\n -- and/or keyAgreement\n\n id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 }\n -- Signing of downloadable executable code\n -- Key usage bits that may be consistent: digitalSignature\n\n id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 }\n -- Email protection\n -- Key usage bits that may be consistent: digitalSignature,\n -- nonRepudiation, and/or (keyEncipherment or keyAgreement)\n\n id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 }\n -- Binding the hash of an object to a time\n -- Key usage bits that may be consistent: digitalSignature\n -- and/or nonRepudiation\n\n id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 }\n -- Signing OCSP responses\n -- Key usage bits that may be consistent: digitalSignature\n -- and/or nonRepudiation\n\n */\n // set flags\n return extKeyUsage;\n}\n\nexport interface SubjectPublicKey {\n modulus: Buffer;\n}\nfunction _readSubjectPublicKey(buffer: Buffer): SubjectPublicKey {\n const block_info = readTag(buffer, 0);\n const blocks = readStruct(buffer, block_info);\n\n return {\n modulus: buffer.subarray(blocks[0].position + 1, blocks[0].position + blocks[0].length),\n };\n}\n/*\n Extension ::= SEQUENCE {\n extnID OBJECT IDENTIFIER,\n critical BOOLEAN DEFAULT FALSE,\n extnValue OCTET STRING\n -- contains the DER encoding of an ASN.1 value\n -- corresponding to the extension type identified\n -- by extnID\n }\n */\nexport function readExtension(\n buffer: Buffer,\n block: BlockInfo,\n): {\n identifier: { oid: string; name: string };\n value: string | X509KeyUsage | X509ExtKeyUsage | AuthorityKeyIdentifier | BasicConstraints | { [key: string]: string[] };\n} {\n const inner_blocks = readStruct(buffer, block);\n\n if (inner_blocks.length === 3) {\n assert(inner_blocks[1].tag === TagType.BOOLEAN);\n inner_blocks[1] = inner_blocks[2];\n }\n\n const identifier = readObjectIdentifier(buffer, inner_blocks[0]);\n const buf = getBlock(buffer, inner_blocks[1]);\n let value:\n | string\n | X509KeyUsage\n | X509ExtKeyUsage\n | AuthorityKeyIdentifier\n | BasicConstraints\n | { [key: string]: string[] }\n | null = null;\n switch (identifier.name) {\n case \"subjectKeyIdentifier\":\n /* from https://tools.ietf.org/html/rfc3280#section-4.1 :\n For CA certificates, subject key identifiers SHOULD be derived from\n the public key or a method that generates unique values. Two common\n methods for generating key identifiers from the public key are:\n\n (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the\n value of the BIT STRING subjectPublicKey (excluding the tag,\n length, and number of unused bits).\n\n (2) The keyIdentifier is composed of a four bit type field with\n the value 0100 followed by the least significant 60 bits of the\n SHA-1 hash of the value of the BIT STRING subjectPublicKey\n (excluding the tag, length, and number of unused bit string bits).\n */\n value = formatBuffer2DigitHexWithColum(readOctetString(buffer, inner_blocks[1]));\n break;\n case \"subjectAltName\":\n value = _readSubjectAltNames(buf);\n break;\n case \"authorityKeyIdentifier\":\n value = _readAuthorityKeyIdentifier(buf);\n break;\n case \"basicConstraints\":\n value = readBasicConstraint2_5_29_19(buf, inner_blocks[1]); // \"2.5.29.19\":\n // \"basicConstraints ( not implemented yet) \" + buf.toString(\"hex\");\n break;\n case \"certExtension\": // Netscape\n value = `basicConstraints ( not implemented yet) ${buf.toString(\"hex\")}`;\n break;\n case \"extKeyUsage\":\n value = readExtKeyUsage(identifier.oid, buf);\n break;\n case \"keyUsage\":\n value = readKeyUsage(identifier.oid, buf);\n break;\n default:\n value = `Unknown ${identifier.name}${buf.toString(\"hex\")}`;\n }\n return {\n identifier,\n value,\n };\n}\n\n// Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension\nfunction _readExtensions(buffer: Buffer, block: BlockInfo): CertificateExtension {\n assert(block.tag === 0xa3);\n let inner_blocks = readStruct(buffer, block);\n inner_blocks = readStruct(buffer, inner_blocks[0]);\n\n const extensions = inner_blocks.map((block) => readExtension(buffer, block));\n\n const result: Record<\n string,\n string | AuthorityKeyIdentifier | BasicConstraints | X509KeyUsage | X509ExtKeyUsage | { [key: string]: string[] }\n > = {};\n for (const e of extensions) {\n result[e.identifier.name] = e.value;\n }\n return result as unknown as CertificateExtension;\n}\n\n/*\n SEQUENCE {\n 204 13: SEQUENCE {\n 206 9: OBJECT IDENTIFIER\n : rsaEncryption (1 2 840 113549 1 1 1)\n 217 0: NULL\n : }\n 219 141: BIT STRING, encapsulates {\n 223 137: SEQUENCE {\n 226 129: INTEGER\n : 00 C2 D7 97 6D 28 70 AA 5B CF 23 2E 80 70 39 EE\n : DB 6F D5 2D D5 6A 4F 7A 34 2D F9 22 72 47 70 1D\n : EF 80 E9 CA 30 8C 00 C4 9A 6E 5B 45 B4 6E A5 E6\n : 6C 94 0D FA 91 E9 40 FC 25 9D C7 B7 68 19 56 8F\n : 11 70 6A D7 F1 C9 11 4F 3A 7E 3F 99 8D 6E 76 A5\n : 74 5F 5E A4 55 53 E5 C7 68 36 53 C7 1D 3B 12 A6\n : 85 FE BD 6E A1 CA DF 35 50 AC 08 D7 B9 B4 7E 5C\n : FE E2 A3 2C D1 23 84 AA 98 C0 9B 66 18 9A 68 47\n : E9\n 358 3: INTEGER 65537\n : }\n : }\n : }\n */\n\nfunction _readSubjectPublicKeyInfo(buffer: Buffer, block: BlockInfo): SubjectPublicKeyInfo {\n const inner_blocks = readStruct(buffer, block);\n\n // algorithm identifier\n const algorithm = readAlgorithmIdentifier(buffer, inner_blocks[0]);\n //const parameters = _readBitString(buffer,inner_blocks[1]);\n const subjectPublicKey = readBitString(buffer, inner_blocks[1]);\n\n // read the 2 big integers of the key\n const data = subjectPublicKey.data;\n const values = readListOfInteger(data);\n // xx const value = _readListOfInteger(data);\n return {\n algorithm: algorithm.identifier,\n keyLength: (values[0].length - 1) as PublicKeyLength,\n subjectPublicKey: _readSubjectPublicKey(subjectPublicKey.data),\n //xx values: values,\n //xx values_length : values.map(function (a){ return a.length; })\n };\n}\n\nfunction _readSubjectECCPublicKeyInfo(buffer: Buffer, block: BlockInfo): SubjectPublicKeyInfo {\n const inner_blocks = readStruct(buffer, block);\n\n // first parameter is the second element of the first block, which is why we have another algorithm\n const algorithm = readECCAlgorithmIdentifier(buffer, inner_blocks[0]);\n\n // the public key is already in bit format, we just need to read it\n const subjectPublicKey = readBitString(buffer, inner_blocks[1]);\n\n // take out the data which is the entirity of our public key\n const data = subjectPublicKey.data;\n return {\n algorithm: algorithm.identifier,\n keyLength: (data.length - 1) as PublicKeyLength,\n subjectPublicKey: {\n modulus: data,\n },\n };\n}\n\nexport interface SubjectPublicKeyInfo {\n algorithm: string;\n keyLength: PublicKeyLength;\n subjectPublicKey: SubjectPublicKey;\n}\n\nexport interface BasicConstraints {\n critical: boolean;\n cA: boolean;\n pathLengthConstraint?: number; // 0 Unlimited\n}\n\nexport interface AuthorityKeyIdentifier {\n keyIdentifier: string | null;\n authorityCertIssuer: DirectoryName | null;\n authorityCertIssuerFingerPrint: string;\n serial: string | null;\n}\n\nexport interface CertificateExtension {\n basicConstraints: BasicConstraints;\n subjectKeyIdentifier?: string;\n authorityKeyIdentifier?: AuthorityKeyIdentifier;\n keyUsage?: X509KeyUsage;\n extKeyUsage?: X509ExtKeyUsage;\n subjectAltName?: { [key: string]: string[] };\n}\n\nexport interface TbsCertificate {\n version: number;\n serialNumber: string;\n issuer: DirectoryName;\n signature: AlgorithmIdentifier;\n validity: Validity;\n subject: DirectoryName;\n subjectFingerPrint: string;\n subjectPublicKeyInfo: SubjectPublicKeyInfo;\n extensions: CertificateExtension | null;\n}\n\nexport function readTbsCertificate(buffer: Buffer, block: BlockInfo): TbsCertificate {\n const blocks = readStruct(buffer, block);\n\n let _version: number;\n let serialNumber: string | undefined;\n let signature: AlgorithmIdentifier;\n let issuer: DirectoryName;\n let validity: Validity;\n let subject: DirectoryName;\n let subjectFingerPrint: string;\n let extensions: CertificateExtension | null;\n let subjectPublicKeyInfo: SubjectPublicKeyInfo;\n\n if (blocks.length === 6) {\n // X509 Version 1:\n _version = 1;\n\n serialNumber = formatBuffer2DigitHexWithColum(readLongIntegerValue(buffer, blocks[0]));\n signature = readAlgorithmIdentifier(buffer, blocks[1]);\n issuer = _readName(buffer, blocks[2]);\n validity = _readValidity(buffer, blocks[3]);\n subject = _readName(buffer, blocks[4]);\n subjectFingerPrint = formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, blocks[4])));\n subjectPublicKeyInfo = _readSubjectPublicKeyInfo(buffer, blocks[5]);\n\n extensions = null;\n } else {\n // X509 Version 3:\n const version_block = findBlockAtIndex(blocks, 0);\n if (!version_block) {\n throw new Error(\"cannot find version block\");\n }\n _version = readVersionValue(buffer, version_block) + 1;\n serialNumber = formatBuffer2DigitHexWithColum(readLongIntegerValue(buffer, blocks[1]));\n signature = readAlgorithmIdentifier(buffer, blocks[2]);\n issuer = _readName(buffer, blocks[3]);\n validity = _readValidity(buffer, blocks[4]);\n subject = _readName(buffer, blocks[5]);\n subjectFingerPrint = formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, blocks[5])));\n\n const inner_block = readStruct(buffer, blocks[6]);\n const what_type = readAlgorithmIdentifier(buffer, inner_block[0]).identifier;\n\n switch (what_type) {\n case \"rsaEncryption\": {\n subjectPublicKeyInfo = _readSubjectPublicKeyInfo(buffer, blocks[6]);\n break;\n }\n default: {\n assert(what_type === \"ecPublicKey\");\n subjectPublicKeyInfo = _readSubjectECCPublicKeyInfo(buffer, blocks[6]);\n break;\n }\n }\n\n const extensionBlock = findBlockAtIndex(blocks, 3);\n if (!extensionBlock) {\n // tslint:disable-next-line: no-console\n doDebug && console.log(`X509 certificate is invalid : cannot find extension block version = ${version_block}`);\n extensions = null;\n } else {\n extensions = _readExtensions(buffer, extensionBlock);\n }\n }\n\n return {\n version: _version,\n serialNumber,\n signature,\n issuer,\n validity,\n subject,\n subjectFingerPrint,\n subjectPublicKeyInfo,\n extensions,\n };\n}\nexport interface CertificateInternals {\n tbsCertificate: TbsCertificate;\n signatureAlgorithm: AlgorithmIdentifier;\n signatureValue: SignatureValue;\n}\n\ninterface CertificatePriv extends Certificate {\n _exploreCertificate_cache?: CertificateInternals;\n}\n/**\n * explore a certificate structure\n * @param certificate\n * @returns a json object that exhibits the internal data of the certificate\n */\nexport function exploreCertificate(certificate: Certificate): CertificateInternals {\n assert(Buffer.isBuffer(certificate));\n\n const certificate_priv = certificate as CertificatePriv;\n if (!certificate_priv._exploreCertificate_cache) {\n const block_info = readTag(certificate, 0);\n const blocks = readStruct(certificate, block_info);\n certificate_priv._exploreCertificate_cache = {\n tbsCertificate: readTbsCertificate(certificate, blocks[0]),\n signatureAlgorithm: readAlgorithmIdentifier(certificate, blocks[1]),\n signatureValue: readSignatureValue(certificate, blocks[2]),\n };\n }\n return certificate_priv._exploreCertificate_cache;\n}\n\n/**\n * @method split_der\n * split a multi chain certificates\n * @param certificateChain the certificate chain in der (binary) format}\n * @returns an array of Der , each element of the array is one certificate of the chain\n */\nexport function split_der(certificateChain: Certificate): Certificate[] {\n const certificate_chain: Buffer[] = [];\n\n do {\n const block_info = readTag(certificateChain, 0);\n const length = block_info.position + block_info.length;\n const der_certificate = certificateChain.subarray(0, length);\n certificate_chain.push(der_certificate);\n certificateChain = certificateChain.subarray(length);\n } while (certificateChain.length > 0);\n return certificate_chain;\n}\n\n/**\n * @method combine_der\n * combine an array of certificates into a single blob\n * @param certificates a array with the individual DER certificates of the chain\n * @return a concatenated buffer containing the certificates\n */\nexport function combine_der(certificates: Certificate[]): Certificate {\n // perform some sanity check\n for (const cert of certificates) {\n const b = split_der(cert);\n let sum = 0;\n b.forEach((block) => {\n const block_info = readTag(block, 0);\n //xx console.log(\"xxxx\" ,cert.length,block_info);\n //xx console.log(cert.toString(\"base64\"));\n assert(block_info.position + block_info.length === block.length);\n sum += block.length;\n });\n assert(sum === cert.length);\n }\n return Buffer.concat(certificates);\n}\n","import assert from \"node:assert\";\nimport type { DirectoryName } from \"./directory_name.js\";\nimport { oid_map } from \"./oid_map.js\";\n// https://github.com/lapo-luchini/asn1js/blob/master/asn1.js\nexport enum TagType {\n BOOLEAN = 0x01,\n INTEGER = 0x02,\n BIT_STRING = 0x03,\n OCTET_STRING = 0x04,\n NULL = 0x05,\n OBJECT_IDENTIFIER = 0x06,\n UTF8String = 0x0c,\n NumericString = 0x12,\n PrintableString = 0x13,\n TeletexString = 0x14,\n IA5String = 0x16,\n UTCTime = 0x17,\n GeneralizedTime = 0x18,\n GraphicString = 0x19,\n VisibleString = 0x1a,\n GeneralString = 0x1b,\n UniversalString = 0x1c,\n BMPString = 0x1e,\n\n SEQUENCE = 0x30,\n\n SET = 0x31,\n\n CONTEXT_SPECIFIC0 = 0xa0,\n CONTEXT_SPECIFIC1 = 0xa1,\n CONTEXT_SPECIFIC2 = 0xa2,\n CONTEXT_SPECIFIC3 = 0xa3,\n A4 = 0xa4,\n}\n\nexport interface BlockInfo {\n tag: TagType | number;\n position: number;\n length: number;\n start: number;\n}\n\nexport function readTag(buf: Buffer, pos: number): BlockInfo {\n const start = pos;\n // istanbul ignore next\n if (buf.length <= pos) {\n throw new Error(`Invalid position : buf.length=${buf.length} pos=${pos}`);\n }\n const tag = buf.readUInt8(pos);\n pos += 1;\n\n let length = buf.readUInt8(pos);\n pos += 1;\n\n // tslint:disable:no-bitwise\n if (length > 127) {\n const nbBytes = length & 0x7f;\n length = 0;\n for (let i = 0; i < nbBytes; i++) {\n length = length * 256 + buf.readUInt8(pos);\n pos += 1;\n }\n }\n return { start, tag, position: pos, length };\n}\n\nexport function readStruct(buf: Buffer, blockInfo: BlockInfo): BlockInfo[] {\n const length = blockInfo.length;\n let cursor = blockInfo.position;\n const end = blockInfo.position + length;\n const blocks: BlockInfo[] = [];\n while (cursor < end) {\n const inner = readTag(buf, cursor);\n cursor = inner.position + inner.length;\n blocks.push(inner);\n }\n return blocks;\n}\n\nexport function parseBitString(buffer: Buffer, start: number, end: number, maxLength: number): string {\n const unusedBit = buffer.readUInt8(start),\n lenBit = ((end - start - 1) << 3) - unusedBit,\n intro = `(${lenBit} bit)\\n`;\n\n let s = \"\",\n skip = unusedBit;\n\n for (let i = end - 1; i > start; --i) {\n const b = buffer.readUInt8(i);\n\n for (let j = skip; j < 8; ++j) {\n // noinspection JSBitwiseOperatorUsage\n s += (b >> j) & 1 ? \"1\" : \"0\";\n }\n skip = 0;\n assert(s.length <= maxLength);\n }\n return intro + s;\n}\n\nexport interface BitString {\n lengthInBits: number;\n lengthInBytes: number;\n data: Buffer;\n debug?: string;\n}\n\nexport function readBitString(buffer: Buffer, block: BlockInfo): BitString {\n assert(block.tag === TagType.BIT_STRING);\n const data = getBlock(buffer, block);\n // number of skipped bits\n const ignore_bits = data.readUInt8(0);\n\n return {\n lengthInBits: data.length * 8 - ignore_bits,\n lengthInBytes: data.length - 1,\n data: data.subarray(1),\n debug: parseBitString(buffer, block.position, block.length + block.position, 4 * 16 * 1024),\n };\n}\n\nexport function formatBuffer2DigitHexWithColum(buffer: Buffer): string {\n const value: string[] = [];\n for (let i = 0; i < buffer.length; i++) {\n value.push(`00${buffer.readUInt8(i).toString(16)}`.substr(-2, 2));\n }\n // remove leading 00\n return value\n .join(\":\")\n .toUpperCase()\n .replace(/^(00:)*/, \"\");\n}\n\nexport function readOctetString(buffer: Buffer, block: BlockInfo): Buffer {\n assert(block.tag === TagType.OCTET_STRING);\n const tag = readTag(buffer, block.position);\n assert(tag.tag === TagType.OCTET_STRING);\n\n const nbBytes = tag.length;\n const pos = tag.position;\n const b = buffer.subarray(pos, pos + nbBytes);\n return b;\n}\n\nexport function getBlock(buffer: Buffer, block: BlockInfo): Buffer {\n const start = block.position;\n const end = block.position + block.length;\n return buffer.subarray(start, end);\n}\n\nexport interface AlgorithmIdentifier {\n identifier: string;\n}\n\nexport function readIntegerAsByteString(buffer: Buffer, block: BlockInfo): Buffer {\n return getBlock(buffer, block);\n}\n\nexport function readListOfInteger(buffer: Buffer): Buffer[] {\n const block = readTag(buffer, 0);\n const inner_blocks = readStruct(buffer, block);\n return inner_blocks.map((innerBlock: BlockInfo) => {\n return readIntegerAsByteString(buffer, innerBlock);\n });\n}\n\nfunction parseOID(buffer: Buffer, start: number, end: number): string {\n // ASN.1 JavaScript decoder\n // Copyright (c) 2008-2014 Lapo Luchini <lapo@lapo.it>\n let s = \"\",\n n = 0,\n bits = 0;\n for (let i = start; i < end; ++i) {\n const v = buffer.readUInt8(i);\n\n // tslint:disable-next-line: no-bitwise\n n = n * 128 + (v & 0x7f);\n bits += 7;\n\n // noinspection JSBitwiseOperatorUsage\n // tslint:disable-next-line: no-bitwise\n if (!(v & 0x80)) {\n // finished\n if (s === \"\") {\n const m = n < 80 ? (n < 40 ? 0 : 1) : 2;\n s = `${m}.${n - m * 40}`;\n } else {\n s += `.${n.toString()}`;\n }\n n = 0;\n bits = 0;\n }\n }\n assert(bits === 0); // if (bits > 0) { s += \".incomplete\"; }\n return s;\n}\n\nexport function readObjectIdentifier(buffer: Buffer, block: BlockInfo): { oid: string; name: string } {\n assert(block.tag === TagType.OBJECT_IDENTIFIER);\n const b = buffer.subarray(block.position, block.position + block.length);\n const oid = parseOID(b, 0, block.length);\n return {\n oid,\n name: oid_map[oid] ? oid_map[oid].d : oid,\n };\n}\n\nexport function readAlgorithmIdentifier(buffer: Buffer, block: BlockInfo): AlgorithmIdentifier {\n const inner_blocks = readStruct(buffer, block);\n return {\n identifier: readObjectIdentifier(buffer, inner_blocks[0]).name,\n };\n}\n\nexport function readECCAlgorithmIdentifier(buffer: Buffer, block: BlockInfo): AlgorithmIdentifier {\n const inner_blocks = readStruct(buffer, block);\n return {\n identifier: readObjectIdentifier(buffer, inner_blocks[1]).name, // difference with RSA as algorithm is second element of nested block\n };\n}\n\nexport type SignatureValue = string;\n\nexport function readSignatureValueBin(buffer: Buffer, block: BlockInfo): Buffer {\n return readBitString(buffer, block).data;\n}\n\nexport function readSignatureValue(buffer: Buffer, block: BlockInfo): SignatureValue {\n return readSignatureValueBin(buffer, block).toString(\"hex\");\n}\n\nexport function readLongIntegerValue(buffer: Buffer, block: BlockInfo): Buffer {\n assert(block.tag === TagType.INTEGER, \"expecting a INTEGER tag\");\n const pos = block.position;\n const nbBytes = block.length;\n const buf = buffer.subarray(pos, pos + nbBytes);\n return buf;\n}\n\nexport function readIntegerValue(buffer: Buffer, block: BlockInfo): number {\n assert(block.tag === TagType.INTEGER, \"expecting a INTEGER tag\");\n let pos = block.position;\n const nbBytes = block.length;\n assert(nbBytes < 4);\n let value = 0;\n for (let i = 0; i < nbBytes; i++) {\n value = value * 256 + buffer.readUInt8(pos);\n pos += 1;\n }\n return value;\n}\n\nexport function readBooleanValue(buffer: Buffer, block: BlockInfo): boolean {\n assert(block.tag === TagType.BOOLEAN, `expecting a BOOLEAN tag. got ${TagType[block.tag]}`);\n const pos = block.position;\n const nbBytes = block.length;\n assert(nbBytes < 4);\n const value = !!buffer.readUInt8(pos);\n return value as boolean;\n}\n\nexport function readVersionValue(buffer: Buffer, block: BlockInfo): number {\n block = readTag(buffer, block.position);\n return readIntegerValue(buffer, block);\n}\n\n/*\n 4.1.2.5.2 GeneralizedTime\n\n The generalized time type, GeneralizedTime, is a standard ASN.1 type\n for variable precision representation of time. Optionally, the\n GeneralizedTime field can include a representation of the time\n differential between local and Greenwich Mean Time.\n\n For the purposes of this profile, GeneralizedTime values MUST be\n expressed Greenwich Mean Time (Zulu) and MUST include seconds (i.e.,\n times are YYYYMMDDHHMMSSZ), even where the number of seconds is zero.\n GeneralizedTime values MUST NOT include fractional seconds.\n\n */\nfunction convertGeneralizedTime(str: string): Date {\n const year = parseInt(str.substr(0, 4), 10);\n const month = parseInt(str.substr(4, 2), 10) - 1;\n const day = parseInt(str.substr(6, 2), 10);\n const hours = parseInt(str.substr(8, 2), 10);\n const mins = parseInt(str.substr(10, 2), 10);\n const secs = parseInt(str.substr(12, 2), 10);\n\n return new Date(Date.UTC(year, month, day, hours, mins, secs));\n}\n\nfunction _readBMPString(buffer: Buffer, block: BlockInfo): string {\n const strBuff = getBlock(buffer, block);\n let str = \"\";\n for (let i = 0; i < strBuff.length; i += 2) {\n const word = strBuff.readUInt16BE(i);\n str += String.fromCharCode(word);\n }\n return str;\n}\n\n/*\n http://tools.ietf.org/html/rfc5280\n\n 4.1.2.5. Validity\n [...]\n As conforming to this profile MUST always encode certificate\n validity dates through the year 2049 as UTCTime; certificate validity\n dates in 2050 or later MUST be encoded as GeneralizedTime.\n Conforming applications MUST be able to process validity dates that\n are encoded in either UTCTime or GeneralizedTime.\n [...]\n\n 4.1.2.5.1 UTCTime\n\n The universal time type, UTCTime, is a standard ASN.1 type intended\n for representation of dates and time. UTCTime specifies the year\n through the two low order digits and time is specified to the\n precision of one minute or one second. UTCTime includes either Z\n (for Zulu, or Greenwich Mean Time) or a time differential.\n\n For the purposes of this profile, UTCTime values MUST be expressed\n Greenwich Mean Time (Zulu) and MUST include seconds (i.e., times are\n YYMMDDHHMMSSZ), even where the number of seconds is zero. Conforming\n systems MUST interpret the year field (YY) as follows:\n\n Where YY is greater than or equal to 50, the year SHALL be\n interpreted as 19YY; and\n\n Where YY is less than 50, the year SHALL be interpreted as 20YY.\n */\nfunction convertUTCTime(str: string): Date {\n let year = parseInt(str.substr(0, 2), 10);\n const month = parseInt(str.substr(2, 2), 10) - 1;\n const day = parseInt(str.substr(4, 2), 10);\n const hours = parseInt(str.substr(6, 2), 10);\n const mins = parseInt(str.substr(8, 2), 10);\n const secs = parseInt(str.substr(10, 2), 10);\n\n year += year >= 50 ? 1900 : 2000;\n return new Date(Date.UTC(year, month, day, hours, mins, secs));\n}\n\nexport function readValue(buffer: Buffer, block: BlockInfo): unknown {\n switch (block.tag) {\n case TagType.BOOLEAN:\n return readBooleanValue(buffer, block);\n case TagType.BMPString:\n return _readBMPString(buffer, block);\n case TagType.PrintableString:\n case TagType.TeletexString:\n case TagType.UTF8String:\n case TagType.NumericString:\n case TagType.IA5String:\n return getBlock(buffer, block).toString(\"ascii\");\n case TagType.UTCTime:\n return convertUTCTime(getBlock(buffer, block).toString(\"ascii\"));\n case TagType.GeneralizedTime:\n return convertGeneralizedTime(getBlock(buffer, block).toString(\"ascii\"));\n default:\n throw new Error(`Invalid tag 0x${block.tag.toString(16)}`);\n //xx return \" ??? <\" + block.tag + \">\";\n }\n}\n\nexport function compactDirectoryName(d: DirectoryName): string {\n return JSON.stringify(d);\n}\n\nexport function findBlockAtIndex(blocks: BlockInfo[], index: number): BlockInfo | null {\n const tmp = blocks.filter((b: BlockInfo) => b.tag === 0xa0 + index || b.tag === 0x80 + index);\n if (tmp.length === 0) {\n return null;\n }\n return tmp[0];\n}\n\nexport function readTime(buffer: Buffer, block: BlockInfo): unknown {\n return readValue(buffer, block);\n}\n","// https://github.com/lapo-luchini/asn1js/blob/master/oids.js\nexport const oid_map: { [key: string]: { d: string; c: string; w?: boolean } } = {\n \"0.9.2342.19200300.100.1.1\": { d: \"userID\", c: \"Some oddball X.500 attribute collection\" },\n \"0.9.2342.19200300.100.1.3\": { d: \"rfc822Mailbox\", c: \"Some oddball X.500 attribute collection\" },\n \"0.9.2342.19200300.100.1.25\": { d: \"domainComponent\", c: \"Men are from Mars, this OID is from Pluto\" },\n\n \"1.2.840.10045.2\": { d: \"publicKeyType\", c: \"ANSI X9.62\" },\n \"1.2.840.10045.2.1\": { d: \"ecPublicKey\", c: \"ANSI X9.62 public key type\" },\n \"1.2.840.10045.3.0.1\": { d: \"c2pnb163v1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.2\": { d: \"c2pnb163v2\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.3\": { d: \"c2pnb163v3\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.5\": { d: \"c2tnb191v1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.6\": { d: \"c2tnb191v2\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.7\": { d: \"c2tnb191v3\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.10\": { d: \"c2pnb208w1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.11\": { d: \"c2tnb239v1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.12\": { d: \"c2tnb239v2\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.13\": { d: \"c2tnb239v3\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.16\": { d: \"c2pnb272w1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.18\": { d: \"c2tnb359v1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.19\": { d: \"c2pnb368w1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.0.20\": { d: \"c2tnb431r1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.1\": { d: \"prime192v1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.2\": { d: \"prime192v2\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.3\": { d: \"prime192v3\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.4\": { d: \"prime239v1\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.5\": { d: \"prime239v2\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.6\": { d: \"prime239v3\", c: \"ANSI X9.62 named elliptic curve\" },\n \"1.2.840.10045.3.1.7\": { d: \"prime256v1\", c: \"ANSI X9.62 named elliptic curve\" },\n\n \"1.2.840.113549.1.1\": { d: \"pkcs-1\", c: \"\", w: false },\n \"1.2.840.113549.1.1.1\": { d: \"rsaEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.2\": { d: \"md2WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.3\": { d: \"md4WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.4\": { d: \"md5WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.5\": { d: \"sha1WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.7\": { d: \"rsaOAEP\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.8\": { d: \"pkcs1-MGF\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.9\": { d: \"rsaOAEP-pSpecified\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.10\": { d: \"rsaPSS\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.11\": { d: \"sha256WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.12\": { d: \"sha384WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.13\": { d: \"sha512WithRSAEncryption\", c: \"PKCS #1\", w: false },\n \"1.2.840.113549.1.1.14\": { d: \"sha224WithRSAEncryption\", c: \"PKCS #1\", w: false },\n\n \"1.2.840.113549.1.9.1\": {\n d: \"emailAddress\",\n c: \"PKCS #9. Deprecated, use an altName extension instead\",\n w: false,\n },\n \"1.2.840.113549.1.9.2\": { d: \"unstructuredName\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.3\": { d: \"contentType\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.4\": { d: \"messageDigest\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.5\": { d: \"signingTime\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.6\": { d: \"countersignature\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.7\": { d: \"challengePassword\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.8\": { d: \"unstructuredAddress\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.9\": { d: \"extendedCertificateAttributes\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.10\": { d: \"issuerAndSerialNumber\", c: \"PKCS #9 experimental\", w: true },\n \"1.2.840.113549.1.9.11\": { d: \"passwordCheck\", c: \"PKCS #9 experimental\", w: true },\n \"1.2.840.113549.1.9.12\": { d: \"publicKey\", c: \"PKCS #9 experimental\", w: true },\n \"1.2.840.113549.1.9.13\": { d: \"signingDescription\", c: \"PKCS #9\", w: false },\n \"1.2.840.113549.1.9.14\": { d: \"extensionRequest\", c: \"PKCS #9 via CRMF\", w: false },\n\n \"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\" },\n \"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\" },\n \"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\" },\n \"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)\" },\n\n \"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\" },\n\n \"1.3.6.1.5.5.7.3.17\": { d: \"1.3.6.1.5.5.7.3.17\", c: \"Internet Key Exchange (IKE)\" },\n\n \"1.3.6.1.5.5.7.3.1\": { d: \"serverAuth\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.2\": { d: \"clientAuth\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.3\": { d: \"codeSigning\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.4\": { d: \"emailProtection\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.5\": { d: \"ipsecEndSystem\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.6\": { d: \"ipsecTunnel\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.7\": { d: \"ipsecUser\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.8\": { d: \"timeStamping\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.9\": { d: \"ocspSigning\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.10\": { d: \"dvcs\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.11\": { d: \"sbgpCertAAServerAuth\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.13\": { d: \"eapOverPPP\", c: \"PKIX key purpose\" },\n \"1.3.6.1.5.5.7.3.14\": { d: \"eapOverLAN\", c: \"PKIX key purpose\" },\n\n \"1.3.36.3.3.2.8.1.1.1\": { d: \"brainpoolP160r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.2\": { d: \"brainpoolP160t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.3\": { d: \"brainpoolP192r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.4\": { d: \"brainpoolP192t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.5\": { d: \"brainpoolP224r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.6\": { d: \"brainpoolP224t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.7\": { d: \"brainpoolP256r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.8\": { d: \"brainpoolP256t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.9\": { d: \"brainpoolP320r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.10\": { d: \"brainpoolP320t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.11\": { d: \"brainpoolP384r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.12\": { d: \"brainpoolP384t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.13\": { d: \"brainpoolP512r1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n \"1.3.36.3.3.2.8.1.1.14\": { d: \"brainpoolP512t1\", c: \"ECC Brainpool Standard Curves and Curve Generation\" },\n\n \"2.5.4.0\": { d: \"objectClass\", c: \"X.520 DN component\", w: false },\n \"2.5.4.1\": { d: \"aliasedEntryName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.2\": { d: \"knowledgeInformation\", c: \"X.520 DN component\", w: false },\n \"2.5.4.3\": { d: \"commonName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.4\": { d: \"surname\", c: \"X.520 DN component\", w: false },\n \"2.5.4.5\": { d: \"serialNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.6\": { d: \"countryName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.7\": { d: \"localityName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.7.1\": { d: \"collectiveLocalityName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.8\": { d: \"stateOrProvinceName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.8.1\": { d: \"collectiveStateOrProvinceName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.9\": { d: \"streetAddress\", c: \"X.520 DN component\", w: false },\n \"2.5.4.9.1\": { d: \"collectiveStreetAddress\", c: \"X.520 DN component\", w: false },\n \"2.5.4.10\": { d: \"organizationName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.10.1\": { d: \"collectiveOrganizationName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.11\": { d: \"organizationalUnitName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.11.1\": { d: \"collectiveOrganizationalUnitName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.12\": { d: \"title\", c: \"X.520 DN component\", w: false },\n \"2.5.4.13\": { d: \"description\", c: \"X.520 DN component\", w: false },\n \"2.5.4.14\": { d: \"searchGuide\", c: \"X.520 DN component\", w: false },\n \"2.5.4.15\": { d: \"businessCategory\", c: \"X.520 DN component\", w: false },\n \"2.5.4.16\": { d: \"postalAddress\", c: \"X.520 DN component\", w: false },\n \"2.5.4.16.1\": { d: \"collectivePostalAddress\", c: \"X.520 DN component\", w: false },\n \"2.5.4.17\": { d: \"postalCode\", c: \"X.520 DN component\", w: false },\n \"2.5.4.17.1\": { d: \"collectivePostalCode\", c: \"X.520 DN component\", w: false },\n \"2.5.4.18\": { d: \"postOfficeBox\", c: \"X.520 DN component\", w: false },\n \"2.5.4.18.1\": { d: \"collectivePostOfficeBox\", c: \"X.520 DN component\", w: false },\n \"2.5.4.19\": { d: \"physicalDeliveryOfficeName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.19.1\": { d: \"collectivePhysicalDeliveryOfficeName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.20\": { d: \"telephoneNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.20.1\": { d: \"collectiveTelephoneNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.21\": { d: \"telexNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.21.1\": { d: \"collectiveTelexNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.22\": { d: \"teletexTerminalIdentifier\", c: \"X.520 DN component\", w: false },\n \"2.5.4.22.1\": { d: \"collectiveTeletexTerminalIdentifier\", c: \"X.520 DN component\", w: false },\n \"2.5.4.23\": { d: \"facsimileTelephoneNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.23.1\": { d: \"collectiveFacsimileTelephoneNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.24\": { d: \"x121Address\", c: \"X.520 DN component\", w: false },\n \"2.5.4.25\": { d: \"internationalISDNNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.25.1\": { d: \"collectiveInternationalISDNNumber\", c: \"X.520 DN component\", w: false },\n \"2.5.4.26\": { d: \"registeredAddress\", c: \"X.520 DN component\", w: false },\n \"2.5.4.27\": { d: \"destinationIndicator\", c: \"X.520 DN component\", w: false },\n \"2.5.4.28\": { d: \"preferredDeliveryMehtod\", c: \"X.520 DN component\", w: false },\n \"2.5.4.29\": { d: \"presentationAddress\", c: \"X.520 DN component\", w: false },\n \"2.5.4.30\": { d: \"supportedApplicationContext\", c: \"X.520 DN component\", w: false },\n \"2.5.4.31\": { d: \"member\", c: \"X.520 DN component\", w: false },\n \"2.5.4.32\": { d: \"owner\", c: \"X.520 DN component\", w: false },\n \"2.5.4.33\": { d: \"roleOccupant\", c: \"X.520 DN component\", w: false },\n \"2.5.4.34\": { d: \"seeAlso\", c: \"X.520 DN component\", w: false },\n \"2.5.4.35\": { d: \"userPassword\", c: \"X.520 DN component\", w: false },\n \"2.5.4.36\": { d: \"userCertificate\", c: \"X.520 DN component\", w: false },\n \"2.5.4.37\": { d: \"caCertificate\", c: \"X.520 DN component\", w: false },\n \"2.5.4.38\": { d: \"authorityRevocationList\", c: \"X.520 DN component\", w: false },\n \"2.5.4.39\": { d: \"certificateRevocationList\", c: \"X.520 DN component\", w: false },\n \"2.5.4.40\": { d: \"crossCertificatePair\", c: \"X.520 DN component\", w: false },\n \"2.5.4.41\": { d: \"name\", c: \"X.520 DN component\", w: false },\n \"2.5.4.42\": { d: \"givenName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.43\": { d: \"initials\", c: \"X.520 DN component\", w: false },\n \"2.5.4.44\": { d: \"generationQualifier\", c: \"X.520 DN component\", w: false },\n \"2.5.4.45\": { d: \"uniqueIdentifier\", c: \"X.520 DN component\", w: false },\n \"2.5.4.46\": { d: \"dnQualifier\", c: \"X.520 DN component\", w: false },\n \"2.5.4.47\": { d: \"enhancedSearchGuide\", c: \"X.520 DN component\", w: false },\n \"2.5.4.48\": { d: \"protocolInformation\", c: \"X.520 DN component\", w: false },\n \"2.5.4.49\": { d: \"distinguishedName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.50\": { d: \"uniqueMember\", c: \"X.520 DN component\", w: false },\n \"2.5.4.51\": { d: \"houseIdentifier\", c: \"X.520 DN component\", w: false },\n \"2.5.4.52\": { d: \"supportedAlgorithms\", c: \"X.520 DN component\", w: false },\n \"2.5.4.53\": { d: \"deltaRevocationList\", c: \"X.520 DN component\", w: false },\n \"2.5.4.54\": { d: \"dmdName\", c: \"X.520 DN component\", w: false },\n \"2.5.4.55\": { d: \"clearance\", c: \"X.520 DN component\", w: false },\n \"2.5.4.56\": { d: \"defaultDirQop\", c: \"X.520 DN component\", w: false },\n \"2.5.4.57\": { d: \"attributeIntegrityInfo\", c: \"X.520 DN component\", w: false },\n \"2.5.4.58\": { d: \"attributeCertificate\", c: \"X.520 DN component\", w: false },\n \"2.5.4.59\": { d: \"attributeCertificateRevocationList\", c: \"X.520 DN component\", w: false },\n \"2.5.4.60\": { d: \"confKeyInfo\", c: \"X.520 DN component\", w: false },\n \"2.5.4.61\": { d: \"aACertificate\", c: \"X.520 DN component\", w: false },\n \"2.5.4.62\": { d: \"attributeDescriptorCertificate\", c: \"X.520 DN component\", w: false },\n \"2.5.4.63\": { d: \"attributeAuthorityRevocationList\", c: \"X.520 DN component\", w: false },\n \"2.5.4.64\": { d: \"familyInformation\", c: \"X.520 DN component\", w: false },\n \"2.5.4.65\": { d: \"pseudonym\", c: \"X.520 DN component\", w: false },\n \"2.5.4.66\": { d: \"communicationsService\", c: \"X.520 DN component\", w: false },\n \"2.5.4.67\": { d: \"communicationsNetwork\", c: \"X.520 DN component\", w: false },\n \"2.5.4.68\": { d: \"certificationPracticeStmt\", c: \"X.520 DN component\", w: false },\n \"2.5.4.69\": { d: \"certificatePolicy\", c: \"X.520 DN component\", w: false },\n \"2.5.4.70\": { d: \"pkiPath\", c: \"X.520 DN component\", w: false },\n \"2.5.4.71\": { d: \"privPolicy\", c: \"X.520 DN component\", w: false },\n \"2.5.4.72\": { d: \"role\", c: \"X.520 DN component\", w: false },\n \"2.5.4.73\": { d: \"delegationPath\", c: \"X.520 DN component\", w: false },\n \"2.5.4.74\": { d: \"protPrivPolicy\", c: \"X.520 DN component\", w: false },\n \"2.5.4.75\": { d: \"xMLPrivilegeInfo\", c: \"X.520 DN component\", w: false },\n \"2.5.4.76\": { d: \"xmlPrivPolicy\", c: \"X.520 DN component\", w: false },\n \"2.5.4.82\": { d: \"permission\", c: \"X.520 DN component\", w: false },\n \"2.5.6.0\": { d: \"top\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.1\": { d: \"alias\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.2\": { d: \"country\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.3\": { d: \"locality\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.4\": { d: \"organization\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.5\": { d: \"organizationalUnit\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.6\": { d: \"person\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.7\": { d: \"organizationalPerson\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.8\": { d: \"organizationalRole\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.9\": { d: \"groupOfNames\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.10\": { d: \"residentialPerson\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.11\": { d: \"applicationProcess\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.12\": { d: \"applicationEntity\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.13\": { d: \"dSA\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.14\": { d: \"device\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.15\": { d: \"strongAuthenticationUser\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.16\": { d: \"certificateAuthority\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.17\": { d: \"groupOfUniqueNames\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.21\": { d: \"pkiUser\", c: \"X.520 objectClass\", w: false },\n \"2.5.6.22\": { d: \"pkiCA\", c: \"X.520 objectClass\", w: false },\n\n \"2.5.29.1\": { d: \"authorityKeyIdentifier\", c: \"X.509 extension. Deprecated, use 2 5 29 35 instead\", w: true },\n \"2.5.29.2\": { d: \"keyAttributes\", c: \"X.509 extension. Obsolete, use keyUsage/extKeyUsage instead\", w: true },\n \"2.5.29.3\": { d: \"certificatePolicies\", c: \"X.509 extension. Deprecated, use 2 5 29 32 instead\", w: true },\n \"2.5.29.4\": {\n d: \"keyUsageRestriction\",\n c: \"X.509 extension. Obsolete, use keyUsage/extKeyUsage instead\",\n w: true,\n },\n \"2.5.29.5\": { d: \"policyMapping\", c: \"X.509 extension. Deprecated, use 2 5 29 33 instead\", w: true },\n \"2.5.29.6\": { d: \"subtreesConstraint\", c: \"X.509 extension. Obsolete, use nameConstraints instead\", w: true },\n \"2.5.29.7\": { d: \"subjectAltName\", c: \"X.509 extension. Deprecated, use 2 5 29 17 instead\", w: true },\n \"2.5.29.8\": { d: \"issuerAltName\", c: \"X.509 extension. Deprecated, use 2 5 29 18 instead\", w: true },\n \"2.5.29.9\": { d: \"subjectDirectoryAttributes\", c: \"X.509 extension\", w: false },\n \"2.5.29.10\": { d: \"basicConstraints\", c: \"X.509 extension. Deprecated, use 2 5 29 19 instead\", w: true },\n \"2.5.29.11\": { d: \"nameConstraints\", c: \"X.509 extension. Deprecated, use 2 5 29 30 instead\", w: true },\n \"2.5.29.12\": { d: \"policyConstraints\", c: \"X.509 extension. Deprecated, use 2 5 29 36 instead\", w: true },\n \"2.5.29.13\": { d: \"basicConstraints\", c: \"X.509 extension. Deprecated, use 2 5 29 19 instead\", w: true },\n \"2.5.29.14\": { d: \"subjectKeyIdentifier\", c: \"X.509 extension\", w: false },\n \"2.5.29.15\": { d: \"keyUsage\", c: \"X.509 extension\", w: false },\n \"2.5.29.16\": { d: \"privateKeyUsagePeriod\", c: \"X.509 extension\", w: false },\n \"2.5.29.17\": { d: \"subjectAltName\", c: \"X.509 extension\", w: false },\n \"2.5.29.18\": { d: \"issuerAltName\", c: \"X.509 extension\", w: false },\n \"2.5.29.19\": { d: \"basicConstraints\", c: \"X.509 extension\", w: false },\n \"2.5.29.20\": { d: \"cRLNumber\", c: \"X.509 extension\", w: false },\n \"2.5.29.21\": { d: \"cRLReason\", c: \"X.509 extension\", w: false },\n \"2.5.29.22\": { d: \"expirationDate\", c: \"X.509 extension. Deprecated, alternative OID uncertain\", w: true },\n \"2.5.29.23\": { d: \"instructionCode\", c: \"X.509 extension\", w: false },\n \"2.5.29.24\": { d: \"invalidityDate\", c: \"X.509 extension\", w: false },\n \"2.5.29.25\": { d: \"cRLDistributionPoints\", c: \"X.509 extension. Deprecated, use 2 5 29 31 instead\", w: true },\n \"2.5.29.26\": {\n d: \"issuingDistributionPoint\",\n c: \"X.509 extension. Deprecated, use 2 5 29 28 instead\",\n w: true,\n },\n \"2.5.29.27\": { d: \"deltaCRLIndicator\", c: \"X.509 extension\", w: false },\n \"2.5.29.28\": { d: \"issuingDistributionPoint\", c: \"X.509 extension\", w: false },\n \"2.5.29.29\": { d: \"certificateIssuer\", c: \"X.509 extension\", w: false },\n \"2.5.29.30\": { d: \"nameConstraints\", c: \"X.509 extension\", w: false },\n \"2.5.29.31\": { d: \"cRLDistributionPoints\", c: \"X.509 extension\", w: false },\n \"2.5.29.32\": { d: \"certificatePolicies\", c: \"X.509 extension\", w: false },\n \"2.5.29.32.0\": { d: \"anyPolicy\", c: \"X.509 certificate policy\", w: false },\n \"2.5.29.33\": { d: \"policyMappings\", c: \"X.509 extension\", w: false },\n \"2.5.29.34\": { d: \"policyConstraints\", c: \"X.509 extension. Deprecated, use 2 5 29 36 instead\", w: true },\n \"2.5.29.35\": { d: \"authorityKeyIdentifier\", c: \"X.509 extension\", w: false },\n \"2.5.29.36\": { d: \"policyConstraints\", c: \"X.509 extension\", w: false },\n \"2.5.29.37\": { d: \"extKeyUsage\", c: \"X.509 extension\", w: false },\n \"2.5.29.37.0\": { d: \"anyExtendedKeyUsage\", c: \"X.509 extended key usage\", w: false },\n \"2.5.29.38\": { d: \"authorityAttributeIdentifier\", c: \"X.509 extension\", w: false },\n \"2.5.29.39\": { d: \"roleSpecCertIdentifier\", c: \"X.509 extension\", w: false },\n \"2.5.29.40\": { d: \"cRLStreamIdentifier\", c: \"X.509 extension\", w: false },\n \"2.5.29.41\": { d: \"basicAttConstraints\", c: \"X.509 extension\", w: false },\n \"2.5.29.42\": { d: \"delegatedNameConstraints\", c: \"X.509 extension\", w: false },\n \"2.5.29.43\": { d: \"timeSpecification\", c: \"X.509 extension\", w: false },\n \"2.5.29.44\": { d: \"cRLScope\", c: \"X.509 extension\", w: false },\n \"2.5.29.45\": { d: \"statusReferrals\", c: \"X.509 extension\", w: false },\n \"2.5.29.46\": { d: \"freshestCRL\", c: \"X.509 extension\", w: false },\n \"2.5.29.47\": { d: \"orderedList\", c: \"X.509 extension\", w: false },\n \"2.5.29.48\": { d: \"attributeDescriptor\", c: \"X.509 extension\", w: false },\n \"2.5.29.49\": { d: \"userNotice\", c: \"X.509 extension\", w: false },\n \"2.5.29.50\": { d: \"sOAIdentifier\", c: \"X.509 extension\", w: false },\n \"2.5.29.51\": { d: \"baseUpdateTime\", c: \"X.509 extension\", w: false },\n \"2.5.29.52\": { d: \"acceptableCertPolicies\", c: \"X.509 extension\", w: false },\n \"2.5.29.53\": { d: \"deltaInfo\", c: \"X.509 extension\", w: false },\n \"2.5.29.54\": { d: \"inhibitAnyPolicy\", c: \"X.509 extension\", w: false },\n \"2.5.29.55\": { d: \"targetInformation\", c: \"X.509 extension\", w: false },\n \"2.5.29.56\": { d: \"noRevAvail\", c: \"X.509 extension\", w: false },\n \"2.5.29.57\": { d: \"acceptablePrivilegePolicies\", c: \"X.509 extension\", w: false },\n \"2.5.29.58\": { d: \"toBeRevoked\", c: \"X.509 extension\", w: false },\n \"2.5.29.59\": { d: \"revokedGroups\", c: \"X.509 extension\", w: false },\n \"2.5.29.60\": { d: \"expiredCertsOnCRL\", c: \"X.509 extension\", w: false },\n \"2.5.29.61\": { d: \"indirectIssuer\", c: \"X.509 extension\", w: false },\n \"2.5.29.62\": { d: \"noAssertion\", c: \"X.509 extension\", w: false },\n \"2.5.29.63\": { d: \"aAissuingDistributionPoint\", c: \"X.509 extension\", w: false },\n \"2.5.29.64\": { d: \"issuedOnBehalfOf\", c: \"X.509 extension\", w: false },\n \"2.5.29.65\": { d: \"singleUse\", c: \"X.509 extension\", w: false },\n \"2.5.29.66\": { d: \"groupAC\", c: \"X.509 extension\", w: false },\n \"2.5.29.67\": { d: \"allowedAttAss\", c: \"X.509 extension\", w: false },\n \"2.5.29.68\": { d: \"attributeMappings\", c: \"X.509 extension\", w: false },\n \"2.5.29.69\": { d: \"holderNameConstraints\", c: \"X.509 extension\", w: false },\n\n // Netscape certificate type\n // An X.509 v3 certificate extension used to identify whether\n // the certificate subject is an SSL client, …\n \"2.16.840.1.113730.1\": { d: \"certExtension\", c: \"Netscape\" },\n \"2.16.840.1.113730.1.1\": { d: \"netscapeCertType\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.2\": { d: \"netscapeBaseUrl\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.3\": { d: \"netscapeRevocationUrl\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.4\": { d: \"netscapeCaRevocationUrl\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.7\": { d: \"netscapeCertRenewalUrl\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.8\": { d: \"netscapeCaPolicyUrl\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.9\": { d: \"HomePageUrl\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.10\": { d: \"EntityLogo\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.11\": { d: \"UserPicture\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.12\": { d: \"netscapeSslServerName\", c: \"Netscape certificate extension\" },\n \"2.16.840.1.113730.1.13\": { d: \"netscapeComment\", c: \"Netscape certificate extension\" },\n\n done: { d: \"\", c: \"\" },\n};\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport assert from \"node:assert\";\n// tslint:disabled:no-var-requires\n/**\n * @module node_opcua_crypto\n */\nimport constants from \"node:constants\";\nimport {\n createHash,\n createPublicKey,\n createSign,\n createVerify,\n type KeyLike,\n type KeyObject,\n privateDecrypt as privateDecrypt1,\n publicEncrypt as publicEncrypt1,\n} from \"node:crypto\";\nimport { createFastUninitializedBuffer } from \"./buffer_utils.js\";\nimport type { Certificate, CertificatePEM, DER, PEM, PrivateKey, PublicKeyPEM, Signature } from \"./common.js\";\nimport { combine_der } from \"./crypto_explore_certificate.js\";\nimport { hexy } from \"./hexy.js\";\n\nconst PEM_REGEX = /^(-----BEGIN (.*)-----\\r?\\n([/+=a-zA-Z0-9\\r\\n]*)\\r?\\n-----END \\2-----\\r?\\n?)/gm;\n\nconst PEM_TYPE_REGEX = /^(-----BEGIN (.*)-----)/m;\n// Copyright 2012 The Obvious Corporation.\n// identifyPemType\n\n/*=\n * Extract and identify the PEM file type represented in the given\n * buffer. Returns the extracted type string or undefined if the\n * buffer doesn't seem to be any sort of PEM format file.\n */\nexport function identifyPemType(rawKey: Buffer | string): undefined | string {\n if (Buffer.isBuffer(rawKey)) {\n rawKey = rawKey.toString(\"utf8\");\n }\n const match = PEM_TYPE_REGEX.exec(rawKey as string);\n return !match ? undefined : match[2];\n}\n\nexport function removeTrailingLF(str: string): string {\n const tmp = str.replace(/(\\r|\\n)+$/m, \"\").replace(/\\r\\n/gm, \"\\n\");\n return tmp;\n}\n\nexport function toPem(raw_key: Buffer | string, pem: string): string {\n assert(raw_key, \"expecting a key\");\n assert(typeof pem === \"string\");\n let pemType = identifyPemType(raw_key);\n if (pemType) {\n return Buffer.isBuffer(raw_key)\n ? removeTrailingLF((raw_key as Buffer).toString(\"utf8\"))\n : removeTrailingLF(raw_key as string);\n } else {\n pemType = pem;\n assert([\"CERTIFICATE REQUEST\", \"CERTIFICATE\", \"RSA PRIVATE KEY\", \"PUBLIC KEY\", \"X509 CRL\"].indexOf(pemType) >= 0);\n let b = (raw_key as Buffer).toString(\"base64\");\n let str = `-----BEGIN ${pemType}-----\\n`;\n while (b.length) {\n str += `${b.substring(0, 64)}\\n`;\n b = b.substring(64);\n }\n str += `-----END ${pemType}-----`;\n // no leading \\n\n return str;\n }\n}\n\nexport function convertPEMtoDER(raw_key: PEM): DER {\n let match: RegExpExecArray | null;\n let _pemType: string;\n let base64str: string;\n\n const parts: DER[] = [];\n\n PEM_REGEX.lastIndex = 0;\n match = PEM_REGEX.exec(raw_key);\n while (match !== null) {\n _pemType = match[2];\n // pemType shall be \"RSA PRIVATE KEY\" , \"PUBLIC KEY\", \"CERTIFICATE\", \"X509 CRL\"\n base64str = match[3];\n base64str = base64str.replace(/\\r?\\n/g, \"\");\n parts.push(Buffer.from(base64str, \"base64\"));\n match = PEM_REGEX.exec(raw_key);\n }\n return combine_der(parts);\n}\n\n// istanbul ignore next\nexport function hexDump(buffer: Buffer, width?: number): string {\n if (!buffer) {\n return \"<>\";\n }\n width = width || 32;\n if (buffer.length > 1024) {\n return `${hexy(buffer.subarray(0, 1024), { width, format: \"twos\" })}\\n .... ( ${buffer.length})`;\n } else {\n return hexy(buffer, { width, format: \"twos\" });\n }\n}\n\ninterface MakeMessageChunkSignatureOptions {\n signatureLength: number;\n algorithm: string;\n privateKey: PrivateKey;\n}\n\nexport function makeMessageChunkSignature(chunk: Buffer, options: MakeMessageChunkSignatureOptions): Buffer {\n // signature length = 128 bytes\n const signer = createSign(options.algorithm);\n signer.update(chunk);\n const signature = signer.sign(options.privateKey.hidden as KeyObject);\n assert(!options.signatureLength || signature.length === options.signatureLength);\n return signature;\n}\n\nexport interface VerifyMessageChunkSignatureOptions {\n signatureLength?: number;\n algorithm: string;\n publicKey: PublicKeyPEM;\n}\n\n/**\n * @method verifyMessageChunkSignature\n *\n * const signer = {\n * signatureLength : 128,\n * algorithm : \"RSA-SHA256\",\n * publicKey: \"qsdqsdqsd\"\n * };\n * @param blockToVerify\n * @param signature\n * @param options\n * @param options.signatureLength\n * @param options.algorithm for example \"RSA-SHA256\"\n * @param options.publicKey\n * @return true if the signature is valid\n */\nexport function verifyMessageChunkSignature(\n blockToVerify: Buffer,\n signature: Signature,\n options: VerifyMessageChunkSignatureOptions,\n): boolean {\n // Note those assets are failing in web browse\n // assert(blockToVerify instanceof Buffer || blockToVerify instanceof Uint8Array);\n // assert(signature instanceof Buffer || blockToVerify instanceof Uint8Array);\n // assert(typeof options.publicKey === \"string\");\n // assert(identifyPemType(options.publicKey));\n\n const verify = createVerify(options.algorithm);\n verify.update(blockToVerify);\n return verify.verify(options.publicKey, signature);\n}\n\nexport function makeSHA1Thumbprint(buffer: Buffer): Signature {\n return createHash(\"sha1\").update(buffer).digest();\n}\n\n// Basically when you =encrypt something using an RSA key (whether public or private), the encrypted value must\n// be smaller than the key (due to the maths used to do the actual encryption). So if you have a 1024-bit key,\n// in theory you could encrypt any 1023-bit value (or a 1024-bit value smaller than the key) with that key.\n// However, the PKCS#1 standard, which OpenSSL uses, specifies a padding scheme (so you can encrypt smaller\n// quantities without losing security), and that padding scheme takes a minimum of 11 bytes (it will be longer\n// if the value you're encrypting is smaller). So the highest number of bits you can encrypt with a 1024-bit\n// key is 936 bits because of this (unless you disable the padding by adding the OPENSSL_NO_PADDING flag,\n// in which case you can go up to 1023-1024 bits). With a 2048-bit key it's 1960 bits instead.\n\nexport const RSA_PKCS1_OAEP_PADDING: number = constants.RSA_PKCS1_OAEP_PADDING;\nexport const RSA_PKCS1_PADDING: number = constants.RSA_PKCS1_PADDING;\n\nexport enum PaddingAlgorithm {\n RSA_PKCS1_OAEP_PADDING = 4,\n RSA_PKCS1_PADDING = 1,\n}\n\nassert(PaddingAlgorithm.RSA_PKCS1_OAEP_PADDING === constants.RSA_PKCS1_OAEP_PADDING);\nassert(PaddingAlgorithm.RSA_PKCS1_PADDING === constants.RSA_PKCS1_PADDING);\n\n// publicEncrypt and privateDecrypt only work with\n// small buffer that depends of the key size.\nexport function publicEncrypt_native(buffer: Buffer, publicKey: KeyLike, algorithm?: PaddingAlgorithm): Buffer {\n if (algorithm === undefined) {\n algorithm = PaddingAlgorithm.RSA_PKCS1_OAEP_PADDING;\n }\n return publicEncrypt1(\n {\n key: publicKey,\n padding: algorithm,\n },\n buffer,\n );\n}\n\nexport function privateDecrypt_native(buffer: Buffer, privateKey: PrivateKey, algorithm?: PaddingAlgorithm): Buffer {\n if (algorithm === undefined) {\n algorithm = PaddingAlgorithm.RSA_PKCS1_OAEP_PADDING;\n }\n\n try {\n return privateDecrypt1(\n {\n key: privateKey.hidden as KeyObject,\n padding: algorithm,\n },\n buffer,\n );\n } catch (_err) {\n return Buffer.alloc(1);\n }\n}\n\nexport const publicEncrypt = publicEncrypt_native;\nexport const privateDecrypt = privateDecrypt_native;\n\nexport function publicEncrypt_long(\n buffer: Buffer,\n publicKey: KeyLike,\n blockSize: number,\n padding?: number,\n paddingAlgorithm?: PaddingAlgorithm,\n): Buffer {\n if (paddingAlgorithm === undefined) {\n paddingAlgorithm = PaddingAlgorithm.RSA_PKCS1_OAEP_PADDING;\n }\n if (paddingAlgorithm === RSA_PKCS1_PADDING) {\n padding = padding || 11;\n if (padding !== 11) throw new Error(\"padding should be 11\");\n } else if (paddingAlgorithm === RSA_PKCS1_OAEP_PADDING) {\n padding = padding || 42;\n if (padding !== 42) throw new Error(\"padding should be 42\");\n } else {\n throw new Error(`Invalid padding algorithm ${paddingAlgorithm}`);\n }\n\n const chunk_size = blockSize - padding;\n const nbBlocks = Math.ceil(buffer.length / chunk_size);\n\n const outputBuffer = createFastUninitializedBuffer(nbBlocks * blockSize);\n for (let i = 0; i < nbBlocks; i++) {\n const currentBlock = buffer.subarray(chunk_size * i, chunk_size * (i + 1));\n const encrypted_chunk = publicEncrypt(currentBlock, publicKey, paddingAlgorithm);\n // istanbul ignore next\n if (encrypted_chunk.length !== blockSize) {\n throw new Error(`publicEncrypt_long unexpected chunk length ${encrypted_chunk.length} expecting ${blockSize}`);\n }\n encrypted_chunk.copy(outputBuffer, i * blockSize);\n }\n return outputBuffer;\n}\n\nexport function privateDecrypt_long(buffer: Buffer, privateKey: PrivateKey, blockSize: number, paddingAlgorithm?: number): Buffer {\n paddingAlgorithm = paddingAlgorithm || RSA_PKCS1_OAEP_PADDING;\n // istanbul ignore next\n if (paddingAlgorithm !== RSA_PKCS1_PADDING && paddingAlgorithm !== RSA_PKCS1_OAEP_PADDING) {\n throw new Error(`Invalid padding algorithm ${paddingAlgorithm}`);\n }\n\n const nbBlocks = Math.ceil(buffer.length / blockSize);\n\n const outputBuffer = createFastUninitializedBuffer(nbBlocks * blockSize);\n\n let total_length = 0;\n for (let i = 0; i < nbBlocks; i++) {\n const currentBlock = buffer.subarray(blockSize * i, Math.min(blockSize * (i + 1), buffer.length));\n const decrypted_buf = privateDecrypt(currentBlock, privateKey, paddingAlgorithm);\n decrypted_buf.copy(outputBuffer, total_length);\n total_length += decrypted_buf.length;\n }\n return outputBuffer.subarray(0, total_length);\n}\n\nexport function coerceCertificatePem(certificate: Certificate | CertificatePEM): CertificatePEM {\n if (Buffer.isBuffer(certificate)) {\n certificate = toPem(certificate, \"CERTIFICATE\");\n }\n assert(typeof certificate === \"string\");\n return certificate;\n}\n\nexport function extractPublicKeyFromCertificateSync(certificate: Certificate | CertificatePEM): PublicKeyPEM {\n certificate = coerceCertificatePem(certificate);\n const publicKeyObject = createPublicKey(certificate);\n const publicKeyAsPem = publicKeyObject.export({ format: \"pem\", type: \"spki\" }).toString();\n assert(typeof publicKeyAsPem === \"string\");\n return publicKeyAsPem;\n}\n\n// https://github.com/kjur/jsrsasign/blob/master/x509-1.1.js\n// tool to analyse asn1 base64 blocks : http://lapo.it/asn1js\n/**\n * extract the publickey from a certificate\n * @async\n */\nexport function extractPublicKeyFromCertificate(\n certificate: CertificatePEM | Certificate,\n callback: (err: Error | null, publicKeyPEM?: PublicKeyPEM) => void,\n): void {\n let err1: Error | null = null;\n let keyPem: PublicKeyPEM;\n try {\n keyPem = extractPublicKeyFromCertificateSync(certificate);\n } catch (err) {\n err1 = err as Error;\n }\n setImmediate(() => {\n callback(err1, keyPem);\n });\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// note: new Buffer(size)# is deprecated since: v6.0. and is replaced with Buffer.allocUnsafe\n// to ensure backward compatibility we have to replace\n// new Buffer(size) with createFastUninitializedBuffer(size)\n//\n// Buffer.alloc and Buffer.allocUnsafe have been introduced in nodejs 5.1.0\n// in node 0.11 new Buffer\n//\n/**\n * @internal\n * @private\n */\nexport const createFastUninitializedBuffer = Buffer.allocUnsafe\n ? Buffer.allocUnsafe\n : (size: number): Buffer => {\n // istanbul ignore next\n return new Buffer(size);\n };\n","// good enough replacement of hexy package for our needs\nexport function hexy(buffer: Buffer, { width, format }: { width?: number; format?: \"twos\" } = {}): string {\n // output in hex of 80 car\n width = width || 80;\n\n if (format === \"twos\") {\n width = 26 * 3;\n }\n const regex = new RegExp(`.{1,${width}}`, \"g\");\n const regexTwos = new RegExp(`.{1,${2}}`, \"g\");\n\n let fullHex = buffer.toString(\"hex\");\n if (format === \"twos\") {\n fullHex = fullHex.match(regexTwos)?.join(\" \") || \"\";\n }\n return fullHex.match(regex)?.join(\"\\n\") || \"\";\n}\n","import assert from \"node:assert\";\nimport { type BlockInfo, readObjectIdentifier, readStruct, readValue } from \"./asn1\";\n\nexport interface DirectoryName {\n stateOrProvinceName?: string;\n localityName?: string;\n organizationName?: string;\n organizationUnitName?: string;\n commonName?: string;\n countryName?: string;\n}\n\nexport function readDirectoryName(buffer: Buffer, block: BlockInfo): DirectoryName {\n // AttributeTypeAndValue ::= SEQUENCE {\n // type ATTRIBUTE.&id({SupportedAttributes}),\n // value ATTRIBUTE.&Type({SupportedAttributes}{@type}),\n const set_blocks = readStruct(buffer, block);\n const names: DirectoryName = {};\n for (const set_block of set_blocks) {\n assert(set_block.tag === 0x31);\n const blocks = readStruct(buffer, set_block);\n assert(blocks.length === 1);\n assert(blocks[0].tag === 0x30);\n\n const sequenceBlock = readStruct(buffer, blocks[0]);\n assert(sequenceBlock.length === 2);\n\n const type = readObjectIdentifier(buffer, sequenceBlock[0]);\n names[type.name as keyof DirectoryName] = readValue(buffer, sequenceBlock[1]) as string;\n }\n return names;\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport {\n type AlgorithmIdentifier,\n type BlockInfo,\n findBlockAtIndex,\n formatBuffer2DigitHexWithColum,\n getBlock,\n readAlgorithmIdentifier,\n readIntegerValue,\n readLongIntegerValue,\n readSignatureValueBin,\n readStruct,\n readTag,\n readTime,\n TagType,\n} from \"./asn1.js\";\nimport type { CertificateRevocationList } from \"./common.js\";\nimport { makeSHA1Thumbprint } from \"./crypto_utils.js\";\nimport { type DirectoryName, readDirectoryName } from \"./directory_name.js\";\n\nexport type Version = string;\nexport type Name = string;\nexport type CertificateSerialNumber = string;\nexport type Extensions = Record<string, unknown>;\nexport interface RevokedCertificate {\n userCertificate: CertificateSerialNumber;\n revocationDate: Date;\n crlEntryExtensions?: Extensions;\n}\nexport interface TBSCertList {\n version?: Version; //OPTIONAL; // must be 2\n signature: AlgorithmIdentifier;\n issuer: Name;\n issuerFingerprint: string; // 00:AA:BB:etc ...\n thisUpdate: Date;\n nextUpdate?: Date; // Time OPTIONAL,\n revokedCertificates: RevokedCertificate[];\n // crlExtensions[0] EXPLICIT Extensions OPTIONAL\n}\nexport interface CertificateRevocationListInfo {\n tbsCertList: TBSCertList;\n signatureAlgorithm: AlgorithmIdentifier;\n signatureValue: Buffer;\n}\n\nexport function readNameForCrl(buffer: Buffer, block: BlockInfo): DirectoryName {\n return readDirectoryName(buffer, block);\n}\n\nfunction _readTbsCertList(buffer: Buffer, blockInfo: BlockInfo): TBSCertList {\n const blocks = readStruct(buffer, blockInfo);\n\n const hasOptionalVersion = blocks[0].tag === TagType.INTEGER;\n\n if (hasOptionalVersion) {\n const _version = readIntegerValue(buffer, blocks[0]);\n const signature = readAlgorithmIdentifier(buffer, blocks[1]);\n const issuer = readNameForCrl(buffer, blocks[2]);\n const issuerFingerprint = formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, blocks[2])));\n\n const thisUpdate = readTime(buffer, blocks[3]);\n const nextUpdate = readTime(buffer, blocks[4]);\n\n const revokedCertificates: RevokedCertificate[] = [];\n\n if (blocks[5] && blocks[5].tag < 0x80) {\n const list = readStruct(buffer, blocks[5]);\n for (const r of list) {\n // sometime blocks[5] doesn't exits .. in this case\n const rr = readStruct(buffer, r);\n const userCertificate = formatBuffer2DigitHexWithColum(readLongIntegerValue(buffer, rr[0]));\n const revocationDate = readTime(buffer, rr[1]) as Date;\n revokedCertificates.push({\n revocationDate,\n userCertificate,\n });\n }\n }\n\n const _ext0 = findBlockAtIndex(blocks, 0);\n return { issuer, issuerFingerprint, thisUpdate, nextUpdate, signature, revokedCertificates } as TBSCertList;\n } else {\n const signature = readAlgorithmIdentifier(buffer, blocks[0]);\n const issuer = readNameForCrl(buffer, blocks[1]);\n const issuerFingerprint = formatBuffer2DigitHexWithColum(makeSHA1Thumbprint(getBlock(buffer, blocks[1])));\n\n const thisUpdate = readTime(buffer, blocks[2]);\n const nextUpdate = readTime(buffer, blocks[3]);\n\n const revokedCertificates: RevokedCertificate[] = [];\n\n if (blocks[4] && blocks[4].tag < 0x80) {\n const list = readStruct(buffer, blocks[4]);\n for (const r of list) {\n // sometime blocks[5] doesn't exits .. in this case\n const rr = readStruct(buffer, r);\n const userCertificate = formatBuffer2DigitHexWithColum(readLongIntegerValue(buffer, rr[0]));\n const revocationDate = readTime(buffer, rr[1]) as Date;\n revokedCertificates.push({\n revocationDate,\n userCertificate,\n });\n }\n }\n return { issuer, issuerFingerprint, thisUpdate, nextUpdate, signature, revokedCertificates } as TBSCertList;\n }\n}\n// see https://tools.ietf.org/html/rfc5280\n\nexport function exploreCertificateRevocationList(crl: CertificateRevocationList): CertificateRevocationListInfo {\n const blockInfo = readTag(crl, 0);\n const blocks = readStruct(crl, blockInfo);\n const tbsCertList = _readTbsCertList(crl, blocks[0]);\n const signatureAlgorithm = readAlgorithmIdentifier(crl, blocks[1]);\n const signatureValue = readSignatureValueBin(crl, blocks[2]);\n return { tbsCertList, signatureAlgorithm, signatureValue };\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\n// tslint:disable: no-console\n\n// Now that we got a hash of the original certificate,\n// we need to verify if we can obtain the same hash by using the same hashing function\n// (in this case SHA-384). In order to do that, we need to extract just the body of\n// the signed certificate. Which, in our case, is everything but the signature.\n// The start of the body is always the first digit of the second line of the following command:\nimport { createVerify } from \"node:crypto\";\nimport { readAlgorithmIdentifier, readSignatureValueBin, readStruct, readTag } from \"./asn1.js\";\nimport type { Certificate } from \"./common.js\";\nimport { exploreCertificate, split_der } from \"./crypto_explore_certificate.js\";\nimport { toPem } from \"./crypto_utils.js\";\n\nexport function verifyCertificateOrClrSignature(certificateOrCrl: Buffer, parentCertificate: Certificate): boolean {\n const block_info = readTag(certificateOrCrl, 0);\n const blocks = readStruct(certificateOrCrl, block_info);\n const bufferToBeSigned = certificateOrCrl.subarray(block_info.position, blocks[1].position - 2);\n\n //xx console.log(\"bufferToBeSigned = \", bufferToBeSigned.length, bufferToBeSigned.toString(\"hex\").substr(0, 50), bufferToBeSigned.toString(\"hex\").substr(-10));\n const signatureAlgorithm = readAlgorithmIdentifier(certificateOrCrl, blocks[1]);\n const signatureValue = readSignatureValueBin(certificateOrCrl, blocks[2]);\n\n const p = split_der(parentCertificate)[0];\n //xx const publicKey = extractPublicKeyFromCertificateSync(p);\n const certPem = toPem(p, \"CERTIFICATE\");\n const verify = createVerify(signatureAlgorithm.identifier);\n verify.update(bufferToBeSigned);\n verify.end();\n return verify.verify(certPem, signatureValue);\n}\n\nexport function verifyCertificateSignature(certificate: Certificate, parentCertificate: Certificate): boolean {\n return verifyCertificateOrClrSignature(certificate, parentCertificate);\n}\nexport function verifyCertificateRevocationListSignature(\n certificateRevocationList: Certificate,\n parentCertificate: Certificate,\n): boolean {\n return verifyCertificateOrClrSignature(certificateRevocationList, parentCertificate);\n}\n\nexport type _VerifyStatus = \"BadCertificateIssuerUseNotAllowed\" | \"BadCertificateInvalid\" | \"Good\";\nexport async function verifyCertificateChain(certificateChain: Certificate[]): Promise<{ status: _VerifyStatus; reason: string }> {\n // verify that all the certificate\n // second certificate must be used for CertificateSign\n\n for (let index = 1; index < certificateChain.length; index++) {\n const cert = certificateChain[index - 1];\n const certParent = certificateChain[index];\n\n // parent child must have keyCertSign\n const certParentInfo = exploreCertificate(certParent);\n const keyUsage = certParentInfo.tbsCertificate.extensions?.keyUsage;\n\n // istanbul ignore next\n if (!keyUsage || !keyUsage.keyCertSign) {\n return {\n status: \"BadCertificateIssuerUseNotAllowed\",\n reason: \"One of the certificate in the chain has not keyUsage set for Certificate Signing\",\n };\n }\n\n const parentSignChild = verifyCertificateSignature(cert, certParent);\n if (!parentSignChild) {\n return {\n status: \"BadCertificateInvalid\",\n reason: \"One of the certificate in the chain is not signing the previous certificate\",\n };\n }\n const certInfo = exploreCertificate(cert);\n\n // istanbul ignore next\n if (!certInfo.tbsCertificate.extensions) {\n return {\n status: \"BadCertificateInvalid\",\n reason: \"Cannot find X509 Extension 3 in certificate\",\n };\n }\n\n // istanbul ignore next\n if (!certParentInfo.tbsCertificate.extensions || !certInfo.tbsCertificate.extensions.authorityKeyIdentifier) {\n return {\n status: \"BadCertificateInvalid\",\n reason: \"Cannot find X509 Extension 3 in certificate (parent)\",\n };\n }\n\n // istanbul ignore next\n if (\n certParentInfo.tbsCertificate.extensions.subjectKeyIdentifier !==\n certInfo.tbsCertificate.extensions.authorityKeyIdentifier.keyIdentifier\n ) {\n return {\n status: \"BadCertificateInvalid\",\n reason: \"subjectKeyIdentifier authorityKeyIdentifier in child certificate do not match subjectKeyIdentifier of parent certificate\",\n };\n }\n }\n return {\n status: \"Good\",\n reason: `certificate chain is valid(length = ${certificateChain.length})`,\n };\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport type { Certificate, CertificateRevocationList } from \"./common.js\";\nimport { exploreCertificate } from \"./crypto_explore_certificate.js\";\nimport { exploreCertificateRevocationList } from \"./explore_certificate_revocation_list.js\";\nimport { verifyCertificateRevocationListSignature } from \"./verify_certificate_signature.js\";\n\n/**\n * Determine if a Certificate Revocation List (CRL) was issued by\n * the given certificate, by comparing the CRL's issuer name\n * fingerprint with the certificate's subject name fingerprint.\n *\n * This is a lightweight check (no cryptographic signature\n * verification). Use {@link verifyCrlIssuedByCertificate} for\n * full verification.\n *\n * @param crl - the CRL to check (DER-encoded)\n * @param certificate - the candidate issuer certificate (DER-encoded)\n * @returns `true` if the CRL's issuer fingerprint matches the\n * certificate's subject fingerprint\n */\nexport function isCrlIssuedByCertificate(crl: CertificateRevocationList, certificate: Certificate): boolean {\n const crlInfo = exploreCertificateRevocationList(crl);\n const certInfo = exploreCertificate(certificate);\n return crlInfo.tbsCertList.issuerFingerprint === certInfo.tbsCertificate.subjectFingerPrint;\n}\n\n/**\n * Verify that a Certificate Revocation List (CRL) was issued by\n * the given certificate. This performs both a fingerprint match\n * **and** a cryptographic signature verification.\n *\n * @param crl - the CRL to verify (DER-encoded)\n * @param certificate - the candidate issuer certificate (DER-encoded)\n * @returns `true` if the CRL's issuer matches the certificate\n * **and** the CRL's signature is valid against the\n * certificate's public key\n */\nexport function verifyCrlIssuedByCertificate(crl: CertificateRevocationList, certificate: Certificate): boolean {\n if (!isCrlIssuedByCertificate(crl, certificate)) {\n return false;\n }\n return verifyCertificateRevocationListSignature(crl, certificate);\n}\n","import { type BlockInfo, readStruct, readTag, TagType } from \"./asn1\";\nimport { hexDump } from \"./crypto_utils\";\n\nfunction t(tag: number) {\n // convert Asn1 tag to string\n return TagType[tag];\n}\nfunction bi(blockInfo: BlockInfo, depth: number) {\n const indent = \" \".repeat(depth);\n const hl = blockInfo.position - blockInfo.start; // header length\n return `${blockInfo.start.toString().padStart(5, \" \")}:d=${depth} hl=${hl.toString().padEnd(3, \" \")} l=${blockInfo.length\n .toString()\n .padStart(6, \" \")} ${blockInfo.tag.toString(16).padEnd(2, \" \")} ${indent} ${t(blockInfo.tag)}`;\n}\n\nexport function exploreAsn1(buffer: Buffer) {\n console.log(hexDump(buffer));\n\n function dump(offset: number, depth: number) {\n const blockInfo = readTag(buffer, offset);\n dumpBlock(blockInfo, depth);\n\n function dumpBlock(blockInfo: BlockInfo, depth: number) {\n console.log(bi(blockInfo, depth));\n if (blockInfo.tag === TagType.SEQUENCE || blockInfo.tag === TagType.SET || blockInfo.tag >= TagType.CONTEXT_SPECIFIC0) {\n const blocks = readStruct(buffer, blockInfo);\n for (const block of blocks) {\n dumpBlock(block, depth + 1);\n }\n }\n }\n }\n dump(0, 0);\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n/**\n * @module node_opcua_crypto\n */\nimport assert from \"node:assert\";\n\nimport type { Certificate, CertificatePEM } from \"./common.js\";\nimport { exploreCertificate, type SubjectPublicKey } from \"./crypto_explore_certificate.js\";\nimport { convertPEMtoDER } from \"./crypto_utils.js\";\nimport type { DirectoryName } from \"./directory_name.js\";\n\nexport type PublicKeyLength = 64 | 96 | 128 | 256 | 384 | 512;\n\n/**\n * A structure exposing useful information about a certificate\n */\nexport interface CertificateInfo {\n /** the public key length in bits */\n publicKeyLength: PublicKeyLength;\n /** the date at which the certificate starts to be valid */\n notBefore: Date;\n /** the date after which the certificate is not valid any more */\n notAfter: Date;\n /** info about certificate owner */\n subject: DirectoryName;\n /** public key */\n publicKey: SubjectPublicKey;\n}\n\nexport function coerceCertificate(certificate: Certificate | CertificatePEM): Certificate {\n if (typeof certificate === \"string\") {\n certificate = convertPEMtoDER(certificate);\n }\n assert(Buffer.isBuffer(certificate));\n return certificate;\n}\n\n/**\n * @method exploreCertificateInfo\n * returns useful information about the certificate such as public key length, start date and end of validity date,\n * and CN\n * @param certificate the certificate to explore\n */\nexport function exploreCertificateInfo(certificate: Certificate | CertificatePEM): CertificateInfo {\n certificate = coerceCertificate(certificate);\n\n const certInfo = exploreCertificate(certificate);\n const data: CertificateInfo = {\n publicKeyLength: certInfo.tbsCertificate.subjectPublicKeyInfo.keyLength,\n notBefore: certInfo.tbsCertificate.validity.notBefore,\n notAfter: certInfo.tbsCertificate.validity.notAfter,\n publicKey: certInfo.tbsCertificate.subjectPublicKeyInfo.subjectPublicKey,\n subject: certInfo.tbsCertificate.subject,\n };\n // istanbul ignore next\n if (\n !(\n data.publicKeyLength === 512 ||\n data.publicKeyLength === 384 ||\n data.publicKeyLength === 256 ||\n data.publicKeyLength === 128\n )\n ) {\n throw new Error(`Invalid public key length (expecting 128,256,384 or 512): ${data.publicKeyLength}`);\n }\n return data;\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport { type BlockInfo, findBlockAtIndex, getBlock, readObjectIdentifier, readStruct, readTag } from \"./asn1.js\";\n\nimport { type BasicConstraints, readExtension, type X509KeyUsage } from \"./crypto_explore_certificate.js\";\n\nexport interface SubjectAltName {\n uniformResourceIdentifier: string[];\n dNSName: string[];\n iPAddress: string[];\n [key: string]: unknown;\n}\nexport interface ExtensionRequest {\n basicConstraints: BasicConstraints;\n keyUsage: X509KeyUsage;\n subjectAltName: SubjectAltName;\n}\nexport interface CertificateSigningRequestInfo {\n extensionRequest: ExtensionRequest;\n}\n\nfunction _readExtensionRequest(buffer: Buffer): ExtensionRequest {\n const block = readTag(buffer, 0);\n\n const inner_blocks = readStruct(buffer, block);\n const extensions = inner_blocks.map((block1) => readExtension(buffer, block1));\n\n const result: ExtensionRequest = {} as ExtensionRequest;\n for (const e of extensions) {\n switch (e.identifier.name) {\n case \"basicConstraints\":\n result.basicConstraints = e.value as BasicConstraints;\n break;\n case \"keyUsage\":\n result.keyUsage = e.value as X509KeyUsage;\n break;\n case \"subjectAltName\":\n result.subjectAltName = e.value as SubjectAltName;\n break;\n default:\n // ignore unknown extensions\n break;\n }\n }\n return result;\n}\n\nexport function readCertificationRequestInfo(buffer: Buffer, block: BlockInfo): CertificateSigningRequestInfo {\n const blocks = readStruct(buffer, block);\n if (blocks.length === 4) {\n const extensionRequestBlock = findBlockAtIndex(blocks, 0);\n if (!extensionRequestBlock) {\n throw new Error(\"cannot find extensionRequest block\");\n }\n const blocks1 = readStruct(buffer, extensionRequestBlock);\n const blocks2 = readStruct(buffer, blocks1[0]);\n const identifier = readObjectIdentifier(buffer, blocks2[0]);\n if (identifier.name !== \"extensionRequest\") {\n throw new Error(\" Cannot find extension Request in ASN1 block\");\n }\n const buf = getBlock(buffer, blocks2[1]);\n\n const extensionRequest = _readExtensionRequest(buf);\n\n return { extensionRequest };\n }\n throw new Error(\"Invalid CSR or \");\n}\n\n// see https://tools.ietf.org/html/rfc2986 : Certification Request Syntax Specification Version 1.7\n\nexport function exploreCertificateSigningRequest(crl: Buffer): CertificateSigningRequestInfo {\n const blockInfo = readTag(crl, 0);\n const blocks = readStruct(crl, blockInfo);\n const csrInfo = readCertificationRequestInfo(crl, blocks[0]);\n return csrInfo;\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport { type BlockInfo, readStruct, readTag, TagType } from \"./asn1.js\";\nimport type { PrivateKey } from \"./common.js\";\nimport { convertPEMtoDER } from \"./crypto_utils.js\";\n\n// tslint:disable:no-empty-interface\nexport interface PrivateKeyInternals {\n /***/\n version: Buffer;\n modulus: Buffer;\n publicExponent: Buffer;\n privateExponent: Buffer;\n prime1: Buffer;\n prime2: Buffer;\n exponent1: Buffer;\n exponent2: Buffer;\n}\n\nfunction f(buffer: Buffer, b: BlockInfo) {\n return buffer.subarray(b.position + 1, b.position + b.length);\n}\nconst doDebug = !!process.env.DEBUG;\n/**\n * \n * @param privateKey RSAPrivateKey ::= SEQUENCE {\n * version Version,\n * modulus INTEGER, -- n\n * publicExponent INTEGER, -- e\n * privateExponent INTEGER, -- d\n * prime1 INTEGER, -- p\n * prime2 INTEGER, -- q\n * exponent1 INTEGER, -- d mod (p-1)\n * exponent2 INTEGER, -- d mod (q-1)\n * coefficient INTEGER, -- (inverse of q) mod p\n * otherPrimeInfos OtherPrimeInfos OPTIONAL\n}\n */\nexport function explorePrivateKey(privateKey2: PrivateKey): PrivateKeyInternals {\n const privateKey1 = privateKey2.hidden;\n const privateKey =\n typeof privateKey1 === \"string\" ? convertPEMtoDER(privateKey1) : privateKey1.export({ format: \"der\", type: \"pkcs1\" });\n\n const block_info = readTag(privateKey, 0);\n const blocks = readStruct(privateKey, block_info);\n\n if (blocks.length === 9) {\n // alice_rsa\n const version = f(privateKey, blocks[0]);\n const modulus = f(privateKey, blocks[1]);\n const publicExponent = f(privateKey, blocks[2]);\n const privateExponent = f(privateKey, blocks[3]);\n const prime1 = f(privateKey, blocks[4]);\n const prime2 = f(privateKey, blocks[5]);\n const exponent1 = f(privateKey, blocks[6]);\n const exponent2 = f(privateKey, blocks[7]);\n\n return {\n version,\n modulus,\n publicExponent,\n privateExponent,\n prime1,\n prime2,\n exponent1,\n exponent2,\n };\n }\n /* istanbul ignore next */\n if (doDebug) {\n // tslint:disable:no-console\n console.log(\"-------------------- private key:\");\n console.log(block_info);\n\n // tslint:disable:no-console\n console.log(\n blocks.map((b) => ({\n tag: `${TagType[b.tag]} 0x${b.tag.toString(16)}`,\n l: b.length,\n p: b.position,\n buff: privateKey.subarray(b.position, b.position + b.length).toString(\"hex\"),\n })),\n );\n }\n\n const b = blocks[2];\n const bb = privateKey.subarray(b.position, b.position + b.length);\n const block_info1 = readTag(bb, 0);\n const blocks1 = readStruct(bb, block_info1);\n\n /* istanbul ignore next */\n if (doDebug) {\n // tslint:disable:no-console\n console.log(\n blocks1.map((b) => ({\n tag: `${TagType[b.tag]} 0x${b.tag.toString(16)}`,\n l: b.length,\n p: b.position,\n buff: bb.subarray(b.position, b.position + b.length).toString(\"hex\"),\n })),\n );\n }\n\n const version = f(bb, blocks1[0]);\n const modulus = f(bb, blocks1[1]);\n const publicExponent = f(bb, blocks1[2]);\n const privateExponent = f(bb, blocks1[3]);\n const prime1 = f(bb, blocks1[4]);\n const prime2 = f(bb, blocks1[5]);\n const exponent1 = f(bb, blocks1[6]);\n const exponent2 = f(bb, blocks1[7]);\n\n return {\n version,\n modulus,\n publicExponent,\n privateExponent,\n prime1,\n prime2,\n exponent1,\n exponent2,\n };\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport { readStruct, readTag, TagType } from \"./asn1.js\";\n\n/**\n * The type of content found in a DER-encoded buffer.\n */\nexport type DERContentType =\n | \"X509Certificate\"\n | \"X509CertificateChain\"\n | \"CertificateRevocationList\"\n | \"CertificateSigningRequest\"\n | \"PKCS12\"\n | \"PrivateKey\"\n | \"Unknown\";\n\n/**\n * Identify the content type of a DER-encoded buffer by inspecting\n * its ASN.1 structure.\n *\n * This function does NOT fully parse the buffer — it only inspects\n * the outermost tags to determine the type. It can distinguish:\n *\n * - **X509Certificate** — a single X.509 certificate (v1 or v3)\n * - **X509CertificateChain** — multiple concatenated X.509 DER\n * certificates\n * - **CertificateRevocationList** — an X.509 CRL (v1 or v2)\n * - **CertificateSigningRequest** — a PKCS#10 CSR\n * - **PKCS12** — a PKCS#12 / PFX container (version 3)\n * - **PrivateKey** — a PKCS#8 or raw RSA private key\n * - **Unknown** — could not identify the content\n *\n * @param buffer A DER-encoded buffer to identify.\n * @returns The detected {@link DERContentType}.\n */\nexport function identifyDERContent(buffer: Buffer): DERContentType {\n if (!Buffer.isBuffer(buffer) || buffer.length < 2) {\n return \"Unknown\";\n }\n\n try {\n const outer = readTag(buffer, 0);\n\n // Every type we care about starts with a SEQUENCE (0x30).\n if (outer.tag !== TagType.SEQUENCE) {\n return \"Unknown\";\n }\n\n const outerEnd = outer.position + outer.length;\n\n // --- Certificate chain detection ---\n // If the outer SEQUENCE does not cover the entire buffer,\n // there are additional DER structures concatenated — that\n // means it is a certificate chain.\n if (outerEnd < buffer.length) {\n // Verify the next blob starts with a SEQUENCE too.\n const next = readTag(buffer, outerEnd);\n if (next.tag === TagType.SEQUENCE) {\n return \"X509CertificateChain\";\n }\n }\n\n const blocks = readStruct(buffer, outer);\n if (blocks.length < 2) {\n return \"Unknown\";\n }\n\n // --- PKCS#12 / PFX detection ---\n // PFX ::= SEQUENCE { version INTEGER (v3), ... }\n // The first element is an INTEGER with value 3.\n if (blocks[0].tag === TagType.INTEGER) {\n const versionByte = buffer[blocks[0].position];\n if (blocks[0].length === 1 && versionByte === 3) {\n return \"PKCS12\";\n }\n // A bare INTEGER at the top of a SEQUENCE could also\n // be a PKCS#8 or RSA private key (version 0).\n if (blocks[0].length === 1 && versionByte === 0) {\n return \"PrivateKey\";\n }\n }\n\n // Both X.509 certs and CRLs and CSRs have the first\n // inner element as a SEQUENCE (TBS block).\n if (blocks[0].tag !== TagType.SEQUENCE) {\n return \"Unknown\";\n }\n\n // Drill into the TBS (first inner SEQUENCE)\n const tbsBlocks = readStruct(buffer, blocks[0]);\n if (tbsBlocks.length === 0) {\n return \"Unknown\";\n }\n\n // --- X.509 v3 Certificate ---\n // TBSCertificate starts with [0] EXPLICIT Version\n // (tag 0xa0 = CONTEXT_SPECIFIC0).\n if (tbsBlocks[0].tag === TagType.CONTEXT_SPECIFIC0) {\n return \"X509Certificate\";\n }\n\n // From here, the TBS starts with an INTEGER.\n // This covers:\n // - X.509 v1 cert (serial number — typically large)\n // - CRL with version (INTEGER value 1)\n // - CSR (INTEGER value 0)\n //\n // Without version, a CRL starts with a SEQUENCE\n // (signature algorithm) directly.\n\n if (tbsBlocks[0].tag === TagType.INTEGER) {\n const intLen = tbsBlocks[0].length;\n const intVal = intLen === 1 ? buffer[tbsBlocks[0].position] : -1;\n\n // --- CSR detection ---\n // CertificationRequestInfo ::= SEQUENCE {\n // version INTEGER { v1(0) },\n // subject Name, -- SEQUENCE\n // subjectPKInfo SubjectPublicKeyInfo, -- SEQUENCE\n // attributes [0] Attributes -- 0xa0\n // }\n // version is always 0, and the 4th element is [0] (0xa0).\n if (intVal === 0 && tbsBlocks.length >= 4) {\n if (tbsBlocks[3].tag === TagType.CONTEXT_SPECIFIC0) {\n return \"CertificateSigningRequest\";\n }\n }\n\n // --- CRL v2 detection ---\n // TBSCertList with version:\n // version INTEGER (1 for v2)\n // signature AlgorithmIdentifier (SEQUENCE)\n // issuer Name (SEQUENCE)\n // thisUpdate Time (UTCTime or GeneralizedTime)\n if (intVal === 1 && tbsBlocks.length >= 4) {\n const tag3 = tbsBlocks[3].tag;\n if (tag3 === TagType.UTCTime || tag3 === TagType.GeneralizedTime) {\n return \"CertificateRevocationList\";\n }\n }\n\n // --- X.509 v1 certificate ---\n // TBSCertificate (v1) structure:\n // serialNumber INTEGER\n // signature AlgorithmIdentifier (SEQUENCE)\n // issuer Name (SEQUENCE)\n // validity Validity (SEQUENCE wrapping two Time values)\n // subject Name (SEQUENCE)\n // subjectPKInfo SubjectPublicKeyInfo (SEQUENCE)\n // Element [3] is a SEQUENCE (validity), not a bare Time.\n if (tbsBlocks.length >= 6) {\n if (tbsBlocks[3].tag === TagType.SEQUENCE) {\n return \"X509Certificate\";\n }\n }\n }\n\n // --- CRL v1 (no version field) ---\n // TBSCertList without version:\n // signature AlgorithmIdentifier (SEQUENCE)\n // issuer Name (SEQUENCE)\n // thisUpdate Time (UTCTime or GeneralizedTime)\n if (tbsBlocks[0].tag === TagType.SEQUENCE && tbsBlocks.length >= 3) {\n const tag2 = tbsBlocks[2].tag;\n if (tag2 === TagType.UTCTime || tag2 === TagType.GeneralizedTime) {\n return \"CertificateRevocationList\";\n }\n }\n\n return \"Unknown\";\n } catch {\n return \"Unknown\";\n }\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SubjectOptions {\n commonName?: string;\n organization?: string;\n organizationalUnit?: string;\n locality?: string;\n state?: string;\n country?: string;\n domainComponent?: string;\n}\n\nconst _keys = {\n C: \"country\",\n CN: \"commonName\",\n DC: \"domainComponent\",\n L: \"locality\",\n O: \"organization\",\n OU: \"organizationalUnit\",\n ST: \"state\",\n};\n\nconst enquoteIfNecessary = (str: string) => {\n str = str.replace(/\"/g, \"”\");\n return str.match(/\\/|=/) ? `\"${str}\"` : str;\n};\nconst unquote = (str: string) => str.replace(/\"/gm, \"\");\nconst unquote2 = (str?: string | undefined) => {\n if (!str) return str;\n const m = str.match(/^\"(.*)\"$/);\n return m ? m[1] : str;\n};\n/**\n * subjectName\tThe subject name to use for the Certificate.\n * If not specified the ApplicationName and/or domainNames are used to create a suitable default value.\n */\nexport class Subject implements SubjectOptions {\n public readonly commonName?: string;\n public readonly organization?: string;\n public readonly organizationalUnit?: string;\n public readonly locality?: string;\n public readonly state?: string;\n public readonly country?: string;\n public readonly domainComponent?: string;\n\n constructor(options: SubjectOptions | string) {\n if (typeof options === \"string\") {\n options = Subject.parse(options);\n }\n this.commonName = unquote2(options.commonName);\n this.organization = unquote2(options.organization);\n this.organizationalUnit = unquote2(options.organizationalUnit);\n this.locality = unquote2(options.locality);\n this.state = unquote2(options.state);\n this.country = unquote2(options.country);\n this.domainComponent = unquote2(options.domainComponent);\n }\n\n public static parse(str: string): SubjectOptions {\n const elements = str.split(/\\/(?=[^/]*?=)/);\n const options: Record<string, unknown> = {};\n\n elements.forEach((element: string) => {\n if (element.length === 0) {\n return;\n }\n const s: string[] = element.split(\"=\");\n\n if (s.length !== 2) {\n throw new Error(`invalid format for ${element}`);\n }\n const longName = (_keys as Record<string, string>)[s[0]];\n if (!longName) {\n throw new Error(`Invalid field found in subject name ${s[0]}`);\n }\n const value = s[1];\n options[longName] = unquote(Buffer.from(value, \"ascii\").toString(\"utf8\"));\n });\n return options as SubjectOptions;\n }\n\n public toStringInternal(sep: string): string {\n // https://reference.opcfoundation.org/v104/GDS/docs/7.6.4/\n // The format of the subject name is a sequence of name value pairs separated by a ‘/’.\n // The name shall be one of ‘CN’, ‘O’, ‘OU’, ‘DC’, ‘L’, ‘S’ or ‘C’ and\n // shall be followed by a ‘=’ and then followed by the value.\n // The value may be any printable character except for ‘”’.\n // If the value contains a ‘/’ or a ‘=’ then it shall be enclosed in double quotes (‘”’).\n\n const tmp: string[] = [];\n if (this.country) {\n tmp.push(`C=${enquoteIfNecessary(this.country)}`);\n }\n if (this.state) {\n tmp.push(`ST=${enquoteIfNecessary(this.state)}`);\n }\n if (this.locality) {\n tmp.push(`L=${enquoteIfNecessary(this.locality)}`);\n }\n if (this.organization) {\n tmp.push(`O=${enquoteIfNecessary(this.organization)}`);\n }\n if (this.organizationalUnit) {\n tmp.push(`OU=${enquoteIfNecessary(this.organizationalUnit)}`);\n }\n if (this.commonName) {\n tmp.push(`CN=${enquoteIfNecessary(this.commonName)}`);\n }\n if (this.domainComponent) {\n tmp.push(`DC=${enquoteIfNecessary(this.domainComponent)}`);\n }\n return tmp.join(sep);\n }\n public toStringForOPCUA(): string {\n return this.toStringInternal(\"/\");\n }\n public toString(): string {\n // standard for SSL is to have a / in front of each Field\n // see https://www.digicert.com/kb/ssl-support/openssl-quick-reference-guide.htm\n const t = this.toStringForOPCUA();\n return t ? `/${t}` : t;\n }\n}\n","import nativeCrypto from \"node:crypto\";\nimport { Crypto as PeculiarWebCrypto } from \"@peculiar/webcrypto\";\nimport * as x509 from \"@peculiar/x509\";\n\nconst doDebug = false;\n\nlet _crypto: PeculiarWebCrypto | typeof nativeCrypto | undefined;\n\ndeclare const crypto: typeof nativeCrypto;\ndeclare const window: unknown;\n\nconst ignoreCrypto = process.env.IGNORE_SUBTLE_FROM_CRYPTO;\n\nif (typeof window === \"undefined\") {\n _crypto = nativeCrypto;\n\n if (!_crypto?.subtle || ignoreCrypto) {\n _crypto = new PeculiarWebCrypto();\n doDebug && console.warn(\"using @peculiar/webcrypto\");\n } else {\n doDebug && console.warn(\"using nodejs crypto (native)\");\n }\n x509.cryptoProvider.set(_crypto as Crypto);\n} else {\n // using browser crypto\n doDebug && console.warn(\"using browser crypto (native)\");\n _crypto = crypto;\n x509.cryptoProvider.set(crypto as Crypto);\n}\n\nexport function getCrypto(): PeculiarWebCrypto | typeof nativeCrypto {\n return _crypto || crypto || nativeCrypto;\n}\nexport * as x509 from \"@peculiar/x509\";\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\nimport { getCrypto, x509 } from \"./_crypto.js\";\n\nexport async function generateKeyPair(modulusLength: 1024 | 2048 | 3072 | 4096 = 2048): Promise<CryptoKeyPair> {\n const crypto = getCrypto();\n\n const alg: RsaHashedKeyGenParams = {\n name: \"RSASSA-PKCS1-v1_5\",\n hash: { name: \"SHA-256\" },\n publicExponent: new Uint8Array([1, 0, 1]),\n modulusLength,\n };\n const keys = await crypto.subtle.generateKey(alg, true, [\"sign\", \"verify\"]);\n\n return keys as CryptoKeyPair;\n}\n\n/**\n * generate a pair of private/public keys of length 1024,2048, 3072, or 4096 bits\n */\nexport async function generatePrivateKey(modulusLength: 1024 | 2048 | 3072 | 4096 = 2048): Promise<CryptoKey> {\n return (await generateKeyPair(modulusLength)).privateKey;\n}\n\n/**\n * convert a CryptoKey to a PEM string\n */\nexport async function privateKeyToPEM(privateKey: CryptoKey) {\n const crypto = getCrypto();\n const privDer = await crypto.subtle.exportKey(\"pkcs8\", privateKey);\n const privPem = x509.PemConverter.encode(privDer, \"PRIVATE KEY\");\n return { privPem, privDer };\n}\n\nexport async function derToPrivateKey(privDer: ArrayBuffer): Promise<CryptoKey> {\n const crypto = getCrypto();\n\n const importedKey = await crypto.subtle.importKey(\n \"pkcs8\",\n privDer,\n {\n name: \"RSASSA-PKCS1-v1_5\",\n hash: { name: \"SHA-256\" },\n },\n true,\n [\n \"sign\",\n // \"encrypt\",\n // \"decrypt\",\n // \"verify\",\n // \"wrapKey\",\n // \"unwrapKey\",\n // \"deriveKey\",\n // \"deriveBits\"\n ],\n );\n return importedKey as CryptoKey;\n}\n\nexport async function pemToPrivateKey(pem: string): Promise<CryptoKey> {\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n const privDer = x509.PemConverter.decode(pem);\n return derToPrivateKey(privDer[0]);\n}\n","import { createPrivateKeyFromNodeJSCrypto, isKeyObject, type KeyObject, type PrivateKey } from \"../common.js\";\nimport { getCrypto } from \"./_crypto.js\";\nimport { derToPrivateKey, pemToPrivateKey } from \"./create_key_pair.js\";\n\nconst crypto = getCrypto();\n\nconst doDebug = false;\n\nexport function coercePEMorDerToPrivateKey(privateKeyInDerOrPem: string | Buffer): PrivateKey {\n if (typeof privateKeyInDerOrPem === \"string\") {\n const hidden = createPrivateKeyFromNodeJSCrypto(privateKeyInDerOrPem);\n return { hidden: hidden as unknown as KeyObject };\n }\n //istanbul ignore next\n throw new Error(\"not implemented\");\n // return privateKey.hidden;\n}\n\n/**\n *\n * @private\n */\nexport async function _coercePrivateKey(privateKey: unknown): Promise<KeyObject> {\n const KeyObject = (crypto as unknown as { KeyObject: { from(key: unknown): KeyObject } }).KeyObject;\n if (Buffer.isBuffer(privateKey)) {\n const privateKey1 = await derToPrivateKey(privateKey as unknown as ArrayBuffer); //\n return KeyObject.from(privateKey1);\n } else if (typeof privateKey === \"string\") {\n try {\n // privateKey = privateKey.replace(/RSA PRIVATE KEY-----\\n.*/mg, \"RSA PRIVATE KEY-----\");\n const privateKey1 = await pemToPrivateKey(privateKey);\n return KeyObject.from(privateKey1);\n } catch (err) {\n doDebug && console.log(privateKey);\n throw err;\n }\n } else if (isKeyObject(privateKey)) {\n return privateKey as KeyObject;\n }\n throw new Error(\"Invalid privateKey\");\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\nimport { getCrypto } from \"./_crypto.js\";\n\n// https://stackoverflow.com/questions/56807959/generate-public-key-from-private-key-using-webcrypto-api\nexport async function buildPublicKey(privateKey: CryptoKey): Promise<CryptoKey> {\n const crypto = getCrypto();\n\n // export private key to JWK\n const jwk = await crypto.subtle.exportKey(\"jwk\", privateKey);\n\n // remove private data from JWK\n delete jwk.d;\n delete jwk.dp;\n delete jwk.dq;\n delete jwk.q;\n delete jwk.qi;\n jwk.key_ops = [\n \"encrypt\",\n \"sign\",\n // \"wrapKey\"\n ];\n\n // import public key\n // const publicKey = await crypto.subtle.importKey(\"jwk\", jwk, { name: \"RSA-OAEP\", hash: { name: \"SHA-256\" } }, true, [\n const publicKey = await crypto.subtle.importKey(\"jwk\", jwk, { name: \"RSASSA-PKCS1-v1_5\", hash: { name: \"SHA-256\" } }, true, [\n // \"encrypt\",\n // \"sign\",\n // \"wrapKey\",\n ]);\n\n return publicKey;\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\nimport { CertificatePurpose } from \"../common.js\";\nimport { x509 } from \"./_crypto.js\";\n\n// key usage of OPCUA Server or OPCUA Client\nconst keyUsageApplication =\n x509.KeyUsageFlags.keyEncipherment |\n x509.KeyUsageFlags.nonRepudiation |\n x509.KeyUsageFlags.dataEncipherment |\n x509.KeyUsageFlags.keyCertSign |\n x509.KeyUsageFlags.digitalSignature;\n\n// key usage for CA certificate\nconst keyUsageCA = x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign;\n\nexport function getAttributes(purpose: CertificatePurpose): {\n nsComment: string;\n basicConstraints: x509.BasicConstraintsExtension;\n keyUsageExtension: x509.ExtendedKeyUsage[];\n usages: x509.KeyUsageFlags;\n} {\n let basicConstraints: x509.BasicConstraintsExtension;\n let keyUsageExtension: x509.ExtendedKeyUsage[] = [];\n let usages: x509.KeyUsageFlags;\n let nsComment: string;\n let _extension: string;\n switch (purpose) {\n case CertificatePurpose.ForCertificateAuthority:\n _extension = \"v3_ca\";\n /**\n [ v3_ca ]\n subjectKeyIdentifier = hash\n authorityKeyIdentifier = keyid:always,issuer:always\n * basicConstraints = CA:TRUE\n * keyUsage = critical, cRLSign, keyCertSign\n * nsComment = \"Self-signed Certificate for CA generated by Node-OPCUA Certificate utility\"\n subjectAltName = $ENV::ALTNAME\n */\n basicConstraints = new x509.BasicConstraintsExtension(true, undefined, false);\n usages = keyUsageCA;\n keyUsageExtension = [];\n nsComment = \"Self-signed certificate for CA generated by Node-OPCUA Certificate utility V2\";\n break;\n // case CertificatePurpose.ForApplication:\n // case CertificatePurpose.ForUserAuthentication:\n default:\n /**\n [ v3_selfsigned]\n subjectKeyIdentifier = hash\n authorityKeyIdentifier = keyid,issuer\n * basicConstraints = critical, CA:FALSE\n * keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign\n * extendedKeyUsage = clientAuth,serverAuth\n * nsComment = \"Self-signed certificate generated by Node-OPCUA Certificate utility\"\n subjectAltName = $ENV::ALTNAME\n */\n _extension = \"v3_selfsigned\";\n basicConstraints = new x509.BasicConstraintsExtension(false, undefined, true);\n usages = keyUsageApplication;\n keyUsageExtension = [x509.ExtendedKeyUsage.serverAuth, x509.ExtendedKeyUsage.clientAuth];\n nsComment = \"Self-signed certificate generated by Node-OPCUA Certificate utility V2\";\n break;\n }\n return { nsComment, basicConstraints, keyUsageExtension, usages };\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport type { CertificatePurpose } from \"../common.js\";\nimport { Subject } from \"../subject.js\";\nimport { buildPublicKey } from \"./_build_public_key.js\";\nimport { getCrypto, x509 } from \"./_crypto.js\";\nimport { getAttributes } from \"./_get_attributes.js\";\n\ninterface CreateCertificateSigningRequestOptions {\n privateKey: CryptoKey;\n notBefore?: Date;\n notAfter?: Date;\n validity?: number;\n subject?: string;\n dns?: string[];\n ip?: string[];\n applicationUri?: string;\n purpose: CertificatePurpose;\n}\nexport async function createCertificateSigningRequest({\n privateKey,\n subject,\n dns,\n ip,\n applicationUri,\n purpose,\n}: CreateCertificateSigningRequestOptions) {\n const crypto = getCrypto();\n\n const modulusLength = 2048;\n\n const alg = {\n name: \"RSASSA-PKCS1-v1_5\",\n hash: { name: \"SHA-256\" },\n publicExponent: new Uint8Array([1, 0, 1]),\n modulusLength,\n };\n\n const publicKey = await buildPublicKey(privateKey);\n\n const keys = {\n privateKey,\n publicKey,\n };\n\n const alternativeNameExtensions: x509.JsonGeneralName[] = [];\n for (const d of dns ?? []) {\n alternativeNameExtensions.push({ type: \"dns\", value: d });\n }\n for (const d of ip ?? []) {\n alternativeNameExtensions.push({ type: \"ip\", value: d });\n }\n if (applicationUri) {\n alternativeNameExtensions.push({ type: \"url\", value: applicationUri });\n }\n\n const { basicConstraints, usages } = getAttributes(purpose);\n\n const s = new Subject(subject || \"\");\n const s1 = s.toStringInternal(\", \");\n const name = s1;\n\n const csr = await x509.Pkcs10CertificateRequestGenerator.create(\n {\n name,\n keys,\n signingAlgorithm: alg,\n extensions: [\n basicConstraints,\n new x509.KeyUsagesExtension(usages, true),\n new x509.SubjectAlternativeNameExtension(alternativeNameExtensions),\n ],\n },\n crypto as Crypto,\n );\n return { csr: csr.toString(\"pem\"), der: csr };\n}\n","/*!\n * Copyright (c) 2014, GMO GlobalSign\n * Copyright (c) 2015-2022, Peculiar Ventures\n * All rights reserved.\n * \n * Author 2014-2019, Yury Strozhevsky\n * \n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * \n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * \n * * Redistributions in binary form must reproduce the above copyright notice, this\n * list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * \n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n * \n */\n\nimport * as pvtsutils from 'pvtsutils';\nimport * as pvutils from 'pvutils';\n\nfunction assertBigInt() {\n if (typeof BigInt === \"undefined\") {\n throw new Error(\"BigInt is not defined. Your environment doesn't implement BigInt.\");\n }\n}\nfunction concat(buffers) {\n let outputLength = 0;\n let prevLength = 0;\n for (let i = 0; i < buffers.length; i++) {\n const buffer = buffers[i];\n outputLength += buffer.byteLength;\n }\n const retView = new Uint8Array(outputLength);\n for (let i = 0; i < buffers.length; i++) {\n const buffer = buffers[i];\n retView.set(new Uint8Array(buffer), prevLength);\n prevLength += buffer.byteLength;\n }\n return retView.buffer;\n}\nfunction checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength) {\n if (!(inputBuffer instanceof Uint8Array)) {\n baseBlock.error = \"Wrong parameter: inputBuffer must be 'Uint8Array'\";\n return false;\n }\n if (!inputBuffer.byteLength) {\n baseBlock.error = \"Wrong parameter: inputBuffer has zero length\";\n return false;\n }\n if (inputOffset < 0) {\n baseBlock.error = \"Wrong parameter: inputOffset less than zero\";\n return false;\n }\n if (inputLength < 0) {\n baseBlock.error = \"Wrong parameter: inputLength less than zero\";\n return false;\n }\n if ((inputBuffer.byteLength - inputOffset - inputLength) < 0) {\n baseBlock.error = \"End of input reached before message was fully decoded (inconsistent offset and length values)\";\n return false;\n }\n return true;\n}\n\nclass ViewWriter {\n constructor() {\n this.items = [];\n }\n write(buf) {\n this.items.push(buf);\n }\n final() {\n return concat(this.items);\n }\n}\n\nconst powers2 = [new Uint8Array([1])];\nconst digitsString = \"0123456789\";\nconst NAME = \"name\";\nconst VALUE_HEX_VIEW = \"valueHexView\";\nconst IS_HEX_ONLY = \"isHexOnly\";\nconst ID_BLOCK = \"idBlock\";\nconst TAG_CLASS = \"tagClass\";\nconst TAG_NUMBER = \"tagNumber\";\nconst IS_CONSTRUCTED = \"isConstructed\";\nconst FROM_BER = \"fromBER\";\nconst TO_BER = \"toBER\";\nconst LOCAL = \"local\";\nconst EMPTY_STRING = \"\";\nconst EMPTY_BUFFER = new ArrayBuffer(0);\nconst EMPTY_VIEW = new Uint8Array(0);\nconst END_OF_CONTENT_NAME = \"EndOfContent\";\nconst OCTET_STRING_NAME = \"OCTET STRING\";\nconst BIT_STRING_NAME = \"BIT STRING\";\n\nfunction HexBlock(BaseClass) {\n var _a;\n return _a = class Some extends BaseClass {\n get valueHex() {\n return this.valueHexView.slice().buffer;\n }\n set valueHex(value) {\n this.valueHexView = new Uint8Array(value);\n }\n constructor(...args) {\n var _b;\n super(...args);\n const params = args[0] || {};\n this.isHexOnly = (_b = params.isHexOnly) !== null && _b !== void 0 ? _b : false;\n this.valueHexView = params.valueHex ? pvtsutils.BufferSourceConverter.toUint8Array(params.valueHex) : EMPTY_VIEW;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const view = inputBuffer instanceof ArrayBuffer ? new Uint8Array(inputBuffer) : inputBuffer;\n if (!checkBufferParams(this, view, inputOffset, inputLength)) {\n return -1;\n }\n const endLength = inputOffset + inputLength;\n this.valueHexView = view.subarray(inputOffset, endLength);\n if (!this.valueHexView.length) {\n this.warnings.push(\"Zero buffer length\");\n return inputOffset;\n }\n this.blockLength = inputLength;\n return endLength;\n }\n toBER(sizeOnly = false) {\n if (!this.isHexOnly) {\n this.error = \"Flag 'isHexOnly' is not set, abort\";\n return EMPTY_BUFFER;\n }\n if (sizeOnly) {\n return new ArrayBuffer(this.valueHexView.byteLength);\n }\n return (this.valueHexView.byteLength === this.valueHexView.buffer.byteLength)\n ? this.valueHexView.buffer\n : this.valueHexView.slice().buffer;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n isHexOnly: this.isHexOnly,\n valueHex: pvtsutils.Convert.ToHex(this.valueHexView),\n };\n }\n },\n _a.NAME = \"hexBlock\",\n _a;\n}\n\nclass LocalBaseBlock {\n static blockName() {\n return this.NAME;\n }\n get valueBeforeDecode() {\n return this.valueBeforeDecodeView.slice().buffer;\n }\n set valueBeforeDecode(value) {\n this.valueBeforeDecodeView = new Uint8Array(value);\n }\n constructor({ blockLength = 0, error = EMPTY_STRING, warnings = [], valueBeforeDecode = EMPTY_VIEW, } = {}) {\n this.blockLength = blockLength;\n this.error = error;\n this.warnings = warnings;\n this.valueBeforeDecodeView = pvtsutils.BufferSourceConverter.toUint8Array(valueBeforeDecode);\n }\n toJSON() {\n return {\n blockName: this.constructor.NAME,\n blockLength: this.blockLength,\n error: this.error,\n warnings: this.warnings,\n valueBeforeDecode: pvtsutils.Convert.ToHex(this.valueBeforeDecodeView),\n };\n }\n}\nLocalBaseBlock.NAME = \"baseBlock\";\n\nclass ValueBlock extends LocalBaseBlock {\n fromBER(_inputBuffer, _inputOffset, _inputLength) {\n throw TypeError(\"User need to make a specific function in a class which extends 'ValueBlock'\");\n }\n toBER(_sizeOnly, _writer) {\n throw TypeError(\"User need to make a specific function in a class which extends 'ValueBlock'\");\n }\n}\nValueBlock.NAME = \"valueBlock\";\n\nclass LocalIdentificationBlock extends HexBlock(LocalBaseBlock) {\n constructor({ idBlock = {} } = {}) {\n var _a, _b, _c, _d;\n super();\n if (idBlock) {\n this.isHexOnly = (_a = idBlock.isHexOnly) !== null && _a !== void 0 ? _a : false;\n this.valueHexView = idBlock.valueHex\n ? pvtsutils.BufferSourceConverter.toUint8Array(idBlock.valueHex)\n : EMPTY_VIEW;\n this.tagClass = (_b = idBlock.tagClass) !== null && _b !== void 0 ? _b : -1;\n this.tagNumber = (_c = idBlock.tagNumber) !== null && _c !== void 0 ? _c : -1;\n this.isConstructed = (_d = idBlock.isConstructed) !== null && _d !== void 0 ? _d : false;\n }\n else {\n this.tagClass = -1;\n this.tagNumber = -1;\n this.isConstructed = false;\n }\n }\n toBER(sizeOnly = false) {\n let firstOctet = 0;\n switch (this.tagClass) {\n case 1:\n firstOctet |= 0x00;\n break;\n case 2:\n firstOctet |= 0x40;\n break;\n case 3:\n firstOctet |= 0x80;\n break;\n case 4:\n firstOctet |= 0xC0;\n break;\n default:\n this.error = \"Unknown tag class\";\n return EMPTY_BUFFER;\n }\n if (this.isConstructed)\n firstOctet |= 0x20;\n if (this.tagNumber < 31 && !this.isHexOnly) {\n const retView = new Uint8Array(1);\n if (!sizeOnly) {\n let number = this.tagNumber;\n number &= 0x1F;\n firstOctet |= number;\n retView[0] = firstOctet;\n }\n return retView.buffer;\n }\n if (!this.isHexOnly) {\n const encodedBuf = pvutils.utilToBase(this.tagNumber, 7);\n const encodedView = new Uint8Array(encodedBuf);\n const size = encodedBuf.byteLength;\n const retView = new Uint8Array(size + 1);\n retView[0] = (firstOctet | 0x1F);\n if (!sizeOnly) {\n for (let i = 0; i < (size - 1); i++)\n retView[i + 1] = encodedView[i] | 0x80;\n retView[size] = encodedView[size - 1];\n }\n return retView.buffer;\n }\n const retView = new Uint8Array(this.valueHexView.byteLength + 1);\n retView[0] = (firstOctet | 0x1F);\n if (!sizeOnly) {\n const curView = this.valueHexView;\n for (let i = 0; i < (curView.length - 1); i++)\n retView[i + 1] = curView[i] | 0x80;\n retView[this.valueHexView.byteLength] = curView[curView.length - 1];\n }\n return retView.buffer;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, inputView, inputOffset, inputLength)) {\n return -1;\n }\n const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength);\n if (intBuffer.length === 0) {\n this.error = \"Zero buffer length\";\n return -1;\n }\n const tagClassMask = intBuffer[0] & 0xC0;\n switch (tagClassMask) {\n case 0x00:\n this.tagClass = (1);\n break;\n case 0x40:\n this.tagClass = (2);\n break;\n case 0x80:\n this.tagClass = (3);\n break;\n case 0xC0:\n this.tagClass = (4);\n break;\n default:\n this.error = \"Unknown tag class\";\n return -1;\n }\n this.isConstructed = (intBuffer[0] & 0x20) === 0x20;\n this.isHexOnly = false;\n const tagNumberMask = intBuffer[0] & 0x1F;\n if (tagNumberMask !== 0x1F) {\n this.tagNumber = (tagNumberMask);\n this.blockLength = 1;\n }\n else {\n let count = 1;\n let intTagNumberBuffer = this.valueHexView = new Uint8Array(255);\n let tagNumberBufferMaxLength = 255;\n while (intBuffer[count] & 0x80) {\n intTagNumberBuffer[count - 1] = intBuffer[count] & 0x7F;\n count++;\n if (count >= intBuffer.length) {\n this.error = \"End of input reached before message was fully decoded\";\n return -1;\n }\n if (count === tagNumberBufferMaxLength) {\n tagNumberBufferMaxLength += 255;\n const tempBufferView = new Uint8Array(tagNumberBufferMaxLength);\n for (let i = 0; i < intTagNumberBuffer.length; i++)\n tempBufferView[i] = intTagNumberBuffer[i];\n intTagNumberBuffer = this.valueHexView = new Uint8Array(tagNumberBufferMaxLength);\n }\n }\n this.blockLength = (count + 1);\n intTagNumberBuffer[count - 1] = intBuffer[count] & 0x7F;\n const tempBufferView = new Uint8Array(count);\n for (let i = 0; i < count; i++)\n tempBufferView[i] = intTagNumberBuffer[i];\n intTagNumberBuffer = this.valueHexView = new Uint8Array(count);\n intTagNumberBuffer.set(tempBufferView);\n if (this.blockLength <= 9)\n this.tagNumber = pvutils.utilFromBase(intTagNumberBuffer, 7);\n else {\n this.isHexOnly = true;\n this.warnings.push(\"Tag too long, represented as hex-coded\");\n }\n }\n if (((this.tagClass === 1))\n && (this.isConstructed)) {\n switch (this.tagNumber) {\n case 1:\n case 2:\n case 5:\n case 6:\n case 9:\n case 13:\n case 14:\n case 23:\n case 24:\n case 31:\n case 32:\n case 33:\n case 34:\n this.error = \"Constructed encoding used for primitive type\";\n return -1;\n }\n }\n return (inputOffset + this.blockLength);\n }\n toJSON() {\n return {\n ...super.toJSON(),\n tagClass: this.tagClass,\n tagNumber: this.tagNumber,\n isConstructed: this.isConstructed,\n };\n }\n}\nLocalIdentificationBlock.NAME = \"identificationBlock\";\n\nclass LocalLengthBlock extends LocalBaseBlock {\n constructor({ lenBlock = {} } = {}) {\n var _a, _b, _c;\n super();\n this.isIndefiniteForm = (_a = lenBlock.isIndefiniteForm) !== null && _a !== void 0 ? _a : false;\n this.longFormUsed = (_b = lenBlock.longFormUsed) !== null && _b !== void 0 ? _b : false;\n this.length = (_c = lenBlock.length) !== null && _c !== void 0 ? _c : 0;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const view = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, view, inputOffset, inputLength)) {\n return -1;\n }\n const intBuffer = view.subarray(inputOffset, inputOffset + inputLength);\n if (intBuffer.length === 0) {\n this.error = \"Zero buffer length\";\n return -1;\n }\n if (intBuffer[0] === 0xFF) {\n this.error = \"Length block 0xFF is reserved by standard\";\n return -1;\n }\n this.isIndefiniteForm = intBuffer[0] === 0x80;\n if (this.isIndefiniteForm) {\n this.blockLength = 1;\n return (inputOffset + this.blockLength);\n }\n this.longFormUsed = !!(intBuffer[0] & 0x80);\n if (this.longFormUsed === false) {\n this.length = (intBuffer[0]);\n this.blockLength = 1;\n return (inputOffset + this.blockLength);\n }\n const count = intBuffer[0] & 0x7F;\n if (count > 8) {\n this.error = \"Too big integer\";\n return -1;\n }\n if ((count + 1) > intBuffer.length) {\n this.error = \"End of input reached before message was fully decoded\";\n return -1;\n }\n const lenOffset = inputOffset + 1;\n const lengthBufferView = view.subarray(lenOffset, lenOffset + count);\n if (lengthBufferView[count - 1] === 0x00)\n this.warnings.push(\"Needlessly long encoded length\");\n this.length = pvutils.utilFromBase(lengthBufferView, 8);\n if (this.longFormUsed && (this.length <= 127))\n this.warnings.push(\"Unnecessary usage of long length form\");\n this.blockLength = count + 1;\n return (inputOffset + this.blockLength);\n }\n toBER(sizeOnly = false) {\n let retBuf;\n let retView;\n if (this.length > 127)\n this.longFormUsed = true;\n if (this.isIndefiniteForm) {\n retBuf = new ArrayBuffer(1);\n if (sizeOnly === false) {\n retView = new Uint8Array(retBuf);\n retView[0] = 0x80;\n }\n return retBuf;\n }\n if (this.longFormUsed) {\n const encodedBuf = pvutils.utilToBase(this.length, 8);\n if (encodedBuf.byteLength > 127) {\n this.error = \"Too big length\";\n return (EMPTY_BUFFER);\n }\n retBuf = new ArrayBuffer(encodedBuf.byteLength + 1);\n if (sizeOnly)\n return retBuf;\n const encodedView = new Uint8Array(encodedBuf);\n retView = new Uint8Array(retBuf);\n retView[0] = encodedBuf.byteLength | 0x80;\n for (let i = 0; i < encodedBuf.byteLength; i++)\n retView[i + 1] = encodedView[i];\n return retBuf;\n }\n retBuf = new ArrayBuffer(1);\n if (sizeOnly === false) {\n retView = new Uint8Array(retBuf);\n retView[0] = this.length;\n }\n return retBuf;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n isIndefiniteForm: this.isIndefiniteForm,\n longFormUsed: this.longFormUsed,\n length: this.length,\n };\n }\n}\nLocalLengthBlock.NAME = \"lengthBlock\";\n\nconst typeStore = {};\n\nclass BaseBlock extends LocalBaseBlock {\n constructor({ name = EMPTY_STRING, optional = false, primitiveSchema, ...parameters } = {}, valueBlockType) {\n super(parameters);\n this.name = name;\n this.optional = optional;\n if (primitiveSchema) {\n this.primitiveSchema = primitiveSchema;\n }\n this.idBlock = new LocalIdentificationBlock(parameters);\n this.lenBlock = new LocalLengthBlock(parameters);\n this.valueBlock = valueBlockType ? new valueBlockType(parameters) : new ValueBlock(parameters);\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, (this.lenBlock.isIndefiniteForm)\n ? inputLength\n : this.lenBlock.length);\n if (resultOffset === -1) {\n this.error = this.valueBlock.error;\n return resultOffset;\n }\n if (!this.idBlock.error.length)\n this.blockLength += this.idBlock.blockLength;\n if (!this.lenBlock.error.length)\n this.blockLength += this.lenBlock.blockLength;\n if (!this.valueBlock.error.length)\n this.blockLength += this.valueBlock.blockLength;\n return resultOffset;\n }\n toBER(sizeOnly, writer) {\n const _writer = writer || new ViewWriter();\n if (!writer) {\n prepareIndefiniteForm(this);\n }\n const idBlockBuf = this.idBlock.toBER(sizeOnly);\n _writer.write(idBlockBuf);\n if (this.lenBlock.isIndefiniteForm) {\n _writer.write(new Uint8Array([0x80]).buffer);\n this.valueBlock.toBER(sizeOnly, _writer);\n _writer.write(new ArrayBuffer(2));\n }\n else {\n const valueBlockBuf = this.valueBlock.toBER(sizeOnly);\n this.lenBlock.length = valueBlockBuf.byteLength;\n const lenBlockBuf = this.lenBlock.toBER(sizeOnly);\n _writer.write(lenBlockBuf);\n _writer.write(valueBlockBuf);\n }\n if (!writer) {\n return _writer.final();\n }\n return EMPTY_BUFFER;\n }\n toJSON() {\n const object = {\n ...super.toJSON(),\n idBlock: this.idBlock.toJSON(),\n lenBlock: this.lenBlock.toJSON(),\n valueBlock: this.valueBlock.toJSON(),\n name: this.name,\n optional: this.optional,\n };\n if (this.primitiveSchema)\n object.primitiveSchema = this.primitiveSchema.toJSON();\n return object;\n }\n toString(encoding = \"ascii\") {\n if (encoding === \"ascii\") {\n return this.onAsciiEncoding();\n }\n return pvtsutils.Convert.ToHex(this.toBER());\n }\n onAsciiEncoding() {\n const name = this.constructor.NAME;\n const value = pvtsutils.Convert.ToHex(this.valueBlock.valueBeforeDecodeView);\n return `${name} : ${value}`;\n }\n isEqual(other) {\n if (this === other) {\n return true;\n }\n if (!(other instanceof this.constructor)) {\n return false;\n }\n const thisRaw = this.toBER();\n const otherRaw = other.toBER();\n return pvutils.isEqualBuffer(thisRaw, otherRaw);\n }\n}\nBaseBlock.NAME = \"BaseBlock\";\nfunction prepareIndefiniteForm(baseBlock) {\n var _a;\n if (baseBlock instanceof typeStore.Constructed) {\n for (const value of baseBlock.valueBlock.value) {\n if (prepareIndefiniteForm(value)) {\n baseBlock.lenBlock.isIndefiniteForm = true;\n }\n }\n }\n return !!((_a = baseBlock.lenBlock) === null || _a === void 0 ? void 0 : _a.isIndefiniteForm);\n}\n\nclass BaseStringBlock extends BaseBlock {\n getValue() {\n return this.valueBlock.value;\n }\n setValue(value) {\n this.valueBlock.value = value;\n }\n constructor({ value = EMPTY_STRING, ...parameters } = {}, stringValueBlockType) {\n super(parameters, stringValueBlockType);\n if (value) {\n this.fromString(value);\n }\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, (this.lenBlock.isIndefiniteForm)\n ? inputLength\n : this.lenBlock.length);\n if (resultOffset === -1) {\n this.error = this.valueBlock.error;\n return resultOffset;\n }\n this.fromBuffer(this.valueBlock.valueHexView);\n if (!this.idBlock.error.length)\n this.blockLength += this.idBlock.blockLength;\n if (!this.lenBlock.error.length)\n this.blockLength += this.lenBlock.blockLength;\n if (!this.valueBlock.error.length)\n this.blockLength += this.valueBlock.blockLength;\n return resultOffset;\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME} : '${this.valueBlock.value}'`;\n }\n}\nBaseStringBlock.NAME = \"BaseStringBlock\";\n\nclass LocalPrimitiveValueBlock extends HexBlock(ValueBlock) {\n constructor({ isHexOnly = true, ...parameters } = {}) {\n super(parameters);\n this.isHexOnly = isHexOnly;\n }\n}\nLocalPrimitiveValueBlock.NAME = \"PrimitiveValueBlock\";\n\nvar _a$w;\nclass Primitive extends BaseBlock {\n constructor(parameters = {}) {\n super(parameters, LocalPrimitiveValueBlock);\n this.idBlock.isConstructed = false;\n }\n}\n_a$w = Primitive;\n(() => {\n typeStore.Primitive = _a$w;\n})();\nPrimitive.NAME = \"PRIMITIVE\";\n\nfunction localChangeType(inputObject, newType) {\n if (inputObject instanceof newType) {\n return inputObject;\n }\n const newObject = new newType();\n newObject.idBlock = inputObject.idBlock;\n newObject.lenBlock = inputObject.lenBlock;\n newObject.warnings = inputObject.warnings;\n newObject.valueBeforeDecodeView = inputObject.valueBeforeDecodeView;\n return newObject;\n}\nfunction localFromBER(inputBuffer, inputOffset = 0, inputLength = inputBuffer.length) {\n const incomingOffset = inputOffset;\n let returnObject = new BaseBlock({}, ValueBlock);\n const baseBlock = new LocalBaseBlock();\n if (!checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength)) {\n returnObject.error = baseBlock.error;\n return {\n offset: -1,\n result: returnObject,\n };\n }\n const intBuffer = inputBuffer.subarray(inputOffset, inputOffset + inputLength);\n if (!intBuffer.length) {\n returnObject.error = \"Zero buffer length\";\n return {\n offset: -1,\n result: returnObject,\n };\n }\n let resultOffset = returnObject.idBlock.fromBER(inputBuffer, inputOffset, inputLength);\n if (returnObject.idBlock.warnings.length) {\n returnObject.warnings.concat(returnObject.idBlock.warnings);\n }\n if (resultOffset === -1) {\n returnObject.error = returnObject.idBlock.error;\n return {\n offset: -1,\n result: returnObject,\n };\n }\n inputOffset = resultOffset;\n inputLength -= returnObject.idBlock.blockLength;\n resultOffset = returnObject.lenBlock.fromBER(inputBuffer, inputOffset, inputLength);\n if (returnObject.lenBlock.warnings.length) {\n returnObject.warnings.concat(returnObject.lenBlock.warnings);\n }\n if (resultOffset === -1) {\n returnObject.error = returnObject.lenBlock.error;\n return {\n offset: -1,\n result: returnObject,\n };\n }\n inputOffset = resultOffset;\n inputLength -= returnObject.lenBlock.blockLength;\n if (!returnObject.idBlock.isConstructed\n && returnObject.lenBlock.isIndefiniteForm) {\n returnObject.error = \"Indefinite length form used for primitive encoding form\";\n return {\n offset: -1,\n result: returnObject,\n };\n }\n let newASN1Type = BaseBlock;\n switch (returnObject.idBlock.tagClass) {\n case 1:\n if ((returnObject.idBlock.tagNumber >= 37)\n && (returnObject.idBlock.isHexOnly === false)) {\n returnObject.error = \"UNIVERSAL 37 and upper tags are reserved by ASN.1 standard\";\n return {\n offset: -1,\n result: returnObject,\n };\n }\n switch (returnObject.idBlock.tagNumber) {\n case 0:\n if ((returnObject.idBlock.isConstructed)\n && (returnObject.lenBlock.length > 0)) {\n returnObject.error = \"Type [UNIVERSAL 0] is reserved\";\n return {\n offset: -1,\n result: returnObject,\n };\n }\n newASN1Type = typeStore.EndOfContent;\n break;\n case 1:\n newASN1Type = typeStore.Boolean;\n break;\n case 2:\n newASN1Type = typeStore.Integer;\n break;\n case 3:\n newASN1Type = typeStore.BitString;\n break;\n case 4:\n newASN1Type = typeStore.OctetString;\n break;\n case 5:\n newASN1Type = typeStore.Null;\n break;\n case 6:\n newASN1Type = typeStore.ObjectIdentifier;\n break;\n case 10:\n newASN1Type = typeStore.Enumerated;\n break;\n case 12:\n newASN1Type = typeStore.Utf8String;\n break;\n case 13:\n newASN1Type = typeStore.RelativeObjectIdentifier;\n break;\n case 14:\n newASN1Type = typeStore.TIME;\n break;\n case 15:\n returnObject.error = \"[UNIVERSAL 15] is reserved by ASN.1 standard\";\n return {\n offset: -1,\n result: returnObject,\n };\n case 16:\n newASN1Type = typeStore.Sequence;\n break;\n case 17:\n newASN1Type = typeStore.Set;\n break;\n case 18:\n newASN1Type = typeStore.NumericString;\n break;\n case 19:\n newASN1Type = typeStore.PrintableString;\n break;\n case 20:\n newASN1Type = typeStore.TeletexString;\n break;\n case 21:\n newASN1Type = typeStore.VideotexString;\n break;\n case 22:\n newASN1Type = typeStore.IA5String;\n break;\n case 23:\n newASN1Type = typeStore.UTCTime;\n break;\n case 24:\n newASN1Type = typeStore.GeneralizedTime;\n break;\n case 25:\n newASN1Type = typeStore.GraphicString;\n break;\n case 26:\n newASN1Type = typeStore.VisibleString;\n break;\n case 27:\n newASN1Type = typeStore.GeneralString;\n break;\n case 28:\n newASN1Type = typeStore.UniversalString;\n break;\n case 29:\n newASN1Type = typeStore.CharacterString;\n break;\n case 30:\n newASN1Type = typeStore.BmpString;\n break;\n case 31:\n newASN1Type = typeStore.DATE;\n break;\n case 32:\n newASN1Type = typeStore.TimeOfDay;\n break;\n case 33:\n newASN1Type = typeStore.DateTime;\n break;\n case 34:\n newASN1Type = typeStore.Duration;\n break;\n default: {\n const newObject = returnObject.idBlock.isConstructed\n ? new typeStore.Constructed()\n : new typeStore.Primitive();\n newObject.idBlock = returnObject.idBlock;\n newObject.lenBlock = returnObject.lenBlock;\n newObject.warnings = returnObject.warnings;\n returnObject = newObject;\n }\n }\n break;\n case 2:\n case 3:\n case 4:\n default: {\n newASN1Type = returnObject.idBlock.isConstructed\n ? typeStore.Constructed\n : typeStore.Primitive;\n }\n }\n returnObject = localChangeType(returnObject, newASN1Type);\n resultOffset = returnObject.fromBER(inputBuffer, inputOffset, returnObject.lenBlock.isIndefiniteForm ? inputLength : returnObject.lenBlock.length);\n returnObject.valueBeforeDecodeView = inputBuffer.subarray(incomingOffset, incomingOffset + returnObject.blockLength);\n return {\n offset: resultOffset,\n result: returnObject,\n };\n}\nfunction fromBER(inputBuffer) {\n if (!inputBuffer.byteLength) {\n const result = new BaseBlock({}, ValueBlock);\n result.error = \"Input buffer has zero length\";\n return {\n offset: -1,\n result,\n };\n }\n return localFromBER(pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer).slice(), 0, inputBuffer.byteLength);\n}\n\nfunction checkLen(indefiniteLength, length) {\n if (indefiniteLength) {\n return 1;\n }\n return length;\n}\nclass LocalConstructedValueBlock extends ValueBlock {\n constructor({ value = [], isIndefiniteForm = false, ...parameters } = {}) {\n super(parameters);\n this.value = value;\n this.isIndefiniteForm = isIndefiniteForm;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const view = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, view, inputOffset, inputLength)) {\n return -1;\n }\n this.valueBeforeDecodeView = view.subarray(inputOffset, inputOffset + inputLength);\n if (this.valueBeforeDecodeView.length === 0) {\n this.warnings.push(\"Zero buffer length\");\n return inputOffset;\n }\n let currentOffset = inputOffset;\n while (checkLen(this.isIndefiniteForm, inputLength) > 0) {\n const returnObject = localFromBER(view, currentOffset, inputLength);\n if (returnObject.offset === -1) {\n this.error = returnObject.result.error;\n this.warnings.concat(returnObject.result.warnings);\n return -1;\n }\n currentOffset = returnObject.offset;\n this.blockLength += returnObject.result.blockLength;\n inputLength -= returnObject.result.blockLength;\n this.value.push(returnObject.result);\n if (this.isIndefiniteForm && returnObject.result.constructor.NAME === END_OF_CONTENT_NAME) {\n break;\n }\n }\n if (this.isIndefiniteForm) {\n if (this.value[this.value.length - 1].constructor.NAME === END_OF_CONTENT_NAME) {\n this.value.pop();\n }\n else {\n this.warnings.push(\"No EndOfContent block encoded\");\n }\n }\n return currentOffset;\n }\n toBER(sizeOnly, writer) {\n const _writer = writer || new ViewWriter();\n for (let i = 0; i < this.value.length; i++) {\n this.value[i].toBER(sizeOnly, _writer);\n }\n if (!writer) {\n return _writer.final();\n }\n return EMPTY_BUFFER;\n }\n toJSON() {\n const object = {\n ...super.toJSON(),\n isIndefiniteForm: this.isIndefiniteForm,\n value: [],\n };\n for (const value of this.value) {\n object.value.push(value.toJSON());\n }\n return object;\n }\n}\nLocalConstructedValueBlock.NAME = \"ConstructedValueBlock\";\n\nvar _a$v;\nclass Constructed extends BaseBlock {\n constructor(parameters = {}) {\n super(parameters, LocalConstructedValueBlock);\n this.idBlock.isConstructed = true;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm;\n const resultOffset = this.valueBlock.fromBER(inputBuffer, inputOffset, (this.lenBlock.isIndefiniteForm) ? inputLength : this.lenBlock.length);\n if (resultOffset === -1) {\n this.error = this.valueBlock.error;\n return resultOffset;\n }\n if (!this.idBlock.error.length)\n this.blockLength += this.idBlock.blockLength;\n if (!this.lenBlock.error.length)\n this.blockLength += this.lenBlock.blockLength;\n if (!this.valueBlock.error.length)\n this.blockLength += this.valueBlock.blockLength;\n return resultOffset;\n }\n onAsciiEncoding() {\n const values = [];\n for (const value of this.valueBlock.value) {\n values.push(value.toString(\"ascii\").split(\"\\n\").map((o) => ` ${o}`).join(\"\\n\"));\n }\n const blockName = this.idBlock.tagClass === 3\n ? `[${this.idBlock.tagNumber}]`\n : this.constructor.NAME;\n return values.length\n ? `${blockName} :\\n${values.join(\"\\n\")}`\n : `${blockName} :`;\n }\n}\n_a$v = Constructed;\n(() => {\n typeStore.Constructed = _a$v;\n})();\nConstructed.NAME = \"CONSTRUCTED\";\n\nclass LocalEndOfContentValueBlock extends ValueBlock {\n fromBER(inputBuffer, inputOffset, _inputLength) {\n return inputOffset;\n }\n toBER(_sizeOnly) {\n return EMPTY_BUFFER;\n }\n}\nLocalEndOfContentValueBlock.override = \"EndOfContentValueBlock\";\n\nvar _a$u;\nclass EndOfContent extends BaseBlock {\n constructor(parameters = {}) {\n super(parameters, LocalEndOfContentValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 0;\n }\n}\n_a$u = EndOfContent;\n(() => {\n typeStore.EndOfContent = _a$u;\n})();\nEndOfContent.NAME = END_OF_CONTENT_NAME;\n\nvar _a$t;\nclass Null extends BaseBlock {\n constructor(parameters = {}) {\n super(parameters, ValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 5;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n if (this.lenBlock.length > 0)\n this.warnings.push(\"Non-zero length of value block for Null type\");\n if (!this.idBlock.error.length)\n this.blockLength += this.idBlock.blockLength;\n if (!this.lenBlock.error.length)\n this.blockLength += this.lenBlock.blockLength;\n this.blockLength += inputLength;\n if ((inputOffset + inputLength) > inputBuffer.byteLength) {\n this.error = \"End of input reached before message was fully decoded (inconsistent offset and length values)\";\n return -1;\n }\n return (inputOffset + inputLength);\n }\n toBER(sizeOnly, writer) {\n const retBuf = new ArrayBuffer(2);\n if (!sizeOnly) {\n const retView = new Uint8Array(retBuf);\n retView[0] = 0x05;\n retView[1] = 0x00;\n }\n if (writer) {\n writer.write(retBuf);\n }\n return retBuf;\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME}`;\n }\n}\n_a$t = Null;\n(() => {\n typeStore.Null = _a$t;\n})();\nNull.NAME = \"NULL\";\n\nclass LocalBooleanValueBlock extends HexBlock(ValueBlock) {\n get value() {\n for (const octet of this.valueHexView) {\n if (octet > 0) {\n return true;\n }\n }\n return false;\n }\n set value(value) {\n this.valueHexView[0] = value ? 0xFF : 0x00;\n }\n constructor({ value, ...parameters } = {}) {\n super(parameters);\n if (parameters.valueHex) {\n this.valueHexView = pvtsutils.BufferSourceConverter.toUint8Array(parameters.valueHex);\n }\n else {\n this.valueHexView = new Uint8Array(1);\n }\n if (value) {\n this.value = value;\n }\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, inputView, inputOffset, inputLength)) {\n return -1;\n }\n this.valueHexView = inputView.subarray(inputOffset, inputOffset + inputLength);\n if (inputLength > 1)\n this.warnings.push(\"Boolean value encoded in more then 1 octet\");\n this.isHexOnly = true;\n pvutils.utilDecodeTC.call(this);\n this.blockLength = inputLength;\n return (inputOffset + inputLength);\n }\n toBER() {\n return this.valueHexView.slice();\n }\n toJSON() {\n return {\n ...super.toJSON(),\n value: this.value,\n };\n }\n}\nLocalBooleanValueBlock.NAME = \"BooleanValueBlock\";\n\nvar _a$s;\nclass Boolean extends BaseBlock {\n getValue() {\n return this.valueBlock.value;\n }\n setValue(value) {\n this.valueBlock.value = value;\n }\n constructor(parameters = {}) {\n super(parameters, LocalBooleanValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 1;\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME} : ${this.getValue}`;\n }\n}\n_a$s = Boolean;\n(() => {\n typeStore.Boolean = _a$s;\n})();\nBoolean.NAME = \"BOOLEAN\";\n\nclass LocalOctetStringValueBlock extends HexBlock(LocalConstructedValueBlock) {\n constructor({ isConstructed = false, ...parameters } = {}) {\n super(parameters);\n this.isConstructed = isConstructed;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n let resultOffset = 0;\n if (this.isConstructed) {\n this.isHexOnly = false;\n resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength);\n if (resultOffset === -1)\n return resultOffset;\n for (let i = 0; i < this.value.length; i++) {\n const currentBlockName = this.value[i].constructor.NAME;\n if (currentBlockName === END_OF_CONTENT_NAME) {\n if (this.isIndefiniteForm)\n break;\n else {\n this.error = \"EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only\";\n return -1;\n }\n }\n if (currentBlockName !== OCTET_STRING_NAME) {\n this.error = \"OCTET STRING may consists of OCTET STRINGs only\";\n return -1;\n }\n }\n }\n else {\n this.isHexOnly = true;\n resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength);\n this.blockLength = inputLength;\n }\n return resultOffset;\n }\n toBER(sizeOnly, writer) {\n if (this.isConstructed)\n return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer);\n return sizeOnly\n ? new ArrayBuffer(this.valueHexView.byteLength)\n : this.valueHexView.slice().buffer;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n isConstructed: this.isConstructed,\n };\n }\n}\nLocalOctetStringValueBlock.NAME = \"OctetStringValueBlock\";\n\nvar _a$r;\nclass OctetString extends BaseBlock {\n constructor({ idBlock = {}, lenBlock = {}, ...parameters } = {}) {\n var _b, _c;\n (_b = parameters.isConstructed) !== null && _b !== void 0 ? _b : (parameters.isConstructed = !!((_c = parameters.value) === null || _c === void 0 ? void 0 : _c.length));\n super({\n idBlock: {\n isConstructed: parameters.isConstructed,\n ...idBlock,\n },\n lenBlock: {\n ...lenBlock,\n isIndefiniteForm: !!parameters.isIndefiniteForm,\n },\n ...parameters,\n }, LocalOctetStringValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 4;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n this.valueBlock.isConstructed = this.idBlock.isConstructed;\n this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm;\n if (inputLength === 0) {\n if (this.idBlock.error.length === 0)\n this.blockLength += this.idBlock.blockLength;\n if (this.lenBlock.error.length === 0)\n this.blockLength += this.lenBlock.blockLength;\n return inputOffset;\n }\n if (!this.valueBlock.isConstructed) {\n const view = inputBuffer instanceof ArrayBuffer ? new Uint8Array(inputBuffer) : inputBuffer;\n const buf = view.subarray(inputOffset, inputOffset + inputLength);\n try {\n if (buf.byteLength) {\n const asn = localFromBER(buf, 0, buf.byteLength);\n if (asn.offset !== -1 && asn.offset === inputLength) {\n this.valueBlock.value = [asn.result];\n }\n }\n }\n catch {\n }\n }\n return super.fromBER(inputBuffer, inputOffset, inputLength);\n }\n onAsciiEncoding() {\n if (this.valueBlock.isConstructed || (this.valueBlock.value && this.valueBlock.value.length)) {\n return Constructed.prototype.onAsciiEncoding.call(this);\n }\n const name = this.constructor.NAME;\n const value = pvtsutils.Convert.ToHex(this.valueBlock.valueHexView);\n return `${name} : ${value}`;\n }\n getValue() {\n if (!this.idBlock.isConstructed) {\n return this.valueBlock.valueHexView.slice().buffer;\n }\n const array = [];\n for (const content of this.valueBlock.value) {\n if (content instanceof _a$r) {\n array.push(content.valueBlock.valueHexView);\n }\n }\n return pvtsutils.BufferSourceConverter.concat(array);\n }\n}\n_a$r = OctetString;\n(() => {\n typeStore.OctetString = _a$r;\n})();\nOctetString.NAME = OCTET_STRING_NAME;\n\nclass LocalBitStringValueBlock extends HexBlock(LocalConstructedValueBlock) {\n constructor({ unusedBits = 0, isConstructed = false, ...parameters } = {}) {\n super(parameters);\n this.unusedBits = unusedBits;\n this.isConstructed = isConstructed;\n this.blockLength = this.valueHexView.byteLength;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n if (!inputLength) {\n return inputOffset;\n }\n let resultOffset = -1;\n if (this.isConstructed) {\n resultOffset = LocalConstructedValueBlock.prototype.fromBER.call(this, inputBuffer, inputOffset, inputLength);\n if (resultOffset === -1)\n return resultOffset;\n for (const value of this.value) {\n const currentBlockName = value.constructor.NAME;\n if (currentBlockName === END_OF_CONTENT_NAME) {\n if (this.isIndefiniteForm)\n break;\n else {\n this.error = \"EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only\";\n return -1;\n }\n }\n if (currentBlockName !== BIT_STRING_NAME) {\n this.error = \"BIT STRING may consists of BIT STRINGs only\";\n return -1;\n }\n const valueBlock = value.valueBlock;\n if ((this.unusedBits > 0) && (valueBlock.unusedBits > 0)) {\n this.error = \"Using of \\\"unused bits\\\" inside constructive BIT STRING allowed for least one only\";\n return -1;\n }\n this.unusedBits = valueBlock.unusedBits;\n }\n return resultOffset;\n }\n const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, inputView, inputOffset, inputLength)) {\n return -1;\n }\n const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength);\n this.unusedBits = intBuffer[0];\n if (this.unusedBits > 7) {\n this.error = \"Unused bits for BitString must be in range 0-7\";\n return -1;\n }\n if (!this.unusedBits) {\n const buf = intBuffer.subarray(1);\n try {\n if (buf.byteLength) {\n const asn = localFromBER(buf, 0, buf.byteLength);\n if (asn.offset !== -1 && asn.offset === (inputLength - 1)) {\n this.value = [asn.result];\n }\n }\n }\n catch {\n }\n }\n this.valueHexView = intBuffer.subarray(1);\n this.blockLength = intBuffer.length;\n return (inputOffset + inputLength);\n }\n toBER(sizeOnly, writer) {\n if (this.isConstructed) {\n return LocalConstructedValueBlock.prototype.toBER.call(this, sizeOnly, writer);\n }\n if (sizeOnly) {\n return new ArrayBuffer(this.valueHexView.byteLength + 1);\n }\n if (!this.valueHexView.byteLength) {\n const empty = new Uint8Array(1);\n empty[0] = 0;\n return empty.buffer;\n }\n const retView = new Uint8Array(this.valueHexView.length + 1);\n retView[0] = this.unusedBits;\n retView.set(this.valueHexView, 1);\n return retView.buffer;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n unusedBits: this.unusedBits,\n isConstructed: this.isConstructed,\n };\n }\n}\nLocalBitStringValueBlock.NAME = \"BitStringValueBlock\";\n\nvar _a$q;\nclass BitString extends BaseBlock {\n constructor({ idBlock = {}, lenBlock = {}, ...parameters } = {}) {\n var _b, _c;\n (_b = parameters.isConstructed) !== null && _b !== void 0 ? _b : (parameters.isConstructed = !!((_c = parameters.value) === null || _c === void 0 ? void 0 : _c.length));\n super({\n idBlock: {\n isConstructed: parameters.isConstructed,\n ...idBlock,\n },\n lenBlock: {\n ...lenBlock,\n isIndefiniteForm: !!parameters.isIndefiniteForm,\n },\n ...parameters,\n }, LocalBitStringValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 3;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n this.valueBlock.isConstructed = this.idBlock.isConstructed;\n this.valueBlock.isIndefiniteForm = this.lenBlock.isIndefiniteForm;\n return super.fromBER(inputBuffer, inputOffset, inputLength);\n }\n onAsciiEncoding() {\n if (this.valueBlock.isConstructed || (this.valueBlock.value && this.valueBlock.value.length)) {\n return Constructed.prototype.onAsciiEncoding.call(this);\n }\n else {\n const bits = [];\n const valueHex = this.valueBlock.valueHexView;\n for (const byte of valueHex) {\n bits.push(byte.toString(2).padStart(8, \"0\"));\n }\n const bitsStr = bits.join(\"\");\n const name = this.constructor.NAME;\n const value = bitsStr.substring(0, bitsStr.length - this.valueBlock.unusedBits);\n return `${name} : ${value}`;\n }\n }\n}\n_a$q = BitString;\n(() => {\n typeStore.BitString = _a$q;\n})();\nBitString.NAME = BIT_STRING_NAME;\n\nvar _a$p;\nfunction viewAdd(first, second) {\n const c = new Uint8Array([0]);\n const firstView = new Uint8Array(first);\n const secondView = new Uint8Array(second);\n let firstViewCopy = firstView.slice(0);\n const firstViewCopyLength = firstViewCopy.length - 1;\n const secondViewCopy = secondView.slice(0);\n const secondViewCopyLength = secondViewCopy.length - 1;\n let value = 0;\n const max = (secondViewCopyLength < firstViewCopyLength) ? firstViewCopyLength : secondViewCopyLength;\n let counter = 0;\n for (let i = max; i >= 0; i--, counter++) {\n switch (true) {\n case (counter < secondViewCopy.length):\n value = firstViewCopy[firstViewCopyLength - counter] + secondViewCopy[secondViewCopyLength - counter] + c[0];\n break;\n default:\n value = firstViewCopy[firstViewCopyLength - counter] + c[0];\n }\n c[0] = value / 10;\n switch (true) {\n case (counter >= firstViewCopy.length):\n firstViewCopy = pvutils.utilConcatView(new Uint8Array([value % 10]), firstViewCopy);\n break;\n default:\n firstViewCopy[firstViewCopyLength - counter] = value % 10;\n }\n }\n if (c[0] > 0)\n firstViewCopy = pvutils.utilConcatView(c, firstViewCopy);\n return firstViewCopy;\n}\nfunction power2(n) {\n if (n >= powers2.length) {\n for (let p = powers2.length; p <= n; p++) {\n const c = new Uint8Array([0]);\n let digits = (powers2[p - 1]).slice(0);\n for (let i = (digits.length - 1); i >= 0; i--) {\n const newValue = new Uint8Array([(digits[i] << 1) + c[0]]);\n c[0] = newValue[0] / 10;\n digits[i] = newValue[0] % 10;\n }\n if (c[0] > 0)\n digits = pvutils.utilConcatView(c, digits);\n powers2.push(digits);\n }\n }\n return powers2[n];\n}\nfunction viewSub(first, second) {\n let b = 0;\n const firstView = new Uint8Array(first);\n const secondView = new Uint8Array(second);\n const firstViewCopy = firstView.slice(0);\n const firstViewCopyLength = firstViewCopy.length - 1;\n const secondViewCopy = secondView.slice(0);\n const secondViewCopyLength = secondViewCopy.length - 1;\n let value;\n let counter = 0;\n for (let i = secondViewCopyLength; i >= 0; i--, counter++) {\n value = firstViewCopy[firstViewCopyLength - counter] - secondViewCopy[secondViewCopyLength - counter] - b;\n switch (true) {\n case (value < 0):\n b = 1;\n firstViewCopy[firstViewCopyLength - counter] = value + 10;\n break;\n default:\n b = 0;\n firstViewCopy[firstViewCopyLength - counter] = value;\n }\n }\n if (b > 0) {\n for (let i = (firstViewCopyLength - secondViewCopyLength + 1); i >= 0; i--, counter++) {\n value = firstViewCopy[firstViewCopyLength - counter] - b;\n if (value < 0) {\n b = 1;\n firstViewCopy[firstViewCopyLength - counter] = value + 10;\n }\n else {\n b = 0;\n firstViewCopy[firstViewCopyLength - counter] = value;\n break;\n }\n }\n }\n return firstViewCopy.slice();\n}\nclass LocalIntegerValueBlock extends HexBlock(ValueBlock) {\n setValueHex() {\n if (this.valueHexView.length >= 4) {\n this.warnings.push(\"Too big Integer for decoding, hex only\");\n this.isHexOnly = true;\n this._valueDec = 0;\n }\n else {\n this.isHexOnly = false;\n if (this.valueHexView.length > 0) {\n this._valueDec = pvutils.utilDecodeTC.call(this);\n }\n }\n }\n constructor({ value, ...parameters } = {}) {\n super(parameters);\n this._valueDec = 0;\n if (parameters.valueHex) {\n this.setValueHex();\n }\n if (value !== undefined) {\n this.valueDec = value;\n }\n }\n set valueDec(v) {\n this._valueDec = v;\n this.isHexOnly = false;\n this.valueHexView = new Uint8Array(pvutils.utilEncodeTC(v));\n }\n get valueDec() {\n return this._valueDec;\n }\n fromDER(inputBuffer, inputOffset, inputLength, expectedLength = 0) {\n const offset = this.fromBER(inputBuffer, inputOffset, inputLength);\n if (offset === -1)\n return offset;\n const view = this.valueHexView;\n if ((view[0] === 0x00) && ((view[1] & 0x80) !== 0)) {\n this.valueHexView = view.subarray(1);\n }\n else {\n if (expectedLength !== 0) {\n if (view.length < expectedLength) {\n if ((expectedLength - view.length) > 1)\n expectedLength = view.length + 1;\n this.valueHexView = view.subarray(expectedLength - view.length);\n }\n }\n }\n return offset;\n }\n toDER(sizeOnly = false) {\n const view = this.valueHexView;\n switch (true) {\n case ((view[0] & 0x80) !== 0):\n {\n const updatedView = new Uint8Array(this.valueHexView.length + 1);\n updatedView[0] = 0x00;\n updatedView.set(view, 1);\n this.valueHexView = updatedView;\n }\n break;\n case ((view[0] === 0x00) && ((view[1] & 0x80) === 0)):\n {\n this.valueHexView = this.valueHexView.subarray(1);\n }\n break;\n }\n return this.toBER(sizeOnly);\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const resultOffset = super.fromBER(inputBuffer, inputOffset, inputLength);\n if (resultOffset === -1) {\n return resultOffset;\n }\n this.setValueHex();\n return resultOffset;\n }\n toBER(sizeOnly) {\n return sizeOnly\n ? new ArrayBuffer(this.valueHexView.length)\n : this.valueHexView.slice().buffer;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n valueDec: this.valueDec,\n };\n }\n toString() {\n const firstBit = (this.valueHexView.length * 8) - 1;\n let digits = new Uint8Array((this.valueHexView.length * 8) / 3);\n let bitNumber = 0;\n let currentByte;\n const asn1View = this.valueHexView;\n let result = \"\";\n let flag = false;\n for (let byteNumber = (asn1View.byteLength - 1); byteNumber >= 0; byteNumber--) {\n currentByte = asn1View[byteNumber];\n for (let i = 0; i < 8; i++) {\n if ((currentByte & 1) === 1) {\n switch (bitNumber) {\n case firstBit:\n digits = viewSub(power2(bitNumber), digits);\n result = \"-\";\n break;\n default:\n digits = viewAdd(digits, power2(bitNumber));\n }\n }\n bitNumber++;\n currentByte >>= 1;\n }\n }\n for (let i = 0; i < digits.length; i++) {\n if (digits[i])\n flag = true;\n if (flag)\n result += digitsString.charAt(digits[i]);\n }\n if (flag === false)\n result += digitsString.charAt(0);\n return result;\n }\n}\n_a$p = LocalIntegerValueBlock;\nLocalIntegerValueBlock.NAME = \"IntegerValueBlock\";\n(() => {\n Object.defineProperty(_a$p.prototype, \"valueHex\", {\n set: function (v) {\n this.valueHexView = new Uint8Array(v);\n this.setValueHex();\n },\n get: function () {\n return this.valueHexView.slice().buffer;\n },\n });\n})();\n\nvar _a$o;\nclass Integer extends BaseBlock {\n constructor(parameters = {}) {\n super(parameters, LocalIntegerValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 2;\n }\n toBigInt() {\n assertBigInt();\n return BigInt(this.valueBlock.toString());\n }\n static fromBigInt(value) {\n assertBigInt();\n const bigIntValue = BigInt(value);\n const writer = new ViewWriter();\n const hex = bigIntValue.toString(16).replace(/^-/, \"\");\n const view = new Uint8Array(pvtsutils.Convert.FromHex(hex));\n if (bigIntValue < 0) {\n const first = new Uint8Array(view.length + (view[0] & 0x80 ? 1 : 0));\n first[0] |= 0x80;\n const firstInt = BigInt(`0x${pvtsutils.Convert.ToHex(first)}`);\n const secondInt = firstInt + bigIntValue;\n const second = pvtsutils.BufferSourceConverter.toUint8Array(pvtsutils.Convert.FromHex(secondInt.toString(16)));\n second[0] |= 0x80;\n writer.write(second);\n }\n else {\n if (view[0] & 0x80) {\n writer.write(new Uint8Array([0]));\n }\n writer.write(view);\n }\n const res = new _a$o({ valueHex: writer.final() });\n return res;\n }\n convertToDER() {\n const integer = new _a$o({ valueHex: this.valueBlock.valueHexView });\n integer.valueBlock.toDER();\n return integer;\n }\n convertFromDER() {\n return new _a$o({\n valueHex: this.valueBlock.valueHexView[0] === 0\n ? this.valueBlock.valueHexView.subarray(1)\n : this.valueBlock.valueHexView,\n });\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME} : ${this.valueBlock.toString()}`;\n }\n}\n_a$o = Integer;\n(() => {\n typeStore.Integer = _a$o;\n})();\nInteger.NAME = \"INTEGER\";\n\nvar _a$n;\nclass Enumerated extends Integer {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 10;\n }\n}\n_a$n = Enumerated;\n(() => {\n typeStore.Enumerated = _a$n;\n})();\nEnumerated.NAME = \"ENUMERATED\";\n\nclass LocalSidValueBlock extends HexBlock(ValueBlock) {\n constructor({ valueDec = -1, isFirstSid = false, ...parameters } = {}) {\n super(parameters);\n this.valueDec = valueDec;\n this.isFirstSid = isFirstSid;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n if (!inputLength) {\n return inputOffset;\n }\n const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, inputView, inputOffset, inputLength)) {\n return -1;\n }\n const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength);\n this.valueHexView = new Uint8Array(inputLength);\n for (let i = 0; i < inputLength; i++) {\n this.valueHexView[i] = intBuffer[i] & 0x7F;\n this.blockLength++;\n if ((intBuffer[i] & 0x80) === 0x00)\n break;\n }\n const tempView = new Uint8Array(this.blockLength);\n for (let i = 0; i < this.blockLength; i++) {\n tempView[i] = this.valueHexView[i];\n }\n this.valueHexView = tempView;\n if ((intBuffer[this.blockLength - 1] & 0x80) !== 0x00) {\n this.error = \"End of input reached before message was fully decoded\";\n return -1;\n }\n if (this.valueHexView[0] === 0x00)\n this.warnings.push(\"Needlessly long format of SID encoding\");\n if (this.blockLength <= 8)\n this.valueDec = pvutils.utilFromBase(this.valueHexView, 7);\n else {\n this.isHexOnly = true;\n this.warnings.push(\"Too big SID for decoding, hex only\");\n }\n return (inputOffset + this.blockLength);\n }\n set valueBigInt(value) {\n assertBigInt();\n let bits = BigInt(value).toString(2);\n while (bits.length % 7) {\n bits = \"0\" + bits;\n }\n const bytes = new Uint8Array(bits.length / 7);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(bits.slice(i * 7, i * 7 + 7), 2) + (i + 1 < bytes.length ? 0x80 : 0);\n }\n this.fromBER(bytes.buffer, 0, bytes.length);\n }\n toBER(sizeOnly) {\n if (this.isHexOnly) {\n if (sizeOnly)\n return (new ArrayBuffer(this.valueHexView.byteLength));\n const curView = this.valueHexView;\n const retView = new Uint8Array(this.blockLength);\n for (let i = 0; i < (this.blockLength - 1); i++)\n retView[i] = curView[i] | 0x80;\n retView[this.blockLength - 1] = curView[this.blockLength - 1];\n return retView.buffer;\n }\n const encodedBuf = pvutils.utilToBase(this.valueDec, 7);\n if (encodedBuf.byteLength === 0) {\n this.error = \"Error during encoding SID value\";\n return EMPTY_BUFFER;\n }\n const retView = new Uint8Array(encodedBuf.byteLength);\n if (!sizeOnly) {\n const encodedView = new Uint8Array(encodedBuf);\n const len = encodedBuf.byteLength - 1;\n for (let i = 0; i < len; i++)\n retView[i] = encodedView[i] | 0x80;\n retView[len] = encodedView[len];\n }\n return retView;\n }\n toString() {\n let result = \"\";\n if (this.isHexOnly)\n result = pvtsutils.Convert.ToHex(this.valueHexView);\n else {\n if (this.isFirstSid) {\n let sidValue = this.valueDec;\n if (this.valueDec <= 39)\n result = \"0.\";\n else {\n if (this.valueDec <= 79) {\n result = \"1.\";\n sidValue -= 40;\n }\n else {\n result = \"2.\";\n sidValue -= 80;\n }\n }\n result += sidValue.toString();\n }\n else\n result = this.valueDec.toString();\n }\n return result;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n valueDec: this.valueDec,\n isFirstSid: this.isFirstSid,\n };\n }\n}\nLocalSidValueBlock.NAME = \"sidBlock\";\n\nclass LocalObjectIdentifierValueBlock extends ValueBlock {\n constructor({ value = EMPTY_STRING, ...parameters } = {}) {\n super(parameters);\n this.value = [];\n if (value) {\n this.fromString(value);\n }\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n let resultOffset = inputOffset;\n while (inputLength > 0) {\n const sidBlock = new LocalSidValueBlock();\n resultOffset = sidBlock.fromBER(inputBuffer, resultOffset, inputLength);\n if (resultOffset === -1) {\n this.blockLength = 0;\n this.error = sidBlock.error;\n return resultOffset;\n }\n if (this.value.length === 0)\n sidBlock.isFirstSid = true;\n this.blockLength += sidBlock.blockLength;\n inputLength -= sidBlock.blockLength;\n this.value.push(sidBlock);\n }\n return resultOffset;\n }\n toBER(sizeOnly) {\n const retBuffers = [];\n for (let i = 0; i < this.value.length; i++) {\n const valueBuf = this.value[i].toBER(sizeOnly);\n if (valueBuf.byteLength === 0) {\n this.error = this.value[i].error;\n return EMPTY_BUFFER;\n }\n retBuffers.push(valueBuf);\n }\n return concat(retBuffers);\n }\n fromString(string) {\n this.value = [];\n let pos1 = 0;\n let pos2 = 0;\n let sid = \"\";\n let flag = false;\n do {\n pos2 = string.indexOf(\".\", pos1);\n if (pos2 === -1)\n sid = string.substring(pos1);\n else\n sid = string.substring(pos1, pos2);\n pos1 = pos2 + 1;\n if (flag) {\n const sidBlock = this.value[0];\n let plus = 0;\n switch (sidBlock.valueDec) {\n case 0:\n break;\n case 1:\n plus = 40;\n break;\n case 2:\n plus = 80;\n break;\n default:\n this.value = [];\n return;\n }\n const parsedSID = parseInt(sid, 10);\n if (isNaN(parsedSID))\n return;\n sidBlock.valueDec = parsedSID + plus;\n flag = false;\n }\n else {\n const sidBlock = new LocalSidValueBlock();\n if (sid > Number.MAX_SAFE_INTEGER) {\n assertBigInt();\n const sidValue = BigInt(sid);\n sidBlock.valueBigInt = sidValue;\n }\n else {\n sidBlock.valueDec = parseInt(sid, 10);\n if (isNaN(sidBlock.valueDec))\n return;\n }\n if (!this.value.length) {\n sidBlock.isFirstSid = true;\n flag = true;\n }\n this.value.push(sidBlock);\n }\n } while (pos2 !== -1);\n }\n toString() {\n let result = \"\";\n let isHexOnly = false;\n for (let i = 0; i < this.value.length; i++) {\n isHexOnly = this.value[i].isHexOnly;\n let sidStr = this.value[i].toString();\n if (i !== 0)\n result = `${result}.`;\n if (isHexOnly) {\n sidStr = `{${sidStr}}`;\n if (this.value[i].isFirstSid)\n result = `2.{${sidStr} - 80}`;\n else\n result += sidStr;\n }\n else\n result += sidStr;\n }\n return result;\n }\n toJSON() {\n const object = {\n ...super.toJSON(),\n value: this.toString(),\n sidArray: [],\n };\n for (let i = 0; i < this.value.length; i++) {\n object.sidArray.push(this.value[i].toJSON());\n }\n return object;\n }\n}\nLocalObjectIdentifierValueBlock.NAME = \"ObjectIdentifierValueBlock\";\n\nvar _a$m;\nclass ObjectIdentifier extends BaseBlock {\n getValue() {\n return this.valueBlock.toString();\n }\n setValue(value) {\n this.valueBlock.fromString(value);\n }\n constructor(parameters = {}) {\n super(parameters, LocalObjectIdentifierValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 6;\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME} : ${this.valueBlock.toString() || \"empty\"}`;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n value: this.getValue(),\n };\n }\n}\n_a$m = ObjectIdentifier;\n(() => {\n typeStore.ObjectIdentifier = _a$m;\n})();\nObjectIdentifier.NAME = \"OBJECT IDENTIFIER\";\n\nclass LocalRelativeSidValueBlock extends HexBlock(LocalBaseBlock) {\n constructor({ valueDec = 0, ...parameters } = {}) {\n super(parameters);\n this.valueDec = valueDec;\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n if (inputLength === 0)\n return inputOffset;\n const inputView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n if (!checkBufferParams(this, inputView, inputOffset, inputLength))\n return -1;\n const intBuffer = inputView.subarray(inputOffset, inputOffset + inputLength);\n this.valueHexView = new Uint8Array(inputLength);\n for (let i = 0; i < inputLength; i++) {\n this.valueHexView[i] = intBuffer[i] & 0x7F;\n this.blockLength++;\n if ((intBuffer[i] & 0x80) === 0x00)\n break;\n }\n const tempView = new Uint8Array(this.blockLength);\n for (let i = 0; i < this.blockLength; i++)\n tempView[i] = this.valueHexView[i];\n this.valueHexView = tempView;\n if ((intBuffer[this.blockLength - 1] & 0x80) !== 0x00) {\n this.error = \"End of input reached before message was fully decoded\";\n return -1;\n }\n if (this.valueHexView[0] === 0x00)\n this.warnings.push(\"Needlessly long format of SID encoding\");\n if (this.blockLength <= 8)\n this.valueDec = pvutils.utilFromBase(this.valueHexView, 7);\n else {\n this.isHexOnly = true;\n this.warnings.push(\"Too big SID for decoding, hex only\");\n }\n return (inputOffset + this.blockLength);\n }\n toBER(sizeOnly) {\n if (this.isHexOnly) {\n if (sizeOnly)\n return (new ArrayBuffer(this.valueHexView.byteLength));\n const curView = this.valueHexView;\n const retView = new Uint8Array(this.blockLength);\n for (let i = 0; i < (this.blockLength - 1); i++)\n retView[i] = curView[i] | 0x80;\n retView[this.blockLength - 1] = curView[this.blockLength - 1];\n return retView.buffer;\n }\n const encodedBuf = pvutils.utilToBase(this.valueDec, 7);\n if (encodedBuf.byteLength === 0) {\n this.error = \"Error during encoding SID value\";\n return EMPTY_BUFFER;\n }\n const retView = new Uint8Array(encodedBuf.byteLength);\n if (!sizeOnly) {\n const encodedView = new Uint8Array(encodedBuf);\n const len = encodedBuf.byteLength - 1;\n for (let i = 0; i < len; i++)\n retView[i] = encodedView[i] | 0x80;\n retView[len] = encodedView[len];\n }\n return retView.buffer;\n }\n toString() {\n let result = \"\";\n if (this.isHexOnly)\n result = pvtsutils.Convert.ToHex(this.valueHexView);\n else {\n result = this.valueDec.toString();\n }\n return result;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n valueDec: this.valueDec,\n };\n }\n}\nLocalRelativeSidValueBlock.NAME = \"relativeSidBlock\";\n\nclass LocalRelativeObjectIdentifierValueBlock extends ValueBlock {\n constructor({ value = EMPTY_STRING, ...parameters } = {}) {\n super(parameters);\n this.value = [];\n if (value) {\n this.fromString(value);\n }\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n let resultOffset = inputOffset;\n while (inputLength > 0) {\n const sidBlock = new LocalRelativeSidValueBlock();\n resultOffset = sidBlock.fromBER(inputBuffer, resultOffset, inputLength);\n if (resultOffset === -1) {\n this.blockLength = 0;\n this.error = sidBlock.error;\n return resultOffset;\n }\n this.blockLength += sidBlock.blockLength;\n inputLength -= sidBlock.blockLength;\n this.value.push(sidBlock);\n }\n return resultOffset;\n }\n toBER(sizeOnly, _writer) {\n const retBuffers = [];\n for (let i = 0; i < this.value.length; i++) {\n const valueBuf = this.value[i].toBER(sizeOnly);\n if (valueBuf.byteLength === 0) {\n this.error = this.value[i].error;\n return EMPTY_BUFFER;\n }\n retBuffers.push(valueBuf);\n }\n return concat(retBuffers);\n }\n fromString(string) {\n this.value = [];\n let pos1 = 0;\n let pos2 = 0;\n let sid = \"\";\n do {\n pos2 = string.indexOf(\".\", pos1);\n if (pos2 === -1)\n sid = string.substring(pos1);\n else\n sid = string.substring(pos1, pos2);\n pos1 = pos2 + 1;\n const sidBlock = new LocalRelativeSidValueBlock();\n sidBlock.valueDec = parseInt(sid, 10);\n if (isNaN(sidBlock.valueDec))\n return true;\n this.value.push(sidBlock);\n } while (pos2 !== -1);\n return true;\n }\n toString() {\n let result = \"\";\n let isHexOnly = false;\n for (let i = 0; i < this.value.length; i++) {\n isHexOnly = this.value[i].isHexOnly;\n let sidStr = this.value[i].toString();\n if (i !== 0)\n result = `${result}.`;\n if (isHexOnly) {\n sidStr = `{${sidStr}}`;\n result += sidStr;\n }\n else\n result += sidStr;\n }\n return result;\n }\n toJSON() {\n const object = {\n ...super.toJSON(),\n value: this.toString(),\n sidArray: [],\n };\n for (let i = 0; i < this.value.length; i++)\n object.sidArray.push(this.value[i].toJSON());\n return object;\n }\n}\nLocalRelativeObjectIdentifierValueBlock.NAME = \"RelativeObjectIdentifierValueBlock\";\n\nvar _a$l;\nclass RelativeObjectIdentifier extends BaseBlock {\n getValue() {\n return this.valueBlock.toString();\n }\n setValue(value) {\n this.valueBlock.fromString(value);\n }\n constructor(parameters = {}) {\n super(parameters, LocalRelativeObjectIdentifierValueBlock);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 13;\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME} : ${this.valueBlock.toString() || \"empty\"}`;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n value: this.getValue(),\n };\n }\n}\n_a$l = RelativeObjectIdentifier;\n(() => {\n typeStore.RelativeObjectIdentifier = _a$l;\n})();\nRelativeObjectIdentifier.NAME = \"RelativeObjectIdentifier\";\n\nvar _a$k;\nclass Sequence extends Constructed {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 16;\n }\n}\n_a$k = Sequence;\n(() => {\n typeStore.Sequence = _a$k;\n})();\nSequence.NAME = \"SEQUENCE\";\n\nvar _a$j;\nclass Set extends Constructed {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 17;\n }\n}\n_a$j = Set;\n(() => {\n typeStore.Set = _a$j;\n})();\nSet.NAME = \"SET\";\n\nclass LocalStringValueBlock extends HexBlock(ValueBlock) {\n constructor({ ...parameters } = {}) {\n super(parameters);\n this.isHexOnly = true;\n this.value = EMPTY_STRING;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n value: this.value,\n };\n }\n}\nLocalStringValueBlock.NAME = \"StringValueBlock\";\n\nclass LocalSimpleStringValueBlock extends LocalStringValueBlock {\n}\nLocalSimpleStringValueBlock.NAME = \"SimpleStringValueBlock\";\n\nclass LocalSimpleStringBlock extends BaseStringBlock {\n constructor({ ...parameters } = {}) {\n super(parameters, LocalSimpleStringValueBlock);\n }\n fromBuffer(inputBuffer) {\n this.valueBlock.value = String.fromCharCode.apply(null, pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer));\n }\n fromString(inputString) {\n const strLen = inputString.length;\n const view = this.valueBlock.valueHexView = new Uint8Array(strLen);\n for (let i = 0; i < strLen; i++)\n view[i] = inputString.charCodeAt(i);\n this.valueBlock.value = inputString;\n }\n}\nLocalSimpleStringBlock.NAME = \"SIMPLE STRING\";\n\nclass LocalUtf8StringValueBlock extends LocalSimpleStringBlock {\n fromBuffer(inputBuffer) {\n this.valueBlock.valueHexView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n try {\n this.valueBlock.value = pvtsutils.Convert.ToUtf8String(inputBuffer);\n }\n catch (ex) {\n this.warnings.push(`Error during \"decodeURIComponent\": ${ex}, using raw string`);\n this.valueBlock.value = pvtsutils.Convert.ToBinary(inputBuffer);\n }\n }\n fromString(inputString) {\n this.valueBlock.valueHexView = new Uint8Array(pvtsutils.Convert.FromUtf8String(inputString));\n this.valueBlock.value = inputString;\n }\n}\nLocalUtf8StringValueBlock.NAME = \"Utf8StringValueBlock\";\n\nvar _a$i;\nclass Utf8String extends LocalUtf8StringValueBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 12;\n }\n}\n_a$i = Utf8String;\n(() => {\n typeStore.Utf8String = _a$i;\n})();\nUtf8String.NAME = \"UTF8String\";\n\nclass LocalBmpStringValueBlock extends LocalSimpleStringBlock {\n fromBuffer(inputBuffer) {\n this.valueBlock.value = pvtsutils.Convert.ToUtf16String(inputBuffer);\n this.valueBlock.valueHexView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer);\n }\n fromString(inputString) {\n this.valueBlock.value = inputString;\n this.valueBlock.valueHexView = new Uint8Array(pvtsutils.Convert.FromUtf16String(inputString));\n }\n}\nLocalBmpStringValueBlock.NAME = \"BmpStringValueBlock\";\n\nvar _a$h;\nclass BmpString extends LocalBmpStringValueBlock {\n constructor({ ...parameters } = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 30;\n }\n}\n_a$h = BmpString;\n(() => {\n typeStore.BmpString = _a$h;\n})();\nBmpString.NAME = \"BMPString\";\n\nclass LocalUniversalStringValueBlock extends LocalSimpleStringBlock {\n fromBuffer(inputBuffer) {\n const copyBuffer = ArrayBuffer.isView(inputBuffer) ? inputBuffer.slice().buffer : inputBuffer.slice(0);\n const valueView = new Uint8Array(copyBuffer);\n for (let i = 0; i < valueView.length; i += 4) {\n valueView[i] = valueView[i + 3];\n valueView[i + 1] = valueView[i + 2];\n valueView[i + 2] = 0x00;\n valueView[i + 3] = 0x00;\n }\n this.valueBlock.value = String.fromCharCode.apply(null, new Uint32Array(copyBuffer));\n }\n fromString(inputString) {\n const strLength = inputString.length;\n const valueHexView = this.valueBlock.valueHexView = new Uint8Array(strLength * 4);\n for (let i = 0; i < strLength; i++) {\n const codeBuf = pvutils.utilToBase(inputString.charCodeAt(i), 8);\n const codeView = new Uint8Array(codeBuf);\n if (codeView.length > 4)\n continue;\n const dif = 4 - codeView.length;\n for (let j = (codeView.length - 1); j >= 0; j--)\n valueHexView[i * 4 + j + dif] = codeView[j];\n }\n this.valueBlock.value = inputString;\n }\n}\nLocalUniversalStringValueBlock.NAME = \"UniversalStringValueBlock\";\n\nvar _a$g;\nclass UniversalString extends LocalUniversalStringValueBlock {\n constructor({ ...parameters } = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 28;\n }\n}\n_a$g = UniversalString;\n(() => {\n typeStore.UniversalString = _a$g;\n})();\nUniversalString.NAME = \"UniversalString\";\n\nvar _a$f;\nclass NumericString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 18;\n }\n}\n_a$f = NumericString;\n(() => {\n typeStore.NumericString = _a$f;\n})();\nNumericString.NAME = \"NumericString\";\n\nvar _a$e;\nclass PrintableString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 19;\n }\n}\n_a$e = PrintableString;\n(() => {\n typeStore.PrintableString = _a$e;\n})();\nPrintableString.NAME = \"PrintableString\";\n\nvar _a$d;\nclass TeletexString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 20;\n }\n}\n_a$d = TeletexString;\n(() => {\n typeStore.TeletexString = _a$d;\n})();\nTeletexString.NAME = \"TeletexString\";\n\nvar _a$c;\nclass VideotexString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 21;\n }\n}\n_a$c = VideotexString;\n(() => {\n typeStore.VideotexString = _a$c;\n})();\nVideotexString.NAME = \"VideotexString\";\n\nvar _a$b;\nclass IA5String extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 22;\n }\n}\n_a$b = IA5String;\n(() => {\n typeStore.IA5String = _a$b;\n})();\nIA5String.NAME = \"IA5String\";\n\nvar _a$a;\nclass GraphicString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 25;\n }\n}\n_a$a = GraphicString;\n(() => {\n typeStore.GraphicString = _a$a;\n})();\nGraphicString.NAME = \"GraphicString\";\n\nvar _a$9;\nclass VisibleString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 26;\n }\n}\n_a$9 = VisibleString;\n(() => {\n typeStore.VisibleString = _a$9;\n})();\nVisibleString.NAME = \"VisibleString\";\n\nvar _a$8;\nclass GeneralString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 27;\n }\n}\n_a$8 = GeneralString;\n(() => {\n typeStore.GeneralString = _a$8;\n})();\nGeneralString.NAME = \"GeneralString\";\n\nvar _a$7;\nclass CharacterString extends LocalSimpleStringBlock {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 29;\n }\n}\n_a$7 = CharacterString;\n(() => {\n typeStore.CharacterString = _a$7;\n})();\nCharacterString.NAME = \"CharacterString\";\n\nvar _a$6;\nclass UTCTime extends VisibleString {\n constructor({ value, valueDate, ...parameters } = {}) {\n super(parameters);\n this.year = 0;\n this.month = 0;\n this.day = 0;\n this.hour = 0;\n this.minute = 0;\n this.second = 0;\n if (value) {\n this.fromString(value);\n this.valueBlock.valueHexView = new Uint8Array(value.length);\n for (let i = 0; i < value.length; i++)\n this.valueBlock.valueHexView[i] = value.charCodeAt(i);\n }\n if (valueDate) {\n this.fromDate(valueDate);\n this.valueBlock.valueHexView = new Uint8Array(this.toBuffer());\n }\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 23;\n }\n fromBuffer(inputBuffer) {\n this.fromString(String.fromCharCode.apply(null, pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer)));\n }\n toBuffer() {\n const str = this.toString();\n const buffer = new ArrayBuffer(str.length);\n const view = new Uint8Array(buffer);\n for (let i = 0; i < str.length; i++)\n view[i] = str.charCodeAt(i);\n return buffer;\n }\n fromDate(inputDate) {\n this.year = inputDate.getUTCFullYear();\n this.month = inputDate.getUTCMonth() + 1;\n this.day = inputDate.getUTCDate();\n this.hour = inputDate.getUTCHours();\n this.minute = inputDate.getUTCMinutes();\n this.second = inputDate.getUTCSeconds();\n }\n toDate() {\n return (new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second)));\n }\n fromString(inputString) {\n const parser = /(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})Z/ig;\n const parserArray = parser.exec(inputString);\n if (parserArray === null) {\n this.error = \"Wrong input string for conversion\";\n return;\n }\n const year = parseInt(parserArray[1], 10);\n if (year >= 50)\n this.year = 1900 + year;\n else\n this.year = 2000 + year;\n this.month = parseInt(parserArray[2], 10);\n this.day = parseInt(parserArray[3], 10);\n this.hour = parseInt(parserArray[4], 10);\n this.minute = parseInt(parserArray[5], 10);\n this.second = parseInt(parserArray[6], 10);\n }\n toString(encoding = \"iso\") {\n if (encoding === \"iso\") {\n const outputArray = new Array(7);\n outputArray[0] = pvutils.padNumber(((this.year < 2000) ? (this.year - 1900) : (this.year - 2000)), 2);\n outputArray[1] = pvutils.padNumber(this.month, 2);\n outputArray[2] = pvutils.padNumber(this.day, 2);\n outputArray[3] = pvutils.padNumber(this.hour, 2);\n outputArray[4] = pvutils.padNumber(this.minute, 2);\n outputArray[5] = pvutils.padNumber(this.second, 2);\n outputArray[6] = \"Z\";\n return outputArray.join(\"\");\n }\n return super.toString(encoding);\n }\n onAsciiEncoding() {\n return `${this.constructor.NAME} : ${this.toDate().toISOString()}`;\n }\n toJSON() {\n return {\n ...super.toJSON(),\n year: this.year,\n month: this.month,\n day: this.day,\n hour: this.hour,\n minute: this.minute,\n second: this.second,\n };\n }\n}\n_a$6 = UTCTime;\n(() => {\n typeStore.UTCTime = _a$6;\n})();\nUTCTime.NAME = \"UTCTime\";\n\nvar _a$5;\nclass GeneralizedTime extends UTCTime {\n constructor(parameters = {}) {\n var _b;\n super(parameters);\n (_b = this.millisecond) !== null && _b !== void 0 ? _b : (this.millisecond = 0);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 24;\n }\n fromDate(inputDate) {\n super.fromDate(inputDate);\n this.millisecond = inputDate.getUTCMilliseconds();\n }\n toDate() {\n const utcDate = Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond);\n return (new Date(utcDate));\n }\n fromString(inputString) {\n let isUTC = false;\n let timeString = \"\";\n let dateTimeString = \"\";\n let fractionPart = 0;\n let parser;\n let hourDifference = 0;\n let minuteDifference = 0;\n if (inputString[inputString.length - 1] === \"Z\") {\n timeString = inputString.substring(0, inputString.length - 1);\n isUTC = true;\n }\n else {\n const number = new Number(inputString[inputString.length - 1]);\n if (isNaN(number.valueOf()))\n throw new Error(\"Wrong input string for conversion\");\n timeString = inputString;\n }\n if (isUTC) {\n if (timeString.indexOf(\"+\") !== -1)\n throw new Error(\"Wrong input string for conversion\");\n if (timeString.indexOf(\"-\") !== -1)\n throw new Error(\"Wrong input string for conversion\");\n }\n else {\n let multiplier = 1;\n let differencePosition = timeString.indexOf(\"+\");\n let differenceString = \"\";\n if (differencePosition === -1) {\n differencePosition = timeString.indexOf(\"-\");\n multiplier = -1;\n }\n if (differencePosition !== -1) {\n differenceString = timeString.substring(differencePosition + 1);\n timeString = timeString.substring(0, differencePosition);\n if ((differenceString.length !== 2) && (differenceString.length !== 4))\n throw new Error(\"Wrong input string for conversion\");\n let number = parseInt(differenceString.substring(0, 2), 10);\n if (isNaN(number.valueOf()))\n throw new Error(\"Wrong input string for conversion\");\n hourDifference = multiplier * number;\n if (differenceString.length === 4) {\n number = parseInt(differenceString.substring(2, 4), 10);\n if (isNaN(number.valueOf()))\n throw new Error(\"Wrong input string for conversion\");\n minuteDifference = multiplier * number;\n }\n }\n }\n let fractionPointPosition = timeString.indexOf(\".\");\n if (fractionPointPosition === -1)\n fractionPointPosition = timeString.indexOf(\",\");\n if (fractionPointPosition !== -1) {\n const fractionPartCheck = new Number(`0${timeString.substring(fractionPointPosition)}`);\n if (isNaN(fractionPartCheck.valueOf()))\n throw new Error(\"Wrong input string for conversion\");\n fractionPart = fractionPartCheck.valueOf();\n dateTimeString = timeString.substring(0, fractionPointPosition);\n }\n else\n dateTimeString = timeString;\n switch (true) {\n case (dateTimeString.length === 8):\n parser = /(\\d{4})(\\d{2})(\\d{2})/ig;\n if (fractionPointPosition !== -1)\n throw new Error(\"Wrong input string for conversion\");\n break;\n case (dateTimeString.length === 10):\n parser = /(\\d{4})(\\d{2})(\\d{2})(\\d{2})/ig;\n if (fractionPointPosition !== -1) {\n let fractionResult = 60 * fractionPart;\n this.minute = Math.floor(fractionResult);\n fractionResult = 60 * (fractionResult - this.minute);\n this.second = Math.floor(fractionResult);\n fractionResult = 1000 * (fractionResult - this.second);\n this.millisecond = Math.floor(fractionResult);\n }\n break;\n case (dateTimeString.length === 12):\n parser = /(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/ig;\n if (fractionPointPosition !== -1) {\n let fractionResult = 60 * fractionPart;\n this.second = Math.floor(fractionResult);\n fractionResult = 1000 * (fractionResult - this.second);\n this.millisecond = Math.floor(fractionResult);\n }\n break;\n case (dateTimeString.length === 14):\n parser = /(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/ig;\n if (fractionPointPosition !== -1) {\n const fractionResult = 1000 * fractionPart;\n this.millisecond = Math.floor(fractionResult);\n }\n break;\n default:\n throw new Error(\"Wrong input string for conversion\");\n }\n const parserArray = parser.exec(dateTimeString);\n if (parserArray === null)\n throw new Error(\"Wrong input string for conversion\");\n for (let j = 1; j < parserArray.length; j++) {\n switch (j) {\n case 1:\n this.year = parseInt(parserArray[j], 10);\n break;\n case 2:\n this.month = parseInt(parserArray[j], 10);\n break;\n case 3:\n this.day = parseInt(parserArray[j], 10);\n break;\n case 4:\n this.hour = parseInt(parserArray[j], 10) + hourDifference;\n break;\n case 5:\n this.minute = parseInt(parserArray[j], 10) + minuteDifference;\n break;\n case 6:\n this.second = parseInt(parserArray[j], 10);\n break;\n default:\n throw new Error(\"Wrong input string for conversion\");\n }\n }\n if (isUTC === false) {\n const tempDate = new Date(this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond);\n this.year = tempDate.getUTCFullYear();\n this.month = tempDate.getUTCMonth();\n this.day = tempDate.getUTCDay();\n this.hour = tempDate.getUTCHours();\n this.minute = tempDate.getUTCMinutes();\n this.second = tempDate.getUTCSeconds();\n this.millisecond = tempDate.getUTCMilliseconds();\n }\n }\n toString(encoding = \"iso\") {\n if (encoding === \"iso\") {\n const outputArray = [];\n outputArray.push(pvutils.padNumber(this.year, 4));\n outputArray.push(pvutils.padNumber(this.month, 2));\n outputArray.push(pvutils.padNumber(this.day, 2));\n outputArray.push(pvutils.padNumber(this.hour, 2));\n outputArray.push(pvutils.padNumber(this.minute, 2));\n outputArray.push(pvutils.padNumber(this.second, 2));\n if (this.millisecond !== 0) {\n outputArray.push(\".\");\n outputArray.push(pvutils.padNumber(this.millisecond, 3));\n }\n outputArray.push(\"Z\");\n return outputArray.join(\"\");\n }\n return super.toString(encoding);\n }\n toJSON() {\n return {\n ...super.toJSON(),\n millisecond: this.millisecond,\n };\n }\n}\n_a$5 = GeneralizedTime;\n(() => {\n typeStore.GeneralizedTime = _a$5;\n})();\nGeneralizedTime.NAME = \"GeneralizedTime\";\n\nvar _a$4;\nclass DATE extends Utf8String {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 31;\n }\n}\n_a$4 = DATE;\n(() => {\n typeStore.DATE = _a$4;\n})();\nDATE.NAME = \"DATE\";\n\nvar _a$3;\nclass TimeOfDay extends Utf8String {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 32;\n }\n}\n_a$3 = TimeOfDay;\n(() => {\n typeStore.TimeOfDay = _a$3;\n})();\nTimeOfDay.NAME = \"TimeOfDay\";\n\nvar _a$2;\nclass DateTime extends Utf8String {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 33;\n }\n}\n_a$2 = DateTime;\n(() => {\n typeStore.DateTime = _a$2;\n})();\nDateTime.NAME = \"DateTime\";\n\nvar _a$1;\nclass Duration extends Utf8String {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 34;\n }\n}\n_a$1 = Duration;\n(() => {\n typeStore.Duration = _a$1;\n})();\nDuration.NAME = \"Duration\";\n\nvar _a;\nclass TIME extends Utf8String {\n constructor(parameters = {}) {\n super(parameters);\n this.idBlock.tagClass = 1;\n this.idBlock.tagNumber = 14;\n }\n}\n_a = TIME;\n(() => {\n typeStore.TIME = _a;\n})();\nTIME.NAME = \"TIME\";\n\nclass Any {\n constructor({ name = EMPTY_STRING, optional = false } = {}) {\n this.name = name;\n this.optional = optional;\n }\n}\n\nclass Choice extends Any {\n constructor({ value = [], ...parameters } = {}) {\n super(parameters);\n this.value = value;\n }\n}\n\nclass Repeated extends Any {\n constructor({ value = new Any(), local = false, ...parameters } = {}) {\n super(parameters);\n this.value = value;\n this.local = local;\n }\n}\n\nclass RawData {\n get data() {\n return this.dataView.slice().buffer;\n }\n set data(value) {\n this.dataView = pvtsutils.BufferSourceConverter.toUint8Array(value);\n }\n constructor({ data = EMPTY_VIEW } = {}) {\n this.dataView = pvtsutils.BufferSourceConverter.toUint8Array(data);\n }\n fromBER(inputBuffer, inputOffset, inputLength) {\n const endLength = inputOffset + inputLength;\n this.dataView = pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer).subarray(inputOffset, endLength);\n return endLength;\n }\n toBER(_sizeOnly) {\n return this.dataView.slice().buffer;\n }\n}\n\nfunction compareSchema(root, inputData, inputSchema) {\n if (inputSchema instanceof Choice) {\n for (const element of inputSchema.value) {\n const result = compareSchema(root, inputData, element);\n if (result.verified) {\n return {\n verified: true,\n result: root,\n };\n }\n }\n {\n const _result = {\n verified: false,\n result: { error: \"Wrong values for Choice type\" },\n };\n if (inputSchema.hasOwnProperty(NAME))\n _result.name = inputSchema.name;\n return _result;\n }\n }\n if (inputSchema instanceof Any) {\n if (inputSchema.hasOwnProperty(NAME))\n root[inputSchema.name] = inputData;\n return {\n verified: true,\n result: root,\n };\n }\n if ((root instanceof Object) === false) {\n return {\n verified: false,\n result: { error: \"Wrong root object\" },\n };\n }\n if ((inputData instanceof Object) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 data\" },\n };\n }\n if ((inputSchema instanceof Object) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if ((ID_BLOCK in inputSchema) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if ((FROM_BER in inputSchema.idBlock) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if ((TO_BER in inputSchema.idBlock) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n const encodedId = inputSchema.idBlock.toBER(false);\n if (encodedId.byteLength === 0) {\n return {\n verified: false,\n result: { error: \"Error encoding idBlock for ASN.1 schema\" },\n };\n }\n const decodedOffset = inputSchema.idBlock.fromBER(encodedId, 0, encodedId.byteLength);\n if (decodedOffset === -1) {\n return {\n verified: false,\n result: { error: \"Error decoding idBlock for ASN.1 schema\" },\n };\n }\n if (inputSchema.idBlock.hasOwnProperty(TAG_CLASS) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if (inputSchema.idBlock.tagClass !== inputData.idBlock.tagClass) {\n return {\n verified: false,\n result: root,\n };\n }\n if (inputSchema.idBlock.hasOwnProperty(TAG_NUMBER) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if (inputSchema.idBlock.tagNumber !== inputData.idBlock.tagNumber) {\n return {\n verified: false,\n result: root,\n };\n }\n if (inputSchema.idBlock.hasOwnProperty(IS_CONSTRUCTED) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if (inputSchema.idBlock.isConstructed !== inputData.idBlock.isConstructed) {\n return {\n verified: false,\n result: root,\n };\n }\n if (!(IS_HEX_ONLY in inputSchema.idBlock)) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n if (inputSchema.idBlock.isHexOnly !== inputData.idBlock.isHexOnly) {\n return {\n verified: false,\n result: root,\n };\n }\n if (inputSchema.idBlock.isHexOnly) {\n if ((VALUE_HEX_VIEW in inputSchema.idBlock) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema\" },\n };\n }\n const schemaView = inputSchema.idBlock.valueHexView;\n const asn1View = inputData.idBlock.valueHexView;\n if (schemaView.length !== asn1View.length) {\n return {\n verified: false,\n result: root,\n };\n }\n for (let i = 0; i < schemaView.length; i++) {\n if (schemaView[i] !== asn1View[1]) {\n return {\n verified: false,\n result: root,\n };\n }\n }\n }\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name)\n root[inputSchema.name] = inputData;\n }\n if (inputSchema instanceof typeStore.Constructed) {\n let admission = 0;\n let result = {\n verified: false,\n result: { error: \"Unknown error\" },\n };\n let maxLength = inputSchema.valueBlock.value.length;\n if (maxLength > 0) {\n if (inputSchema.valueBlock.value[0] instanceof Repeated) {\n maxLength = inputData.valueBlock.value.length;\n }\n }\n if (maxLength === 0) {\n return {\n verified: true,\n result: root,\n };\n }\n if ((inputData.valueBlock.value.length === 0)\n && (inputSchema.valueBlock.value.length !== 0)) {\n let _optional = true;\n for (let i = 0; i < inputSchema.valueBlock.value.length; i++)\n _optional = _optional && (inputSchema.valueBlock.value[i].optional || false);\n if (_optional) {\n return {\n verified: true,\n result: root,\n };\n }\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name)\n delete root[inputSchema.name];\n }\n root.error = \"Inconsistent object length\";\n return {\n verified: false,\n result: root,\n };\n }\n for (let i = 0; i < maxLength; i++) {\n if ((i - admission) >= inputData.valueBlock.value.length) {\n if (inputSchema.valueBlock.value[i].optional === false) {\n const _result = {\n verified: false,\n result: root,\n };\n root.error = \"Inconsistent length between ASN.1 data and schema\";\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name) {\n delete root[inputSchema.name];\n _result.name = inputSchema.name;\n }\n }\n return _result;\n }\n }\n else {\n if (inputSchema.valueBlock.value[0] instanceof Repeated) {\n result = compareSchema(root, inputData.valueBlock.value[i], inputSchema.valueBlock.value[0].value);\n if (result.verified === false) {\n if (inputSchema.valueBlock.value[0].optional)\n admission++;\n else {\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name)\n delete root[inputSchema.name];\n }\n return result;\n }\n }\n if ((NAME in inputSchema.valueBlock.value[0]) && (inputSchema.valueBlock.value[0].name.length > 0)) {\n let arrayRoot = {};\n if ((LOCAL in inputSchema.valueBlock.value[0]) && (inputSchema.valueBlock.value[0].local))\n arrayRoot = inputData;\n else\n arrayRoot = root;\n if (typeof arrayRoot[inputSchema.valueBlock.value[0].name] === \"undefined\")\n arrayRoot[inputSchema.valueBlock.value[0].name] = [];\n arrayRoot[inputSchema.valueBlock.value[0].name].push(inputData.valueBlock.value[i]);\n }\n }\n else {\n result = compareSchema(root, inputData.valueBlock.value[i - admission], inputSchema.valueBlock.value[i]);\n if (result.verified === false) {\n if (inputSchema.valueBlock.value[i].optional)\n admission++;\n else {\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name)\n delete root[inputSchema.name];\n }\n return result;\n }\n }\n }\n }\n }\n if (result.verified === false) {\n const _result = {\n verified: false,\n result: root,\n };\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name) {\n delete root[inputSchema.name];\n _result.name = inputSchema.name;\n }\n }\n return _result;\n }\n return {\n verified: true,\n result: root,\n };\n }\n if (inputSchema.primitiveSchema\n && (VALUE_HEX_VIEW in inputData.valueBlock)) {\n const asn1 = localFromBER(inputData.valueBlock.valueHexView);\n if (asn1.offset === -1) {\n const _result = {\n verified: false,\n result: asn1.result,\n };\n if (inputSchema.name) {\n inputSchema.name = inputSchema.name.replace(/^\\s+|\\s+$/g, EMPTY_STRING);\n if (inputSchema.name) {\n delete root[inputSchema.name];\n _result.name = inputSchema.name;\n }\n }\n return _result;\n }\n return compareSchema(root, asn1.result, inputSchema.primitiveSchema);\n }\n return {\n verified: true,\n result: root,\n };\n}\nfunction verifySchema(inputBuffer, inputSchema) {\n if ((inputSchema instanceof Object) === false) {\n return {\n verified: false,\n result: { error: \"Wrong ASN.1 schema type\" },\n };\n }\n const asn1 = localFromBER(pvtsutils.BufferSourceConverter.toUint8Array(inputBuffer));\n if (asn1.offset === -1) {\n return {\n verified: false,\n result: asn1.result,\n };\n }\n return compareSchema(asn1.result, asn1.result, inputSchema);\n}\n\nexport { Any, BaseBlock, BaseStringBlock, BitString, BmpString, Boolean, CharacterString, Choice, Constructed, DATE, DateTime, Duration, EndOfContent, Enumerated, GeneralString, GeneralizedTime, GraphicString, HexBlock, IA5String, Integer, Null, NumericString, ObjectIdentifier, OctetString, Primitive, PrintableString, RawData, RelativeObjectIdentifier, Repeated, Sequence, Set, TIME, TeletexString, TimeOfDay, UTCTime, UniversalString, Utf8String, ValueBlock, VideotexString, ViewWriter, VisibleString, compareSchema, fromBER, verifySchema };\n","/*!\n * MIT License\n * \n * Copyright (c) 2017-2024 Peculiar Ventures, LLC\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\n\nconst ARRAY_BUFFER_NAME = \"[object ArrayBuffer]\";\nclass BufferSourceConverter {\n static isArrayBuffer(data) {\n return Object.prototype.toString.call(data) === ARRAY_BUFFER_NAME;\n }\n static toArrayBuffer(data) {\n if (this.isArrayBuffer(data)) {\n return data;\n }\n if (data.byteLength === data.buffer.byteLength) {\n return data.buffer;\n }\n if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) {\n return data.buffer;\n }\n return this.toUint8Array(data.buffer)\n .slice(data.byteOffset, data.byteOffset + data.byteLength)\n .buffer;\n }\n static toUint8Array(data) {\n return this.toView(data, Uint8Array);\n }\n static toView(data, type) {\n if (data.constructor === type) {\n return data;\n }\n if (this.isArrayBuffer(data)) {\n return new type(data);\n }\n if (this.isArrayBufferView(data)) {\n return new type(data.buffer, data.byteOffset, data.byteLength);\n }\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n static isBufferSource(data) {\n return this.isArrayBufferView(data)\n || this.isArrayBuffer(data);\n }\n static isArrayBufferView(data) {\n return ArrayBuffer.isView(data)\n || (data && this.isArrayBuffer(data.buffer));\n }\n static isEqual(a, b) {\n const aView = BufferSourceConverter.toUint8Array(a);\n const bView = BufferSourceConverter.toUint8Array(b);\n if (aView.length !== bView.byteLength) {\n return false;\n }\n for (let i = 0; i < aView.length; i++) {\n if (aView[i] !== bView[i]) {\n return false;\n }\n }\n return true;\n }\n static concat(...args) {\n let buffers;\n if (Array.isArray(args[0]) && !(args[1] instanceof Function)) {\n buffers = args[0];\n }\n else if (Array.isArray(args[0]) && args[1] instanceof Function) {\n buffers = args[0];\n }\n else {\n if (args[args.length - 1] instanceof Function) {\n buffers = args.slice(0, args.length - 1);\n }\n else {\n buffers = args;\n }\n }\n let size = 0;\n for (const buffer of buffers) {\n size += buffer.byteLength;\n }\n const res = new Uint8Array(size);\n let offset = 0;\n for (const buffer of buffers) {\n const view = this.toUint8Array(buffer);\n res.set(view, offset);\n offset += view.length;\n }\n if (args[args.length - 1] instanceof Function) {\n return this.toView(res, args[args.length - 1]);\n }\n return res.buffer;\n }\n}\n\nconst STRING_TYPE = \"string\";\nconst HEX_REGEX = /^[0-9a-f\\s]+$/i;\nconst BASE64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\nconst BASE64URL_REGEX = /^[a-zA-Z0-9-_]+$/;\nclass Utf8Converter {\n static fromString(text) {\n const s = unescape(encodeURIComponent(text));\n const uintArray = new Uint8Array(s.length);\n for (let i = 0; i < s.length; i++) {\n uintArray[i] = s.charCodeAt(i);\n }\n return uintArray.buffer;\n }\n static toString(buffer) {\n const buf = BufferSourceConverter.toUint8Array(buffer);\n let encodedString = \"\";\n for (let i = 0; i < buf.length; i++) {\n encodedString += String.fromCharCode(buf[i]);\n }\n const decodedString = decodeURIComponent(escape(encodedString));\n return decodedString;\n }\n}\nclass Utf16Converter {\n static toString(buffer, littleEndian = false) {\n const arrayBuffer = BufferSourceConverter.toArrayBuffer(buffer);\n const dataView = new DataView(arrayBuffer);\n let res = \"\";\n for (let i = 0; i < arrayBuffer.byteLength; i += 2) {\n const code = dataView.getUint16(i, littleEndian);\n res += String.fromCharCode(code);\n }\n return res;\n }\n static fromString(text, littleEndian = false) {\n const res = new ArrayBuffer(text.length * 2);\n const dataView = new DataView(res);\n for (let i = 0; i < text.length; i++) {\n dataView.setUint16(i * 2, text.charCodeAt(i), littleEndian);\n }\n return res;\n }\n}\nclass Convert {\n static isHex(data) {\n return typeof data === STRING_TYPE\n && HEX_REGEX.test(data);\n }\n static isBase64(data) {\n return typeof data === STRING_TYPE\n && BASE64_REGEX.test(data);\n }\n static isBase64Url(data) {\n return typeof data === STRING_TYPE\n && BASE64URL_REGEX.test(data);\n }\n static ToString(buffer, enc = \"utf8\") {\n const buf = BufferSourceConverter.toUint8Array(buffer);\n switch (enc.toLowerCase()) {\n case \"utf8\":\n return this.ToUtf8String(buf);\n case \"binary\":\n return this.ToBinary(buf);\n case \"hex\":\n return this.ToHex(buf);\n case \"base64\":\n return this.ToBase64(buf);\n case \"base64url\":\n return this.ToBase64Url(buf);\n case \"utf16le\":\n return Utf16Converter.toString(buf, true);\n case \"utf16\":\n case \"utf16be\":\n return Utf16Converter.toString(buf);\n default:\n throw new Error(`Unknown type of encoding '${enc}'`);\n }\n }\n static FromString(str, enc = \"utf8\") {\n if (!str) {\n return new ArrayBuffer(0);\n }\n switch (enc.toLowerCase()) {\n case \"utf8\":\n return this.FromUtf8String(str);\n case \"binary\":\n return this.FromBinary(str);\n case \"hex\":\n return this.FromHex(str);\n case \"base64\":\n return this.FromBase64(str);\n case \"base64url\":\n return this.FromBase64Url(str);\n case \"utf16le\":\n return Utf16Converter.fromString(str, true);\n case \"utf16\":\n case \"utf16be\":\n return Utf16Converter.fromString(str);\n default:\n throw new Error(`Unknown type of encoding '${enc}'`);\n }\n }\n static ToBase64(buffer) {\n const buf = BufferSourceConverter.toUint8Array(buffer);\n if (typeof btoa !== \"undefined\") {\n const binary = this.ToString(buf, \"binary\");\n return btoa(binary);\n }\n else {\n return Buffer.from(buf).toString(\"base64\");\n }\n }\n static FromBase64(base64) {\n const formatted = this.formatString(base64);\n if (!formatted) {\n return new ArrayBuffer(0);\n }\n if (!Convert.isBase64(formatted)) {\n throw new TypeError(\"Argument 'base64Text' is not Base64 encoded\");\n }\n if (typeof atob !== \"undefined\") {\n return this.FromBinary(atob(formatted));\n }\n else {\n return new Uint8Array(Buffer.from(formatted, \"base64\")).buffer;\n }\n }\n static FromBase64Url(base64url) {\n const formatted = this.formatString(base64url);\n if (!formatted) {\n return new ArrayBuffer(0);\n }\n if (!Convert.isBase64Url(formatted)) {\n throw new TypeError(\"Argument 'base64url' is not Base64Url encoded\");\n }\n return this.FromBase64(this.Base64Padding(formatted.replace(/\\-/g, \"+\").replace(/\\_/g, \"/\")));\n }\n static ToBase64Url(data) {\n return this.ToBase64(data).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/\\=/g, \"\");\n }\n static FromUtf8String(text, encoding = Convert.DEFAULT_UTF8_ENCODING) {\n switch (encoding) {\n case \"ascii\":\n return this.FromBinary(text);\n case \"utf8\":\n return Utf8Converter.fromString(text);\n case \"utf16\":\n case \"utf16be\":\n return Utf16Converter.fromString(text);\n case \"utf16le\":\n case \"usc2\":\n return Utf16Converter.fromString(text, true);\n default:\n throw new Error(`Unknown type of encoding '${encoding}'`);\n }\n }\n static ToUtf8String(buffer, encoding = Convert.DEFAULT_UTF8_ENCODING) {\n switch (encoding) {\n case \"ascii\":\n return this.ToBinary(buffer);\n case \"utf8\":\n return Utf8Converter.toString(buffer);\n case \"utf16\":\n case \"utf16be\":\n return Utf16Converter.toString(buffer);\n case \"utf16le\":\n case \"usc2\":\n return Utf16Converter.toString(buffer, true);\n default:\n throw new Error(`Unknown type of encoding '${encoding}'`);\n }\n }\n static FromBinary(text) {\n const stringLength = text.length;\n const resultView = new Uint8Array(stringLength);\n for (let i = 0; i < stringLength; i++) {\n resultView[i] = text.charCodeAt(i);\n }\n return resultView.buffer;\n }\n static ToBinary(buffer) {\n const buf = BufferSourceConverter.toUint8Array(buffer);\n let res = \"\";\n for (let i = 0; i < buf.length; i++) {\n res += String.fromCharCode(buf[i]);\n }\n return res;\n }\n static ToHex(buffer) {\n const buf = BufferSourceConverter.toUint8Array(buffer);\n let result = \"\";\n const len = buf.length;\n for (let i = 0; i < len; i++) {\n const byte = buf[i];\n if (byte < 16) {\n result += \"0\";\n }\n result += byte.toString(16);\n }\n return result;\n }\n static FromHex(hexString) {\n let formatted = this.formatString(hexString);\n if (!formatted) {\n return new ArrayBuffer(0);\n }\n if (!Convert.isHex(formatted)) {\n throw new TypeError(\"Argument 'hexString' is not HEX encoded\");\n }\n if (formatted.length % 2) {\n formatted = `0${formatted}`;\n }\n const res = new Uint8Array(formatted.length / 2);\n for (let i = 0; i < formatted.length; i = i + 2) {\n const c = formatted.slice(i, i + 2);\n res[i / 2] = parseInt(c, 16);\n }\n return res.buffer;\n }\n static ToUtf16String(buffer, littleEndian = false) {\n return Utf16Converter.toString(buffer, littleEndian);\n }\n static FromUtf16String(text, littleEndian = false) {\n return Utf16Converter.fromString(text, littleEndian);\n }\n static Base64Padding(base64) {\n const padCount = 4 - (base64.length % 4);\n if (padCount < 4) {\n for (let i = 0; i < padCount; i++) {\n base64 += \"=\";\n }\n }\n return base64;\n }\n static formatString(data) {\n return (data === null || data === void 0 ? void 0 : data.replace(/[\\n\\r\\t ]/g, \"\")) || \"\";\n }\n}\nConvert.DEFAULT_UTF8_ENCODING = \"utf8\";\n\nfunction assign(target, ...sources) {\n const res = arguments[0];\n for (let i = 1; i < arguments.length; i++) {\n const obj = arguments[i];\n for (const prop in obj) {\n res[prop] = obj[prop];\n }\n }\n return res;\n}\nfunction combine(...buf) {\n const totalByteLength = buf.map((item) => item.byteLength).reduce((prev, cur) => prev + cur);\n const res = new Uint8Array(totalByteLength);\n let currentPos = 0;\n buf.map((item) => new Uint8Array(item)).forEach((arr) => {\n for (const item2 of arr) {\n res[currentPos++] = item2;\n }\n });\n return res.buffer;\n}\nfunction isEqual(bytes1, bytes2) {\n if (!(bytes1 && bytes2)) {\n return false;\n }\n if (bytes1.byteLength !== bytes2.byteLength) {\n return false;\n }\n const b1 = new Uint8Array(bytes1);\n const b2 = new Uint8Array(bytes2);\n for (let i = 0; i < bytes1.byteLength; i++) {\n if (b1[i] !== b2[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport { BufferSourceConverter, Convert, assign, combine, isEqual };\n","/*!\n Copyright (c) Peculiar Ventures, LLC\n*/\n\nfunction getUTCDate(date) {\r\n return new Date(date.getTime() + (date.getTimezoneOffset() * 60000));\r\n}\r\nfunction getParametersValue(parameters, name, defaultValue) {\r\n var _a;\r\n if ((parameters instanceof Object) === false) {\r\n return defaultValue;\r\n }\r\n return (_a = parameters[name]) !== null && _a !== void 0 ? _a : defaultValue;\r\n}\r\nfunction bufferToHexCodes(inputBuffer, inputOffset = 0, inputLength = (inputBuffer.byteLength - inputOffset), insertSpace = false) {\r\n let result = \"\";\r\n for (const item of (new Uint8Array(inputBuffer, inputOffset, inputLength))) {\r\n const str = item.toString(16).toUpperCase();\r\n if (str.length === 1) {\r\n result += \"0\";\r\n }\r\n result += str;\r\n if (insertSpace) {\r\n result += \" \";\r\n }\r\n }\r\n return result.trim();\r\n}\r\nfunction checkBufferParams(baseBlock, inputBuffer, inputOffset, inputLength) {\r\n if (!(inputBuffer instanceof ArrayBuffer)) {\r\n baseBlock.error = \"Wrong parameter: inputBuffer must be \\\"ArrayBuffer\\\"\";\r\n return false;\r\n }\r\n if (!inputBuffer.byteLength) {\r\n baseBlock.error = \"Wrong parameter: inputBuffer has zero length\";\r\n return false;\r\n }\r\n if (inputOffset < 0) {\r\n baseBlock.error = \"Wrong parameter: inputOffset less than zero\";\r\n return false;\r\n }\r\n if (inputLength < 0) {\r\n baseBlock.error = \"Wrong parameter: inputLength less than zero\";\r\n return false;\r\n }\r\n if ((inputBuffer.byteLength - inputOffset - inputLength) < 0) {\r\n baseBlock.error = \"End of input reached before message was fully decoded (inconsistent offset and length values)\";\r\n return false;\r\n }\r\n return true;\r\n}\r\nfunction utilFromBase(inputBuffer, inputBase) {\r\n let result = 0;\r\n if (inputBuffer.length === 1) {\r\n return inputBuffer[0];\r\n }\r\n for (let i = (inputBuffer.length - 1); i >= 0; i--) {\r\n result += inputBuffer[(inputBuffer.length - 1) - i] * Math.pow(2, inputBase * i);\r\n }\r\n return result;\r\n}\r\nfunction utilToBase(value, base, reserved = (-1)) {\r\n const internalReserved = reserved;\r\n let internalValue = value;\r\n let result = 0;\r\n let biggest = Math.pow(2, base);\r\n for (let i = 1; i < 8; i++) {\r\n if (value < biggest) {\r\n let retBuf;\r\n if (internalReserved < 0) {\r\n retBuf = new ArrayBuffer(i);\r\n result = i;\r\n }\r\n else {\r\n if (internalReserved < i) {\r\n return (new ArrayBuffer(0));\r\n }\r\n retBuf = new ArrayBuffer(internalReserved);\r\n result = internalReserved;\r\n }\r\n const retView = new Uint8Array(retBuf);\r\n for (let j = (i - 1); j >= 0; j--) {\r\n const basis = Math.pow(2, j * base);\r\n retView[result - j - 1] = Math.floor(internalValue / basis);\r\n internalValue -= (retView[result - j - 1]) * basis;\r\n }\r\n return retBuf;\r\n }\r\n biggest *= Math.pow(2, base);\r\n }\r\n return new ArrayBuffer(0);\r\n}\r\nfunction utilConcatBuf(...buffers) {\r\n let outputLength = 0;\r\n let prevLength = 0;\r\n for (const buffer of buffers) {\r\n outputLength += buffer.byteLength;\r\n }\r\n const retBuf = new ArrayBuffer(outputLength);\r\n const retView = new Uint8Array(retBuf);\r\n for (const buffer of buffers) {\r\n retView.set(new Uint8Array(buffer), prevLength);\r\n prevLength += buffer.byteLength;\r\n }\r\n return retBuf;\r\n}\r\nfunction utilConcatView(...views) {\r\n let outputLength = 0;\r\n let prevLength = 0;\r\n for (const view of views) {\r\n outputLength += view.length;\r\n }\r\n const retBuf = new ArrayBuffer(outputLength);\r\n const retView = new Uint8Array(retBuf);\r\n for (const view of views) {\r\n retView.set(view, prevLength);\r\n prevLength += view.length;\r\n }\r\n return retView;\r\n}\r\nfunction utilDecodeTC() {\r\n const buf = new Uint8Array(this.valueHex);\r\n if (this.valueHex.byteLength >= 2) {\r\n const condition1 = (buf[0] === 0xFF) && (buf[1] & 0x80);\r\n const condition2 = (buf[0] === 0x00) && ((buf[1] & 0x80) === 0x00);\r\n if (condition1 || condition2) {\r\n this.warnings.push(\"Needlessly long format\");\r\n }\r\n }\r\n const bigIntBuffer = new ArrayBuffer(this.valueHex.byteLength);\r\n const bigIntView = new Uint8Array(bigIntBuffer);\r\n for (let i = 0; i < this.valueHex.byteLength; i++) {\r\n bigIntView[i] = 0;\r\n }\r\n bigIntView[0] = (buf[0] & 0x80);\r\n const bigInt = utilFromBase(bigIntView, 8);\r\n const smallIntBuffer = new ArrayBuffer(this.valueHex.byteLength);\r\n const smallIntView = new Uint8Array(smallIntBuffer);\r\n for (let j = 0; j < this.valueHex.byteLength; j++) {\r\n smallIntView[j] = buf[j];\r\n }\r\n smallIntView[0] &= 0x7F;\r\n const smallInt = utilFromBase(smallIntView, 8);\r\n return (smallInt - bigInt);\r\n}\r\nfunction utilEncodeTC(value) {\r\n const modValue = (value < 0) ? (value * (-1)) : value;\r\n let bigInt = 128;\r\n for (let i = 1; i < 8; i++) {\r\n if (modValue <= bigInt) {\r\n if (value < 0) {\r\n const smallInt = bigInt - modValue;\r\n const retBuf = utilToBase(smallInt, 8, i);\r\n const retView = new Uint8Array(retBuf);\r\n retView[0] |= 0x80;\r\n return retBuf;\r\n }\r\n let retBuf = utilToBase(modValue, 8, i);\r\n let retView = new Uint8Array(retBuf);\r\n if (retView[0] & 0x80) {\r\n const tempBuf = retBuf.slice(0);\r\n const tempView = new Uint8Array(tempBuf);\r\n retBuf = new ArrayBuffer(retBuf.byteLength + 1);\r\n retView = new Uint8Array(retBuf);\r\n for (let k = 0; k < tempBuf.byteLength; k++) {\r\n retView[k + 1] = tempView[k];\r\n }\r\n retView[0] = 0x00;\r\n }\r\n return retBuf;\r\n }\r\n bigInt *= Math.pow(2, 8);\r\n }\r\n return (new ArrayBuffer(0));\r\n}\r\nfunction isEqualBuffer(inputBuffer1, inputBuffer2) {\r\n if (inputBuffer1.byteLength !== inputBuffer2.byteLength) {\r\n return false;\r\n }\r\n const view1 = new Uint8Array(inputBuffer1);\r\n const view2 = new Uint8Array(inputBuffer2);\r\n for (let i = 0; i < view1.length; i++) {\r\n if (view1[i] !== view2[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction padNumber(inputNumber, fullLength) {\r\n const str = inputNumber.toString(10);\r\n if (fullLength < str.length) {\r\n return \"\";\r\n }\r\n const dif = fullLength - str.length;\r\n const padding = new Array(dif);\r\n for (let i = 0; i < dif; i++) {\r\n padding[i] = \"0\";\r\n }\r\n const paddingString = padding.join(\"\");\r\n return paddingString.concat(str);\r\n}\r\nconst base64Template = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\nconst base64UrlTemplate = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=\";\r\nfunction toBase64(input, useUrlTemplate = false, skipPadding = false, skipLeadingZeros = false) {\r\n let i = 0;\r\n let flag1 = 0;\r\n let flag2 = 0;\r\n let output = \"\";\r\n const template = (useUrlTemplate) ? base64UrlTemplate : base64Template;\r\n if (skipLeadingZeros) {\r\n let nonZeroPosition = 0;\r\n for (let i = 0; i < input.length; i++) {\r\n if (input.charCodeAt(i) !== 0) {\r\n nonZeroPosition = i;\r\n break;\r\n }\r\n }\r\n input = input.slice(nonZeroPosition);\r\n }\r\n while (i < input.length) {\r\n const chr1 = input.charCodeAt(i++);\r\n if (i >= input.length) {\r\n flag1 = 1;\r\n }\r\n const chr2 = input.charCodeAt(i++);\r\n if (i >= input.length) {\r\n flag2 = 1;\r\n }\r\n const chr3 = input.charCodeAt(i++);\r\n const enc1 = chr1 >> 2;\r\n const enc2 = ((chr1 & 0x03) << 4) | (chr2 >> 4);\r\n let enc3 = ((chr2 & 0x0F) << 2) | (chr3 >> 6);\r\n let enc4 = chr3 & 0x3F;\r\n if (flag1 === 1) {\r\n enc3 = enc4 = 64;\r\n }\r\n else {\r\n if (flag2 === 1) {\r\n enc4 = 64;\r\n }\r\n }\r\n if (skipPadding) {\r\n if (enc3 === 64) {\r\n output += `${template.charAt(enc1)}${template.charAt(enc2)}`;\r\n }\r\n else {\r\n if (enc4 === 64) {\r\n output += `${template.charAt(enc1)}${template.charAt(enc2)}${template.charAt(enc3)}`;\r\n }\r\n else {\r\n output += `${template.charAt(enc1)}${template.charAt(enc2)}${template.charAt(enc3)}${template.charAt(enc4)}`;\r\n }\r\n }\r\n }\r\n else {\r\n output += `${template.charAt(enc1)}${template.charAt(enc2)}${template.charAt(enc3)}${template.charAt(enc4)}`;\r\n }\r\n }\r\n return output;\r\n}\r\nfunction fromBase64(input, useUrlTemplate = false, cutTailZeros = false) {\r\n const template = (useUrlTemplate) ? base64UrlTemplate : base64Template;\r\n function indexOf(toSearch) {\r\n for (let i = 0; i < 64; i++) {\r\n if (template.charAt(i) === toSearch)\r\n return i;\r\n }\r\n return 64;\r\n }\r\n function test(incoming) {\r\n return ((incoming === 64) ? 0x00 : incoming);\r\n }\r\n let i = 0;\r\n let output = \"\";\r\n while (i < input.length) {\r\n const enc1 = indexOf(input.charAt(i++));\r\n const enc2 = (i >= input.length) ? 0x00 : indexOf(input.charAt(i++));\r\n const enc3 = (i >= input.length) ? 0x00 : indexOf(input.charAt(i++));\r\n const enc4 = (i >= input.length) ? 0x00 : indexOf(input.charAt(i++));\r\n const chr1 = (test(enc1) << 2) | (test(enc2) >> 4);\r\n const chr2 = ((test(enc2) & 0x0F) << 4) | (test(enc3) >> 2);\r\n const chr3 = ((test(enc3) & 0x03) << 6) | test(enc4);\r\n output += String.fromCharCode(chr1);\r\n if (enc3 !== 64) {\r\n output += String.fromCharCode(chr2);\r\n }\r\n if (enc4 !== 64) {\r\n output += String.fromCharCode(chr3);\r\n }\r\n }\r\n if (cutTailZeros) {\r\n const outputLength = output.length;\r\n let nonZeroStart = (-1);\r\n for (let i = (outputLength - 1); i >= 0; i--) {\r\n if (output.charCodeAt(i) !== 0) {\r\n nonZeroStart = i;\r\n break;\r\n }\r\n }\r\n if (nonZeroStart !== (-1)) {\r\n output = output.slice(0, nonZeroStart + 1);\r\n }\r\n else {\r\n output = \"\";\r\n }\r\n }\r\n return output;\r\n}\r\nfunction arrayBufferToString(buffer) {\r\n let resultString = \"\";\r\n const view = new Uint8Array(buffer);\r\n for (const element of view) {\r\n resultString += String.fromCharCode(element);\r\n }\r\n return resultString;\r\n}\r\nfunction stringToArrayBuffer(str) {\r\n const stringLength = str.length;\r\n const resultBuffer = new ArrayBuffer(stringLength);\r\n const resultView = new Uint8Array(resultBuffer);\r\n for (let i = 0; i < stringLength; i++) {\r\n resultView[i] = str.charCodeAt(i);\r\n }\r\n return resultBuffer;\r\n}\r\nconst log2 = Math.log(2);\r\nfunction nearestPowerOf2(length) {\r\n const base = (Math.log(length) / log2);\r\n const floor = Math.floor(base);\r\n const round = Math.round(base);\r\n return ((floor === round) ? floor : round);\r\n}\r\nfunction clearProps(object, propsArray) {\r\n for (const prop of propsArray) {\r\n delete object[prop];\r\n }\r\n}\n\nexport { arrayBufferToString, bufferToHexCodes, checkBufferParams, clearProps, fromBase64, getParametersValue, getUTCDate, isEqualBuffer, nearestPowerOf2, padNumber, stringToArrayBuffer, toBase64, utilConcatBuf, utilConcatView, utilDecodeTC, utilEncodeTC, utilFromBase, utilToBase };\n","export var AsnTypeTypes;\n(function (AsnTypeTypes) {\n AsnTypeTypes[AsnTypeTypes[\"Sequence\"] = 0] = \"Sequence\";\n AsnTypeTypes[AsnTypeTypes[\"Set\"] = 1] = \"Set\";\n AsnTypeTypes[AsnTypeTypes[\"Choice\"] = 2] = \"Choice\";\n})(AsnTypeTypes || (AsnTypeTypes = {}));\nexport var AsnPropTypes;\n(function (AsnPropTypes) {\n AsnPropTypes[AsnPropTypes[\"Any\"] = 1] = \"Any\";\n AsnPropTypes[AsnPropTypes[\"Boolean\"] = 2] = \"Boolean\";\n AsnPropTypes[AsnPropTypes[\"OctetString\"] = 3] = \"OctetString\";\n AsnPropTypes[AsnPropTypes[\"BitString\"] = 4] = \"BitString\";\n AsnPropTypes[AsnPropTypes[\"Integer\"] = 5] = \"Integer\";\n AsnPropTypes[AsnPropTypes[\"Enumerated\"] = 6] = \"Enumerated\";\n AsnPropTypes[AsnPropTypes[\"ObjectIdentifier\"] = 7] = \"ObjectIdentifier\";\n AsnPropTypes[AsnPropTypes[\"Utf8String\"] = 8] = \"Utf8String\";\n AsnPropTypes[AsnPropTypes[\"BmpString\"] = 9] = \"BmpString\";\n AsnPropTypes[AsnPropTypes[\"UniversalString\"] = 10] = \"UniversalString\";\n AsnPropTypes[AsnPropTypes[\"NumericString\"] = 11] = \"NumericString\";\n AsnPropTypes[AsnPropTypes[\"PrintableString\"] = 12] = \"PrintableString\";\n AsnPropTypes[AsnPropTypes[\"TeletexString\"] = 13] = \"TeletexString\";\n AsnPropTypes[AsnPropTypes[\"VideotexString\"] = 14] = \"VideotexString\";\n AsnPropTypes[AsnPropTypes[\"IA5String\"] = 15] = \"IA5String\";\n AsnPropTypes[AsnPropTypes[\"GraphicString\"] = 16] = \"GraphicString\";\n AsnPropTypes[AsnPropTypes[\"VisibleString\"] = 17] = \"VisibleString\";\n AsnPropTypes[AsnPropTypes[\"GeneralString\"] = 18] = \"GeneralString\";\n AsnPropTypes[AsnPropTypes[\"CharacterString\"] = 19] = \"CharacterString\";\n AsnPropTypes[AsnPropTypes[\"UTCTime\"] = 20] = \"UTCTime\";\n AsnPropTypes[AsnPropTypes[\"GeneralizedTime\"] = 21] = \"GeneralizedTime\";\n AsnPropTypes[AsnPropTypes[\"DATE\"] = 22] = \"DATE\";\n AsnPropTypes[AsnPropTypes[\"TimeOfDay\"] = 23] = \"TimeOfDay\";\n AsnPropTypes[AsnPropTypes[\"DateTime\"] = 24] = \"DateTime\";\n AsnPropTypes[AsnPropTypes[\"Duration\"] = 25] = \"Duration\";\n AsnPropTypes[AsnPropTypes[\"TIME\"] = 26] = \"TIME\";\n AsnPropTypes[AsnPropTypes[\"Null\"] = 27] = \"Null\";\n})(AsnPropTypes || (AsnPropTypes = {}));\n","import * as asn1js from \"asn1js\";\nimport { AsnPropTypes } from \"./enums\";\nimport { OctetString } from \"./types/index\";\nexport const AsnAnyConverter = {\n fromASN: (value) => value instanceof asn1js.Null ? null : value.valueBeforeDecodeView,\n toASN: (value) => {\n if (value === null) {\n return new asn1js.Null();\n }\n const schema = asn1js.fromBER(value);\n if (schema.result.error) {\n throw new Error(schema.result.error);\n }\n return schema.result;\n },\n};\nexport const AsnIntegerConverter = {\n fromASN: (value) => value.valueBlock.valueHexView.byteLength >= 4\n ? value.valueBlock.toString()\n : value.valueBlock.valueDec,\n toASN: (value) => new asn1js.Integer({ value: +value }),\n};\nexport const AsnEnumeratedConverter = {\n fromASN: (value) => value.valueBlock.valueDec,\n toASN: (value) => new asn1js.Enumerated({ value }),\n};\nexport const AsnIntegerArrayBufferConverter = {\n fromASN: (value) => value.valueBlock.valueHexView,\n toASN: (value) => new asn1js.Integer({ valueHex: value }),\n};\nexport const AsnIntegerBigIntConverter = {\n fromASN: (value) => value.toBigInt(),\n toASN: (value) => asn1js.Integer.fromBigInt(value),\n};\nexport const AsnBitStringConverter = {\n fromASN: (value) => value.valueBlock.valueHexView,\n toASN: (value) => new asn1js.BitString({ valueHex: value }),\n};\nexport const AsnObjectIdentifierConverter = {\n fromASN: (value) => value.valueBlock.toString(),\n toASN: (value) => new asn1js.ObjectIdentifier({ value }),\n};\nexport const AsnBooleanConverter = {\n fromASN: (value) => value.valueBlock.value,\n toASN: (value) => new asn1js.Boolean({ value }),\n};\nexport const AsnOctetStringConverter = {\n fromASN: (value) => value.valueBlock.valueHexView,\n toASN: (value) => new asn1js.OctetString({ valueHex: value }),\n};\nexport const AsnConstructedOctetStringConverter = {\n fromASN: (value) => new OctetString(value.getValue()),\n toASN: (value) => value.toASN(),\n};\nfunction createStringConverter(Asn1Type) {\n return {\n fromASN: (value) => value.valueBlock.value,\n toASN: (value) => new Asn1Type({ value }),\n };\n}\nexport const AsnUtf8StringConverter = createStringConverter(asn1js.Utf8String);\nexport const AsnBmpStringConverter = createStringConverter(asn1js.BmpString);\nexport const AsnUniversalStringConverter = createStringConverter(asn1js.UniversalString);\nexport const AsnNumericStringConverter = createStringConverter(asn1js.NumericString);\nexport const AsnPrintableStringConverter = createStringConverter(asn1js.PrintableString);\nexport const AsnTeletexStringConverter = createStringConverter(asn1js.TeletexString);\nexport const AsnVideotexStringConverter = createStringConverter(asn1js.VideotexString);\nexport const AsnIA5StringConverter = createStringConverter(asn1js.IA5String);\nexport const AsnGraphicStringConverter = createStringConverter(asn1js.GraphicString);\nexport const AsnVisibleStringConverter = createStringConverter(asn1js.VisibleString);\nexport const AsnGeneralStringConverter = createStringConverter(asn1js.GeneralString);\nexport const AsnCharacterStringConverter = createStringConverter(asn1js.CharacterString);\nexport const AsnUTCTimeConverter = {\n fromASN: (value) => value.toDate(),\n toASN: (value) => new asn1js.UTCTime({ valueDate: value }),\n};\nexport const AsnGeneralizedTimeConverter = {\n fromASN: (value) => value.toDate(),\n toASN: (value) => new asn1js.GeneralizedTime({ valueDate: value }),\n};\nexport const AsnNullConverter = {\n fromASN: () => null,\n toASN: () => {\n return new asn1js.Null();\n },\n};\nexport function defaultConverter(type) {\n switch (type) {\n case AsnPropTypes.Any:\n return AsnAnyConverter;\n case AsnPropTypes.BitString:\n return AsnBitStringConverter;\n case AsnPropTypes.BmpString:\n return AsnBmpStringConverter;\n case AsnPropTypes.Boolean:\n return AsnBooleanConverter;\n case AsnPropTypes.CharacterString:\n return AsnCharacterStringConverter;\n case AsnPropTypes.Enumerated:\n return AsnEnumeratedConverter;\n case AsnPropTypes.GeneralString:\n return AsnGeneralStringConverter;\n case AsnPropTypes.GeneralizedTime:\n return AsnGeneralizedTimeConverter;\n case AsnPropTypes.GraphicString:\n return AsnGraphicStringConverter;\n case AsnPropTypes.IA5String:\n return AsnIA5StringConverter;\n case AsnPropTypes.Integer:\n return AsnIntegerConverter;\n case AsnPropTypes.Null:\n return AsnNullConverter;\n case AsnPropTypes.NumericString:\n return AsnNumericStringConverter;\n case AsnPropTypes.ObjectIdentifier:\n return AsnObjectIdentifierConverter;\n case AsnPropTypes.OctetString:\n return AsnOctetStringConverter;\n case AsnPropTypes.PrintableString:\n return AsnPrintableStringConverter;\n case AsnPropTypes.TeletexString:\n return AsnTeletexStringConverter;\n case AsnPropTypes.UTCTime:\n return AsnUTCTimeConverter;\n case AsnPropTypes.UniversalString:\n return AsnUniversalStringConverter;\n case AsnPropTypes.Utf8String:\n return AsnUtf8StringConverter;\n case AsnPropTypes.VideotexString:\n return AsnVideotexStringConverter;\n case AsnPropTypes.VisibleString:\n return AsnVisibleStringConverter;\n default:\n return null;\n }\n}\n","export function isConvertible(target) {\n if (typeof target === \"function\" && target.prototype) {\n if (target.prototype.toASN && target.prototype.fromASN) {\n return true;\n }\n else {\n return isConvertible(target.prototype);\n }\n }\n else {\n return !!(target && typeof target === \"object\" && \"toASN\" in target && \"fromASN\" in target);\n }\n}\nexport function isTypeOfArray(target) {\n var _a;\n if (target) {\n const proto = Object.getPrototypeOf(target);\n if (((_a = proto === null || proto === void 0 ? void 0 : proto.prototype) === null || _a === void 0 ? void 0 : _a.constructor) === Array) {\n return true;\n }\n return isTypeOfArray(proto);\n }\n return false;\n}\nexport function isArrayEqual(bytes1, bytes2) {\n if (!(bytes1 && bytes2)) {\n return false;\n }\n if (bytes1.byteLength !== bytes2.byteLength) {\n return false;\n }\n const b1 = new Uint8Array(bytes1);\n const b2 = new Uint8Array(bytes2);\n for (let i = 0; i < bytes1.byteLength; i++) {\n if (b1[i] !== b2[i]) {\n return false;\n }\n }\n return true;\n}\n","import * as asn1js from \"asn1js\";\nimport { AsnPropTypes, AsnTypeTypes } from \"./enums\";\nimport { isConvertible } from \"./helper\";\nexport class AsnSchemaStorage {\n constructor() {\n this.items = new WeakMap();\n }\n has(target) {\n return this.items.has(target);\n }\n get(target, checkSchema = false) {\n const schema = this.items.get(target);\n if (!schema) {\n throw new Error(`Cannot get schema for '${target.prototype.constructor.name}' target`);\n }\n if (checkSchema && !schema.schema) {\n throw new Error(`Schema '${target.prototype.constructor.name}' doesn't contain ASN.1 schema. Call 'AsnSchemaStorage.cache'.`);\n }\n return schema;\n }\n cache(target) {\n const schema = this.get(target);\n if (!schema.schema) {\n schema.schema = this.create(target, true);\n }\n }\n createDefault(target) {\n const schema = { type: AsnTypeTypes.Sequence, items: {} };\n const parentSchema = this.findParentSchema(target);\n if (parentSchema) {\n Object.assign(schema, parentSchema);\n schema.items = Object.assign({}, schema.items, parentSchema.items);\n }\n return schema;\n }\n create(target, useNames) {\n const schema = this.items.get(target) || this.createDefault(target);\n const asn1Value = [];\n for (const key in schema.items) {\n const item = schema.items[key];\n const name = useNames ? key : \"\";\n let asn1Item;\n if (typeof item.type === \"number\") {\n const Asn1TypeName = AsnPropTypes[item.type];\n const Asn1Type = asn1js[Asn1TypeName];\n if (!Asn1Type) {\n throw new Error(`Cannot get ASN1 class by name '${Asn1TypeName}'`);\n }\n asn1Item = new Asn1Type({ name });\n }\n else if (isConvertible(item.type)) {\n const instance = new item.type();\n asn1Item = instance.toSchema(name);\n }\n else if (item.optional) {\n const itemSchema = this.get(item.type);\n if (itemSchema.type === AsnTypeTypes.Choice) {\n asn1Item = new asn1js.Any({ name });\n }\n else {\n asn1Item = this.create(item.type, false);\n asn1Item.name = name;\n }\n }\n else {\n asn1Item = new asn1js.Any({ name });\n }\n const optional = !!item.optional || item.defaultValue !== undefined;\n if (item.repeated) {\n asn1Item.name = \"\";\n const Container = item.repeated === \"set\" ? asn1js.Set : asn1js.Sequence;\n asn1Item = new Container({\n name: \"\",\n value: [new asn1js.Repeated({ name, value: asn1Item })],\n });\n }\n if (item.context !== null && item.context !== undefined) {\n if (item.implicit) {\n if (typeof item.type === \"number\" || isConvertible(item.type)) {\n const Container = item.repeated ? asn1js.Constructed : asn1js.Primitive;\n asn1Value.push(new Container({ name, optional, idBlock: { tagClass: 3, tagNumber: item.context } }));\n }\n else {\n this.cache(item.type);\n const isRepeated = !!item.repeated;\n let value = !isRepeated ? this.get(item.type, true).schema : asn1Item;\n value =\n \"valueBlock\" in value\n ? value.valueBlock.value\n :\n value.value;\n asn1Value.push(new asn1js.Constructed({\n name: !isRepeated ? name : \"\",\n optional,\n idBlock: { tagClass: 3, tagNumber: item.context },\n value: value,\n }));\n }\n }\n else {\n asn1Value.push(new asn1js.Constructed({\n optional,\n idBlock: { tagClass: 3, tagNumber: item.context },\n value: [asn1Item],\n }));\n }\n }\n else {\n asn1Item.optional = optional;\n asn1Value.push(asn1Item);\n }\n }\n switch (schema.type) {\n case AsnTypeTypes.Sequence:\n return new asn1js.Sequence({ value: asn1Value, name: \"\" });\n case AsnTypeTypes.Set:\n return new asn1js.Set({ value: asn1Value, name: \"\" });\n case AsnTypeTypes.Choice:\n return new asn1js.Choice({ value: asn1Value, name: \"\" });\n default:\n throw new Error(`Unsupported ASN1 type in use`);\n }\n }\n set(target, schema) {\n this.items.set(target, schema);\n return this;\n }\n findParentSchema(target) {\n const parent = Object.getPrototypeOf(target);\n if (parent) {\n const schema = this.items.get(parent);\n return schema || this.findParentSchema(parent);\n }\n return null;\n }\n}\n","import { AsnSchemaStorage } from \"./schema\";\nexport const schemaStorage = new AsnSchemaStorage();\n","export class AsnSchemaValidationError extends Error {\n constructor() {\n super(...arguments);\n this.schemas = [];\n }\n}\n","import * as asn1js from \"asn1js\";\nimport { AsnPropTypes, AsnTypeTypes } from \"./enums\";\nimport * as converters from \"./converters\";\nimport { AsnSchemaValidationError } from \"./errors\";\nimport { isConvertible, isTypeOfArray } from \"./helper\";\nimport { schemaStorage } from \"./storage\";\nexport class AsnParser {\n static parse(data, target) {\n const asn1Parsed = asn1js.fromBER(data);\n if (asn1Parsed.result.error) {\n throw new Error(asn1Parsed.result.error);\n }\n const res = this.fromASN(asn1Parsed.result, target);\n return res;\n }\n static fromASN(asn1Schema, target) {\n try {\n if (isConvertible(target)) {\n const value = new target();\n return value.fromASN(asn1Schema);\n }\n const schema = schemaStorage.get(target);\n schemaStorage.cache(target);\n let targetSchema = schema.schema;\n const choiceResult = this.handleChoiceTypes(asn1Schema, schema, target, targetSchema);\n if (choiceResult === null || choiceResult === void 0 ? void 0 : choiceResult.result) {\n return choiceResult.result;\n }\n if (choiceResult === null || choiceResult === void 0 ? void 0 : choiceResult.targetSchema) {\n targetSchema = choiceResult.targetSchema;\n }\n const sequenceResult = this.handleSequenceTypes(asn1Schema, schema, target, targetSchema);\n const res = new target();\n if (isTypeOfArray(target)) {\n return this.handleArrayTypes(asn1Schema, schema, target);\n }\n this.processSchemaItems(schema, sequenceResult, res);\n return res;\n }\n catch (error) {\n if (error instanceof AsnSchemaValidationError) {\n error.schemas.push(target.name);\n }\n throw error;\n }\n }\n static handleChoiceTypes(asn1Schema, schema, target, targetSchema) {\n if (asn1Schema.constructor === asn1js.Constructed &&\n schema.type === AsnTypeTypes.Choice &&\n asn1Schema.idBlock.tagClass === 3) {\n for (const key in schema.items) {\n const schemaItem = schema.items[key];\n if (schemaItem.context === asn1Schema.idBlock.tagNumber && schemaItem.implicit) {\n if (typeof schemaItem.type === \"function\" &&\n schemaStorage.has(schemaItem.type)) {\n const fieldSchema = schemaStorage.get(schemaItem.type);\n if (fieldSchema && fieldSchema.type === AsnTypeTypes.Sequence) {\n const newSeq = new asn1js.Sequence();\n if (\"value\" in asn1Schema.valueBlock &&\n Array.isArray(asn1Schema.valueBlock.value) &&\n \"value\" in newSeq.valueBlock) {\n newSeq.valueBlock.value = asn1Schema.valueBlock.value;\n const fieldValue = this.fromASN(newSeq, schemaItem.type);\n const res = new target();\n res[key] = fieldValue;\n return { result: res };\n }\n }\n }\n }\n }\n }\n else if (asn1Schema.constructor === asn1js.Constructed &&\n schema.type !== AsnTypeTypes.Choice) {\n const newTargetSchema = new asn1js.Constructed({\n idBlock: {\n tagClass: 3,\n tagNumber: asn1Schema.idBlock.tagNumber,\n },\n value: schema.schema.valueBlock.value,\n });\n for (const key in schema.items) {\n delete asn1Schema[key];\n }\n return { targetSchema: newTargetSchema };\n }\n return null;\n }\n static handleSequenceTypes(asn1Schema, schema, target, targetSchema) {\n if (schema.type === AsnTypeTypes.Sequence) {\n const asn1ComparedSchema = asn1js.compareSchema({}, asn1Schema, targetSchema);\n if (!asn1ComparedSchema.verified) {\n throw new AsnSchemaValidationError(`Data does not match to ${target.name} ASN1 schema.${asn1ComparedSchema.result.error ? ` ${asn1ComparedSchema.result.error}` : \"\"}`);\n }\n return asn1ComparedSchema;\n }\n else {\n const asn1ComparedSchema = asn1js.compareSchema({}, asn1Schema, targetSchema);\n if (!asn1ComparedSchema.verified) {\n throw new AsnSchemaValidationError(`Data does not match to ${target.name} ASN1 schema.${asn1ComparedSchema.result.error ? ` ${asn1ComparedSchema.result.error}` : \"\"}`);\n }\n return asn1ComparedSchema;\n }\n }\n static processRepeatedField(asn1Elements, asn1Index, schemaItem) {\n let elementsToProcess = asn1Elements.slice(asn1Index);\n if (elementsToProcess.length === 1 && elementsToProcess[0].constructor.name === \"Sequence\") {\n const seq = elementsToProcess[0];\n if (seq.valueBlock && seq.valueBlock.value && Array.isArray(seq.valueBlock.value)) {\n elementsToProcess = seq.valueBlock.value;\n }\n }\n if (typeof schemaItem.type === \"number\") {\n const converter = converters.defaultConverter(schemaItem.type);\n if (!converter)\n throw new Error(`No converter for ASN.1 type ${schemaItem.type}`);\n return elementsToProcess\n .filter((el) => el && el.valueBlock)\n .map((el) => {\n try {\n return converter.fromASN(el);\n }\n catch {\n return undefined;\n }\n })\n .filter((v) => v !== undefined);\n }\n else {\n return elementsToProcess\n .filter((el) => el && el.valueBlock)\n .map((el) => {\n try {\n return this.fromASN(el, schemaItem.type);\n }\n catch {\n return undefined;\n }\n })\n .filter((v) => v !== undefined);\n }\n }\n static processPrimitiveField(asn1Element, schemaItem) {\n const converter = converters.defaultConverter(schemaItem.type);\n if (!converter)\n throw new Error(`No converter for ASN.1 type ${schemaItem.type}`);\n return converter.fromASN(asn1Element);\n }\n static isOptionalChoiceField(schemaItem) {\n return (schemaItem.optional &&\n typeof schemaItem.type === \"function\" &&\n schemaStorage.has(schemaItem.type) &&\n schemaStorage.get(schemaItem.type).type === AsnTypeTypes.Choice);\n }\n static processOptionalChoiceField(asn1Element, schemaItem) {\n try {\n const value = this.fromASN(asn1Element, schemaItem.type);\n return { processed: true, value };\n }\n catch (err) {\n if (err instanceof AsnSchemaValidationError &&\n /Wrong values for Choice type/.test(err.message)) {\n return { processed: false };\n }\n throw err;\n }\n }\n static handleArrayTypes(asn1Schema, schema, target) {\n if (!(\"value\" in asn1Schema.valueBlock && Array.isArray(asn1Schema.valueBlock.value))) {\n throw new Error(`Cannot get items from the ASN.1 parsed value. ASN.1 object is not constructed.`);\n }\n const itemType = schema.itemType;\n if (typeof itemType === \"number\") {\n const converter = converters.defaultConverter(itemType);\n if (!converter) {\n throw new Error(`Cannot get default converter for array item of ${target.name} ASN1 schema`);\n }\n return target.from(asn1Schema.valueBlock.value, (element) => converter.fromASN(element));\n }\n else {\n return target.from(asn1Schema.valueBlock.value, (element) => this.fromASN(element, itemType));\n }\n }\n static processSchemaItems(schema, asn1ComparedSchema, res) {\n for (const key in schema.items) {\n const asn1SchemaValue = asn1ComparedSchema.result[key];\n if (!asn1SchemaValue) {\n continue;\n }\n const schemaItem = schema.items[key];\n const schemaItemType = schemaItem.type;\n let parsedValue;\n if (typeof schemaItemType === \"number\" || isConvertible(schemaItemType)) {\n parsedValue = this.processPrimitiveSchemaItem(asn1SchemaValue, schemaItem, schemaItemType);\n }\n else {\n parsedValue = this.processComplexSchemaItem(asn1SchemaValue, schemaItem, schemaItemType);\n }\n if (parsedValue &&\n typeof parsedValue === \"object\" &&\n \"value\" in parsedValue &&\n \"raw\" in parsedValue) {\n res[key] = parsedValue.value;\n res[`${key}Raw`] = parsedValue.raw;\n }\n else {\n res[key] = parsedValue;\n }\n }\n }\n static processPrimitiveSchemaItem(asn1SchemaValue, schemaItem, schemaItemType) {\n var _a;\n const converter = (_a = schemaItem.converter) !== null && _a !== void 0 ? _a : (isConvertible(schemaItemType)\n ? new schemaItemType()\n : null);\n if (!converter) {\n throw new Error(\"Converter is empty\");\n }\n if (schemaItem.repeated) {\n return this.processRepeatedPrimitiveItem(asn1SchemaValue, schemaItem, converter);\n }\n else {\n return this.processSinglePrimitiveItem(asn1SchemaValue, schemaItem, schemaItemType, converter);\n }\n }\n static processRepeatedPrimitiveItem(asn1SchemaValue, schemaItem, converter) {\n if (schemaItem.implicit) {\n const Container = schemaItem.repeated === \"sequence\" ? asn1js.Sequence : asn1js.Set;\n const newItem = new Container();\n newItem.valueBlock = asn1SchemaValue.valueBlock;\n const newItemAsn = asn1js.fromBER(newItem.toBER(false));\n if (newItemAsn.offset === -1) {\n throw new Error(`Cannot parse the child item. ${newItemAsn.result.error}`);\n }\n if (!(\"value\" in newItemAsn.result.valueBlock &&\n Array.isArray(newItemAsn.result.valueBlock.value))) {\n throw new Error(\"Cannot get items from the ASN.1 parsed value. ASN.1 object is not constructed.\");\n }\n const value = newItemAsn.result.valueBlock.value;\n return Array.from(value, (element) => converter.fromASN(element));\n }\n else {\n return Array.from(asn1SchemaValue, (element) => converter.fromASN(element));\n }\n }\n static processSinglePrimitiveItem(asn1SchemaValue, schemaItem, schemaItemType, converter) {\n let value = asn1SchemaValue;\n if (schemaItem.implicit) {\n let newItem;\n if (isConvertible(schemaItemType)) {\n newItem = new schemaItemType().toSchema(\"\");\n }\n else {\n const Asn1TypeName = AsnPropTypes[schemaItemType];\n const Asn1Type = asn1js[Asn1TypeName];\n if (!Asn1Type) {\n throw new Error(`Cannot get '${Asn1TypeName}' class from asn1js module`);\n }\n newItem = new Asn1Type();\n }\n newItem.valueBlock = value.valueBlock;\n value = asn1js.fromBER(newItem.toBER(false)).result;\n }\n return converter.fromASN(value);\n }\n static processComplexSchemaItem(asn1SchemaValue, schemaItem, schemaItemType) {\n if (schemaItem.repeated) {\n if (!Array.isArray(asn1SchemaValue)) {\n throw new Error(\"Cannot get list of items from the ASN.1 parsed value. ASN.1 value should be iterable.\");\n }\n return Array.from(asn1SchemaValue, (element) => this.fromASN(element, schemaItemType));\n }\n else {\n const valueToProcess = this.handleImplicitTagging(asn1SchemaValue, schemaItem, schemaItemType);\n if (this.isOptionalChoiceField(schemaItem)) {\n try {\n return this.fromASN(valueToProcess, schemaItemType);\n }\n catch (err) {\n if (err instanceof AsnSchemaValidationError &&\n /Wrong values for Choice type/.test(err.message)) {\n return undefined;\n }\n throw err;\n }\n }\n else {\n const parsedValue = this.fromASN(valueToProcess, schemaItemType);\n if (schemaItem.raw) {\n return {\n value: parsedValue,\n raw: asn1SchemaValue.valueBeforeDecodeView,\n };\n }\n return parsedValue;\n }\n }\n }\n static handleImplicitTagging(asn1SchemaValue, schemaItem, schemaItemType) {\n if (schemaItem.implicit && typeof schemaItem.context === \"number\") {\n const schema = schemaStorage.get(schemaItemType);\n if (schema.type === AsnTypeTypes.Sequence) {\n const newSeq = new asn1js.Sequence();\n if (\"value\" in asn1SchemaValue.valueBlock &&\n Array.isArray(asn1SchemaValue.valueBlock.value) &&\n \"value\" in newSeq.valueBlock) {\n newSeq.valueBlock.value = asn1SchemaValue.valueBlock.value;\n return newSeq;\n }\n }\n else if (schema.type === AsnTypeTypes.Set) {\n const newSet = new asn1js.Set();\n if (\"value\" in asn1SchemaValue.valueBlock &&\n Array.isArray(asn1SchemaValue.valueBlock.value) &&\n \"value\" in newSet.valueBlock) {\n newSet.valueBlock.value = asn1SchemaValue.valueBlock.value;\n return newSet;\n }\n }\n }\n return asn1SchemaValue;\n }\n}\n","import * as asn1js from \"asn1js\";\nimport * as converters from \"./converters\";\nimport { AsnPropTypes, AsnTypeTypes } from \"./enums\";\nimport { isConvertible, isArrayEqual } from \"./helper\";\nimport { schemaStorage } from \"./storage\";\nexport class AsnSerializer {\n static serialize(obj) {\n if (obj instanceof asn1js.BaseBlock) {\n return obj.toBER(false);\n }\n return this.toASN(obj).toBER(false);\n }\n static toASN(obj) {\n if (obj && typeof obj === \"object\" && isConvertible(obj)) {\n return obj.toASN();\n }\n if (!(obj && typeof obj === \"object\")) {\n throw new TypeError(\"Parameter 1 should be type of Object.\");\n }\n const target = obj.constructor;\n const schema = schemaStorage.get(target);\n schemaStorage.cache(target);\n let asn1Value = [];\n if (schema.itemType) {\n if (!Array.isArray(obj)) {\n throw new TypeError(\"Parameter 1 should be type of Array.\");\n }\n if (typeof schema.itemType === \"number\") {\n const converter = converters.defaultConverter(schema.itemType);\n if (!converter) {\n throw new Error(`Cannot get default converter for array item of ${target.name} ASN1 schema`);\n }\n asn1Value = obj.map((o) => converter.toASN(o));\n }\n else {\n asn1Value = obj.map((o) => this.toAsnItem({ type: schema.itemType }, \"[]\", target, o));\n }\n }\n else {\n for (const key in schema.items) {\n const schemaItem = schema.items[key];\n const objProp = obj[key];\n if (objProp === undefined ||\n schemaItem.defaultValue === objProp ||\n (typeof schemaItem.defaultValue === \"object\" &&\n typeof objProp === \"object\" &&\n isArrayEqual(this.serialize(schemaItem.defaultValue), this.serialize(objProp)))) {\n continue;\n }\n const asn1Item = AsnSerializer.toAsnItem(schemaItem, key, target, objProp);\n if (typeof schemaItem.context === \"number\") {\n if (schemaItem.implicit) {\n if (!schemaItem.repeated &&\n (typeof schemaItem.type === \"number\" || isConvertible(schemaItem.type))) {\n const value = {};\n value.valueHex =\n asn1Item instanceof asn1js.Null\n ? asn1Item.valueBeforeDecodeView\n : asn1Item.valueBlock.toBER();\n asn1Value.push(new asn1js.Primitive({\n optional: schemaItem.optional,\n idBlock: {\n tagClass: 3,\n tagNumber: schemaItem.context,\n },\n ...value,\n }));\n }\n else {\n asn1Value.push(new asn1js.Constructed({\n optional: schemaItem.optional,\n idBlock: {\n tagClass: 3,\n tagNumber: schemaItem.context,\n },\n value: asn1Item.valueBlock.value,\n }));\n }\n }\n else {\n asn1Value.push(new asn1js.Constructed({\n optional: schemaItem.optional,\n idBlock: {\n tagClass: 3,\n tagNumber: schemaItem.context,\n },\n value: [asn1Item],\n }));\n }\n }\n else if (schemaItem.repeated) {\n asn1Value = asn1Value.concat(asn1Item);\n }\n else {\n asn1Value.push(asn1Item);\n }\n }\n }\n let asnSchema;\n switch (schema.type) {\n case AsnTypeTypes.Sequence:\n asnSchema = new asn1js.Sequence({ value: asn1Value });\n break;\n case AsnTypeTypes.Set:\n asnSchema = new asn1js.Set({ value: asn1Value });\n break;\n case AsnTypeTypes.Choice:\n if (!asn1Value[0]) {\n throw new Error(`Schema '${target.name}' has wrong data. Choice cannot be empty.`);\n }\n asnSchema = asn1Value[0];\n break;\n }\n return asnSchema;\n }\n static toAsnItem(schemaItem, key, target, objProp) {\n let asn1Item;\n if (typeof schemaItem.type === \"number\") {\n const converter = schemaItem.converter;\n if (!converter) {\n throw new Error(`Property '${key}' doesn't have converter for type ${AsnPropTypes[schemaItem.type]} in schema '${target.name}'`);\n }\n if (schemaItem.repeated) {\n if (!Array.isArray(objProp)) {\n throw new TypeError(\"Parameter 'objProp' should be type of Array.\");\n }\n const items = Array.from(objProp, (element) => converter.toASN(element));\n const Container = schemaItem.repeated === \"sequence\" ? asn1js.Sequence : asn1js.Set;\n asn1Item = new Container({\n value: items,\n });\n }\n else {\n asn1Item = converter.toASN(objProp);\n }\n }\n else {\n if (schemaItem.repeated) {\n if (!Array.isArray(objProp)) {\n throw new TypeError(\"Parameter 'objProp' should be type of Array.\");\n }\n const items = Array.from(objProp, (element) => this.toASN(element));\n const Container = schemaItem.repeated === \"sequence\" ? asn1js.Sequence : asn1js.Set;\n asn1Item = new Container({\n value: items,\n });\n }\n else {\n asn1Item = this.toASN(objProp);\n }\n }\n return asn1Item;\n }\n}\n","import * as asn1js from \"asn1js\";\nimport { BufferSourceConverter } from \"pvtsutils\";\nimport { AsnParser } from \"./parser\";\nimport { AsnSerializer } from \"./serializer\";\nexport class AsnConvert {\n static serialize(obj) {\n return AsnSerializer.serialize(obj);\n }\n static parse(data, target) {\n return AsnParser.parse(data, target);\n }\n static toString(data) {\n const buf = BufferSourceConverter.isBufferSource(data)\n ? BufferSourceConverter.toArrayBuffer(data)\n : AsnConvert.serialize(data);\n const asn = asn1js.fromBER(buf);\n if (asn.offset === -1) {\n throw new Error(`Cannot decode ASN.1 data. ${asn.result.error}`);\n }\n return asn.result.toString();\n }\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport { AsnConvert, AsnUtf8StringConverter } from \"@peculiar/asn1-schema\";\nimport type { CertificatePurpose } from \"../common.js\";\nimport { Subject } from \"../subject.js\";\nimport { buildPublicKey } from \"./_build_public_key.js\";\nimport { getCrypto, x509 } from \"./_crypto.js\";\nimport { getAttributes } from \"./_get_attributes.js\";\n\nexport interface CreateSelfSignCertificateOptions {\n privateKey: CryptoKey;\n notBefore?: Date;\n notAfter?: Date;\n validity?: number;\n // CN=common/O=Org/C=US/ST=State/L=City\n subject?: string;\n dns?: string[];\n ip?: string[];\n applicationUri?: string;\n purpose: CertificatePurpose;\n}\n\n/**\n *\n * construct a self-signed certificate\n */\nexport async function createSelfSignedCertificate({\n privateKey,\n notAfter,\n notBefore,\n validity,\n subject,\n dns,\n ip,\n applicationUri,\n purpose,\n}: CreateSelfSignCertificateOptions) {\n const crypto = getCrypto();\n\n const publicKey = await buildPublicKey(privateKey);\n\n const keys = {\n privateKey,\n publicKey,\n };\n\n const { nsComment, basicConstraints, keyUsageExtension, usages } = getAttributes(purpose);\n\n notBefore = notBefore || new Date();\n validity = validity || 0;\n if (!notAfter) {\n validity = validity || 365;\n }\n notAfter = notAfter || new Date(notBefore.getTime() + validity * 24 * 60 * 60 * 1000);\n\n const alternativeNameExtensions: x509.JsonGeneralName[] = [];\n if (dns) {\n for (const d of dns) {\n alternativeNameExtensions.push({ type: \"dns\", value: d });\n }\n }\n if (ip) {\n for (const d of ip) {\n alternativeNameExtensions.push({ type: \"ip\", value: d });\n }\n }\n if (applicationUri) {\n alternativeNameExtensions.push({ type: \"url\", value: applicationUri });\n }\n\n // https://opensource.apple.com/source/OpenSSH/OpenSSH-186/osslshim/heimdal-asn1/rfc2459.asn1.auto.html\n const ID_NETSCAPE_COMMENT = \"2.16.840.1.113730.1.13\";\n\n const s = new Subject(subject || \"\");\n const s1 = s.toStringInternal(\", \");\n const name = s1;\n\n const cert = await x509.X509CertificateGenerator.createSelfSigned(\n {\n serialNumber: Date.now().toString(),\n name,\n notBefore,\n notAfter,\n\n signingAlgorithm: { name: \"RSASSA-PKCS1-v1_5\", hash: { name: \"SHA-256\" } },\n\n keys,\n\n extensions: [\n new x509.Extension(ID_NETSCAPE_COMMENT, false, AsnConvert.serialize(AsnUtf8StringConverter.toASN(nsComment))),\n // new x509.BasicConstraintsExtension(true, 2, true),\n basicConstraints,\n new x509.ExtendedKeyUsageExtension(keyUsageExtension, true),\n new x509.KeyUsagesExtension(usages, true),\n await x509.SubjectKeyIdentifierExtension.create(keys.publicKey),\n await x509.AuthorityKeyIdentifierExtension.create(keys.publicKey),\n new x509.SubjectAlternativeNameExtension(alternativeNameExtensions),\n ],\n },\n crypto as Crypto,\n );\n\n return { cert: cert.toString(\"pem\"), der: cert };\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * @module node_opcua_crypto\n */\nimport assert from \"node:assert\";\nimport { createPrivateKey, createPublicKey } from \"node:crypto\";\nimport { isKeyObject, type KeyObject, type PrivateKey, type PrivateKeyPEM, type PublicKey, type PublicKeyPEM } from \"./common.js\";\nimport { removeTrailingLF, toPem } from \"./crypto_utils.js\";\n\n/***\n * @method rsaLengthPrivateKey\n * A method to determine the rsa key length ( i.e 2048bits or 1024bits)\n * @param key a PEM public key or a PEM rsa private key\n * @return the key length in bytes.\n */\nexport function rsaLengthPrivateKey(key: PrivateKey): number {\n const keyPem = typeof key.hidden === \"string\" ? key.hidden : key.hidden.export({ type: \"pkcs1\", format: \"pem\" }).toString();\n const keyObject = createPrivateKey(keyPem);\n const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;\n assert(modulusLength, \"Cannot determine modulus length from private key\");\n return modulusLength / 8;\n}\n\n/**\n * @method toPem2\n * @param raw_key\n * @param pem\n *\n *\n * @return a PEM string containing the Private Key\n *\n * Note: a Pem key can be converted back to a private key object using coercePrivateKey\n *\n */\nexport function toPem2(raw_key: Buffer | string | KeyObject | PrivateKey, pem: string): string {\n if ((raw_key as PrivateKey).hidden) {\n return toPem2((raw_key as PrivateKey).hidden, pem);\n }\n assert(raw_key, \"expecting a key\");\n assert(typeof pem === \"string\");\n\n if (isKeyObject(raw_key)) {\n const _raw_key = raw_key as KeyObject;\n if (pem === \"RSA PRIVATE KEY\") {\n return removeTrailingLF(_raw_key.export({ format: \"pem\", type: \"pkcs1\" }).toString());\n } else if (pem === \"PRIVATE KEY\") {\n return removeTrailingLF(_raw_key.export({ format: \"pem\", type: \"pkcs8\" }).toString());\n } else {\n throw new Error(\"Unsupported case!\");\n }\n }\n return toPem(raw_key as Buffer | string, pem);\n}\n\nexport function coercePrivateKeyPem(privateKey: PrivateKey): PrivateKeyPEM {\n return toPem2(privateKey, \"PRIVATE KEY\");\n}\n\nexport function coercePublicKeyPem(publicKey: PublicKey | PublicKeyPEM): PublicKeyPEM {\n if (isKeyObject(publicKey)) {\n return (publicKey as KeyObject).export({ format: \"pem\", type: \"spki\" }).toString();\n }\n assert(typeof publicKey === \"string\");\n return publicKey;\n}\nexport function coerceRsaPublicKeyPem(publicKey: PublicKey | KeyObject | PublicKeyPEM): PublicKeyPEM {\n if (isKeyObject(publicKey)) {\n return (publicKey as KeyObject).export({ format: \"pem\", type: \"spki\" }).toString();\n }\n assert(typeof publicKey === \"string\");\n return publicKey;\n}\n\nexport function rsaLengthPublicKey(key: PublicKeyPEM | PublicKey): number {\n key = coercePublicKeyPem(key);\n assert(typeof key === \"string\");\n const keyObject = createPublicKey(key);\n const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;\n assert(modulusLength, \"Cannot determine modulus length from public key\");\n return modulusLength / 8;\n}\nexport function rsaLengthRsaPublicKey(key: PublicKeyPEM | PublicKey): number {\n key = coerceRsaPublicKeyPem(key);\n assert(typeof key === \"string\");\n const keyObject = createPublicKey(key);\n const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;\n assert(modulusLength, \"Cannot determine modulus length from public key\");\n return modulusLength / 8;\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * @module node_opcua_crypto\n */\nimport assert from \"node:assert\";\nimport { createCipheriv, createDecipheriv, createHmac } from \"node:crypto\";\n\nimport { createFastUninitializedBuffer } from \"./buffer_utils.js\";\nimport type { Nonce } from \"./common.js\";\nimport { type VerifyMessageChunkSignatureOptions, verifyMessageChunkSignature } from \"./crypto_utils.js\";\nimport { exploreCertificateInfo } from \"./explore_certificate.js\";\n\nfunction HMAC_HASH(sha1or256: \"SHA1\" | \"SHA256\", secret: Buffer, message: Buffer) {\n return createHmac(sha1or256, secret).update(message).digest();\n}\n\nfunction plus(buf1: Buffer, buf2: Buffer): Buffer {\n return Buffer.concat([buf1, buf2]);\n}\n\n// OPC-UA Spec 1.02 part 6 - 6.7.5 Deriving Keys page 42\n// Once the SecureChannel is established the Messages are signed and encrypted with keys derived\n// from the Nonces exchanged in t he OpenSecureChannel call. These keys are derived by passing the\n// Nonces to a pseudo - random function which produces a sequence of bytes from a set of inputs. A\n// pseudo- random function is represented by the following function declaration:\n// Byte[] PRF(\n// Byte[] secret,\n// Byte[] seed,\n// Int32 length,\n// Int32 offset\n// )\n// Where length is the number of bytes to return and offset is a number of bytes from the beginning of\n// the sequence.\n// The lengths of the keys that need to be generated depend on the SecurityPolicy used for the\n// channel. The following information is specified by the SecurityPolicy:\n// a) SigningKeyLength (from the DerivedSignatureKeyLength);\n// b) EncryptingKeyLength (implied by the SymmetricEncryptionAlgorithm);\n// c) EncryptingBlockSize (implied by the SymmetricEncryptionAlgorithm).\n// The parameters passed to the pseudo random function are specified in Table 36.\n// Table 36 - Cryptography Key Generation Parameters\n//\n// Key Secret Seed Length Offset\n// ClientSigningKey ServerNonce ClientNonce SigningKeyLength 0\n// ClientEncryptingKey ServerNonce ClientNonce EncryptingKeyLength SigningKeyLength\n// ClientInitializationVector ServerNonce ClientNonce EncryptingBlockSize SigningKeyLength+ EncryptingKeyLength\n// ServerSigningKey ClientNonce ServerNonce SigningKeyLength 0\n// ServerEncryptingKey ClientNonce ServerNonce EncryptingKeyLength SigningKeyLength\n// ServerInitializationVector ClientNonce ServerNonce EncryptingBlockSize SigningKeyLength+ EncryptingKeyLength\n//\n// The Client keys are used to secure Messages sent by the Client. The Server keys are used to\n// secure Messages sent by the Server.\n// The SSL/TLS specification defines a pseudo random function called P_HASH which is used for this purpose.\n//\n// The P_HASH algorithm is defined as follows:\n//\n// P_HASH(secret, seed) = HMAC_HASH(secret, A(1) + seed) +\n// HMAC_HASH(secret, A(2) + seed) +\n// HMAC_HASH(secret, A(3) + seed) + ...\n// Where A(n) is defined as:\n// A(0) = seed\n// A(n) = HMAC_HASH(secret, A(n-1))\n// + indicates that the results are appended to previous results.\n// Where HASH is a hash function such as SHA1 or SHA256. The hash function to use depends on the SecurityPolicyUri.\n//\n//\n// see also http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/ws-secureconversation-1.3-os.html\n// http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\nexport function makePseudoRandomBuffer(secret: Nonce, seed: Nonce, minLength: number, sha1or256: \"SHA1\" | \"SHA256\"): Buffer {\n assert(Buffer.isBuffer(seed));\n assert(sha1or256 === \"SHA1\" || sha1or256 === \"SHA256\");\n\n const a: Buffer[] = [];\n a[0] = seed;\n let index = 1;\n let p_hash = createFastUninitializedBuffer(0);\n while (p_hash.length <= minLength) {\n /* eslint new-cap:0 */\n a[index] = HMAC_HASH(sha1or256, secret, a[index - 1]);\n p_hash = plus(p_hash, HMAC_HASH(sha1or256, secret, plus(a[index], seed)));\n index += 1;\n }\n return p_hash.subarray(0, minLength);\n}\n\nexport interface ComputeDerivedKeysOptions {\n signatureLength: number;\n signingKeyLength: number;\n encryptingKeyLength: number;\n\n encryptingBlockSize: number;\n algorithm: string;\n sha1or256?: \"SHA1\" | \"SHA256\";\n}\n\nexport interface DerivedKeys extends ComputeDerivedKeysOptions {\n signatureLength: number;\n signingKeyLength: number;\n encryptingKeyLength: number;\n\n encryptingBlockSize: number;\n algorithm: string;\n sha1or256: \"SHA1\" | \"SHA256\";\n\n signingKey: Buffer;\n encryptingKey: Buffer;\n initializationVector: Buffer;\n}\n\nexport function computeDerivedKeys(secret: Nonce, seed: Nonce, options: ComputeDerivedKeysOptions): DerivedKeys {\n assert(Number.isFinite(options.signatureLength));\n assert(Number.isFinite(options.encryptingKeyLength));\n assert(Number.isFinite(options.encryptingBlockSize));\n assert(typeof options.algorithm === \"string\");\n options.sha1or256 = options.sha1or256 || \"SHA1\";\n assert(typeof options.sha1or256 === \"string\");\n\n const offset1 = options.signingKeyLength;\n const offset2 = offset1 + options.encryptingKeyLength;\n const minLength = offset2 + options.encryptingBlockSize;\n\n const buf = makePseudoRandomBuffer(secret, seed, minLength, options.sha1or256);\n\n // +---------------+---------------------+-----------------------+\n // + signingKey + encryptingKey + initializationVector +\n // +---------------+---------------------+-----------------------+\n return {\n signatureLength: options.signatureLength,\n signingKeyLength: options.signingKeyLength,\n encryptingKeyLength: options.encryptingKeyLength,\n\n encryptingBlockSize: options.encryptingBlockSize,\n algorithm: options.algorithm,\n sha1or256: options.sha1or256,\n\n signingKey: buf.subarray(0, offset1),\n encryptingKey: buf.subarray(offset1, offset2),\n initializationVector: buf.subarray(offset2, minLength),\n };\n}\n\n/**\n * @method reduceLength\n * @param buffer\n * @param byteToRemove\n * @return buffer\n */\nexport function reduceLength(buffer: Buffer, byteToRemove: number): Buffer {\n return buffer.subarray(0, buffer.length - byteToRemove);\n}\n\n/**\n * @method removePadding\n * @param buffer\n * @return buffer with padding removed\n */\nexport function removePadding(buffer: Buffer): Buffer {\n const nbPaddingBytes = buffer.readUInt8(buffer.length - 1) + 1;\n return reduceLength(buffer, nbPaddingBytes);\n}\n\nexport type VerifyChunkSignatureOptions = VerifyMessageChunkSignatureOptions;\n\n/**\n * @method verifyChunkSignature\n *\n * const signer = {\n * signatureLength : 128,\n * algorithm : \"RSA-SHA256\",\n * public_key: \"qsdqsdqsd\"\n * };\n *\n * @param chunk The message chunk to verify.\n * @param options\n * @param options.signatureLength\n * @param options.algorithm the algorithm.\n * @param options.publicKey\n * @return {*}\n */\nexport function verifyChunkSignature(chunk: Buffer, options: VerifyChunkSignatureOptions): boolean {\n assert(Buffer.isBuffer(chunk));\n let signatureLength = options.signatureLength || 0;\n if (signatureLength === 0) {\n // let's get the signatureLength by checking the size\n // of the certificate's public key\n const cert = exploreCertificateInfo(options.publicKey);\n signatureLength = cert.publicKeyLength || 0; // 1024 bits = 128Bytes or 2048=256Bytes\n }\n const block_to_verify = chunk.subarray(0, chunk.length - signatureLength);\n const signature = chunk.subarray(chunk.length - signatureLength);\n return verifyMessageChunkSignature(block_to_verify, signature, options);\n}\n\n// /**\n// * extract the public key from a certificate - using the pem module\n// *\n// * @method extractPublicKeyFromCertificate_WithPem\n// * @async\n// * @param certificate\n// * @param callback {Function}\n// * @param callback.err\n// * @param callback.publicKey as pem\n// */\n// exports.extractPublicKeyFromCertificate_WithPem = function (certificate, callback) {\n//\n// const err1 = new Error();\n// const cert_pem = crypto_utils.toPem(certificate, \"CERTIFICATE\");\n// require(\"pem\").getPublicKey(cert_pem, function (err, data) {\n// if (err) {\n// console.log(err1.stack);\n// console.log(\" CANNOT EXTRAT PUBLIC KEY from Certificate\".red, certificate);\n// return callback(err);\n// }\n// callback(err, data.publicKey);\n// });\n// };\n//\n\nexport function computePaddingFooter(buffer: Buffer, derivedKeys: DerivedKeys): Buffer {\n assert(Object.hasOwn(derivedKeys, \"encryptingBlockSize\"));\n const paddingSize = derivedKeys.encryptingBlockSize - ((buffer.length + 1) % derivedKeys.encryptingBlockSize);\n const padding = createFastUninitializedBuffer(paddingSize + 1);\n padding.fill(paddingSize);\n return padding;\n}\n\nfunction derivedKeys_algorithm(derivedKeys: DerivedKeys) {\n assert(Object.hasOwn(derivedKeys, \"algorithm\"));\n const algorithm = derivedKeys.algorithm || \"aes-128-cbc\";\n assert(algorithm === \"aes-128-cbc\" || algorithm === \"aes-256-cbc\");\n return algorithm;\n}\n\nexport function encryptBufferWithDerivedKeys(buffer: Buffer, derivedKeys: DerivedKeys): Buffer {\n const algorithm = derivedKeys_algorithm(derivedKeys);\n const key = derivedKeys.encryptingKey;\n const initVector = derivedKeys.initializationVector;\n const cipher = createCipheriv(algorithm, key, initVector);\n\n cipher.setAutoPadding(false);\n const encrypted_chunks: Buffer[] = [];\n encrypted_chunks.push(cipher.update(buffer));\n encrypted_chunks.push(cipher.final());\n return Buffer.concat(encrypted_chunks);\n}\n\nexport function decryptBufferWithDerivedKeys(buffer: Buffer, derivedKeys: DerivedKeys): Buffer {\n const algorithm = derivedKeys_algorithm(derivedKeys);\n const key = derivedKeys.encryptingKey;\n const initVector = derivedKeys.initializationVector;\n const cipher = createDecipheriv(algorithm, key, initVector);\n\n cipher.setAutoPadding(false);\n\n const decrypted_chunks: Buffer[] = [];\n decrypted_chunks.push(cipher.update(buffer));\n decrypted_chunks.push(cipher.final());\n\n return Buffer.concat(decrypted_chunks);\n}\n\n/**\n * @method makeMessageChunkSignatureWithDerivedKeys\n * @param message\n * @param derivedKeys\n * @return\n */\nexport function makeMessageChunkSignatureWithDerivedKeys(message: Buffer, derivedKeys: DerivedKeys): Buffer {\n assert(Buffer.isBuffer(message));\n assert(Buffer.isBuffer(derivedKeys.signingKey));\n assert(typeof derivedKeys.sha1or256 === \"string\");\n assert(derivedKeys.sha1or256 === \"SHA1\" || derivedKeys.sha1or256 === \"SHA256\");\n const signature = createHmac(derivedKeys.sha1or256, derivedKeys.signingKey).update(message).digest();\n assert(signature.length === derivedKeys.signatureLength);\n return signature;\n}\n\n/**\n * @method verifyChunkSignatureWithDerivedKeys\n * @param chunk\n * @param derivedKeys\n * @return\n */\nexport function verifyChunkSignatureWithDerivedKeys(chunk: Buffer, derivedKeys: DerivedKeys): boolean {\n const message = chunk.subarray(0, chunk.length - derivedKeys.signatureLength);\n const expectedSignature = chunk.subarray(chunk.length - derivedKeys.signatureLength);\n const computedSignature = makeMessageChunkSignatureWithDerivedKeys(message, derivedKeys);\n return computedSignature.toString(\"hex\") === expectedSignature.toString(\"hex\");\n}\n","import type { PrivateKey } from \"./common.js\";\nexport function makePrivateKeyFromPem(privateKeyInPem: string): PrivateKey {\n return { hidden: privateKeyInPem };\n}\n","import type { PrivateKey } from \"./common.js\";\nexport function makePrivateKeyThumbPrint(_privateKey: PrivateKey): Buffer {\n // // .export({ format: \"der\", type: \"pkcs1\" });\n // if (typeof privateKey === \"string\") {\n //\n // } else {\n // return makeSHA1Thumbprint(privateKey.hidden);\n // }\n // to do\n return Buffer.alloc(0);\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\nimport type { Certificate, CertificatePEM, PrivateKey } from \"./common.js\";\nimport { exploreCertificate } from \"./crypto_explore_certificate.js\";\nimport { privateDecrypt_long, publicEncrypt_long, toPem } from \"./crypto_utils.js\";\nimport { explorePrivateKey } from \"./explore_private_key.js\";\n\nexport function publicKeyAndPrivateKeyMatches(certificate: Certificate, privateKey: PrivateKey): boolean {\n const i = exploreCertificate(certificate);\n const j = explorePrivateKey(privateKey);\n\n const modulus1 = i.tbsCertificate.subjectPublicKeyInfo.subjectPublicKey.modulus;\n const modulus2 = j.modulus;\n\n if (modulus1.length !== modulus2.length) {\n return false;\n }\n return modulus1.toString(\"hex\") === modulus2.toString(\"hex\");\n}\n\n/**\n * check that the given certificate matches the given private key\n * @param certificate\n * @param privateKey\n */\nfunction certificateMatchesPrivateKeyPEM(certificate: CertificatePEM, privateKey: PrivateKey, blockSize: number): boolean {\n const initialBuffer = Buffer.from(\"Lorem Ipsum\");\n const encryptedBuffer = publicEncrypt_long(initialBuffer, certificate, blockSize);\n const decryptedBuffer = privateDecrypt_long(encryptedBuffer, privateKey, blockSize);\n const finalString = decryptedBuffer.toString(\"utf-8\");\n return initialBuffer.toString(\"utf-8\") === finalString;\n}\n\nexport function certificateMatchesPrivateKey(certificate: Certificate, privateKey: PrivateKey): boolean {\n const e = explorePrivateKey(privateKey);\n const blockSize = e.modulus.length;\n const certificatePEM = toPem(certificate, \"CERTIFICATE\");\n return certificateMatchesPrivateKeyPEM(certificatePEM, privateKey, blockSize);\n}\n","// ---------------------------------------------------------------------------------------------------------------------\n// node-opcua-crypto\n// ---------------------------------------------------------------------------------------------------------------------\n// Copyright (c) 2014-2022 - Etienne Rossignon - etienne.rossignon (at) gadz.org\n// Copyright (c) 2022-2026 - Sterfive.com\n// ---------------------------------------------------------------------------------------------------------------------\n//\n// This project is licensed under the terms of the MIT license.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the\n// Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Browser-native exports — these work in the browser without any Node.js crypto shim.\n// They use ASN1 parsing, @peculiar/x509, and pure JS only.\n// ---------------------------------------------------------------------------------------------------------------------\n\n//xx export * from \"./asn1.js\";\nexport * from \"./common.js\";\nexport * from \"./crl_utils.js\";\nexport * from \"./crypto_explore_certificate.js\";\nexport type { DirectoryName } from \"./directory_name.js\";\nexport * from \"./explore_asn1.js\";\nexport * from \"./explore_certificate.js\";\nexport * from \"./explore_certificate.js\";\nexport * from \"./explore_certificate_revocation_list.js\";\nexport * from \"./explore_certificate_signing_request.js\";\nexport * from \"./explore_private_key.js\";\nexport * from \"./identify_der.js\";\nexport * from \"./subject.js\";\nexport * from \"./verify_certificate_signature.js\";\nexport * from \"./x509/coerce_private_key.js\";\nexport * from \"./x509/create_certificate_signing_request.js\";\nexport * from \"./x509/create_key_pair.js\";\nexport * from \"./x509/create_self_signed_certificate.js\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Exports that require a node:crypto shim in the browser.\n// On Node.js these use native crypto. In the browser, the bundler must alias\n// node:crypto → a shim providing createPublicKey, createPrivateKey,\n// createSign, createVerify, publicEncrypt, privateDecrypt, etc.\n// (see node-opcua-crypto-web/node-crypto-shim.js)\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./crypto_utils.js\";\nexport * from \"./crypto_utils2.js\";\nexport * from \"./derived_keys.js\";\nexport * from \"./make_private_key_from_pem.js\";\nexport * from \"./make_private_key_thumbprint.js\";\n/**\n * @module node_opcua_crypto\n */\nexport { certificateMatchesPrivateKey, publicKeyAndPrivateKeyMatches } from \"./public_private_match.js\";\n\nimport { readAlgorithmIdentifier, readSignatureValueBin, readStruct, readTag } from \"./asn1.js\";\nimport { readDirectoryName } from \"./directory_name.js\";\nexport const asn1 = { readDirectoryName, readTag, readStruct, readAlgorithmIdentifier, readSignatureValueBin };\n"]}
|