micro509 0.1.0

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.
Files changed (115) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +220 -0
  3. package/dist/index.d.ts +21 -0
  4. package/dist/index.js +1 -0
  5. package/dist/internal/asn1/asn1.js +2 -0
  6. package/dist/internal/asn1/asn1.js.map +1 -0
  7. package/dist/internal/asn1/der.js +2 -0
  8. package/dist/internal/asn1/der.js.map +1 -0
  9. package/dist/internal/asn1/oids.js +2 -0
  10. package/dist/internal/asn1/oids.js.map +1 -0
  11. package/dist/internal/crypto/algorithm-names.js +2 -0
  12. package/dist/internal/crypto/algorithm-names.js.map +1 -0
  13. package/dist/internal/crypto/ecdsa.js +2 -0
  14. package/dist/internal/crypto/ecdsa.js.map +1 -0
  15. package/dist/internal/crypto/hash.js +2 -0
  16. package/dist/internal/crypto/hash.js.map +1 -0
  17. package/dist/internal/crypto/pbes2.d.ts +23 -0
  18. package/dist/internal/crypto/pbes2.js +2 -0
  19. package/dist/internal/crypto/pbes2.js.map +1 -0
  20. package/dist/internal/crypto/rsa-pss.js +2 -0
  21. package/dist/internal/crypto/rsa-pss.js.map +1 -0
  22. package/dist/internal/crypto/sig-verify.js +2 -0
  23. package/dist/internal/crypto/sig-verify.js.map +1 -0
  24. package/dist/internal/crypto/signing.d.ts +16 -0
  25. package/dist/internal/crypto/signing.js +2 -0
  26. package/dist/internal/crypto/signing.js.map +1 -0
  27. package/dist/internal/crypto/webcrypto.js +2 -0
  28. package/dist/internal/crypto/webcrypto.js.map +1 -0
  29. package/dist/internal/shared/base64.js +2 -0
  30. package/dist/internal/shared/base64.js.map +1 -0
  31. package/dist/internal/shared/dn.js +2 -0
  32. package/dist/internal/shared/dn.js.map +1 -0
  33. package/dist/internal/shared/ip.js +2 -0
  34. package/dist/internal/shared/ip.js.map +1 -0
  35. package/dist/internal/verify/name-constraints-engine.js +2 -0
  36. package/dist/internal/verify/name-constraints-engine.js.map +1 -0
  37. package/dist/internal/verify/policy-engine.js +2 -0
  38. package/dist/internal/verify/policy-engine.js.map +1 -0
  39. package/dist/internal/verify/verify-path.js +2 -0
  40. package/dist/internal/verify/verify-path.js.map +1 -0
  41. package/dist/internal/x509/extension-bits.d.ts +18 -0
  42. package/dist/internal/x509/extension-bits.js +2 -0
  43. package/dist/internal/x509/extension-bits.js.map +1 -0
  44. package/dist/internal/x509/extension-registry.js +2 -0
  45. package/dist/internal/x509/extension-registry.js.map +1 -0
  46. package/dist/internal/x509/name-fields.js +2 -0
  47. package/dist/internal/x509/name-fields.js.map +1 -0
  48. package/dist/keys/keys.d.ts +431 -0
  49. package/dist/keys/keys.js +5 -0
  50. package/dist/keys/keys.js.map +1 -0
  51. package/dist/keys.d.ts +3 -0
  52. package/dist/keys.js +1 -0
  53. package/dist/pem/pem.d.ts +56 -0
  54. package/dist/pem/pem.js +6 -0
  55. package/dist/pem/pem.js.map +1 -0
  56. package/dist/pem.d.ts +2 -0
  57. package/dist/pem.js +1 -0
  58. package/dist/pkcs/pfx.d.ts +177 -0
  59. package/dist/pkcs/pfx.js +2 -0
  60. package/dist/pkcs/pfx.js.map +1 -0
  61. package/dist/pkcs/pkcs12-mac.d.ts +41 -0
  62. package/dist/pkcs/pkcs12-mac.js +2 -0
  63. package/dist/pkcs/pkcs12-mac.js.map +1 -0
  64. package/dist/pkcs/pkcs7.d.ts +131 -0
  65. package/dist/pkcs/pkcs7.js +2 -0
  66. package/dist/pkcs/pkcs7.js.map +1 -0
  67. package/dist/pkcs.d.ts +5 -0
  68. package/dist/pkcs.js +1 -0
  69. package/dist/result/result.d.ts +68 -0
  70. package/dist/result/result.js +2 -0
  71. package/dist/result/result.js.map +1 -0
  72. package/dist/result.d.ts +2 -0
  73. package/dist/result.js +1 -0
  74. package/dist/revocation/chain.d.ts +180 -0
  75. package/dist/revocation/chain.js +2 -0
  76. package/dist/revocation/chain.js.map +1 -0
  77. package/dist/revocation/crl.d.ts +316 -0
  78. package/dist/revocation/crl.js +2 -0
  79. package/dist/revocation/crl.js.map +1 -0
  80. package/dist/revocation/ocsp.d.ts +332 -0
  81. package/dist/revocation/ocsp.js +2 -0
  82. package/dist/revocation/ocsp.js.map +1 -0
  83. package/dist/revocation/revocation.d.ts +168 -0
  84. package/dist/revocation/revocation.js +2 -0
  85. package/dist/revocation/revocation.js.map +1 -0
  86. package/dist/revocation.d.ts +5 -0
  87. package/dist/revocation.js +1 -0
  88. package/dist/verify/identity.d.ts +129 -0
  89. package/dist/verify/identity.js +2 -0
  90. package/dist/verify/identity.js.map +1 -0
  91. package/dist/verify/name-constraints.d.ts +18 -0
  92. package/dist/verify/policy.d.ts +39 -0
  93. package/dist/verify/verify.d.ts +404 -0
  94. package/dist/verify/verify.js +2 -0
  95. package/dist/verify/verify.js.map +1 -0
  96. package/dist/verify.d.ts +5 -0
  97. package/dist/verify.js +1 -0
  98. package/dist/x509/certificate.d.ts +191 -0
  99. package/dist/x509/certificate.js +2 -0
  100. package/dist/x509/certificate.js.map +1 -0
  101. package/dist/x509/csr.d.ts +55 -0
  102. package/dist/x509/csr.js +2 -0
  103. package/dist/x509/csr.js.map +1 -0
  104. package/dist/x509/extensions.d.ts +550 -0
  105. package/dist/x509/extensions.js +2 -0
  106. package/dist/x509/extensions.js.map +1 -0
  107. package/dist/x509/name.d.ts +140 -0
  108. package/dist/x509/name.js +2 -0
  109. package/dist/x509/name.js.map +1 -0
  110. package/dist/x509/parse.d.ts +377 -0
  111. package/dist/x509/parse.js +2 -0
  112. package/dist/x509/parse.js.map +1 -0
  113. package/dist/x509.d.ts +8 -0
  114. package/dist/x509.js +1 -0
  115. package/package.json +153 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+ ===========
3
+
4
+ Copyright (c) 2026 Kaj Kowalski
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,220 @@
1
+ <picture>
2
+ <source media="(prefers-color-scheme: dark)" srcset="https://github.com/kjanat/ts-x509/raw/c5720af044fd9cc8f3c33e3bb91f79e6d5567454/site/assets/icon-light.svg">
3
+ <source media="(prefers-color-scheme: light)" srcset="https://github.com/kjanat/ts-x509/raw/c5720af044fd9cc8f3c33e3bb91f79e6d5567454/site/assets/icon.svg">
4
+ <img alt="" src="https://github.com/kjanat/ts-x509/raw/c5720af044fd9cc8f3c33e3bb91f79e6d5567454/site/assets/icon.svg" width="64" height="64" align="left">
5
+ </picture>
6
+
7
+ # micro509
8
+
9
+ [![NPM](https://img.shields.io/npm/v/micro509?logo=npm&labelColor=CB3837&color=black)][npm]
10
+ [![JSR](https://img.shields.io/jsr/v/@kjanat/micro509?logoColor=083344&logo=jsr&logoSize=auto&label=&labelColor=f7df1e&color=black)][jsr]
11
+
12
+ [npm]: https://npm.im/micro509
13
+ [jsr]: https://jsr.io/@kjanat/micro509
14
+
15
+ A zero-dependency TypeScript PKI toolkit for certificates, verification, revocation, and PKCS workflows.
16
+
17
+ Zero dependencies. Tree-shakeable subpath entrypoints. Pure WebCrypto. Runs everywhere: Node, Bun, Deno, browsers, Cloudflare Workers.
18
+
19
+ > **Prerelease** — API may change before 1.0.
20
+
21
+ ## Install
22
+
23
+ ```bash
24
+ npm install micro509
25
+ ```
26
+
27
+ ## Why micro509
28
+
29
+ JavaScript PKI libraries usually force a bad tradeoff:
30
+ heavyweight standards toolkits, legacy crypto kitchen sinks,
31
+ or narrow parsing utilities.
32
+
33
+ micro509 is the practical middle: a modern, WebCrypto-native
34
+ PKI toolkit with zero runtime dependencies and typed APIs for
35
+ the workflows most applications actually need.
36
+
37
+ It gives you one library for certificate and CSR creation,
38
+ chain verification, service-identity matching, CRLs, OCSP,
39
+ PKCS#7 SignedData, PFX/PKCS#12, PEM handling, and key
40
+ import/export.
41
+
42
+ And when verification fails, you get typed results your code
43
+ can act on: [21 error codes], the failing certificate index,
44
+ and structured failure details instead of `false`.
45
+
46
+ [21 error codes]: https://micro509.kjanat.com/guide/verification#error-codes
47
+
48
+ ```ts
49
+ if (!result.ok) {
50
+ // result.error.code: 'signature_invalid' | 'certificate_expired' | 'name_constraints_violated' | ...
51
+ // result.error.index: which certificate in the chain failed
52
+ // result.error.details: { expected, actual } for identity mismatches
53
+ }
54
+ ```
55
+
56
+ Beyond verification, micro509 covers PKI surface that's hard to find
57
+ in a single zero-dependency JS package:
58
+
59
+ - **OCSP** — build requests, parse and validate responses, verify responder authorization
60
+ - **PFX / PKCS#12** — create and parse password-protected key+cert bundles
61
+ - **PKCS#7 / CMS** — parse SignedData, verify signer signatures, extract cert bags
62
+ - **CRLs** — create, parse, verify, and check revocation status
63
+ - **Encrypted keys** — PBES2 PKCS#8, legacy OpenSSL encrypted PEM, PKCS#1, SEC1
64
+ - **Key import/export** — PKCS#8, SPKI, JWK, PKCS#1, SEC1 with generation for RSA, ECDSA, Ed25519
65
+ - **Service identity** — wildcard DNS, IPv6 normalization, URI-ID, SRV-ID, explicit CN opt-in
66
+
67
+ Narrow defaults, explicit escape hatches — dangerous operations like CN
68
+ fallback or self-signed leaf acceptance require opt-in. All with no `any`,
69
+ no type assertions, no non-null assertions, and no runtime DI frameworks
70
+ that break edge runtimes.
71
+
72
+ ## Quick start
73
+
74
+ Create a self-signed certificate:
75
+
76
+ ```ts
77
+ import { createSelfSignedCertificate } from 'micro509';
78
+
79
+ const { certificate, keyPair } = await createSelfSignedCertificate({
80
+ subject: {
81
+ commonName: 'example.com',
82
+ organization: 'Acme',
83
+ country: 'US',
84
+ },
85
+ validity: { days: 30 },
86
+ extensions: {
87
+ keyUsage: ['digitalSignature', 'keyEncipherment'],
88
+ subjectAltNames: [
89
+ { type: 'dns', value: 'example.com' },
90
+ { type: 'dns', value: 'www.example.com' },
91
+ ],
92
+ },
93
+ });
94
+
95
+ console.log(certificate.pem);
96
+ console.log(await keyPair.exportPkcs8Pem());
97
+ ```
98
+
99
+ Create a CSR:
100
+
101
+ ```ts
102
+ import { createCertificateSigningRequest, generateKeyPair } from 'micro509';
103
+
104
+ const keyPair = await generateKeyPair({ kind: 'ed25519' });
105
+ const csr = await createCertificateSigningRequest({
106
+ subject: { commonName: 'csr.example' },
107
+ publicKey: keyPair.publicKey,
108
+ signerPrivateKey: keyPair.privateKey,
109
+ extensions: {
110
+ subjectAltNames: [{ type: 'dns', value: 'csr.example' }],
111
+ },
112
+ });
113
+
114
+ console.log(csr.pem);
115
+ ```
116
+
117
+ Parse a certificate:
118
+
119
+ ```ts
120
+ import { parseCertificatePem } from 'micro509';
121
+
122
+ // Using certificate from previous example
123
+ const parsed = parseCertificatePem(certificate.pem);
124
+ console.log(parsed.subject.values.commonName);
125
+ console.log(parsed.extendedKeyUsage);
126
+ console.log(parsed.authorityInfoAccess);
127
+ ```
128
+
129
+ Verify a chain:
130
+
131
+ ```ts
132
+ import { verifyCertificateChain } from 'micro509';
133
+
134
+ // Assuming you have a self-signed certificate used as both leaf and root; no intermediates
135
+ const result = await verifyCertificateChain({
136
+ leaf: certificate.pem,
137
+ intermediates: [],
138
+ roots: [certificate.pem], // Using self-signed cert as root for demo
139
+ purpose: 'serverAuth',
140
+ serviceIdentity: { type: 'dns', value: 'example.com' },
141
+ });
142
+
143
+ if (result.ok) {
144
+ console.log(result.value.chain.length);
145
+ } else {
146
+ console.log(result.error.code);
147
+ }
148
+ ```
149
+
150
+ ## Runtime support
151
+
152
+ | Runtime | Status | Notes |
153
+ | ------- | --------- | -------------------------------------------------- |
154
+ | Node | supported | modern Node with WebCrypto globals (tested on 24+) |
155
+ | Bun | supported | Bun 1.3+ |
156
+ | Deno | supported | requires WebCrypto and web text/base64 globals |
157
+ | Browser | supported | modern browsers only |
158
+ | Worker | supported | same WebCrypto and text/base64 globals required |
159
+
160
+ The core stays ESM-only and side-effect-free.
161
+
162
+ ## Algorithm support
163
+
164
+ | Area | Shipped support |
165
+ | ------------------------------ | -------------------------------------------------------------------- |
166
+ | Certificate and CSR signatures | RSA PKCS#1 v1.5, RSA-PSS, ECDSA `P-256` / `P-384` / `P-521`, Ed25519 |
167
+ | RSA key APIs | `scheme: 'pkcs1-v1_5'` |
168
+ | ECDSA key APIs | `P-256`, `P-384`, `P-521` |
169
+ | Encrypted PKCS#8 and PFX | PBES2 with AES-CBC plus PBKDF2 HMAC-SHA1/HMAC-SHA256 |
170
+ | Encrypted traditional PEM | AES-128-CBC, AES-192-CBC, AES-256-CBC for RSA and EC private keys |
171
+
172
+ `micro509` focuses on algorithms that are broadly interoperable in modern X.509 and WebCrypto-backed runtimes.\
173
+ It intentionally excludes niche, blockchain-specific, or key-agreement-only primitives from the core API unless they are needed for a PKI workflow the library explicitly supports.
174
+
175
+ ## Standards status
176
+
177
+ | Area | Status |
178
+ | -------------------------- | ------- |
179
+ | RFC 5280 path validation | partial |
180
+ | RFC 6960 OCSP | partial |
181
+ | RFC 6125 service identity | partial |
182
+ | RFC 9618 policy validation | partial |
183
+
184
+ See [`docs/PKIX-SCOPE.md`](./docs/PKIX-SCOPE.md) for the detailed scope boundary
185
+ and the [API reference](https://micro509.kjanat.com/api/) for the public module surface.
186
+
187
+ ## Imports
188
+
189
+ Use the root package for most applications:
190
+
191
+ ```ts
192
+ import { createCertificate, parseCertificatePem, verifyCertificateChain } from 'micro509';
193
+ ```
194
+
195
+ Use domain entrypoints when you want exhaustive advanced types or a narrower
196
+ workflow surface:
197
+
198
+ ```ts
199
+ import { parseCertificatePem } from 'micro509/x509';
200
+ import { verifyCertificateChain, matchServiceIdentity } from 'micro509/verify';
201
+ import { createOcspRequest, checkCertificateRevocation } from 'micro509/revocation';
202
+ import { createPfx } from 'micro509/pkcs';
203
+ import { generateKeyPair } from 'micro509/keys';
204
+ import { pemDecode, pemEncode } from 'micro509/pem';
205
+ import type { Micro509Error } from 'micro509/result';
206
+ ```
207
+
208
+ The full stable subpath list lives in the [API reference](https://micro509.kjanat.com/api/).
209
+
210
+ ## More docs
211
+
212
+ - API reference: [micro509.kjanat.com/api](https://micro509.kjanat.com/api/)
213
+ - Standards scope: [`docs/PKIX-SCOPE.md`](./docs/PKIX-SCOPE.md)
214
+ - PKITS harness: [`test/pkits.test.ts`](./test/pkits.test.ts)
215
+ - Differential harness: [`test/differential.test.ts`](./test/differential.test.ts)
216
+ - Contributing: [`CONTRIBUTING.md`](./CONTRIBUTING.md)
217
+
218
+ ## License
219
+
220
+ [MIT](./LICENSE)
@@ -0,0 +1,21 @@
1
+ import { Pbes2EncryptionOptions, Pbes2EncryptionScheme, Pbes2Prf } from "./internal/crypto/pbes2.js";
2
+ import { EcKeyAlgorithmInput, EcNamedCurve, Ed25519KeyAlgorithmInput, EncryptedPkcs8Options, ImportEcPublicKeyInput, ImportEd25519PublicKeyInput, ImportRsaPublicKeyInput, KeyAlgorithmInput, KeyPairMaterial, LegacyPemEncryptionOptions, PrivateKeyImportInput, PublicKeyImportInput, RsaHash, RsaKeyAlgorithmInput, RsaScheme, exportBinaryBase64, exportEncryptedPkcs1Pem, exportEncryptedPkcs8Der, exportEncryptedPkcs8Pem, exportEncryptedSec1Pem, exportPkcs1Der, exportPkcs1Pem, exportPkcs8Der, exportPkcs8Pem, exportPrivateJwk, exportPublicJwk, exportSec1Der, exportSec1Pem, exportSpkiDer, exportSpkiPem, generateKeyPair, importEncryptedPkcs1Pem, importEncryptedPkcs8Der, importEncryptedPkcs8Pem, importEncryptedSec1Pem, importPkcs1Der, importPkcs1Pem, importPkcs8Base64, importPkcs8Der, importPkcs8Pem, importPrivateJwk, importPublicJwk, importSec1Der, importSec1Pem, importSpkiBase64, importSpkiDer, importSpkiPem } from "./keys/keys.js";
3
+ import { CategorizedPemBlocks, PemBlock, categorizePemBlocks, pemDecode, pemEncode, splitPemBlocks } from "./pem/pem.js";
4
+ import { ErrorResult, IndexedErrorResult, IndexedMicro509Error, Micro509Error, Result } from "./result/result.js";
5
+ import { NameAttribute, NameFieldKey, NameInput, NameObject, RelativeDistinguishedNameInput } from "./x509/name.js";
6
+ import { AuthorityInformationAccess, BasicConstraints, CertificateExtensionsInput, CertificatePolicies, DistributionPoint, DistributionPointName, ExtendedKeyUsage, GeneralName, GeneralSubtree, InhibitAnyPolicy, IssuingDistributionPoint, KeyUsage, NameConstraintForm, NameConstraints, ParsedNameConstraintForm, PolicyConstraints, PolicyInformation, PolicyMapping, PolicyMappings, PolicyQualifierInfo, SubjectAltName } from "./x509/extensions.js";
7
+ import { ParsedBitFlags } from "./internal/x509/extension-bits.js";
8
+ import { DecodedExtensionMap, DecodedExtensionValue, ExtensionDecoder, ExtensionDecoderMap, ParseOptions, ParsedCertificate, ParsedCertificateSigningRequest, ParsedDistributionPoint, ParsedDistributionPointName, ParsedExtension, ParsedIssuingDistributionPoint, ParsedName, ParsedNameAttribute, ParsedRelativeDistinguishedName, decodeExtension, decodeExtensionMap, decodeExtensions, defineExtensionDecoder, defineExtensionDecoderMap, findExtension, parseCertificateChainPem, parseCertificateDer, parseCertificatePem, parseCertificateSigningRequestDer, parseCertificateSigningRequestPem } from "./x509/parse.js";
9
+ import { CreatePfxInput, ParsePfxErrorCode, ParsePfxFailure, ParsePfxOptions, ParsePfxResult, ParsedPfx, ParsedPfxAttribute, ParsedPfxBag, ParsedPfxBagAttributes, PfxBagAttributesInput, PfxCertificateBagInput, PfxCertificateSource, PfxEncryptionOptions, PfxMaterial, PfxPrivateKeyBagInput, PfxPrivateKeySource, createPfx, parsePfxDer, parsePfxPem } from "./pkcs/pfx.js";
10
+ import { ParsePkcs7CertBagResult, ParsePkcs7ErrorCode, ParsePkcs7Failure, ParsePkcs7SignedDataResult, ParsedPkcs7SignedData, ParsedPkcs7SignerInfo, Pkcs7CertBag, Pkcs7CertificateSource, VerifyPkcs7SignedDataFailure, VerifyPkcs7SignedDataResult, createPkcs7CertBagDer, createPkcs7CertBagPem, parsePkcs7CertBagDer, parsePkcs7CertBagPem, parsePkcs7SignedDataDer, parsePkcs7SignedDataPem, verifyPkcs7SignedData } from "./pkcs/pkcs7.js";
11
+ import { CertificateRevocationListMaterial, CheckCertificateRevocationAgainstCrlInput, CheckCertificateRevocationAgainstCrlResult, CreateCertificateRevocationListInput, CrlCertificateSource, CrlSource, ParsedCertificateRevocationList, ParsedRevokedCertificate, RevocationReason, RevokedCertificateInput, ValidateCertificateRevocationListFailure, ValidateCertificateRevocationListInput, ValidateCertificateRevocationListResult, VerifyCertificateRevocationListFailure, VerifyCertificateRevocationListResult, checkCertificateRevocationAgainstCrl, createCertificateRevocationList, isCertificateRevoked, parseCertificateRevocationListDer, parseCertificateRevocationListPem, validateCertificateRevocationList, verifyCertificateRevocationList } from "./revocation/crl.js";
12
+ import { CreateOcspRequestInput, CreateOcspRequestItemInput, CreateOcspResponseInput, CreateOcspSingleResponseInput, OcspCertStatus, OcspCertificateSource, OcspRequestMaterial, OcspRequestSource, OcspResponseMaterial, ParsedOcspCertId, ParsedOcspRequest, ParsedOcspResponderId, ParsedOcspResponse, ParsedOcspSingleResponse, ValidateOcspResponseFailure, ValidateOcspResponseInput, ValidateOcspResponseResult, VerifyOcspResponseFailure, VerifyOcspResponseResult, createOcspRequest, createOcspResponse, parseOcspRequestDer, parseOcspRequestPem, parseOcspResponseDer, parseOcspResponsePem, validateOcspResponse, verifyOcspResponse } from "./revocation/ocsp.js";
13
+ import { CheckCertificateRevocationInput, CheckCertificateRevocationResult, ConfiguredOcspResponder, OcspResponderCandidate, OcspResponderSource, ResolveOcspResponderCandidatesInput, RevocationCertificateSource, RevocationCrlEvidenceInput, RevocationEvidenceInput, RevocationEvidenceKind, RevocationOcspEvidenceInput, RevocationStatus, checkCertificateRevocation, getCertificateOcspResponderUris, resolveOcspResponderCandidates } from "./revocation/revocation.js";
14
+ import { CertificateRevocationStatus, CheckChainRevocationInput, CheckChainRevocationResult, CheckChainRevocationValue, RevocationExecutionError, RevocationIndeterminateReason, RevocationPolicy, RevocationSource, checkChainRevocation } from "./revocation/chain.js";
15
+ import { DnsServiceIdentityInput, IpServiceIdentityInput, MatchServiceIdentityErrorCode, MatchServiceIdentityFailure, MatchServiceIdentityInput, MatchServiceIdentityResult, MatchServiceIdentitySuccess, ServiceIdentityInput, ServiceIdentityType, SrvServiceIdentityInput, UriServiceIdentityInput, VerifyServiceIdentityInput, matchCertificateServiceIdentity, matchServiceIdentity } from "./verify/identity.js";
16
+ import { InitialNameConstraintsInput } from "./verify/name-constraints.js";
17
+ import { PolicyValidationInput } from "./verify/policy.js";
18
+ import { BuildCandidatePathInput, BuildCandidatePathResult, CandidatePath, CertificateSource, ChainRevocationInput, CsrSource, EkuCheckFailure, EkuCheckPurpose, EkuCheckResult, TrustAnchor, ValidateCandidatePathInput, ValidateCandidatePathResult, ValidateCandidatePathSuccess, ValidateForCaInput, ValidateForCodeSigningInput, ValidateForTlsClientInput, ValidateForTlsServerInput, VerifiedCertificateChain, VerifyCertificateChainInput, VerifyChainFailure, VerifyChainResult, VerifyErrorCode, VerifyFailureDetails, VerifyPurpose, VerifyRequestFailure, VerifyRequestResult, buildCandidatePath, checkExtendedKeyUsage, trustAnchorFromCertificate, validateCandidatePath, validateForCa, validateForCodeSigning, validateForTlsClient, validateForTlsServer, verifyCertificateChain, verifyCertificateSigningRequest } from "./verify/verify.js";
19
+ import { CertificateMaterial, CreateCertificateInput, CreateSelfSignedCertificateInput, SelfSignedCertificateResult, ValidityInput, createCertificate, createSelfSignedCertificate } from "./x509/certificate.js";
20
+ import { CreateCsrInput, CsrMaterial, createCertificateSigningRequest } from "./x509/csr.js";
21
+ export { type AuthorityInformationAccess, type BasicConstraints, type BuildCandidatePathInput, type BuildCandidatePathResult, type CandidatePath, type CategorizedPemBlocks, type CertificateExtensionsInput, type CertificateMaterial, type CertificatePolicies, type CertificateRevocationListMaterial, type CertificateRevocationStatus, type CertificateSource, type ChainRevocationInput, type CheckCertificateRevocationAgainstCrlInput, type CheckCertificateRevocationAgainstCrlResult, type CheckCertificateRevocationInput, type CheckCertificateRevocationResult, type CheckChainRevocationInput, type CheckChainRevocationResult, type CheckChainRevocationValue, type ConfiguredOcspResponder, type CreateCertificateInput, type CreateCertificateRevocationListInput, type CreateCsrInput, type CreateOcspRequestInput, type CreateOcspRequestItemInput, type CreateOcspResponseInput, type CreateOcspSingleResponseInput, type CreatePfxInput, type CreateSelfSignedCertificateInput, type CrlCertificateSource, type CrlSource, type CsrMaterial, type CsrSource, type DecodedExtensionMap, type DecodedExtensionValue, type DistributionPoint, type DistributionPointName, type DnsServiceIdentityInput, type EcKeyAlgorithmInput, type EcNamedCurve, type Ed25519KeyAlgorithmInput, type EkuCheckFailure, type EkuCheckPurpose, type EkuCheckResult, type EncryptedPkcs8Options, type ErrorResult, type ExtendedKeyUsage, type ExtensionDecoder, type ExtensionDecoderMap, type GeneralName, type GeneralSubtree, type ImportEcPublicKeyInput, type ImportEd25519PublicKeyInput, type ImportRsaPublicKeyInput, type IndexedErrorResult, type IndexedMicro509Error, type InhibitAnyPolicy, type InitialNameConstraintsInput, type IpServiceIdentityInput, type IssuingDistributionPoint, type KeyAlgorithmInput, type KeyPairMaterial, type KeyUsage, type LegacyPemEncryptionOptions, type MatchServiceIdentityErrorCode, type MatchServiceIdentityFailure, type MatchServiceIdentityInput, type MatchServiceIdentityResult, type MatchServiceIdentitySuccess, type Micro509Error, type NameAttribute, type NameConstraintForm, type NameConstraints, type NameFieldKey, type NameInput, type NameObject, type OcspCertStatus, type OcspCertificateSource, type OcspRequestMaterial, type OcspRequestSource, type OcspResponderCandidate, type OcspResponderSource, type OcspResponseMaterial, type ParseOptions, type ParsePfxErrorCode, type ParsePfxFailure, type ParsePfxOptions, type ParsePfxResult, type ParsePkcs7CertBagResult, type ParsePkcs7ErrorCode, type ParsePkcs7Failure, type ParsePkcs7SignedDataResult, type ParsedBitFlags, type ParsedCertificate, type ParsedCertificateRevocationList, type ParsedCertificateSigningRequest, type ParsedDistributionPoint, type ParsedDistributionPointName, type ParsedExtension, type ParsedIssuingDistributionPoint, type ParsedName, type ParsedNameAttribute, type ParsedNameConstraintForm, type ParsedOcspCertId, type ParsedOcspRequest, type ParsedOcspResponderId, type ParsedOcspResponse, type ParsedOcspSingleResponse, type ParsedPfx, type ParsedPfxAttribute, type ParsedPfxBag, type ParsedPfxBagAttributes, type ParsedPkcs7SignedData, type ParsedPkcs7SignerInfo, type ParsedRelativeDistinguishedName, type ParsedRevokedCertificate, type Pbes2EncryptionOptions, type Pbes2EncryptionScheme, type Pbes2Prf, type PemBlock, type PfxBagAttributesInput, type PfxCertificateBagInput, type PfxCertificateSource, type PfxEncryptionOptions, type PfxMaterial, type PfxPrivateKeyBagInput, type PfxPrivateKeySource, type Pkcs7CertBag, type Pkcs7CertificateSource, type PolicyConstraints, type PolicyInformation, type PolicyMapping, type PolicyMappings, type PolicyQualifierInfo, type PolicyValidationInput, type PrivateKeyImportInput, type PublicKeyImportInput, type RelativeDistinguishedNameInput, type ResolveOcspResponderCandidatesInput, type Result, type RevocationCertificateSource, type RevocationCrlEvidenceInput, type RevocationEvidenceInput, type RevocationEvidenceKind, type RevocationExecutionError, type RevocationIndeterminateReason, type RevocationOcspEvidenceInput, type RevocationPolicy, type RevocationReason, type RevocationSource, type RevocationStatus, type RevokedCertificateInput, type RsaHash, type RsaKeyAlgorithmInput, type RsaScheme, type SelfSignedCertificateResult, type ServiceIdentityInput, type ServiceIdentityType, type SrvServiceIdentityInput, type SubjectAltName, type TrustAnchor, type UriServiceIdentityInput, type ValidateCandidatePathInput, type ValidateCandidatePathResult, type ValidateCandidatePathSuccess, type ValidateCertificateRevocationListFailure, type ValidateCertificateRevocationListInput, type ValidateCertificateRevocationListResult, type ValidateForCaInput, type ValidateForCodeSigningInput, type ValidateForTlsClientInput, type ValidateForTlsServerInput, type ValidateOcspResponseFailure, type ValidateOcspResponseInput, type ValidateOcspResponseResult, type ValidityInput, type VerifiedCertificateChain, type VerifyCertificateChainInput, type VerifyCertificateRevocationListFailure, type VerifyCertificateRevocationListResult, type VerifyChainFailure, type VerifyChainResult, type VerifyErrorCode, type VerifyFailureDetails, type VerifyOcspResponseFailure, type VerifyOcspResponseResult, type VerifyPkcs7SignedDataFailure, type VerifyPkcs7SignedDataResult, type VerifyPurpose, type VerifyRequestFailure, type VerifyRequestResult, type VerifyServiceIdentityInput, buildCandidatePath, categorizePemBlocks, checkCertificateRevocation, checkCertificateRevocationAgainstCrl, checkChainRevocation, checkExtendedKeyUsage, createCertificate, createCertificateRevocationList, createCertificateSigningRequest, createOcspRequest, createOcspResponse, createPfx, createPkcs7CertBagDer, createPkcs7CertBagPem, createSelfSignedCertificate, decodeExtension, decodeExtensionMap, decodeExtensions, defineExtensionDecoder, defineExtensionDecoderMap, exportBinaryBase64, exportEncryptedPkcs1Pem, exportEncryptedPkcs8Der, exportEncryptedPkcs8Pem, exportEncryptedSec1Pem, exportPkcs1Der, exportPkcs1Pem, exportPkcs8Der, exportPkcs8Pem, exportPrivateJwk, exportPublicJwk, exportSec1Der, exportSec1Pem, exportSpkiDer, exportSpkiPem, findExtension, generateKeyPair, getCertificateOcspResponderUris, importEncryptedPkcs1Pem, importEncryptedPkcs8Der, importEncryptedPkcs8Pem, importEncryptedSec1Pem, importPkcs1Der, importPkcs1Pem, importPkcs8Base64, importPkcs8Der, importPkcs8Pem, importPrivateJwk, importPublicJwk, importSec1Der, importSec1Pem, importSpkiBase64, importSpkiDer, importSpkiPem, isCertificateRevoked, matchCertificateServiceIdentity, matchServiceIdentity, parseCertificateChainPem, parseCertificateDer, parseCertificatePem, parseCertificateRevocationListDer, parseCertificateRevocationListPem, parseCertificateSigningRequestDer, parseCertificateSigningRequestPem, parseOcspRequestDer, parseOcspRequestPem, parseOcspResponseDer, parseOcspResponsePem, parsePfxDer, parsePfxPem, parsePkcs7CertBagDer, parsePkcs7CertBagPem, parsePkcs7SignedDataDer, parsePkcs7SignedDataPem, pemDecode, pemEncode, resolveOcspResponderCandidates, splitPemBlocks, trustAnchorFromCertificate, validateCandidatePath, validateCertificateRevocationList, validateForCa, validateForCodeSigning, validateForTlsClient, validateForTlsServer, validateOcspResponse, verifyCertificateChain, verifyCertificateRevocationList, verifyCertificateSigningRequest, verifyOcspResponse, verifyPkcs7SignedData };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{categorizePemBlocks as e,pemDecode as t,pemEncode as n,splitPemBlocks as r}from"./pem/pem.js";import{exportBinaryBase64 as i,exportEncryptedPkcs1Pem as a,exportEncryptedPkcs8Der as o,exportEncryptedPkcs8Pem as s,exportEncryptedSec1Pem as c,exportPkcs1Der as l,exportPkcs1Pem as u,exportPkcs8Der as d,exportPkcs8Pem as f,exportPrivateJwk as p,exportPublicJwk as m,exportSec1Der as h,exportSec1Pem as g,exportSpkiDer as _,exportSpkiPem as v,generateKeyPair as y,importEncryptedPkcs1Pem as b,importEncryptedPkcs8Der as x,importEncryptedPkcs8Pem as S,importEncryptedSec1Pem as C,importPkcs1Der as w,importPkcs1Pem as T,importPkcs8Base64 as E,importPkcs8Der as D,importPkcs8Pem as O,importPrivateJwk as k,importPublicJwk as A,importSec1Der as j,importSec1Pem as M,importSpkiBase64 as N,importSpkiDer as P,importSpkiPem as F}from"./keys/keys.js";import{decodeExtension as I,decodeExtensionMap as L,decodeExtensions as R,defineExtensionDecoder as z,defineExtensionDecoderMap as B,findExtension as V,parseCertificateChainPem as H,parseCertificateDer as U,parseCertificatePem as W,parseCertificateSigningRequestDer as G,parseCertificateSigningRequestPem as K}from"./x509/parse.js";import{createPfx as q,parsePfxDer as J,parsePfxPem as Y}from"./pkcs/pfx.js";import{createPkcs7CertBagDer as X,createPkcs7CertBagPem as Z,parsePkcs7CertBagDer as Q,parsePkcs7CertBagPem as $,parsePkcs7SignedDataDer as ee,parsePkcs7SignedDataPem as te,verifyPkcs7SignedData as ne}from"./pkcs/pkcs7.js";import{checkCertificateRevocationAgainstCrl as re,createCertificateRevocationList as ie,isCertificateRevoked as ae,parseCertificateRevocationListDer as oe,parseCertificateRevocationListPem as se,validateCertificateRevocationList as ce,verifyCertificateRevocationList as le}from"./revocation/crl.js";import{checkChainRevocation as ue}from"./revocation/chain.js";import{matchCertificateServiceIdentity as de,matchServiceIdentity as fe}from"./verify/identity.js";import{buildCandidatePath as pe,checkExtendedKeyUsage as me,trustAnchorFromCertificate as he,validateCandidatePath as ge,validateForCa as _e,validateForCodeSigning as ve,validateForTlsClient as ye,validateForTlsServer as be,verifyCertificateChain as xe,verifyCertificateSigningRequest as Se}from"./verify/verify.js";import{createOcspRequest as Ce,createOcspResponse as we,parseOcspRequestDer as Te,parseOcspRequestPem as Ee,parseOcspResponseDer as De,parseOcspResponsePem as Oe,validateOcspResponse as ke,verifyOcspResponse as Ae}from"./revocation/ocsp.js";import{checkCertificateRevocation as je,getCertificateOcspResponderUris as Me,resolveOcspResponderCandidates as Ne}from"./revocation/revocation.js";import{createCertificate as Pe,createSelfSignedCertificate as Fe}from"./x509/certificate.js";import{createCertificateSigningRequest as Ie}from"./x509/csr.js";export{pe as buildCandidatePath,e as categorizePemBlocks,je as checkCertificateRevocation,re as checkCertificateRevocationAgainstCrl,ue as checkChainRevocation,me as checkExtendedKeyUsage,Pe as createCertificate,ie as createCertificateRevocationList,Ie as createCertificateSigningRequest,Ce as createOcspRequest,we as createOcspResponse,q as createPfx,X as createPkcs7CertBagDer,Z as createPkcs7CertBagPem,Fe as createSelfSignedCertificate,I as decodeExtension,L as decodeExtensionMap,R as decodeExtensions,z as defineExtensionDecoder,B as defineExtensionDecoderMap,i as exportBinaryBase64,a as exportEncryptedPkcs1Pem,o as exportEncryptedPkcs8Der,s as exportEncryptedPkcs8Pem,c as exportEncryptedSec1Pem,l as exportPkcs1Der,u as exportPkcs1Pem,d as exportPkcs8Der,f as exportPkcs8Pem,p as exportPrivateJwk,m as exportPublicJwk,h as exportSec1Der,g as exportSec1Pem,_ as exportSpkiDer,v as exportSpkiPem,V as findExtension,y as generateKeyPair,Me as getCertificateOcspResponderUris,b as importEncryptedPkcs1Pem,x as importEncryptedPkcs8Der,S as importEncryptedPkcs8Pem,C as importEncryptedSec1Pem,w as importPkcs1Der,T as importPkcs1Pem,E as importPkcs8Base64,D as importPkcs8Der,O as importPkcs8Pem,k as importPrivateJwk,A as importPublicJwk,j as importSec1Der,M as importSec1Pem,N as importSpkiBase64,P as importSpkiDer,F as importSpkiPem,ae as isCertificateRevoked,de as matchCertificateServiceIdentity,fe as matchServiceIdentity,H as parseCertificateChainPem,U as parseCertificateDer,W as parseCertificatePem,oe as parseCertificateRevocationListDer,se as parseCertificateRevocationListPem,G as parseCertificateSigningRequestDer,K as parseCertificateSigningRequestPem,Te as parseOcspRequestDer,Ee as parseOcspRequestPem,De as parseOcspResponseDer,Oe as parseOcspResponsePem,J as parsePfxDer,Y as parsePfxPem,Q as parsePkcs7CertBagDer,$ as parsePkcs7CertBagPem,ee as parsePkcs7SignedDataDer,te as parsePkcs7SignedDataPem,t as pemDecode,n as pemEncode,Ne as resolveOcspResponderCandidates,r as splitPemBlocks,he as trustAnchorFromCertificate,ge as validateCandidatePath,ce as validateCertificateRevocationList,_e as validateForCa,ve as validateForCodeSigning,ye as validateForTlsClient,be as validateForTlsServer,ke as validateOcspResponse,xe as verifyCertificateChain,le as verifyCertificateRevocationList,Se as verifyCertificateSigningRequest,Ae as verifyOcspResponse,ne as verifyPkcs7SignedData};
@@ -0,0 +1,2 @@
1
+ import{readElement as e}from"./der.js";const t=new TextDecoder(`utf-8`,{fatal:!0}),n=/^[A-Za-z0-9 '()+,\-./:=?]*$/u;function r(e){if(e.length===0)throw Error(`OID is empty`);let t=h(e,0),n=t.nextOffset,r=t.value<40?[0,t.value]:t.value<80?[1,t.value-40]:[2,t.value-80];for(;n<e.length;){let t=h(e,n);r.push(t.value),n=t.nextOffset}return r.join(`.`)}function i(e){return Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}function a(e){let t=new ArrayBuffer(e.length);return new Uint8Array(t).set(e),t}function o(t,n){let r=[],i=n.start;for(;i<n.end;){let a=e(t,i);if(a.end>n.end)throw Error(`DER child exceeds parent length`);r.push(a),i=a.end}if(i!==n.end)throw Error(`Malformed DER container`);return r}function s(e,t){if(e===void 0)throw Error(`Missing ${t}`);return e}function c(e){if(e.tag!==3)throw Error(`Expected BIT STRING`);let t=e.value[0];if(t===void 0||t>7)throw Error(`Invalid BIT STRING`);if(t!==0)throw Error(`BIT STRING must have zero unused bits`);return e.value.slice(1)}function l(e){if(e.tag===23){let t=_(e.value,`UTCTime`),n=/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z$/.exec(t);if(n===null)throw Error(`Invalid UTCTime`);let r=s(n[1],`UTCTime year`),i=s(n[2],`UTCTime month`),a=s(n[3],`UTCTime day`),o=s(n[4],`UTCTime hour`),c=s(n[5],`UTCTime minute`),l=s(n[6],`UTCTime second`),u=Number.parseInt(r,10);return m(u>=50?1900+u:2e3+u,i,a,o,c,l,`UTCTime`)}if(e.tag===24){let t=_(e.value,`GeneralizedTime`),n=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z$/.exec(t);if(n===null)throw Error(`Invalid GeneralizedTime`);let r=s(n[1],`GeneralizedTime year`),i=s(n[2],`GeneralizedTime month`),a=s(n[3],`GeneralizedTime day`),o=s(n[4],`GeneralizedTime hour`),c=s(n[5],`GeneralizedTime minute`),l=s(n[6],`GeneralizedTime second`);return m(Number.parseInt(r,10),i,a,o,c,l,`GeneralizedTime`)}throw Error(`Unsupported time tag: ${e.tag}`)}function u(e){let t=e[0];if(t===void 0)throw Error(`INTEGER is empty`);if(t&128)throw Error(`INTEGER must be non-negative`);if(e.length>1&&t===0&&!((e[1]??0)&128))throw Error(`INTEGER must use minimal encoding`);if(e.length>6)throw Error(`Integer too large for safe number (${e.length} bytes)`);let n=0;for(let t of e)n=n*256+t;return n}function d(e,t=`INTEGER`){if(t===`INTEGER`)return u(e);try{return u(e)}catch(n){if(!(n instanceof Error))throw n;switch(n.message){case`INTEGER is empty`:throw Error(`${t} is empty`);case`INTEGER must be non-negative`:throw Error(`${t} must be non-negative`);case`INTEGER must use minimal encoding`:throw Error(`${t} must use minimal encoding`);default:throw n.message.startsWith(`Integer too large for safe number`)?Error(`${t} too large for safe number (${e.length} bytes)`):n}}}function f(e){let t=e.length%2==0?e:`0${e}`,n=new Uint8Array(t.length/2);for(let e=0;e<n.length;e+=1){let r=t.slice(e*2,e*2+2);if(!/^[0-9a-fA-F]{2}$/.test(r))throw Error(`Invalid hex byte: ${r}`);n[e]=Number.parseInt(r,16)}return n}function p(e){if(e.length!==1)throw Error(`BOOLEAN must contain exactly one octet`);let t=e[0];if(t!==0&&t!==255)throw Error(`BOOLEAN must use DER encoding`);return t===255}function m(e,t,n,r,i,a,o){let s=Number.parseInt(t,10),c=Number.parseInt(n,10),l=Number.parseInt(r,10),u=Number.parseInt(i,10),d=Number.parseInt(a,10),f=new Date(Date.UTC(e,s-1,c,l,u,d));if(Number.isNaN(f.getTime())||f.getUTCFullYear()!==e||f.getUTCMonth()!==s-1||f.getUTCDate()!==c||f.getUTCHours()!==l||f.getUTCMinutes()!==u||f.getUTCSeconds()!==d)throw Error(`Invalid ${o}`);return f}function h(e,t){let n=e[t];if(n===void 0)throw Error(`Malformed OID`);if(n===128)throw Error(`Malformed OID: non-minimal base-128 encoding`);let r=0,i=t;for(;i<e.length;i+=1){let t=e[i];if(t===void 0)throw Error(`Malformed OID`);let n=t&127;if(r>Math.floor((2**53-1-n)/128))throw Error(`Malformed OID: overflow/non-minimal or too-large subidentifier`);if(r=r*128+n,!(t&128))return{value:r,nextOffset:i+1}}throw Error(`Malformed OID: incomplete continuation`)}function g(e,t){switch(e){case 12:return _(t,`UTF8String`);case 19:return b(t);case 22:return y(t);case 20:throw Error(`Unsupported string tag: 20 (TeletexString)`);case 28:return S(t);case 30:return x(t);default:throw Error(`Unsupported string tag: ${e}`)}}function _(e,n){try{return t.decode(e)}catch(e){throw e instanceof Error?Error(`Invalid ${n}: invalid UTF-8`,{cause:e}):e}}function v(e,t){let n=``;for(let r of e){if(r>127)throw Error(`Invalid ${t}: contains non-ASCII bytes`);n+=String.fromCharCode(r)}return n}function y(e){return v(e,`IA5String`)}function b(e){let t=v(e,`PrintableString`);if(!n.test(t))throw Error(`Invalid PrintableString: contains characters outside the allowed set`);return t}function x(e){if(e.length%2!=0)throw Error(`Invalid BMPString length`);let t=``;for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];if(r===void 0||i===void 0)throw Error(`Invalid BMPString content`);let a=r<<8|i;if(a>=55296&&a<=57343)throw Error(`Invalid BMPString code point`);t+=String.fromCharCode(a)}return t}function S(e){if(e.length%4!=0)throw Error(`Invalid UniversalString length`);let t=``;for(let n=0;n<e.length;n+=4){let r=e[n],i=e[n+1],a=e[n+2],o=e[n+3];if(r===void 0||i===void 0||a===void 0||o===void 0)throw Error(`Invalid UniversalString content`);let s=((r*256+i)*256+a)*256+o;if(s>1114111||s>=55296&&s<=57343)throw Error(`Invalid UniversalString code point`);t+=String.fromCodePoint(s)}return t}export{o as childrenOf,p as decodeBoolean,u as decodeIntegerNumber,d as decodeNonNegativeIntegerNumber,r as decodeObjectIdentifier,g as decodeString,c as extractBitStringValue,f as hexToBytes,l as parseTime,s as requireElement,a as toArrayBuffer,i as toHex};
2
+ //# sourceMappingURL=asn1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asn1.js","names":[],"sources":["../../../src/internal/asn1/asn1.ts"],"sourcesContent":["/**\n * ASN.1 decoding helpers used by the higher-level DER, parse, and crypto modules.\n *\n * These utilities stay intentionally small and strict so malformed input fails early and\n * higher-level modules can build on one consistent decoding layer.\n *\n * @module\n */\n\nimport { type DerElement, readElement } from './der.ts';\n\n/** Shared UTF-8 text decoder for ASN.1 string types. */\nconst textDecoder = new TextDecoder('utf-8', { fatal: true });\n\nconst PRINTABLE_STRING_PATTERN = /^[A-Za-z0-9 '()+,\\-./:=?]*$/u;\n\n/**\n * Decodes a DER-encoded OBJECT IDENTIFIER value into its dotted-decimal string\n * form (e.g. `\"1.2.840.113549.1.1.1\"`).\n *\n * Throws on empty input, truncated multi-byte sub-identifiers, or incomplete\n * continuation octets.\n */\nexport function decodeObjectIdentifier(bytes: Uint8Array): string {\n\tif (bytes.length === 0) {\n\t\tthrow new Error('OID is empty');\n\t}\n\tconst firstSubidentifier = decodeOidSubidentifier(bytes, 0);\n\tlet offset = firstSubidentifier.nextOffset;\n\tconst values =\n\t\tfirstSubidentifier.value < 40\n\t\t\t? [0, firstSubidentifier.value]\n\t\t\t: firstSubidentifier.value < 80\n\t\t\t\t? [1, firstSubidentifier.value - 40]\n\t\t\t\t: [2, firstSubidentifier.value - 80];\n\twhile (offset < bytes.length) {\n\t\tconst subidentifier = decodeOidSubidentifier(bytes, offset);\n\t\tvalues.push(subidentifier.value);\n\t\toffset = subidentifier.nextOffset;\n\t}\n\treturn values.join('.');\n}\n\n/** Converts raw bytes to a lowercase hex string with no separator. */\nexport function toHex(bytes: Uint8Array): string {\n\treturn Array.from(bytes, (value) => value.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Copies a `Uint8Array` into a standalone `ArrayBuffer` suitable for\n * Web Crypto operations that require a non-shared backing buffer.\n */\nexport function toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n\tconst out = new ArrayBuffer(bytes.length);\n\tnew Uint8Array(out).set(bytes);\n\treturn out;\n}\n\n/**\n * Iterates through all direct child TLV elements inside a constructed\n * {@linkcode DerElement} (SEQUENCE, SET, or context-tagged container).\n *\n * Throws if any child overflows the parent boundary or if there is\n * leftover data between the last child and the parent end offset.\n */\nexport function childrenOf(source: Uint8Array, parent: DerElement): DerElement[] {\n\tconst children: DerElement[] = [];\n\tlet offset = parent.start;\n\twhile (offset < parent.end) {\n\t\tconst child = readElement(source, offset);\n\t\tif (child.end > parent.end) {\n\t\t\tthrow new Error('DER child exceeds parent length');\n\t\t}\n\t\tchildren.push(child);\n\t\toffset = child.end;\n\t}\n\tif (offset !== parent.end) {\n\t\tthrow new Error('Malformed DER container');\n\t}\n\treturn children;\n}\n\n/**\n * Asserts that a value is not `undefined`, returning it narrowed.\n * Used to enforce the presence of mandatory ASN.1 fields during parsing.\n *\n * @param label Human-readable field name included in the error message on failure.\n */\nexport function requireElement<T>(value: T | undefined, label: string): T {\n\tif (value === undefined) {\n\t\tthrow new Error(`Missing ${label}`);\n\t}\n\treturn value;\n}\n\n/**\n * Strips the leading \"unused bits\" octet from a BIT STRING element,\n * returning just the payload bytes. Throws if the tag is not `0x03`.\n *\n * Used to extract signature values and public keys from their BIT STRING wrapper.\n */\nexport function extractBitStringValue(element: DerElement): Uint8Array {\n\tif (element.tag !== 0x03) {\n\t\tthrow new Error('Expected BIT STRING');\n\t}\n\tconst unusedBits = element.value[0];\n\tif (unusedBits === undefined || unusedBits > 7) {\n\t\tthrow new Error('Invalid BIT STRING');\n\t}\n\tif (unusedBits !== 0) {\n\t\tthrow new Error('BIT STRING must have zero unused bits');\n\t}\n\treturn element.value.slice(1);\n}\n\n/**\n * Parses a {@linkcode DerElement} with tag UTCTime (`0x17`) or GeneralizedTime (`0x18`)\n * into a `Date`.\n *\n * For UTCTime, the two-digit year is interpreted per RFC 5280: values >= 50 map\n * to 19xx, values < 50 map to 20xx. Throws on unrecognized time tags.\n */\nexport function parseTime(element: DerElement): Date {\n\tif (element.tag === 0x17) {\n\t\tconst value = decodeUtf8Text(element.value, 'UTCTime');\n\t\tconst match = /^(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})Z$/.exec(value);\n\t\tif (match === null) {\n\t\t\tthrow new Error('Invalid UTCTime');\n\t\t}\n\t\tconst yearText = requireElement(match[1], 'UTCTime year');\n\t\tconst monthText = requireElement(match[2], 'UTCTime month');\n\t\tconst dayText = requireElement(match[3], 'UTCTime day');\n\t\tconst hourText = requireElement(match[4], 'UTCTime hour');\n\t\tconst minuteText = requireElement(match[5], 'UTCTime minute');\n\t\tconst secondText = requireElement(match[6], 'UTCTime second');\n\t\tconst year = Number.parseInt(yearText, 10);\n\t\treturn buildStrictUtcDate(\n\t\t\tyear >= 50 ? 1900 + year : 2000 + year,\n\t\t\tmonthText,\n\t\t\tdayText,\n\t\t\thourText,\n\t\t\tminuteText,\n\t\t\tsecondText,\n\t\t\t'UTCTime',\n\t\t);\n\t}\n\tif (element.tag === 0x18) {\n\t\tconst value = decodeUtf8Text(element.value, 'GeneralizedTime');\n\t\tconst match = /^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})Z$/.exec(value);\n\t\tif (match === null) {\n\t\t\tthrow new Error('Invalid GeneralizedTime');\n\t\t}\n\t\tconst yearText = requireElement(match[1], 'GeneralizedTime year');\n\t\tconst monthText = requireElement(match[2], 'GeneralizedTime month');\n\t\tconst dayText = requireElement(match[3], 'GeneralizedTime day');\n\t\tconst hourText = requireElement(match[4], 'GeneralizedTime hour');\n\t\tconst minuteText = requireElement(match[5], 'GeneralizedTime minute');\n\t\tconst secondText = requireElement(match[6], 'GeneralizedTime second');\n\t\treturn buildStrictUtcDate(\n\t\t\tNumber.parseInt(yearText, 10),\n\t\t\tmonthText,\n\t\t\tdayText,\n\t\t\thourText,\n\t\t\tminuteText,\n\t\t\tsecondText,\n\t\t\t'GeneralizedTime',\n\t\t);\n\t}\n\tthrow new Error(`Unsupported time tag: ${element.tag}`);\n}\n\n/**\n * Decodes a big-endian unsigned byte sequence into a JavaScript `number`.\n * Throws if the value exceeds 6 bytes (48 bits), which is the safe-integer\n * boundary for lossless arithmetic.\n */\nexport function decodeIntegerNumber(bytes: Uint8Array): number {\n\tconst first = bytes[0];\n\tif (first === undefined) {\n\t\tthrow new Error('INTEGER is empty');\n\t}\n\tif ((first & 0x80) !== 0) {\n\t\tthrow new Error('INTEGER must be non-negative');\n\t}\n\tif (bytes.length > 1 && first === 0 && ((bytes[1] ?? 0) & 0x80) === 0) {\n\t\tthrow new Error('INTEGER must use minimal encoding');\n\t}\n\tif (bytes.length > 6) {\n\t\tthrow new Error(`Integer too large for safe number (${bytes.length} bytes)`);\n\t}\n\tlet value = 0;\n\tfor (const byte of bytes) {\n\t\tvalue = value * 256 + byte;\n\t}\n\treturn value;\n}\n\n/**\n * Like {@linkcode decodeIntegerNumber}, but optionally rewrites thrown error\n * messages with a caller-specific field label.\n *\n * @param label Field name for error messages (defaults to `\"INTEGER\"`).\n */\nexport function decodeNonNegativeIntegerNumber(bytes: Uint8Array, label = 'INTEGER'): number {\n\tif (label === 'INTEGER') {\n\t\treturn decodeIntegerNumber(bytes);\n\t}\n\ttry {\n\t\treturn decodeIntegerNumber(bytes);\n\t} catch (error) {\n\t\tif (!(error instanceof Error)) {\n\t\t\tthrow error;\n\t\t}\n\t\tswitch (error.message) {\n\t\t\tcase 'INTEGER is empty':\n\t\t\t\tthrow new Error(`${label} is empty`);\n\t\t\tcase 'INTEGER must be non-negative':\n\t\t\t\tthrow new Error(`${label} must be non-negative`);\n\t\t\tcase 'INTEGER must use minimal encoding':\n\t\t\t\tthrow new Error(`${label} must use minimal encoding`);\n\t\t\tdefault:\n\t\t\t\tif (error.message.startsWith('Integer too large for safe number')) {\n\t\t\t\t\tthrow new Error(`${label} too large for safe number (${bytes.length} bytes)`);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t}\n\t}\n}\n\n/**\n * Converts a hex string (even or odd length) to a `Uint8Array`.\n * Odd-length strings are left-padded with a zero nibble.\n */\nexport function hexToBytes(value: string): Uint8Array {\n\tconst normalized = value.length % 2 === 0 ? value : `0${value}`;\n\tconst out = new Uint8Array(normalized.length / 2);\n\tfor (let index = 0; index < out.length; index += 1) {\n\t\tconst chunk = normalized.slice(index * 2, index * 2 + 2);\n\t\tif (!/^[0-9a-fA-F]{2}$/.test(chunk)) {\n\t\t\tthrow new Error(`Invalid hex byte: ${chunk}`);\n\t\t}\n\t\tconst parsed = Number.parseInt(chunk, 16);\n\t\tout[index] = parsed;\n\t}\n\treturn out;\n}\n\n/** Decodes a DER BOOLEAN value: any non-zero first byte is `true`. */\nexport function decodeBoolean(bytes: Uint8Array): boolean {\n\tif (bytes.length !== 1) {\n\t\tthrow new Error('BOOLEAN must contain exactly one octet');\n\t}\n\tconst value = bytes[0];\n\tif (value !== 0x00 && value !== 0xff) {\n\t\tthrow new Error('BOOLEAN must use DER encoding');\n\t}\n\treturn value === 0xff;\n}\n\nfunction buildStrictUtcDate(\n\tyear: number,\n\tmonthText: string,\n\tdayText: string,\n\thourText: string,\n\tminuteText: string,\n\tsecondText: string,\n\tlabel: 'UTCTime' | 'GeneralizedTime',\n): Date {\n\tconst month = Number.parseInt(monthText, 10);\n\tconst day = Number.parseInt(dayText, 10);\n\tconst hour = Number.parseInt(hourText, 10);\n\tconst minute = Number.parseInt(minuteText, 10);\n\tconst second = Number.parseInt(secondText, 10);\n\tconst date = new Date(Date.UTC(year, month - 1, day, hour, minute, second));\n\tif (\n\t\tNumber.isNaN(date.getTime()) ||\n\t\tdate.getUTCFullYear() !== year ||\n\t\tdate.getUTCMonth() !== month - 1 ||\n\t\tdate.getUTCDate() !== day ||\n\t\tdate.getUTCHours() !== hour ||\n\t\tdate.getUTCMinutes() !== minute ||\n\t\tdate.getUTCSeconds() !== second\n\t) {\n\t\tthrow new Error(`Invalid ${label}`);\n\t}\n\treturn date;\n}\n\nfunction decodeOidSubidentifier(\n\tbytes: Uint8Array,\n\tstart: number,\n): {\n\treadonly value: number;\n\treadonly nextOffset: number;\n} {\n\tconst first = bytes[start];\n\tif (first === undefined) {\n\t\tthrow new Error('Malformed OID');\n\t}\n\tif (first === 0x80) {\n\t\tthrow new Error('Malformed OID: non-minimal base-128 encoding');\n\t}\n\tlet value = 0;\n\tlet offset = start;\n\tfor (; offset < bytes.length; offset += 1) {\n\t\tconst next = bytes[offset];\n\t\tif (next === undefined) {\n\t\t\tthrow new Error('Malformed OID');\n\t\t}\n\t\tconst digit = next & 0x7f;\n\t\tif (value > Math.floor((Number.MAX_SAFE_INTEGER - digit) / 128)) {\n\t\t\tthrow new Error('Malformed OID: overflow/non-minimal or too-large subidentifier');\n\t\t}\n\t\tvalue = value * 128 + digit;\n\t\tif ((next & 0x80) === 0) {\n\t\t\treturn {\n\t\t\t\tvalue,\n\t\t\t\tnextOffset: offset + 1,\n\t\t\t};\n\t\t}\n\t}\n\tthrow new Error('Malformed OID: incomplete continuation');\n}\n\n/**\n * Decodes a DER string element by tag. Supports UTF8String (`0x0c`),\n * PrintableString (`0x13`), IA5String (`0x16`), UniversalString (`0x1c`),\n * and BMPString (`0x1e`).\n * Throws on unsupported string tags.\n */\nexport function decodeString(tag: number, bytes: Uint8Array): string {\n\tswitch (tag) {\n\t\tcase 0x0c:\n\t\t\treturn decodeUtf8Text(bytes, 'UTF8String');\n\t\tcase 0x13:\n\t\t\treturn decodePrintableString(bytes);\n\t\tcase 0x16:\n\t\t\treturn decodeIa5String(bytes);\n\t\tcase 0x14:\n\t\t\tthrow new Error('Unsupported string tag: 20 (TeletexString)');\n\t\tcase 0x1c:\n\t\t\treturn decodeUniversalString(bytes);\n\t\tcase 0x1e:\n\t\t\treturn decodeBmpString(bytes);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported string tag: ${tag}`);\n\t}\n}\n\nfunction decodeUtf8Text(\n\tbytes: Uint8Array,\n\tlabel: 'GeneralizedTime' | 'UTCTime' | 'UTF8String',\n): string {\n\ttry {\n\t\treturn textDecoder.decode(bytes);\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tthrow new Error(`Invalid ${label}: invalid UTF-8`, { cause: error });\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction decodeAsciiString(bytes: Uint8Array, label: 'IA5String' | 'PrintableString'): string {\n\tlet value = '';\n\tfor (const byte of bytes) {\n\t\tif (byte > 0x7f) {\n\t\t\tthrow new Error(`Invalid ${label}: contains non-ASCII bytes`);\n\t\t}\n\t\tvalue += String.fromCharCode(byte);\n\t}\n\treturn value;\n}\n\nfunction decodeIa5String(bytes: Uint8Array): string {\n\treturn decodeAsciiString(bytes, 'IA5String');\n}\n\nfunction decodePrintableString(bytes: Uint8Array): string {\n\tconst value = decodeAsciiString(bytes, 'PrintableString');\n\tif (!PRINTABLE_STRING_PATTERN.test(value)) {\n\t\tthrow new Error('Invalid PrintableString: contains characters outside the allowed set');\n\t}\n\treturn value;\n}\n\nfunction decodeBmpString(bytes: Uint8Array): string {\n\tif (bytes.length % 2 !== 0) {\n\t\tthrow new Error('Invalid BMPString length');\n\t}\n\tlet value = '';\n\tfor (let index = 0; index < bytes.length; index += 2) {\n\t\tconst left = bytes[index];\n\t\tconst right = bytes[index + 1];\n\t\tif (left === undefined || right === undefined) {\n\t\t\tthrow new Error('Invalid BMPString content');\n\t\t}\n\t\tconst codeUnit = (left << 8) | right;\n\t\tif (codeUnit >= 0xd800 && codeUnit <= 0xdfff) {\n\t\t\tthrow new Error('Invalid BMPString code point');\n\t\t}\n\t\tvalue += String.fromCharCode(codeUnit);\n\t}\n\treturn value;\n}\n\nfunction decodeUniversalString(bytes: Uint8Array): string {\n\tif (bytes.length % 4 !== 0) {\n\t\tthrow new Error('Invalid UniversalString length');\n\t}\n\tlet value = '';\n\tfor (let index = 0; index < bytes.length; index += 4) {\n\t\tconst first = bytes[index];\n\t\tconst second = bytes[index + 1];\n\t\tconst third = bytes[index + 2];\n\t\tconst fourth = bytes[index + 3];\n\t\tif (\n\t\t\tfirst === undefined ||\n\t\t\tsecond === undefined ||\n\t\t\tthird === undefined ||\n\t\t\tfourth === undefined\n\t\t) {\n\t\t\tthrow new Error('Invalid UniversalString content');\n\t\t}\n\t\tconst codePoint = ((first * 256 + second) * 256 + third) * 256 + fourth;\n\t\tif (codePoint > 0x10ffff || (codePoint >= 0xd800 && codePoint <= 0xdfff)) {\n\t\t\tthrow new Error('Invalid UniversalString code point');\n\t\t}\n\t\tvalue += String.fromCodePoint(codePoint);\n\t}\n\treturn value;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e(e){if(O(e,`DER length`),e<128)return Uint8Array.of(e);let t=C(e);return Uint8Array.of(128|t.length,...t)}function t(e){let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function n(n,r){return k(n),t([Uint8Array.of(n),e(r.length),r])}function r(e){return n(48,t(e))}function i(e){return n(49,t(e.slice().sort((e,t)=>{let n=Math.min(e.length,t.length);for(let r=0;r<n;r++){let n=(e[r]??0)-(t[r]??0);if(n!==0)return n}return e.length-t.length})))}function a(e,t){return A(e),n(160+e,t)}function o(e,t){return A(e),n(160+e,t)}function s(e,t){return A(e),n(128+e,t)}function c(e){if(e.length===0)return n(2,Uint8Array.of(0));let r=0;for(;r<e.length-1&&e[r]===0;)r+=1;let i=e.slice(r);return(i[0]??0)>=128?n(2,t([Uint8Array.of(0),i])):n(2,i)}function l(e){if(!Number.isSafeInteger(e)||e<0)throw Error(`INTEGER must be a non-negative safe integer`);return c(e===0?Uint8Array.of(0):Uint8Array.from(C(e)))}function u(e){return n(1,Uint8Array.of(e?255:0))}function d(){return n(5,new Uint8Array)}function f(e){return n(4,e)}function p(e,r=0){if(r<0||r>7)throw Error(`unusedBits must be between 0 and 7`);if(e.length===0&&r!==0)throw Error(`unusedBits must be 0 when value is empty`);if(e.length>0&&r>0&&(e[e.length-1]??0)&(1<<r)-1)throw Error(`unused bits in the last byte must be zero`);return n(3,t([Uint8Array.of(r),e]))}function m(e){return n(12,new TextEncoder().encode(e))}function h(e){if(!/^[A-Za-z0-9 '()+,\-./:=?]*$/.test(e))throw Error(`Invalid PrintableString: contains characters outside the allowed set`);return n(19,new TextEncoder().encode(e))}function g(e){for(let t=0;t<e.length;t++)if(e.charCodeAt(t)>127)throw Error(`Invalid IA5String: contains non-ASCII characters`);return n(22,new TextEncoder().encode(e))}function _(e){let t=[Number(e&127n)],n=e>>7n;for(;n>0n;)t.unshift(128|Number(n&127n)),n>>=7n;return t}function v(e){let t=/^\d+$/,r=e.split(`.`).map(e=>{if(!t.test(e))throw Error(`Invalid OID segment: ${e}`);return BigInt(e)});if(r.length<2)throw Error(`Invalid OID: ${e}`);let[i,a,...o]=r;if(i===void 0||a===void 0)throw Error(`Invalid OID: ${e}`);if(i!==0n&&i!==1n&&i!==2n)throw Error(`Invalid OID first arc: ${i}`);if((i===0n||i===1n)&&a>=40n)throw Error(`Invalid OID second arc: ${a} (must be < 40 when first arc is ${i})`);let s=_(i*40n+a);for(let e of o)s.push(..._(e));return n(6,Uint8Array.from(s))}function y(e){j(e,`UTCTime`);let t=e.getUTCFullYear();if(t<1950||t>2049)throw RangeError(`UTCTime year must be between 1950 and 2049`);let r=`${[S(t%100),S(e.getUTCMonth()+1),S(e.getUTCDate()),S(e.getUTCHours()),S(e.getUTCMinutes()),S(e.getUTCSeconds())].join(``)}Z`;return n(23,new TextEncoder().encode(r))}function b(e){j(e,`GeneralizedTime`);let t=e.getUTCFullYear();if(t<0||t>9999)throw RangeError(`GeneralizedTime year must be between 0 and 9999`);let r=`${[String(t).padStart(4,`0`),S(e.getUTCMonth()+1),S(e.getUTCDate()),S(e.getUTCHours()),S(e.getUTCMinutes()),S(e.getUTCSeconds())].join(``)}Z`;return n(24,new TextEncoder().encode(r))}function x(e){return e.getUTCFullYear()>=2050||e.getUTCFullYear()<1950?b(e):y(e)}function S(e){return String(e).padStart(2,`0`)}function C(e){O(e,`DER integer`);let t=[],n=e;for(;n>0;)t.unshift(n&255),n=Math.floor(n/256);return t}function w(e,t=0){let n=e[t];if(n===void 0)throw Error(`Unexpected end of DER input`);if((n&31)==31)throw Error(`High-tag-number DER form is not supported`);let r=e[t+1];if(r===void 0)throw Error(`Unexpected end of DER input`);let i=2,a=0;if(!(r&128))a=r;else{let n=r&127;if(n===0)throw Error(`Indefinite lengths are not supported`);let o=e[t+2];if(o===void 0)throw Error(`Unexpected end of DER input`);if(o===0)throw Error(`Non-minimal DER length encoding`);i+=n;for(let r=0;r<n;r+=1){let n=e[t+2+r];if(n===void 0)throw Error(`Unexpected end of DER input`);if(a>Math.floor((2**53-1-n)/256))throw Error(`DER length exceeds safe integer range`);a=a*256+n}if(a<128)throw Error(`Non-minimal DER length encoding`)}let o=t+i,s=o+a;if(s>e.length)throw Error(`DER element exceeds input length`);return{tag:n,headerLength:i,length:a,start:o,end:s,value:e.slice(o,s)}}function T(e,t=64,n){if(!Number.isSafeInteger(t)||t<1)throw Error(`DER max depth must be a positive safe integer`);let r=w(e,0);if(r.end!==e.length)throw Error(`Trailing data after DER element`);let i=[{element:r,depth:1}];for(;i.length>0;){let r=i.pop();if(r===void 0)continue;if(r.depth>t)throw Error(`DER exceeds max depth of ${t}`);if(!(r.element.tag&32))continue;let a=r.element.start,o=!1;for(;a<r.element.end;){let t;try{t=w(e,a)}catch(e){if(M(r.element,a,n)){o=!0,a=r.element.end;break}throw e}if(t.end>r.element.end){if(M(r.element,a,n)){o=!0,a=r.element.end;break}throw Error(`DER child exceeds parent length`)}i.push({element:t,depth:r.depth+1}),a=t.end}if(!o&&a!==r.element.end)throw Error(`Malformed DER container`)}}function E(e,t){T(e,t?.maxDepth??64,t);let n=w(e,0);if(n.end!==e.length)throw Error(`Trailing data after DER element`);return n}function D(e,t){let n=E(e,t);if(n.tag!==48)throw Error(`Expected SEQUENCE`);let r=[],i=n.start;for(;i<n.end;){let t=w(e,i);if(t.end>n.end)throw Error(`DER child exceeds parent length`);r.push(t),i=t.end}if(i!==n.end)throw Error(`Malformed DER sequence`);return r}function O(e,t){if(!Number.isSafeInteger(e)||e<0)throw Error(`${t} must be a non-negative safe integer`)}function k(e){if(!Number.isSafeInteger(e)||e<0||e>255)throw RangeError(`DER tag octet must be between 0 and 255`);if((e&31)==31)throw Error(`High-tag-number DER tags are not supported`)}function A(e){if(!Number.isSafeInteger(e)||e<0||e>=31)throw RangeError(`Context-specific tag number must be between 0 and 30`)}function j(e,t){if(Number.isNaN(e.getTime()))throw RangeError(`${t} requires a valid Date`)}function M(e,t,n){return t===e.start&&n?.allowOpaqueConstructedTags?.includes(e.tag)===!0}export{T as assertDerMaxDepth,p as bitString,u as bool,t as concatBytes,e as encodeLength,a as explicitContext,b as generalizedTime,g as ia5String,o as implicitConstructedContext,s as implicitPrimitiveContext,c as integer,l as integerFromNumber,d as nullValue,v as objectIdentifier,f as octetString,h as printableString,w as readElement,E as readRootElement,D as readSequenceChildren,r as sequence,i as setOf,x as time,n as tlv,y as utcTime,m as utf8String};
2
+ //# sourceMappingURL=der.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"der.js","names":[],"sources":["../../../src/internal/asn1/der.ts"],"sourcesContent":["/**\n * Low-level DER encoding and reading helpers shared across the library.\n *\n * These utilities build and traverse ASN.1 TLV (tag-length-value) structures\n * without pulling in external dependencies.\n *\n * @module\n */\n\n/**\n * Maximum nesting depth allowed when recursively walking a DER structure.\n * Guards against stack exhaustion from pathologically nested input.\n */\nexport const DEFAULT_MAX_DER_DEPTH = 64;\n\n/**\n * Produces the DER length octets for a given byte count.\n * Values < 128 use the short form (one octet); larger values use the\n * long form (leading octet encodes the number of subsequent length bytes).\n */\nexport function encodeLength(length: number): Uint8Array {\n\tassertNonNegativeSafeInteger(length, 'DER length');\n\tif (length < 128) {\n\t\treturn Uint8Array.of(length);\n\t}\n\n\tconst parts = encodeBase256(length);\n\treturn Uint8Array.of(0x80 | parts.length, ...parts);\n}\n\n/** Concatenates multiple byte arrays into a single `Uint8Array`. */\nexport function concatBytes(parts: readonly Uint8Array[]): Uint8Array {\n\tconst length = parts.reduce((sum, part) => sum + part.length, 0);\n\tconst out = new Uint8Array(length);\n\tlet offset = 0;\n\tfor (const part of parts) {\n\t\tout.set(part, offset);\n\t\toffset += part.length;\n\t}\n\treturn out;\n}\n\n/**\n * Builds a complete DER TLV (tag-length-value) element: one tag octet,\n * the DER-encoded length, then the raw value bytes.\n */\nexport function tlv(tag: number, value: Uint8Array): Uint8Array {\n\tassertSingleOctetDerTag(tag);\n\treturn concatBytes([Uint8Array.of(tag), encodeLength(value.length), value]);\n}\n\n/** Wraps concatenated children in a SEQUENCE (tag `0x30`). */\nexport function sequence(parts: readonly Uint8Array[]): Uint8Array {\n\treturn tlv(0x30, concatBytes(parts));\n}\n\n/**\n * Wraps children in a SET (tag `0x31`) after DER-sorting them\n * lexicographically by encoded bytes, as required by X.690 DER.\n */\nexport function setOf(parts: readonly Uint8Array[]): Uint8Array {\n\tconst sorted = parts.slice().sort((a, b) => {\n\t\tconst len = Math.min(a.length, b.length);\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tconst diff = (a[i] ?? 0) - (b[i] ?? 0);\n\t\t\tif (diff !== 0) return diff;\n\t\t}\n\t\treturn a.length - b.length;\n\t});\n\treturn tlv(0x31, concatBytes(sorted));\n}\n\n/**\n * Wraps a value in an explicit context-specific constructed tag (`0xa0 + tag`).\n * Used for optional SEQUENCE fields tagged with `[tag] EXPLICIT`.\n */\nexport function explicitContext(tag: number, value: Uint8Array): Uint8Array {\n\tassertContextSpecificTagNumber(tag);\n\treturn tlv(0xa0 + tag, value);\n}\n\n/**\n * Wraps a value in an implicit context-specific constructed tag (`0xa0 + tag`).\n * Used for `[tag] IMPLICIT` fields whose underlying type is constructed (e.g. SEQUENCE).\n */\nexport function implicitConstructedContext(tag: number, value: Uint8Array): Uint8Array {\n\tassertContextSpecificTagNumber(tag);\n\treturn tlv(0xa0 + tag, value);\n}\n\n/**\n * Wraps a value in an implicit context-specific primitive tag (`0x80 + tag`).\n * Used for `[tag] IMPLICIT` fields whose underlying type is primitive (e.g. OCTET STRING).\n */\nexport function implicitPrimitiveContext(tag: number, value: Uint8Array): Uint8Array {\n\tassertContextSpecificTagNumber(tag);\n\treturn tlv(0x80 + tag, value);\n}\n\n/**\n * Encodes raw big-endian bytes as a DER INTEGER (tag `0x02`).\n * Strips leading zero bytes for minimal encoding and prepends a zero\n * byte when the high bit is set to keep the value non-negative.\n */\nexport function integer(bytes: Uint8Array): Uint8Array {\n\tif (bytes.length === 0) {\n\t\treturn tlv(0x02, Uint8Array.of(0));\n\t}\n\n\tlet start = 0;\n\twhile (start < bytes.length - 1 && bytes[start] === 0) {\n\t\tstart += 1;\n\t}\n\n\tconst value = bytes.slice(start);\n\tif ((value[0] ?? 0) >= 0x80) {\n\t\treturn tlv(0x02, concatBytes([Uint8Array.of(0), value]));\n\t}\n\n\treturn tlv(0x02, value);\n}\n\n/**\n * Encodes a non-negative JavaScript `number` as a DER INTEGER.\n * Throws if the value is not a non-negative safe integer.\n */\nexport function integerFromNumber(value: number): Uint8Array {\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new Error('INTEGER must be a non-negative safe integer');\n\t}\n\n\tif (value === 0) {\n\t\treturn integer(Uint8Array.of(0));\n\t}\n\n\treturn integer(Uint8Array.from(encodeBase256(value)));\n}\n\n/** Encodes a DER BOOLEAN (tag `0x01`): `true` → `0xff`, `false` → `0x00`. */\nexport function bool(value: boolean): Uint8Array {\n\treturn tlv(0x01, Uint8Array.of(value ? 0xff : 0x00));\n}\n\n/** Produces a DER NULL element (tag `0x05`, zero-length value). */\nexport function nullValue(): Uint8Array {\n\treturn tlv(0x05, new Uint8Array());\n}\n\n/** Wraps raw bytes in an OCTET STRING element (tag `0x04`). */\nexport function octetString(value: Uint8Array): Uint8Array {\n\treturn tlv(0x04, value);\n}\n\n/**\n * Encodes a DER BIT STRING (tag `0x03`). The value is prefixed with a\n * single octet indicating how many trailing bits in the last byte are unused.\n *\n * @param unusedBits Number of unused trailing bits (0–7). Defaults to 0.\n */\nexport function bitString(value: Uint8Array, unusedBits = 0): Uint8Array {\n\tif (unusedBits < 0 || unusedBits > 7) {\n\t\tthrow new Error('unusedBits must be between 0 and 7');\n\t}\n\tif (value.length === 0 && unusedBits !== 0) {\n\t\tthrow new Error('unusedBits must be 0 when value is empty');\n\t}\n\tif (value.length > 0 && unusedBits > 0) {\n\t\tconst lastByte = value[value.length - 1] ?? 0;\n\t\tif ((lastByte & ((1 << unusedBits) - 1)) !== 0) {\n\t\t\tthrow new Error('unused bits in the last byte must be zero');\n\t\t}\n\t}\n\treturn tlv(0x03, concatBytes([Uint8Array.of(unusedBits), value]));\n}\n\n/** Encodes a DER UTF8String (tag `0x0c`). */\nexport function utf8String(value: string): Uint8Array {\n\treturn tlv(0x0c, new TextEncoder().encode(value));\n}\n\n/**\n * Encodes a DER PrintableString (tag `0x13`).\n * Throws if the input contains characters outside the X.520 PrintableString set.\n */\nexport function printableString(value: string): Uint8Array {\n\tif (!/^[A-Za-z0-9 '()+,\\-./:=?]*$/.test(value)) {\n\t\tthrow new Error('Invalid PrintableString: contains characters outside the allowed set');\n\t}\n\treturn tlv(0x13, new TextEncoder().encode(value));\n}\n\n/**\n * Encodes a DER IA5String (tag `0x16`).\n * Throws if the input contains any non-ASCII character (code point > 0x7f).\n */\nexport function ia5String(value: string): Uint8Array {\n\tfor (let i = 0; i < value.length; i++) {\n\t\tif (value.charCodeAt(i) > 0x7f) {\n\t\t\tthrow new Error('Invalid IA5String: contains non-ASCII characters');\n\t\t}\n\t}\n\treturn tlv(0x16, new TextEncoder().encode(value));\n}\n\n/** Encode a non-negative integer as a base-128 sub-identifier (X.690 §8.19.2). */\nfunction encodeBase128(value: bigint): number[] {\n\tconst encoded: number[] = [Number(value & 0x7fn)];\n\tlet current = value >> 7n;\n\twhile (current > 0n) {\n\t\tencoded.unshift(0x80 | Number(current & 0x7fn));\n\t\tcurrent >>= 7n;\n\t}\n\treturn encoded;\n}\n\n/**\n * Encodes a dotted-decimal OID string as a DER OBJECT IDENTIFIER (tag `0x06`).\n * Validates arc constraints per X.660: first arc must be 0–2, second < 40\n * for arcs 0 and 1. Sub-identifiers are encoded with base-128 continuation.\n */\nexport function objectIdentifier(oid: string): Uint8Array {\n\tconst digitPattern = /^\\d+$/;\n\tconst segments = oid.split('.').map((segment) => {\n\t\tif (!digitPattern.test(segment)) {\n\t\t\tthrow new Error(`Invalid OID segment: ${segment}`);\n\t\t}\n\t\treturn BigInt(segment);\n\t});\n\tif (segments.length < 2) {\n\t\tthrow new Error(`Invalid OID: ${oid}`);\n\t}\n\n\tconst [first, second, ...rest] = segments;\n\tif (first === undefined || second === undefined) {\n\t\tthrow new Error(`Invalid OID: ${oid}`);\n\t}\n\tif (first !== 0n && first !== 1n && first !== 2n) {\n\t\tthrow new Error(`Invalid OID first arc: ${first}`);\n\t}\n\tif ((first === 0n || first === 1n) && second >= 40n) {\n\t\tthrow new Error(`Invalid OID second arc: ${second} (must be < 40 when first arc is ${first})`);\n\t}\n\tconst bytes: number[] = encodeBase128(first * 40n + second);\n\tfor (const segment of rest) {\n\t\tbytes.push(...encodeBase128(segment));\n\t}\n\n\treturn tlv(0x06, Uint8Array.from(bytes));\n}\n\n/**\n * Encodes a `Date` as a DER UTCTime (tag `0x17`), format `YYMMDDHHMMSSZ`.\n * Only the two-digit year is stored; suitable for dates in 1950–2049.\n */\nexport function utcTime(date: Date): Uint8Array {\n\tassertValidDate(date, 'UTCTime');\n\tconst year = date.getUTCFullYear();\n\tif (year < 1950 || year > 2049) {\n\t\tthrow new RangeError('UTCTime year must be between 1950 and 2049');\n\t}\n\tconst value = `${[\n\t\ttwoDigits(year % 100),\n\t\ttwoDigits(date.getUTCMonth() + 1),\n\t\ttwoDigits(date.getUTCDate()),\n\t\ttwoDigits(date.getUTCHours()),\n\t\ttwoDigits(date.getUTCMinutes()),\n\t\ttwoDigits(date.getUTCSeconds()),\n\t].join('')}Z`;\n\treturn tlv(0x17, new TextEncoder().encode(value));\n}\n\n/**\n * Encodes a `Date` as a DER GeneralizedTime (tag `0x18`), format `YYYYMMDDHHMMSSZ`.\n * Uses a four-digit year; required for dates outside the 1950–2049 range.\n */\nexport function generalizedTime(date: Date): Uint8Array {\n\tassertValidDate(date, 'GeneralizedTime');\n\tconst year = date.getUTCFullYear();\n\tif (year < 0 || year > 9999) {\n\t\tthrow new RangeError('GeneralizedTime year must be between 0 and 9999');\n\t}\n\tconst value = `${[\n\t\tString(year).padStart(4, '0'),\n\t\ttwoDigits(date.getUTCMonth() + 1),\n\t\ttwoDigits(date.getUTCDate()),\n\t\ttwoDigits(date.getUTCHours()),\n\t\ttwoDigits(date.getUTCMinutes()),\n\t\ttwoDigits(date.getUTCSeconds()),\n\t].join('')}Z`;\n\treturn tlv(0x18, new TextEncoder().encode(value));\n}\n\n/**\n * Encodes a `Date` as the appropriate DER time type per RFC 5280:\n * {@linkcode utcTime} for 1950–2049, {@linkcode generalizedTime} otherwise.\n */\nexport function time(date: Date): Uint8Array {\n\tif (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) {\n\t\treturn generalizedTime(date);\n\t}\n\treturn utcTime(date);\n}\n\n/** Zero-pads a number to two digits for time encoding. */\nfunction twoDigits(value: number): string {\n\treturn String(value).padStart(2, '0');\n}\n\n/** Encodes a non-negative integer as big-endian base-256 octets. */\nfunction encodeBase256(value: number): readonly number[] {\n\tassertNonNegativeSafeInteger(value, 'DER integer');\n\tconst parts: number[] = [];\n\tlet current = value;\n\twhile (current > 0) {\n\t\tparts.unshift(current & 0xff);\n\t\tcurrent = Math.floor(current / 256);\n\t}\n\treturn parts;\n}\n\n/** A single parsed ASN.1 TLV element with byte-range metadata. */\nexport interface DerElement {\n\t/** ASN.1 tag byte (e.g. `0x30` for SEQUENCE, `0x02` for INTEGER). */\n\treadonly tag: number;\n\t/** Number of bytes occupied by the tag + length octets. */\n\treadonly headerLength: number;\n\t/** Byte length of the value portion (excluding tag and length octets). */\n\treadonly length: number;\n\t/** Byte offset where the value portion begins in the source buffer. */\n\treadonly start: number;\n\t/** Byte offset one past the last value byte — equals the next element's header offset. */\n\treadonly end: number;\n\t/** The raw value bytes (slice of the source buffer). */\n\treadonly value: Uint8Array;\n}\n\n/** Options for {@linkcode readSequenceChildren}. */\nexport interface ReadSequenceChildrenOptions {\n\t/** Maximum nesting depth for the DER depth check. Default: {@linkcode DEFAULT_MAX_DER_DEPTH}. */\n\treadonly maxDepth?: number;\n\t/** Constructed tags whose inner bytes may not parse as valid TLV children (e.g. opaque extension values). */\n\treadonly allowOpaqueConstructedTags?: readonly number[];\n}\n\n/** Options for {@linkcode readRootElement}. */\nexport interface ReadRootElementOptions {\n\t/** Maximum nesting depth for the DER depth check. Default: {@linkcode DEFAULT_MAX_DER_DEPTH}. */\n\treadonly maxDepth?: number;\n\t/** Constructed tags whose inner bytes may not parse as valid TLV children (e.g. opaque extension values). */\n\treadonly allowOpaqueConstructedTags?: readonly number[];\n}\n\n/**\n * Reads one TLV element from `bytes` starting at `offset`.\n * Parses the tag byte, decodes the DER length octets, and slices out the\n * value bytes. Throws on truncated input, indefinite lengths, and\n * non-minimal length encodings.\n *\n * @param offset Byte position of the tag octet. Defaults to 0.\n */\nexport function readElement(bytes: Uint8Array, offset = 0): DerElement {\n\tconst tag = bytes[offset];\n\tif (tag === undefined) {\n\t\tthrow new Error('Unexpected end of DER input');\n\t}\n\tif ((tag & 0x1f) === 0x1f) {\n\t\tthrow new Error('High-tag-number DER form is not supported');\n\t}\n\tconst lengthByte = bytes[offset + 1];\n\tif (lengthByte === undefined) {\n\t\tthrow new Error('Unexpected end of DER input');\n\t}\n\n\tlet headerLength = 2;\n\tlet length = 0;\n\tif ((lengthByte & 0x80) === 0) {\n\t\tlength = lengthByte;\n\t} else {\n\t\tconst octets = lengthByte & 0x7f;\n\t\tif (octets === 0) {\n\t\t\tthrow new Error('Indefinite lengths are not supported');\n\t\t}\n\t\tconst firstLengthOctet = bytes[offset + 2];\n\t\tif (firstLengthOctet === undefined) {\n\t\t\tthrow new Error('Unexpected end of DER input');\n\t\t}\n\t\tif (firstLengthOctet === 0) {\n\t\t\tthrow new Error('Non-minimal DER length encoding');\n\t\t}\n\t\theaderLength += octets;\n\t\tfor (let index = 0; index < octets; index += 1) {\n\t\t\tconst next = bytes[offset + 2 + index];\n\t\t\tif (next === undefined) {\n\t\t\t\tthrow new Error('Unexpected end of DER input');\n\t\t\t}\n\t\t\tif (length > Math.floor((Number.MAX_SAFE_INTEGER - next) / 256)) {\n\t\t\t\tthrow new Error('DER length exceeds safe integer range');\n\t\t\t}\n\t\t\tlength = length * 256 + next;\n\t\t}\n\t\tif (length < 128) {\n\t\t\tthrow new Error('Non-minimal DER length encoding');\n\t\t}\n\t}\n\n\tconst start = offset + headerLength;\n\tconst end = start + length;\n\tif (end > bytes.length) {\n\t\tthrow new Error('DER element exceeds input length');\n\t}\n\n\treturn {\n\t\ttag,\n\t\theaderLength,\n\t\tlength,\n\t\tstart,\n\t\tend,\n\t\tvalue: bytes.slice(start, end),\n\t};\n}\n\n/**\n * Walks the full DER tree rooted in `bytes` and throws if nesting exceeds\n * `maxDepth`. Constructed tags with content that cannot be parsed as valid\n * children are tolerated when listed in `allowOpaqueConstructedTags`.\n */\nexport function assertDerMaxDepth(\n\tbytes: Uint8Array,\n\tmaxDepth: number = DEFAULT_MAX_DER_DEPTH,\n\toptions?: {\n\t\t/** Constructed tags whose inner bytes may not parse as valid TLV children. */\n\t\treadonly allowOpaqueConstructedTags?: readonly number[];\n\t},\n): void {\n\tif (!Number.isSafeInteger(maxDepth) || maxDepth < 1) {\n\t\tthrow new Error('DER max depth must be a positive safe integer');\n\t}\n\tconst root = readElement(bytes, 0);\n\tif (root.end !== bytes.length) {\n\t\tthrow new Error('Trailing data after DER element');\n\t}\n\tconst stack: {\n\t\treadonly element: DerElement;\n\t\treadonly depth: number;\n\t}[] = [{ element: root, depth: 1 }];\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (current === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (current.depth > maxDepth) {\n\t\t\tthrow new Error(`DER exceeds max depth of ${maxDepth}`);\n\t\t}\n\t\tif ((current.element.tag & 0x20) === 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet offset = current.element.start;\n\t\tlet treatedAsOpaqueLeaf = false;\n\t\twhile (offset < current.element.end) {\n\t\t\tlet child: DerElement;\n\t\t\ttry {\n\t\t\t\tchild = readElement(bytes, offset);\n\t\t\t} catch (error) {\n\t\t\t\tif (canTreatAsOpaqueLeaf(current.element, offset, options)) {\n\t\t\t\t\ttreatedAsOpaqueLeaf = true;\n\t\t\t\t\toffset = current.element.end;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (child.end > current.element.end) {\n\t\t\t\tif (canTreatAsOpaqueLeaf(current.element, offset, options)) {\n\t\t\t\t\ttreatedAsOpaqueLeaf = true;\n\t\t\t\t\toffset = current.element.end;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthrow new Error('DER child exceeds parent length');\n\t\t\t}\n\t\t\tstack.push({ element: child, depth: current.depth + 1 });\n\t\t\toffset = child.end;\n\t\t}\n\t\tif (!treatedAsOpaqueLeaf && offset !== current.element.end) {\n\t\t\tthrow new Error('Malformed DER container');\n\t\t}\n\t}\n}\n\n/**\n * Reads the single top-level TLV element from `bytes`, optionally\n * validating nesting depth. Throws if there is trailing data after the element.\n */\nexport function readRootElement(bytes: Uint8Array, options?: ReadRootElementOptions): DerElement {\n\tconst maxDepth = options?.maxDepth ?? DEFAULT_MAX_DER_DEPTH;\n\tassertDerMaxDepth(bytes, maxDepth, options);\n\tconst element = readElement(bytes, 0);\n\tif (element.end !== bytes.length) {\n\t\tthrow new Error('Trailing data after DER element');\n\t}\n\treturn element;\n}\n\n/**\n * Reads a DER-encoded SEQUENCE from `bytes` and returns its direct children.\n * Throws if the root element is not a SEQUENCE or if child boundaries are inconsistent.\n */\nexport function readSequenceChildren(\n\tbytes: Uint8Array,\n\toptions?: ReadSequenceChildrenOptions,\n): DerElement[] {\n\tconst sequenceElement = readRootElement(bytes, options);\n\tif (sequenceElement.tag !== 0x30) {\n\t\tthrow new Error('Expected SEQUENCE');\n\t}\n\n\tconst children: DerElement[] = [];\n\tlet offset = sequenceElement.start;\n\twhile (offset < sequenceElement.end) {\n\t\tconst element = readElement(bytes, offset);\n\t\tif (element.end > sequenceElement.end) {\n\t\t\tthrow new Error('DER child exceeds parent length');\n\t\t}\n\t\tchildren.push(element);\n\t\toffset = element.end;\n\t}\n\tif (offset !== sequenceElement.end) {\n\t\tthrow new Error('Malformed DER sequence');\n\t}\n\treturn children;\n}\n\n/** Throws if `value` is not a non-negative safe integer. */\nfunction assertNonNegativeSafeInteger(value: number, label: string): void {\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new Error(`${label} must be a non-negative safe integer`);\n\t}\n}\n\nfunction assertSingleOctetDerTag(tag: number): void {\n\tif (!Number.isSafeInteger(tag) || tag < 0 || tag > 0xff) {\n\t\tthrow new RangeError('DER tag octet must be between 0 and 255');\n\t}\n\tif ((tag & 0x1f) === 0x1f) {\n\t\tthrow new Error('High-tag-number DER tags are not supported');\n\t}\n}\n\nfunction assertContextSpecificTagNumber(tag: number): void {\n\tif (!Number.isSafeInteger(tag) || tag < 0 || tag >= 31) {\n\t\tthrow new RangeError('Context-specific tag number must be between 0 and 30');\n\t}\n}\n\nfunction assertValidDate(date: Date, label: 'UTCTime' | 'GeneralizedTime'): void {\n\tif (Number.isNaN(date.getTime())) {\n\t\tthrow new RangeError(`${label} requires a valid Date`);\n\t}\n}\n\n/**\n * Returns `true` when a constructed element's content should be treated as\n * an opaque leaf (not recursed into) because its tag appears in the\n * `allowOpaqueConstructedTags` list and the offset is at the element start.\n */\nfunction canTreatAsOpaqueLeaf(\n\telement: DerElement,\n\toffset: number,\n\toptions?: {\n\t\t/** Constructed tags whose inner bytes may not parse as valid TLV children. */\n\t\treadonly allowOpaqueConstructedTags?: readonly number[];\n\t},\n): boolean {\n\treturn (\n\t\toffset === element.start && options?.allowOpaqueConstructedTags?.includes(element.tag) === true\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e={commonName:`2.5.4.3`,surname:`2.5.4.4`,serialNumber:`2.5.4.5`,countryName:`2.5.4.6`,localityName:`2.5.4.7`,stateOrProvinceName:`2.5.4.8`,streetAddress:`2.5.4.9`,organizationName:`2.5.4.10`,organizationalUnitName:`2.5.4.11`,title:`2.5.4.12`,givenName:`2.5.4.42`,emailAddress:`1.2.840.113549.1.9.1`,cmsContentType:`1.2.840.113549.1.9.3`,cmsMessageDigest:`1.2.840.113549.1.9.4`,extensionRequest:`1.2.840.113549.1.9.14`,pkcs7Data:`1.2.840.113549.1.7.1`,pkcs7SignedData:`1.2.840.113549.1.7.2`,pkcs7EncryptedData:`1.2.840.113549.1.7.6`,pkcs12KeyBag:`1.2.840.113549.1.12.10.1.1`,pkcs12CertBag:`1.2.840.113549.1.12.10.1.3`,x509CertificateBagType:`1.2.840.113549.1.9.22.1`,friendlyName:`1.2.840.113549.1.9.20`,localKeyId:`1.2.840.113549.1.9.21`,pbes2:`1.2.840.113549.1.5.13`,pbkdf2:`1.2.840.113549.1.5.12`,mgf1:`1.2.840.113549.1.1.8`,hmacWithSHA1:`1.2.840.113549.2.7`,hmacWithSHA256:`1.2.840.113549.2.9`,aes128Cbc:`2.16.840.1.101.3.4.1.2`,aes192Cbc:`2.16.840.1.101.3.4.1.22`,aes256Cbc:`2.16.840.1.101.3.4.1.42`,rsaEncryption:`1.2.840.113549.1.1.1`,sha1WithRSAEncryption:`1.2.840.113549.1.1.5`,rsassaPss:`1.2.840.113549.1.1.10`,sha256WithRSAEncryption:`1.2.840.113549.1.1.11`,sha384WithRSAEncryption:`1.2.840.113549.1.1.12`,sha512WithRSAEncryption:`1.2.840.113549.1.1.13`,ecPublicKey:`1.2.840.10045.2.1`,ecdsaWithSHA1:`1.2.840.10045.4.1`,ecdsaWithSHA224:`1.2.840.10045.4.3.1`,ecdsaWithSHA256:`1.2.840.10045.4.3.2`,ecdsaWithSHA384:`1.2.840.10045.4.3.3`,ecdsaWithSHA512:`1.2.840.10045.4.3.4`,prime256v1:`1.2.840.10045.3.1.7`,secp384r1:`1.3.132.0.34`,secp521r1:`1.3.132.0.35`,ed25519:`1.3.101.112`,subjectKeyIdentifier:`2.5.29.14`,keyUsage:`2.5.29.15`,subjectAltName:`2.5.29.17`,nameConstraints:`2.5.29.30`,certificatePolicies:`2.5.29.32`,policyMappings:`2.5.29.33`,cRLNumber:`2.5.29.20`,cRLReason:`2.5.29.21`,invalidityDate:`2.5.29.24`,certificateIssuer:`2.5.29.29`,issuingDistributionPoint:`2.5.29.28`,deltaCRLIndicator:`2.5.29.27`,basicConstraints:`2.5.29.19`,policyConstraints:`2.5.29.36`,cRLDistributionPoints:`2.5.29.31`,freshestCRL:`2.5.29.46`,inhibitAnyPolicy:`2.5.29.54`,extendedKeyUsage:`2.5.29.37`,authorityKeyIdentifier:`2.5.29.35`,anyPolicy:`2.5.29.32.0`,authorityInfoAccess:`1.3.6.1.5.5.7.1.1`,idOnDnsSrv:`1.3.6.1.5.5.7.8.7`,cpsPolicyQualifier:`1.3.6.1.5.5.7.2.1`,userNoticePolicyQualifier:`1.3.6.1.5.5.7.2.2`,ocspAccessMethod:`1.3.6.1.5.5.7.48.1`,caIssuersAccessMethod:`1.3.6.1.5.5.7.48.2`,ocspBasicResponse:`1.3.6.1.5.5.7.48.1.1`,ocspNonce:`1.3.6.1.5.5.7.48.1.2`,sha1:`1.3.14.3.2.26`,sha256:`2.16.840.1.101.3.4.2.1`,sha384:`2.16.840.1.101.3.4.2.2`,sha512:`2.16.840.1.101.3.4.2.3`,serverAuth:`1.3.6.1.5.5.7.3.1`,clientAuth:`1.3.6.1.5.5.7.3.2`,codeSigning:`1.3.6.1.5.5.7.3.3`,emailProtection:`1.3.6.1.5.5.7.3.4`,timeStamping:`1.3.6.1.5.5.7.3.8`,ocspSigning:`1.3.6.1.5.5.7.3.9`};export{e as OIDS,e as default};
2
+ //# sourceMappingURL=oids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oids.js","names":[],"sources":["../../../src/internal/asn1/oids.ts"],"sourcesContent":["/**\n * Centralized ASN.1 object identifier registry referenced by create, parse,\n * verify, and container modules.\n *\n * All OIDs are dotted-decimal string constants keyed by their common short name.\n *\n * @module\n */\n\n/**\n * Dotted-decimal OID constants for X.500 attributes, PKCS algorithms,\n * X.509v3 extensions, EKU purposes, hash algorithms, and PKIX access methods.\n */\nconst OIDS = {\n\tcommonName: '2.5.4.3',\n\tsurname: '2.5.4.4',\n\tserialNumber: '2.5.4.5',\n\tcountryName: '2.5.4.6',\n\tlocalityName: '2.5.4.7',\n\tstateOrProvinceName: '2.5.4.8',\n\tstreetAddress: '2.5.4.9',\n\torganizationName: '2.5.4.10',\n\torganizationalUnitName: '2.5.4.11',\n\ttitle: '2.5.4.12',\n\tgivenName: '2.5.4.42',\n\temailAddress: '1.2.840.113549.1.9.1',\n\tcmsContentType: '1.2.840.113549.1.9.3',\n\tcmsMessageDigest: '1.2.840.113549.1.9.4',\n\textensionRequest: '1.2.840.113549.1.9.14',\n\tpkcs7Data: '1.2.840.113549.1.7.1',\n\tpkcs7SignedData: '1.2.840.113549.1.7.2',\n\tpkcs7EncryptedData: '1.2.840.113549.1.7.6',\n\tpkcs12KeyBag: '1.2.840.113549.1.12.10.1.1',\n\tpkcs12CertBag: '1.2.840.113549.1.12.10.1.3',\n\tx509CertificateBagType: '1.2.840.113549.1.9.22.1',\n\tfriendlyName: '1.2.840.113549.1.9.20',\n\tlocalKeyId: '1.2.840.113549.1.9.21',\n\tpbes2: '1.2.840.113549.1.5.13',\n\tpbkdf2: '1.2.840.113549.1.5.12',\n\tmgf1: '1.2.840.113549.1.1.8',\n\thmacWithSHA1: '1.2.840.113549.2.7',\n\thmacWithSHA256: '1.2.840.113549.2.9',\n\taes128Cbc: '2.16.840.1.101.3.4.1.2',\n\taes192Cbc: '2.16.840.1.101.3.4.1.22',\n\taes256Cbc: '2.16.840.1.101.3.4.1.42',\n\trsaEncryption: '1.2.840.113549.1.1.1',\n\tsha1WithRSAEncryption: '1.2.840.113549.1.1.5',\n\trsassaPss: '1.2.840.113549.1.1.10',\n\tsha256WithRSAEncryption: '1.2.840.113549.1.1.11',\n\tsha384WithRSAEncryption: '1.2.840.113549.1.1.12',\n\tsha512WithRSAEncryption: '1.2.840.113549.1.1.13',\n\tecPublicKey: '1.2.840.10045.2.1',\n\tecdsaWithSHA1: '1.2.840.10045.4.1',\n\tecdsaWithSHA224: '1.2.840.10045.4.3.1',\n\tecdsaWithSHA256: '1.2.840.10045.4.3.2',\n\tecdsaWithSHA384: '1.2.840.10045.4.3.3',\n\tecdsaWithSHA512: '1.2.840.10045.4.3.4',\n\tprime256v1: '1.2.840.10045.3.1.7',\n\tsecp384r1: '1.3.132.0.34',\n\tsecp521r1: '1.3.132.0.35',\n\ted25519: '1.3.101.112',\n\tsubjectKeyIdentifier: '2.5.29.14',\n\tkeyUsage: '2.5.29.15',\n\tsubjectAltName: '2.5.29.17',\n\tnameConstraints: '2.5.29.30',\n\tcertificatePolicies: '2.5.29.32',\n\tpolicyMappings: '2.5.29.33',\n\tcRLNumber: '2.5.29.20',\n\tcRLReason: '2.5.29.21',\n\tinvalidityDate: '2.5.29.24',\n\tcertificateIssuer: '2.5.29.29',\n\tissuingDistributionPoint: '2.5.29.28',\n\tdeltaCRLIndicator: '2.5.29.27',\n\tbasicConstraints: '2.5.29.19',\n\tpolicyConstraints: '2.5.29.36',\n\tcRLDistributionPoints: '2.5.29.31',\n\tfreshestCRL: '2.5.29.46',\n\tinhibitAnyPolicy: '2.5.29.54',\n\textendedKeyUsage: '2.5.29.37',\n\tauthorityKeyIdentifier: '2.5.29.35',\n\tanyPolicy: '2.5.29.32.0',\n\tauthorityInfoAccess: '1.3.6.1.5.5.7.1.1',\n\tidOnDnsSrv: '1.3.6.1.5.5.7.8.7',\n\tcpsPolicyQualifier: '1.3.6.1.5.5.7.2.1',\n\tuserNoticePolicyQualifier: '1.3.6.1.5.5.7.2.2',\n\tocspAccessMethod: '1.3.6.1.5.5.7.48.1',\n\tcaIssuersAccessMethod: '1.3.6.1.5.5.7.48.2',\n\tocspBasicResponse: '1.3.6.1.5.5.7.48.1.1',\n\tocspNonce: '1.3.6.1.5.5.7.48.1.2',\n\tsha1: '1.3.14.3.2.26',\n\tsha256: '2.16.840.1.101.3.4.2.1',\n\tsha384: '2.16.840.1.101.3.4.2.2',\n\tsha512: '2.16.840.1.101.3.4.2.3',\n\tserverAuth: '1.3.6.1.5.5.7.3.1',\n\tclientAuth: '1.3.6.1.5.5.7.3.2',\n\tcodeSigning: '1.3.6.1.5.5.7.3.3',\n\temailProtection: '1.3.6.1.5.5.7.3.4',\n\ttimeStamping: '1.3.6.1.5.5.7.3.8',\n\tocspSigning: '1.3.6.1.5.5.7.3.9',\n} as const;\n\nexport { OIDS };\nexport default OIDS;\n"],"mappings":"AAaA,MAAM,EAAO,CACZ,WAAY,UACZ,QAAS,UACT,aAAc,UACd,YAAa,UACb,aAAc,UACd,oBAAqB,UACrB,cAAe,UACf,iBAAkB,WAClB,uBAAwB,WACxB,MAAO,WACP,UAAW,WACX,aAAc,uBACd,eAAgB,uBAChB,iBAAkB,uBAClB,iBAAkB,wBAClB,UAAW,uBACX,gBAAiB,uBACjB,mBAAoB,uBACpB,aAAc,6BACd,cAAe,6BACf,uBAAwB,0BACxB,aAAc,wBACd,WAAY,wBACZ,MAAO,wBACP,OAAQ,wBACR,KAAM,uBACN,aAAc,qBACd,eAAgB,qBAChB,UAAW,yBACX,UAAW,0BACX,UAAW,0BACX,cAAe,uBACf,sBAAuB,uBACvB,UAAW,wBACX,wBAAyB,wBACzB,wBAAyB,wBACzB,wBAAyB,wBACzB,YAAa,oBACb,cAAe,oBACf,gBAAiB,sBACjB,gBAAiB,sBACjB,gBAAiB,sBACjB,gBAAiB,sBACjB,WAAY,sBACZ,UAAW,eACX,UAAW,eACX,QAAS,cACT,qBAAsB,YACtB,SAAU,YACV,eAAgB,YAChB,gBAAiB,YACjB,oBAAqB,YACrB,eAAgB,YAChB,UAAW,YACX,UAAW,YACX,eAAgB,YAChB,kBAAmB,YACnB,yBAA0B,YAC1B,kBAAmB,YACnB,iBAAkB,YAClB,kBAAmB,YACnB,sBAAuB,YACvB,YAAa,YACb,iBAAkB,YAClB,iBAAkB,YAClB,uBAAwB,YACxB,UAAW,cACX,oBAAqB,oBACrB,WAAY,oBACZ,mBAAoB,oBACpB,0BAA2B,oBAC3B,iBAAkB,qBAClB,sBAAuB,qBACvB,kBAAmB,uBACnB,UAAW,uBACX,KAAM,gBACN,OAAQ,yBACR,OAAQ,yBACR,OAAQ,yBACR,WAAY,oBACZ,WAAY,oBACZ,YAAa,oBACb,gBAAiB,oBACjB,aAAc,oBACd,YAAa,mBACd"}
@@ -0,0 +1,2 @@
1
+ import{OIDS as e}from"../asn1/oids.js";import{parseRsaPssParameters as t}from"./rsa-pss.js";function n(t){switch(t){case e.sha1:return`SHA-1`;case e.sha256:return`SHA-256`;case e.sha384:return`SHA-384`;case e.sha512:return`SHA-512`;default:return`Unknown (${t})`}}function r(n,r){switch(n){case e.sha1WithRSAEncryption:return`RSA PKCS#1 v1.5 with SHA-1`;case e.sha256WithRSAEncryption:return`RSA PKCS#1 v1.5 with SHA-256`;case e.sha384WithRSAEncryption:return`RSA PKCS#1 v1.5 with SHA-384`;case e.sha512WithRSAEncryption:return`RSA PKCS#1 v1.5 with SHA-512`;case e.rsassaPss:{let e=t(r);return e.ok?`RSA-PSS with ${e.value.hash}`:`RSA-PSS`}case e.ecdsaWithSHA1:return`ECDSA with SHA-1`;case e.ecdsaWithSHA224:return`ECDSA with SHA-224`;case e.ecdsaWithSHA256:return`ECDSA with SHA-256`;case e.ecdsaWithSHA384:return`ECDSA with SHA-384`;case e.ecdsaWithSHA512:return`ECDSA with SHA-512`;case e.ed25519:return`Ed25519`;default:return`Unknown (${n})`}}function i(t,n){switch(t){case e.rsaEncryption:return`RSA`;case e.rsassaPss:return`RSA-PSS`;case e.ecPublicKey:switch(n){case e.prime256v1:return`EC P-256`;case e.secp384r1:return`EC P-384`;case e.secp521r1:return`EC P-521`;default:return`EC`}case e.ed25519:return`Ed25519`;default:return`Unknown (${t})`}}export{n as describeHashAlgorithm,i as describePublicKeyAlgorithm,r as describeSignatureAlgorithm};
2
+ //# sourceMappingURL=algorithm-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithm-names.js","names":[],"sources":["../../../src/internal/crypto/algorithm-names.ts"],"sourcesContent":["/**\n * Human-readable algorithm labels for parsed OIDs.\n *\n * Shared by certificate, revocation, and PKCS parse surfaces so callers can\n * display meaningful algorithm names without memorizing dotted-decimal OIDs.\n *\n * @module\n */\n\nimport { OIDS } from '#micro509/internal/asn1/oids.ts';\nimport { parseRsaPssParameters } from './rsa-pss.ts';\n\n/** Convert a hash or message-digest OID into a human-readable name. */\nexport function describeHashAlgorithm(oid: string): string {\n\tswitch (oid) {\n\t\tcase OIDS.sha1:\n\t\t\treturn 'SHA-1';\n\t\tcase OIDS.sha256:\n\t\t\treturn 'SHA-256';\n\t\tcase OIDS.sha384:\n\t\t\treturn 'SHA-384';\n\t\tcase OIDS.sha512:\n\t\t\treturn 'SHA-512';\n\t\tdefault:\n\t\t\treturn `Unknown (${oid})`;\n\t}\n}\n\n/** Convert a signature AlgorithmIdentifier into a human-readable name. */\nexport function describeSignatureAlgorithm(\n\toid: string,\n\tparametersDer: Uint8Array | undefined,\n): string {\n\tswitch (oid) {\n\t\tcase OIDS.sha1WithRSAEncryption:\n\t\t\treturn 'RSA PKCS#1 v1.5 with SHA-1';\n\t\tcase OIDS.sha256WithRSAEncryption:\n\t\t\treturn 'RSA PKCS#1 v1.5 with SHA-256';\n\t\tcase OIDS.sha384WithRSAEncryption:\n\t\t\treturn 'RSA PKCS#1 v1.5 with SHA-384';\n\t\tcase OIDS.sha512WithRSAEncryption:\n\t\t\treturn 'RSA PKCS#1 v1.5 with SHA-512';\n\t\tcase OIDS.rsassaPss: {\n\t\t\tconst parsed = parseRsaPssParameters(parametersDer);\n\t\t\treturn parsed.ok ? `RSA-PSS with ${parsed.value.hash}` : 'RSA-PSS';\n\t\t}\n\t\tcase OIDS.ecdsaWithSHA1:\n\t\t\treturn 'ECDSA with SHA-1';\n\t\tcase OIDS.ecdsaWithSHA224:\n\t\t\treturn 'ECDSA with SHA-224';\n\t\tcase OIDS.ecdsaWithSHA256:\n\t\t\treturn 'ECDSA with SHA-256';\n\t\tcase OIDS.ecdsaWithSHA384:\n\t\t\treturn 'ECDSA with SHA-384';\n\t\tcase OIDS.ecdsaWithSHA512:\n\t\t\treturn 'ECDSA with SHA-512';\n\t\tcase OIDS.ed25519:\n\t\t\treturn 'Ed25519';\n\t\tdefault:\n\t\t\treturn `Unknown (${oid})`;\n\t}\n}\n\n/** Convert a SubjectPublicKeyInfo algorithm identifier into a human-readable name. */\nexport function describePublicKeyAlgorithm(oid: string, parametersOid: string | undefined): string {\n\tswitch (oid) {\n\t\tcase OIDS.rsaEncryption:\n\t\t\treturn 'RSA';\n\t\tcase OIDS.rsassaPss:\n\t\t\treturn 'RSA-PSS';\n\t\tcase OIDS.ecPublicKey:\n\t\t\tswitch (parametersOid) {\n\t\t\t\tcase OIDS.prime256v1:\n\t\t\t\t\treturn 'EC P-256';\n\t\t\t\tcase OIDS.secp384r1:\n\t\t\t\t\treturn 'EC P-384';\n\t\t\t\tcase OIDS.secp521r1:\n\t\t\t\t\treturn 'EC P-521';\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'EC';\n\t\t\t}\n\t\tcase OIDS.ed25519:\n\t\t\treturn 'Ed25519';\n\t\tdefault:\n\t\t\treturn `Unknown (${oid})`;\n\t}\n}\n"],"mappings":"4FAaA,SAAgB,EAAsB,EAAqB,CAC1D,OAAQ,EAAR,CACC,KAAK,EAAK,KACT,MAAO,QACR,KAAK,EAAK,OACT,MAAO,UACR,KAAK,EAAK,OACT,MAAO,UACR,KAAK,EAAK,OACT,MAAO,UACR,QACC,MAAO,YAAY,EAAI,EACzB,CACD,CAGA,SAAgB,EACf,EACA,EACS,CACT,OAAQ,EAAR,CACC,KAAK,EAAK,sBACT,MAAO,6BACR,KAAK,EAAK,wBACT,MAAO,+BACR,KAAK,EAAK,wBACT,MAAO,+BACR,KAAK,EAAK,wBACT,MAAO,+BACR,KAAK,EAAK,UAAW,CACpB,IAAM,EAAS,EAAsB,CAAa,EAClD,OAAO,EAAO,GAAK,gBAAgB,EAAO,MAAM,OAAS,SAC1D,CACA,KAAK,EAAK,cACT,MAAO,mBACR,KAAK,EAAK,gBACT,MAAO,qBACR,KAAK,EAAK,gBACT,MAAO,qBACR,KAAK,EAAK,gBACT,MAAO,qBACR,KAAK,EAAK,gBACT,MAAO,qBACR,KAAK,EAAK,QACT,MAAO,UACR,QACC,MAAO,YAAY,EAAI,EACzB,CACD,CAGA,SAAgB,EAA2B,EAAa,EAA2C,CAClG,OAAQ,EAAR,CACC,KAAK,EAAK,cACT,MAAO,MACR,KAAK,EAAK,UACT,MAAO,UACR,KAAK,EAAK,YACT,OAAQ,EAAR,CACC,KAAK,EAAK,WACT,MAAO,WACR,KAAK,EAAK,UACT,MAAO,WACR,KAAK,EAAK,UACT,MAAO,WACR,QACC,MAAO,IACT,CACD,KAAK,EAAK,QACT,MAAO,UACR,QACC,MAAO,YAAY,EAAI,EACzB,CACD"}
@@ -0,0 +1,2 @@
1
+ import{integer as e,readSequenceChildren as t,sequence as n}from"../asn1/der.js";function r(e,n){let r=t(e),i=r[0],a=r[1];if(i===void 0||a===void 0||r.length!==2)throw Error(`Malformed ECDSA DER signature`);if(i.tag!==2||a.tag!==2)throw Error(`ECDSA DER signature must contain two INTEGERs`);return o(s(i.value),s(a.value),n)}function i(t,r){if(t.length!==r*2)throw Error(`Unexpected ECDSA raw signature length`);return n([e(t.slice(0,r)),e(t.slice(r))])}function a(e,t){if(e[0]===48)try{return r(e,t)}catch{}try{return i(e,t)}catch{return}}function o(e,t,n){if(e.length>n||t.length>n)throw Error(`ECDSA signature integer too large`);let r=new Uint8Array(n*2);return r.set(e,n-e.length),r.set(t,r.length-t.length),r}function s(e){let t=0;for(;t<e.length-1&&e[t]===0;)t+=1;return e.slice(t)}export{a as alternateEcdsaSignatureEncoding,o as concatFixedWidth,r as derEcdsaSignatureToRaw,i as rawEcdsaSignatureToDer};
2
+ //# sourceMappingURL=ecdsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdsa.js","names":[],"sources":["../../../src/internal/crypto/ecdsa.ts"],"sourcesContent":["/**\n * ECDSA signature encoding conversion between ASN.1 DER (r, s INTEGER) and the\n * fixed-width raw format used by WebCrypto.\n *\n * @module\n */\n\nimport { integer, readSequenceChildren, sequence } from '#micro509/internal/asn1/der.ts';\n\n/** Convert a DER-encoded ECDSA signature (SEQUENCE of two INTEGERs) to fixed-width raw `r || s`. */\nexport function derEcdsaSignatureToRaw(signature: Uint8Array, partLength: number): Uint8Array {\n\tconst parts = readSequenceChildren(signature);\n\tconst r = parts[0];\n\tconst s = parts[1];\n\tif (r === undefined || s === undefined || parts.length !== 2) {\n\t\tthrow new Error('Malformed ECDSA DER signature');\n\t}\n\tif (r.tag !== 0x02 || s.tag !== 0x02) {\n\t\tthrow new Error('ECDSA DER signature must contain two INTEGERs');\n\t}\n\treturn concatFixedWidth(trimLeadingZero(r.value), trimLeadingZero(s.value), partLength);\n}\n\n/** Convert a fixed-width raw `r || s` ECDSA signature to DER-encoded SEQUENCE of two INTEGERs. */\nexport function rawEcdsaSignatureToDer(signature: Uint8Array, partLength: number): Uint8Array {\n\tif (signature.length !== partLength * 2) {\n\t\tthrow new Error('Unexpected ECDSA raw signature length');\n\t}\n\treturn sequence([integer(signature.slice(0, partLength)), integer(signature.slice(partLength))]);\n}\n\n/**\n * Try the opposite ECDSA encoding: DER→raw or raw→DER.\n *\n * Returns `undefined` if conversion fails, letting callers retry verification\n * with the alternate encoding.\n */\nexport function alternateEcdsaSignatureEncoding(\n\tsignature: Uint8Array,\n\tpartLength: number,\n): Uint8Array | undefined {\n\t// Try DER→raw first if it looks like DER (starts with SEQUENCE tag)\n\tif (signature[0] === 0x30) {\n\t\ttry {\n\t\t\treturn derEcdsaSignatureToRaw(signature, partLength);\n\t\t} catch {\n\t\t\t// Fall through to try raw→DER\n\t\t}\n\t}\n\t// Try raw→DER\n\ttry {\n\t\treturn rawEcdsaSignatureToDer(signature, partLength);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Left-pad and concatenate `r` and `s` into a fixed-width `partLength * 2` byte buffer. */\nexport function concatFixedWidth(\n\tleft: Uint8Array,\n\tright: Uint8Array,\n\tpartLength: number,\n): Uint8Array {\n\tif (left.length > partLength || right.length > partLength) {\n\t\tthrow new Error('ECDSA signature integer too large');\n\t}\n\tconst out = new Uint8Array(partLength * 2);\n\tout.set(left, partLength - left.length);\n\tout.set(right, out.length - right.length);\n\treturn out;\n}\n\n/** Strip leading zero bytes from a DER INTEGER value, keeping at least one byte. */\nfunction trimLeadingZero(bytes: Uint8Array): Uint8Array {\n\tlet index = 0;\n\twhile (index < bytes.length - 1 && bytes[index] === 0) {\n\t\tindex += 1;\n\t}\n\treturn bytes.slice(index);\n}\n"],"mappings":"iFAUA,SAAgB,EAAuB,EAAuB,EAAgC,CAC7F,IAAM,EAAQ,EAAqB,CAAS,EACtC,EAAI,EAAM,GACV,EAAI,EAAM,GAChB,GAAI,IAAM,IAAA,IAAa,IAAM,IAAA,IAAa,EAAM,SAAW,EAC1D,MAAU,MAAM,+BAA+B,EAEhD,GAAI,EAAE,MAAQ,GAAQ,EAAE,MAAQ,EAC/B,MAAU,MAAM,+CAA+C,EAEhE,OAAO,EAAiB,EAAgB,EAAE,KAAK,EAAG,EAAgB,EAAE,KAAK,EAAG,CAAU,CACvF,CAGA,SAAgB,EAAuB,EAAuB,EAAgC,CAC7F,GAAI,EAAU,SAAW,EAAa,EACrC,MAAU,MAAM,uCAAuC,EAExD,OAAO,EAAS,CAAC,EAAQ,EAAU,MAAM,EAAG,CAAU,CAAC,EAAG,EAAQ,EAAU,MAAM,CAAU,CAAC,CAAC,CAAC,CAChG,CAQA,SAAgB,EACf,EACA,EACyB,CAEzB,GAAI,EAAU,KAAO,GACpB,GAAI,CACH,OAAO,EAAuB,EAAW,CAAU,CACpD,MAAQ,CAER,CAGD,GAAI,CACH,OAAO,EAAuB,EAAW,CAAU,CACpD,MAAQ,CACP,MACD,CACD,CAGA,SAAgB,EACf,EACA,EACA,EACa,CACb,GAAI,EAAK,OAAS,GAAc,EAAM,OAAS,EAC9C,MAAU,MAAM,mCAAmC,EAEpD,IAAM,EAAM,IAAI,WAAW,EAAa,CAAC,EAGzC,OAFA,EAAI,IAAI,EAAM,EAAa,EAAK,MAAM,EACtC,EAAI,IAAI,EAAO,EAAI,OAAS,EAAM,MAAM,EACjC,CACR,CAGA,SAAS,EAAgB,EAA+B,CACvD,IAAI,EAAQ,EACZ,KAAO,EAAQ,EAAM,OAAS,GAAK,EAAM,KAAW,GACnD,GAAS,EAEV,OAAO,EAAM,MAAM,CAAK,CACzB"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){return(e<<t|e>>>32-t)>>>0}function t(e,t){let n=BigInt(e.length)*8n,r=new Uint8Array(Math.ceil((e.length+1+8)/64)*64);return r.set(e),r[e.length]=128,new DataView(r.buffer,r.byteOffset,r.byteLength).setBigUint64(r.length-8,n,t),r}function n(e,t){let n=e[t];if(n===void 0)throw RangeError(`table index ${t}`);return n}function r(e,t){let n=e[t];if(n===void 0)throw RangeError(`word index ${t}`);return n}const i=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21],a=[3614090360,3905402710,606105819,3250441966,4118548399,1200080426,2821735955,4249261313,1770035416,2336552879,4294925233,2304563134,1804603682,4254626195,2792965006,1236535329,4129170786,3225465664,643717713,3921069994,3593408605,38016083,3634488961,3889429448,568446438,3275163606,4107603335,1163531501,2850285829,4243563512,1735328473,2368359562,4294588738,2272392833,1839030562,4259657740,2763975236,1272893353,4139469664,3200236656,681279174,3936430074,3572445317,76029189,3654602809,3873151461,530742520,3299628645,4096336452,1126891415,2878612391,4237533241,1700485571,2399980690,4293915773,2240044497,1873313359,4264355552,2734768916,1309151649,4149444226,3174756917,718787259,3951481745];function o(o){let s=t(o,!0),[c,l,u,d]=[1732584193,4023233417,2562383102,271733878],f=new Uint32Array(16);for(let t=0;t<s.length;t+=64){let o=new DataView(s.buffer,s.byteOffset+t,64);for(let e=0;e<16;e++)f[e]=o.getUint32(e*4,!0);let[p,m,h,g]=[c,l,u,d];for(let t=0;t<64;t++){let o,s;t<16?(o=(m&h|~m&g)>>>0,s=t):t<32?(o=(g&m|~g&h)>>>0,s=5*t+1&15):t<48?(o=(m^h^g)>>>0,s=3*t+5&15):(o=(h^(m|~g))>>>0,s=7*t&15),o=o+p+n(a,t)+r(f,s)>>>0;let c=g;g=h,h=m,m=m+e(o,n(i,t))>>>0,p=c}c=c+p>>>0,l=l+m>>>0,u=u+h>>>0,d=d+g>>>0}let p=new Uint8Array(16),m=new DataView(p.buffer,p.byteOffset,p.byteLength);return m.setUint32(0,c,!0),m.setUint32(4,l,!0),m.setUint32(8,u,!0),m.setUint32(12,d,!0),p}function s(n){let i=t(n,!1),[a,o,s,c,l]=[1732584193,4023233417,2562383102,271733878,3285377520],u=new Uint32Array(80),d=new DataView(i.buffer,i.byteOffset,i.byteLength);for(let t=0;t<i.length;t+=64){for(let e=0;e<16;e++)u[e]=d.getUint32(t+e*4,!1);for(let t=16;t<80;t++)u[t]=e(r(u,t-3)^r(u,t-8)^r(u,t-14)^r(u,t-16),1);let[n,i,f,p,m]=[a,o,s,c,l];for(let t=0;t<80;t++){let a,o;t<=19?(a=(i&f|~i&p)>>>0,o=1518500249):t<=39?(a=(i^f^p)>>>0,o=1859775393):t<=59?(a=(i&f|i&p|f&p)>>>0,o=2400959708):(a=(i^f^p)>>>0,o=3395469782);let s=e(n,5)+a+m+o+r(u,t)>>>0;m=p,p=f,f=e(i,30),i=n,n=s}a=a+n>>>0,o=o+i>>>0,s=s+f>>>0,c=c+p>>>0,l=l+m>>>0}let f=new Uint8Array(20),p=new DataView(f.buffer,f.byteOffset,f.byteLength);return p.setUint32(0,a,!1),p.setUint32(4,o,!1),p.setUint32(8,s,!1),p.setUint32(12,c,!1),p.setUint32(16,l,!1),f}export{o as md5,s as sha1};
2
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","names":[],"sources":["../../../src/internal/crypto/hash.ts"],"sourcesContent":["/**\n * Synchronous digest implementations for MD5 and SHA-1, used where WebCrypto's\n * async API is impractical (e.g. `EVP_BytesToKey` key derivation, PKCS#12 MAC).\n *\n * @module\n */\n\n// ── Shared Merkle–Damgård primitives ──────────────────────────────\n\n/** Unsigned 32-bit left-rotate. */\nfunction rotl(x: number, n: number): number {\n\treturn ((x << n) | (x >>> (32 - n))) >>> 0;\n}\n\n/**\n * Merkle–Damgård padding: append 0x80, zero-pad to 56 mod 64,\n * append original bit-length as 64-bit integer.\n */\nfunction mdPad(data: Uint8Array, littleEndian: boolean): Uint8Array {\n\tconst bitLen = BigInt(data.length) * 8n;\n\tconst padded = new Uint8Array(Math.ceil((data.length + 1 + 8) / 64) * 64);\n\tpadded.set(data);\n\tpadded[data.length] = 0x80;\n\tconst view = new DataView(padded.buffer, padded.byteOffset, padded.byteLength);\n\tview.setBigUint64(padded.length - 8, bitLen, littleEndian);\n\treturn padded;\n}\n\n/** Bounds-checked read from a readonly number table. */\nfunction tbl(arr: readonly number[], i: number): number {\n\tconst v = arr[i];\n\tif (v === undefined) throw new RangeError(`table index ${i}`);\n\treturn v;\n}\n\n/** Bounds-checked read from a Uint32Array. */\nfunction w32(arr: Uint32Array, i: number): number {\n\tconst v = arr[i];\n\tif (v === undefined) throw new RangeError(`word index ${i}`);\n\treturn v;\n}\n\n// ── MD5 (RFC 1321) ───────────────────────────────────────────────\n\n/** Per-round left-rotate amounts for MD5 (RFC 1321 §3.4). */\nconst MD5_S = /* dprint-ignore */ [\n\t7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14,\n\t20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6,\n\t10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n] as const satisfies readonly number[];\n\n/** Pre-computed sine-derived constants for MD5 (RFC 1321 §3.4). */\nconst MD5_K = /* dprint-ignore */ [\n\t0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\n\t0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\n\t0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\n\t0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\n\t0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\n\t0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\n\t0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\n\t0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,\n] as const satisfies readonly number[];\n\n/** Compute a 16-byte MD5 digest (RFC 1321). Used by `EVP_BytesToKey` key derivation. */\nexport function md5(data: Uint8Array): Uint8Array<ArrayBuffer> {\n\tconst padded = mdPad(data, true);\n\n\tlet [a0, b0, c0, d0] = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];\n\n\tconst M = new Uint32Array(16);\n\n\tfor (let offset = 0; offset < padded.length; offset += 64) {\n\t\tconst view = new DataView(padded.buffer, padded.byteOffset + offset, 64);\n\t\tfor (let j = 0; j < 16; j++) {\n\t\t\tM[j] = view.getUint32(j * 4, true);\n\t\t}\n\n\t\tlet [A, B, C, D] = [a0, b0, c0, d0];\n\n\t\tfor (let i = 0; i < 64; i++) {\n\t\t\tlet F: number;\n\t\t\tlet g: number;\n\n\t\t\tif (i < 16) {\n\t\t\t\tF = ((B & C) | (~B & D)) >>> 0;\n\t\t\t\tg = i;\n\t\t\t} else if (i < 32) {\n\t\t\t\tF = ((D & B) | (~D & C)) >>> 0;\n\t\t\t\tg = (5 * i + 1) & 15;\n\t\t\t} else if (i < 48) {\n\t\t\t\tF = (B ^ C ^ D) >>> 0;\n\t\t\t\tg = (3 * i + 5) & 15;\n\t\t\t} else {\n\t\t\t\tF = (C ^ (B | ~D)) >>> 0;\n\t\t\t\tg = (7 * i) & 15;\n\t\t\t}\n\n\t\t\tF = (F + A + tbl(MD5_K, i) + w32(M, g)) >>> 0;\n\t\t\tconst oldD = D;\n\t\t\tD = C;\n\t\t\tC = B;\n\t\t\tB = (B + rotl(F, tbl(MD5_S, i))) >>> 0;\n\t\t\tA = oldD;\n\t\t}\n\n\t\ta0 = (a0 + A) >>> 0;\n\t\tb0 = (b0 + B) >>> 0;\n\t\tc0 = (c0 + C) >>> 0;\n\t\td0 = (d0 + D) >>> 0;\n\t}\n\n\tconst out = new Uint8Array(16);\n\tconst dv = new DataView(out.buffer, out.byteOffset, out.byteLength);\n\tdv.setUint32(0, a0, true);\n\tdv.setUint32(4, b0, true);\n\tdv.setUint32(8, c0, true);\n\tdv.setUint32(12, d0, true);\n\treturn out;\n}\n\n// ── SHA-1 (RFC 3174) ─────────────────────────────────────────────\n\n/** Compute a 20-byte SHA-1 digest (RFC 3174). Used by PKCS#12 MAC verification. */\nexport function sha1(data: Uint8Array): Uint8Array<ArrayBuffer> {\n\tconst padded = mdPad(data, false);\n\n\tlet [h0, h1, h2, h3, h4] = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n\tconst W = new Uint32Array(80);\n\tconst pv = new DataView(padded.buffer, padded.byteOffset, padded.byteLength);\n\n\tfor (let off = 0; off < padded.length; off += 64) {\n\t\tfor (let i = 0; i < 16; i++) {\n\t\t\tW[i] = pv.getUint32(off + i * 4, false);\n\t\t}\n\t\tfor (let i = 16; i < 80; i++) {\n\t\t\tW[i] = rotl(w32(W, i - 3) ^ w32(W, i - 8) ^ w32(W, i - 14) ^ w32(W, i - 16), 1);\n\t\t}\n\n\t\tlet [a, b, c, d, e] = [h0, h1, h2, h3, h4];\n\n\t\tfor (let i = 0; i < 80; i++) {\n\t\t\tlet f: number;\n\t\t\tlet k: number;\n\n\t\t\tif (i <= 19) {\n\t\t\t\tf = ((b & c) | (~b & d)) >>> 0;\n\t\t\t\tk = 0x5a827999;\n\t\t\t} else if (i <= 39) {\n\t\t\t\tf = (b ^ c ^ d) >>> 0;\n\t\t\t\tk = 0x6ed9eba1;\n\t\t\t} else if (i <= 59) {\n\t\t\t\tf = ((b & c) | (b & d) | (c & d)) >>> 0;\n\t\t\t\tk = 0x8f1bbcdc;\n\t\t\t} else {\n\t\t\t\tf = (b ^ c ^ d) >>> 0;\n\t\t\t\tk = 0xca62c1d6;\n\t\t\t}\n\n\t\t\tconst temp = (rotl(a, 5) + f + e + k + w32(W, i)) >>> 0;\n\t\t\te = d;\n\t\t\td = c;\n\t\t\tc = rotl(b, 30);\n\t\t\tb = a;\n\t\t\ta = temp;\n\t\t}\n\n\t\th0 = (h0 + a) >>> 0;\n\t\th1 = (h1 + b) >>> 0;\n\t\th2 = (h2 + c) >>> 0;\n\t\th3 = (h3 + d) >>> 0;\n\t\th4 = (h4 + e) >>> 0;\n\t}\n\n\tconst out = new Uint8Array(20);\n\tconst dv = new DataView(out.buffer, out.byteOffset, out.byteLength);\n\tdv.setUint32(0, h0, false);\n\tdv.setUint32(4, h1, false);\n\tdv.setUint32(8, h2, false);\n\tdv.setUint32(12, h3, false);\n\tdv.setUint32(16, h4, false);\n\treturn out;\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ //#region src/internal/crypto/pbes2.d.ts
2
+ /** AES-CBC key sizes supported by this PBES2 implementation. */
3
+ type Pbes2EncryptionScheme = "aes128-cbc" | "aes192-cbc" | "aes256-cbc";
4
+ /** PBKDF2 pseudo-random function choices. `hmac-sha1` is the RFC default; `hmac-sha256` is preferred. */
5
+ type Pbes2Prf = "hmac-sha1" | "hmac-sha256";
6
+ /** Input for `encryptPbes2`. */
7
+ interface Pbes2EncryptionOptions {
8
+ /** Password fed to PBKDF2 for key derivation. */
9
+ readonly password: string;
10
+ /** PBKDF2 iteration count. Default: `100_000`. */
11
+ readonly iterations?: number;
12
+ /** PBKDF2 salt. Default: 16 cryptographically random bytes. */
13
+ readonly salt?: Uint8Array;
14
+ /** AES-CBC initialization vector. Default: 16 cryptographically random bytes. */
15
+ readonly iv?: Uint8Array;
16
+ /** AES key size. Default: `'aes256-cbc'`. */
17
+ readonly encryption?: Pbes2EncryptionScheme;
18
+ /** PBKDF2 PRF. Default: `'hmac-sha256'`. */
19
+ readonly prf?: Pbes2Prf;
20
+ }
21
+ //#endregion
22
+ export { Pbes2EncryptionOptions, Pbes2EncryptionScheme, Pbes2Prf };
23
+ //# sourceMappingURL=pbes2.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{integerFromNumber as e,nullValue as t,objectIdentifier as n,octetString as r,readSequenceChildren as i,sequence as a}from"../asn1/der.js";import{decodeIntegerNumber as o,decodeObjectIdentifier as s,toArrayBuffer as c}from"../asn1/asn1.js";import{OIDS as l}from"../asn1/oids.js";import{getCrypto as u}from"./webcrypto.js";async function d(e,t){let n=t.iterations??1e5,r=t.salt??u().getRandomValues(new Uint8Array(16)),i=t.iv??u().getRandomValues(new Uint8Array(16)),a=t.encryption??`aes256-cbc`,o=t.prf??`hmac-sha256`;if(!Number.isInteger(n)||n<1)throw RangeError(`Invalid iterations: must be an integer >= 1, got ${n}`);if(!(r instanceof Uint8Array)||r.length<8)throw TypeError(`Invalid salt: must be Uint8Array with length >= 8, got length ${r.length}`);if(!(i instanceof Uint8Array)||i.length!==16)throw TypeError(`Invalid IV: must be Uint8Array of exactly 16 bytes, got length ${i.length}`);let s=await h(t.password,r,n,a,o,[`encrypt`]),l=new Uint8Array(await u().subtle.encrypt({name:`AES-CBC`,iv:c(i)},s,c(e)));return{algorithmIdentifierDer:p({iterations:n,salt:r,iv:i,encryption:a,prf:o}),encryptedData:l,parameters:{iterations:n,salt:r,iv:i,encryption:a,prf:o}}}async function f(e,t,n){let r=m(e),i=await h(n,r.salt,r.iterations,r.encryption,r.prf,[`decrypt`]);try{return new Uint8Array(await u().subtle.decrypt({name:`AES-CBC`,iv:c(r.iv)},i,c(t)))}catch{throw Error(`Invalid password or encrypted content`)}}function p(i){let o=y(i.encryption),s=b(i.prf);return a([n(l.pbes2),a([a([n(l.pbkdf2),a([r(i.salt),e(i.iterations),e(o.keyLengthBytes),a([n(s.oid),t()])])]),a([n(o.oid),r(i.iv)])])])}function m(e){let t=i(e),n=t[0],r=t[1];if(n===void 0||r===void 0)throw Error(`Malformed PBES2 algorithm identifier`);if(s(n.value)!==l.pbes2)throw Error(`Unsupported encryption algorithm`);let a=e.slice(r.start-r.headerLength,r.end),c=i(a),u=c[0],d=c[1];if(u===void 0||d===void 0)throw Error(`Malformed PBES2 params`);let f=a.slice(u.start-u.headerLength,u.end),p=i(f),m=p[0],h=p[1];if(m===void 0||h===void 0)throw Error(`Malformed KDF params`);if(s(m.value)!==l.pbkdf2)throw Error(`Unsupported KDF`);let v=f.slice(h.start-h.headerLength,h.end),y=i(v),b=y[0],x=y[1];if(b===void 0||x===void 0||b.tag!==4)throw Error(`Malformed PBKDF2 params`);let S=y[2],C=S?.tag===2,w=C?y[3]:S,T=i(a.slice(d.start-d.headerLength,d.end)),E=T[0],D=T[1];if(E===void 0||D===void 0||D.tag!==4)throw Error(`Malformed encryption scheme`);let O=_(s(E.value));if(O===void 0)throw Error(`Unsupported content encryption scheme`);if(S!==void 0&&!C&&S.tag!==48)throw Error(`Malformed PBKDF2 params`);if(C&&o(S.value)!==O.keyLengthBytes)throw Error(`Unsupported PBKDF2 key length`);let k=g(v,w),A=o(x.value),j=new Uint8Array(b.value),M=new Uint8Array(D.value);if(A<1)throw RangeError(`Invalid PBES2 iterations: must be >= 1, got ${A}`);if(j.length<8)throw RangeError(`Invalid PBES2 salt: must be >= 8 bytes, got ${j.length}`);if(M.length!==16)throw RangeError(`Invalid PBES2 IV: must be exactly 16 bytes, got ${M.length}`);return{salt:j,iterations:A,iv:M,encryption:O.name,prf:k}}async function h(e,t,n,r,i,a){let o=y(r),s=b(i),l=await u().subtle.importKey(`raw`,new TextEncoder().encode(e),`PBKDF2`,!1,[`deriveKey`]);return u().subtle.deriveKey({name:`PBKDF2`,salt:c(t),iterations:n,hash:s.hash},l,{name:`AES-CBC`,length:o.keyLengthBits},!1,a)}function g(e,t){if(t===void 0)return`hmac-sha1`;if(t.tag!==48)throw Error(`Malformed PBKDF2 PRF`);let n=i(e.slice(t.start-t.headerLength,t.end))[0];if(n===void 0)throw Error(`Malformed PBKDF2 PRF`);let r=v(s(n.value));if(r===void 0)throw Error(`Unsupported PBKDF2 PRF`);return r}function _(e){switch(e){case l.aes128Cbc:return{name:`aes128-cbc`,oid:e,keyLengthBits:128,keyLengthBytes:16};case l.aes192Cbc:return{name:`aes192-cbc`,oid:e,keyLengthBits:192,keyLengthBytes:24};case l.aes256Cbc:return{name:`aes256-cbc`,oid:e,keyLengthBits:256,keyLengthBytes:32}}}function v(e){switch(e){case l.hmacWithSHA1:return`hmac-sha1`;case l.hmacWithSHA256:return`hmac-sha256`}}function y(e){let t=_(e===`aes128-cbc`?l.aes128Cbc:e===`aes192-cbc`?l.aes192Cbc:l.aes256Cbc);if(t===void 0)throw Error(`Unsupported content encryption scheme`);return t}function b(e){switch(e){case`hmac-sha1`:return{oid:l.hmacWithSHA1,hash:`SHA-1`};case`hmac-sha256`:return{oid:l.hmacWithSHA256,hash:`SHA-256`}}}export{f as decryptPbes2,p as encodePbes2AlgorithmIdentifier,d as encryptPbes2,m as parsePbes2AlgorithmIdentifier};
2
+ //# sourceMappingURL=pbes2.js.map