@blamejs/pki 0.4.15 → 0.5.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 (59) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/MIGRATING.md +2 -2
  3. package/README.md +142 -137
  4. package/index.js +4 -0
  5. package/lib/acme.js +73 -1
  6. package/lib/asn1-der.js +2 -0
  7. package/lib/attrcert-sign.js +4 -0
  8. package/lib/cbor-det.js +32 -16
  9. package/lib/cmc-build.js +880 -0
  10. package/lib/cmc-verify.js +657 -0
  11. package/lib/cmp-build.js +8 -7
  12. package/lib/cmp-verify.js +11 -1
  13. package/lib/cms-sign.js +170 -8
  14. package/lib/cms-verify.js +80 -14
  15. package/lib/crl-sign.js +22 -0
  16. package/lib/crmf-sign.js +5 -2
  17. package/lib/csr-sign.js +3 -0
  18. package/lib/ct.js +72 -0
  19. package/lib/est.js +828 -32
  20. package/lib/framework-error.js +13 -0
  21. package/lib/guard-bytes.js +37 -1
  22. package/lib/guard-range.js +23 -1
  23. package/lib/http-transport.js +9 -3
  24. package/lib/inspect.js +28 -5
  25. package/lib/jose.js +15 -0
  26. package/lib/lint.js +4 -0
  27. package/lib/merkle.js +5 -5
  28. package/lib/ocsp.js +139 -11
  29. package/lib/oid.js +69 -1
  30. package/lib/path-validate.js +27 -4
  31. package/lib/pkcs12-build.js +12 -0
  32. package/lib/schema-all.js +19 -1
  33. package/lib/schema-attrcert.js +27 -0
  34. package/lib/schema-c509.js +6 -0
  35. package/lib/schema-cmc.js +791 -0
  36. package/lib/schema-cmp.js +25 -0
  37. package/lib/schema-cms.js +17 -1
  38. package/lib/schema-crl.js +23 -1
  39. package/lib/schema-crmf.js +13 -0
  40. package/lib/schema-csr.js +11 -0
  41. package/lib/schema-csrattrs.js +6 -0
  42. package/lib/schema-engine.js +6 -2
  43. package/lib/schema-ocsp.js +41 -0
  44. package/lib/schema-pkcs12.js +16 -0
  45. package/lib/schema-pkcs8.js +8 -0
  46. package/lib/schema-smime.js +4 -4
  47. package/lib/schema-tsp.js +32 -1
  48. package/lib/schema-x509.js +14 -1
  49. package/lib/shbs.js +12 -4
  50. package/lib/sigstore.js +4 -0
  51. package/lib/smime.js +28 -7
  52. package/lib/tls-cert-compress.js +15 -3
  53. package/lib/trust.js +27 -4
  54. package/lib/tsp-sign.js +41 -6
  55. package/lib/vendor/README.md +19 -19
  56. package/lib/webauthn.js +895 -26
  57. package/lib/x509-sign.js +3 -0
  58. package/package.json +1 -1
  59. package/sbom.cdx.json +6 -6
package/lib/schema-cmp.js CHANGED
@@ -881,6 +881,14 @@ var PKI_MESSAGE = schema.seq([
881
881
  * `crmf/*` code -- all `PkiError` subclasses.
882
882
  *
883
883
  * @example
884
+ * var pair = await pki.key.generate("Ed25519");
885
+ * var key = await pki.key.export(pair.privateKey);
886
+ * var cert = await pki.x509.sign({ subject: "client", subjectPublicKey: await pki.key.export(pair.publicKey),
887
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
888
+ * var csrDer = await pki.csr.sign({ subject: "client", subjectPublicKey: await pki.key.export(pair.publicKey) }, { key: key });
889
+ * var der = await pki.cmp.build(
890
+ * { header: { sender: { directoryName: "CN=client" }, recipient: { directoryName: "CN=CA" } },
891
+ * body: { p10cr: csrDer } }, { key: key, cert: cert });
884
892
  * var m = pki.schema.cmp.parse(der);
885
893
  * m.body.arm; // "ir", "ip", "error", ...
886
894
  * m.header.transactionID; // raw Buffer or null
@@ -903,6 +911,15 @@ var parse = pkix.makeParser({
903
911
  * messages that transit text channels.
904
912
  *
905
913
  * @example
914
+ * var pair = await pki.key.generate("Ed25519");
915
+ * var key = await pki.key.export(pair.privateKey);
916
+ * var cert = await pki.x509.sign({ subject: "client", subjectPublicKey: await pki.key.export(pair.publicKey),
917
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
918
+ * var csrDer = await pki.csr.sign({ subject: "client", subjectPublicKey: await pki.key.export(pair.publicKey) }, { key: key });
919
+ * var msg = await pki.cmp.build(
920
+ * { header: { sender: { directoryName: "CN=client" }, recipient: { directoryName: "CN=CA" } },
921
+ * body: { p10cr: csrDer } }, { key: key, cert: cert });
922
+ * var pemText = pki.schema.cmp.pemEncode(msg);
906
923
  * var der = pki.schema.cmp.pemDecode(pemText);
907
924
  */
908
925
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "CMP", PemError); }
@@ -918,6 +935,14 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "CMP", Pe
918
935
  * Wrap DER bytes in a PEM envelope (default label `CMP`).
919
936
  *
920
937
  * @example
938
+ * var pair = await pki.key.generate("Ed25519");
939
+ * var key = await pki.key.export(pair.privateKey);
940
+ * var cert = await pki.x509.sign({ subject: "client", subjectPublicKey: await pki.key.export(pair.publicKey),
941
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
942
+ * var csrDer = await pki.csr.sign({ subject: "client", subjectPublicKey: await pki.key.export(pair.publicKey) }, { key: key });
943
+ * var der = await pki.cmp.build(
944
+ * { header: { sender: { directoryName: "CN=client" }, recipient: { directoryName: "CN=CA" } },
945
+ * body: { p10cr: csrDer } }, { key: key, cert: cert });
921
946
  * var pem = pki.schema.cmp.pemEncode(der);
922
947
  */
923
948
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "CMP", PemError); }
package/lib/schema-cms.js CHANGED
@@ -1140,8 +1140,14 @@ var CONTENT_INFO = schema.seq([
1140
1140
  * `asn1/*`.
1141
1141
  *
1142
1142
  * @example
1143
+ * var pair = await pki.key.generate("Ed25519");
1144
+ * var key = await pki.key.export(pair.privateKey);
1145
+ * var cert = await pki.x509.sign({ subject: "Signer", subjectPublicKey: await pki.key.export(pair.publicKey),
1146
+ * serialNumber: 0x0a1bn, notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
1147
+ * { key: key });
1148
+ * var der = await pki.cms.sign(Buffer.from("hello"), { cert: cert, key: key });
1143
1149
  * var cms = pki.schema.cms.parse(der);
1144
- * cms.signerInfos[0].sid.serialNumberHex; // -> "0a1b..."
1150
+ * cms.signerInfos[0].sid.serialNumberHex; // -> "0a1b"
1145
1151
  * cms.encapContentInfo.eContent; // -> Buffer | null (detached)
1146
1152
  */
1147
1153
  var parse = pkix.makeParser({ pemLabel: "CMS", PemError: PemError, ErrorClass: CmsError, prefix: "cms", what: "CMS ContentInfo", topSchema: CONTENT_INFO, ns: NS });
@@ -1158,6 +1164,11 @@ var parse = pkix.makeParser({ pemLabel: "CMS", PemError: PemError, ErrorClass: C
1158
1164
  * `PemError` on a missing / mismatched envelope or a non-base64 body.
1159
1165
  *
1160
1166
  * @example
1167
+ * var pair = await pki.key.generate("Ed25519");
1168
+ * var key = await pki.key.export(pair.privateKey);
1169
+ * var cert = await pki.x509.sign({ subject: "Signer", subjectPublicKey: await pki.key.export(pair.publicKey),
1170
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
1171
+ * var pemText = await pki.cms.sign(Buffer.from("hello"), { cert: cert, key: key }, { pem: true });
1161
1172
  * var der = pki.schema.cms.pemDecode(pemText);
1162
1173
  */
1163
1174
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "CMS", PemError); }
@@ -1173,6 +1184,11 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "CMS", Pe
1173
1184
  * Wrap DER bytes in a PEM CMS envelope (default label `CMS`).
1174
1185
  *
1175
1186
  * @example
1187
+ * var pair = await pki.key.generate("Ed25519");
1188
+ * var key = await pki.key.export(pair.privateKey);
1189
+ * var cert = await pki.x509.sign({ subject: "Signer", subjectPublicKey: await pki.key.export(pair.publicKey),
1190
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
1191
+ * var der = await pki.cms.sign(Buffer.from("hello"), { cert: cert, key: key });
1176
1192
  * var pem = pki.schema.cms.pemEncode(der);
1177
1193
  */
1178
1194
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "CMS", PemError); }
package/lib/schema-crl.js CHANGED
@@ -206,8 +206,16 @@ var CERTIFICATE_LIST = pkix.signedEnvelope(NS, TBS_CERTLIST, {
206
206
  * typed `CrlError` (`crl/*`) and a leaf-level codec fault surfaces as `asn1/*`.
207
207
  *
208
208
  * @example
209
+ * var pair = await pki.key.generate("Ed25519");
210
+ * var key = await pki.key.export(pair.privateKey);
211
+ * var caCert = await pki.x509.sign({ subject: "Issuing CA", subjectPublicKey: await pki.key.export(pair.publicKey),
212
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
213
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["keyCertSign", "cRLSign"] } }, { key: key });
214
+ * var der = await pki.crl.sign({ thisUpdate: new Date("2026-01-01T00:00:00Z"), crlNumber: 1n,
215
+ * revoked: [{ serialNumber: 0x0a3fn, revocationDate: new Date("2026-01-15T00:00:00Z") }] },
216
+ * { cert: caCert, key: key });
209
217
  * var crl = pki.schema.crl.parse(der);
210
- * crl.revokedCertificates[0].serialNumberHex; // -> "0a3f..."
218
+ * crl.revokedCertificates[0].serialNumberHex; // -> "0a3f"
211
219
  */
212
220
  var parse = pkix.makeParser({ pemLabel: "X509 CRL", PemError: PemError, ErrorClass: CrlError, prefix: "crl", what: "CRL", topSchema: CERTIFICATE_LIST, ns: NS });
213
221
 
@@ -223,6 +231,13 @@ var parse = pkix.makeParser({ pemLabel: "X509 CRL", PemError: PemError, ErrorCla
223
231
  * `PemError` on a missing / mismatched envelope or a non-base64 body.
224
232
  *
225
233
  * @example
234
+ * var pair = await pki.key.generate("Ed25519");
235
+ * var key = await pki.key.export(pair.privateKey);
236
+ * var caCert = await pki.x509.sign({ subject: "Issuing CA", subjectPublicKey: await pki.key.export(pair.publicKey),
237
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
238
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["cRLSign"] } }, { key: key });
239
+ * var pemText = await pki.crl.sign({ thisUpdate: new Date("2026-01-01T00:00:00Z"), crlNumber: 1n, revoked: [] },
240
+ * { cert: caCert, key: key }, { pem: true });
226
241
  * var der = pki.schema.crl.pemDecode(pemText);
227
242
  */
228
243
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "X509 CRL", PemError); }
@@ -239,6 +254,13 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "X509 CRL
239
254
  * label `X509 CRL`, the RFC 7468 sec. 6 armor `pemDecode` expects back).
240
255
  *
241
256
  * @example
257
+ * var pair = await pki.key.generate("Ed25519");
258
+ * var key = await pki.key.export(pair.privateKey);
259
+ * var caCert = await pki.x509.sign({ subject: "Issuing CA", subjectPublicKey: await pki.key.export(pair.publicKey),
260
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
261
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["cRLSign"] } }, { key: key });
262
+ * var der = await pki.crl.sign({ thisUpdate: new Date("2026-01-01T00:00:00Z"), crlNumber: 1n, revoked: [] },
263
+ * { cert: caCert, key: key });
242
264
  * var pem = pki.schema.crl.pemEncode(der);
243
265
  */
244
266
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "X509 CRL", PemError); }
@@ -482,6 +482,10 @@ var CERT_REQ_MESSAGES = schema.seqOf(CERT_REQ_MSG, {
482
482
  * `Asn1Error` when the underlying DER is malformed.
483
483
  *
484
484
  * @example
485
+ * var pair = await pki.key.generate("Ed25519");
486
+ * var der = await pki.crmf.build(
487
+ * { certReqId: 0, certTemplate: { subject: "req.example", publicKey: await pki.key.export(pair.publicKey) } },
488
+ * { key: await pki.key.export(pair.privateKey) });
485
489
  * var m = pki.schema.crmf.parse(der);
486
490
  * m.messages[0].certReq.certTemplate.subject.dn; // "CN=req.example"
487
491
  */
@@ -503,6 +507,11 @@ var parse = pkix.makeParser({
503
507
  * DER in practice). Throws `PemError` on a missing envelope or a non-base64 body.
504
508
  *
505
509
  * @example
510
+ * var pair = await pki.key.generate("Ed25519");
511
+ * var msg = await pki.crmf.build(
512
+ * { certReqId: 0, certTemplate: { subject: "req.example", publicKey: await pki.key.export(pair.publicKey) } },
513
+ * { key: await pki.key.export(pair.privateKey) });
514
+ * var pemText = pki.schema.crmf.pemEncode(msg, "CERT REQUEST MESSAGES");
506
515
  * var der = pki.schema.crmf.pemDecode(pemText);
507
516
  */
508
517
  function pemDecode(text, label) { return pkix.pemDecode(text, label || null, PemError); }
@@ -520,6 +529,10 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || null, Pem
520
529
  * `pemDecode`, which accepts any label). Omitting it throws `pem/bad-label`.
521
530
  *
522
531
  * @example
532
+ * var pair = await pki.key.generate("Ed25519");
533
+ * var der = await pki.crmf.build(
534
+ * { certReqId: 0, certTemplate: { subject: "req.example", publicKey: await pki.key.export(pair.publicKey) } },
535
+ * { key: await pki.key.export(pair.privateKey) });
523
536
  * var pem = pki.schema.crmf.pemEncode(der, "CERT REQUEST MESSAGES");
524
537
  */
525
538
  function pemEncode(der, label) { return pkix.pemEncode(der, label, PemError); }
package/lib/schema-csr.js CHANGED
@@ -176,6 +176,11 @@ var CERTIFICATION_REQUEST = pkix.signedEnvelope(NS, CERTIFICATION_REQUEST_INFO,
176
176
  * certificate's extensions use).
177
177
  *
178
178
  * @example
179
+ * var pair = await pki.key.generate("Ed25519");
180
+ * var der = await pki.csr.sign(
181
+ * { subject: "req.example", subjectPublicKey: await pki.key.export(pair.publicKey),
182
+ * extensionRequest: { subjectAltName: [{ dNSName: "req.example" }] } },
183
+ * { key: await pki.key.export(pair.privateKey) });
179
184
  * var csr = pki.schema.csr.parse(der);
180
185
  * csr.subject.dn; // -> "CN=req.example"
181
186
  * csr.attributes[0].type; // -> "1.2.840.113549.1.9.14"
@@ -195,6 +200,9 @@ var parse = pkix.makeParser({ pemLabel: "CERTIFICATE REQUEST", PemError: PemErro
195
200
  * body.
196
201
  *
197
202
  * @example
203
+ * var pair = await pki.key.generate("Ed25519");
204
+ * var pemText = await pki.csr.sign({ subject: "req.example", subjectPublicKey: await pki.key.export(pair.publicKey) },
205
+ * { key: await pki.key.export(pair.privateKey) }, { pem: true });
198
206
  * var der = pki.schema.csr.pemDecode(pemText);
199
207
  */
200
208
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "CERTIFICATE REQUEST", PemError); }
@@ -210,6 +218,9 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "CERTIFIC
210
218
  * Wrap DER bytes in a PEM CSR envelope (default label `CERTIFICATE REQUEST`).
211
219
  *
212
220
  * @example
221
+ * var pair = await pki.key.generate("Ed25519");
222
+ * var der = await pki.csr.sign({ subject: "req.example", subjectPublicKey: await pki.key.export(pair.publicKey) },
223
+ * { key: await pki.key.export(pair.privateKey) });
213
224
  * var pem = pki.schema.csr.pemEncode(der);
214
225
  */
215
226
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "CERTIFICATE REQUEST", PemError); }
@@ -335,6 +335,12 @@ var CSR_ATTRS = schema.seqOf(ATTR_OR_OID, {
335
335
  * (`csrattrs/*`) and a leaf-level codec fault surfaces as `asn1/*`.
336
336
  *
337
337
  * @example
338
+ * // a CsrAttrs carrying one bare OID (challengePassword) and one Attribute
339
+ * var b = pki.asn1.build;
340
+ * var der = b.sequence([
341
+ * b.oid("1.2.840.113549.1.9.7"),
342
+ * b.sequence([b.oid("1.2.840.113549.1.1.1"), b.set([b.integer(2048n)])]),
343
+ * ]);
338
344
  * var a = pki.schema.csrattrs.parse(der);
339
345
  * a.items[0].kind; // -> "oid" | "attribute"
340
346
  */
@@ -271,6 +271,9 @@ function implicitSeqOf(tag, item, opts) {
271
271
  *
272
272
  * @example
273
273
  * var S = pki.schema.engine;
274
+ * // `E` is an error FACTORY (called without `new`), so a domain can raise its own type
275
+ * var MyError = function (code, msg) { var e = new Error(msg); e.code = code; return e; };
276
+ * var der = pki.asn1.build.sequence([pki.asn1.build.oid("1.3.101.112")]);
274
277
  * var ALGID = S.seq([S.field("algorithm", S.oidLeaf())],
275
278
  * { assert: "sequence", arity: { min: 1 }, code: "app/bad-alg" });
276
279
  * S.walk(ALGID, pki.asn1.decode(der), { prefix: "app", E: MyError, oid: pki.oid });
@@ -466,7 +469,7 @@ function _encFail(message) { throw new Error("schema.encode: " + message); }
466
469
  * @primitive pki.schema.engine.encode
467
470
  * @signature pki.schema.engine.encode(schema, value, ctx) -> Buffer
468
471
  * @since 0.1.17
469
- * @status experimental
472
+ * @status stable
470
473
  * @spec X.690, X.680
471
474
  * @related pki.schema.engine.walk
472
475
  *
@@ -589,7 +592,7 @@ function _encodeChoice(schema, value, ctx) {
589
592
  * @primitive pki.schema.engine.embeddedDer
590
593
  * @signature pki.schema.engine.embeddedDer(schema, bytes, ctx, opts?) -> value
591
594
  * @since 0.1.18
592
- * @status experimental
595
+ * @status stable
593
596
  * @spec X.690
594
597
  * @defends ASN.1-parser-DoS (CWE-400)
595
598
  * @related pki.schema.engine.walk, pki.asn1.decode
@@ -613,6 +616,7 @@ function _encodeChoice(schema, value, ctx) {
613
616
  *
614
617
  * @example
615
618
  * var S = pki.schema.engine;
619
+ * var MyError = function (code, msg) { var e = new Error(msg); e.code = code; return e; };
616
620
  * var INNER = S.seq([S.field("version", S.integerLeaf())], { code: "app/bad-inner" });
617
621
  * var ns = { prefix: "app", E: MyError, oid: pki.oid };
618
622
  * S.embeddedDer(INNER, pki.asn1.build.sequence([pki.asn1.build.integer(3n)]), ns,
@@ -469,6 +469,16 @@ var OCSP_REQUEST = schema.seq([
469
469
  * `asn1/*`.
470
470
  *
471
471
  * @example
472
+ * var ca = await pki.key.generate("Ed25519");
473
+ * var caKey = await pki.key.export(ca.privateKey);
474
+ * var caDer = await pki.x509.sign({ subject: "Example CA", subjectPublicKey: await pki.key.export(ca.publicKey),
475
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
476
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["keyCertSign"], subjectKeyIdentifier: true } }, { key: caKey });
477
+ * var leaf = await pki.key.generate("Ed25519");
478
+ * var leafDer = await pki.x509.sign({ subject: "leaf.example", subjectPublicKey: await pki.key.export(leaf.publicKey),
479
+ * serialNumber: 0x1332n, notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
480
+ * { cert: caDer, key: caKey });
481
+ * var der = await pki.ocsp.buildRequest({ cert: leafDer, issuer: caDer }, {});
472
482
  * var req = pki.schema.ocsp.parseRequest(der);
473
483
  * req.requestList[0].certID.serialNumberHex; // -> "1332"
474
484
  */
@@ -492,6 +502,17 @@ var parseRequest = pkix.makeParser({ pemLabel: "OCSP REQUEST", PemError: PemErro
492
502
  * `ocsp/unsupported-response-type`.
493
503
  *
494
504
  * @example
505
+ * var ca = await pki.key.generate("Ed25519");
506
+ * var caKey = await pki.key.export(ca.privateKey);
507
+ * var caDer = await pki.x509.sign({ subject: "Example CA", subjectPublicKey: await pki.key.export(ca.publicKey),
508
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
509
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["keyCertSign"], subjectKeyIdentifier: true } }, { key: caKey });
510
+ * var leaf = await pki.key.generate("Ed25519");
511
+ * var leafDer = await pki.x509.sign({ subject: "leaf.example", subjectPublicKey: await pki.key.export(leaf.publicKey),
512
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
513
+ * { cert: caDer, key: caKey });
514
+ * var der = await pki.ocsp.sign({ responderID: "byName", responses: [{ cert: leafDer, issuer: caDer, status: "good" }] },
515
+ * { cert: caDer, key: caKey });
495
516
  * var res = pki.schema.ocsp.parseResponse(der);
496
517
  * res.responseStatus.name; // -> "successful"
497
518
  * res.basicResponse.responses[0].certStatus.type; // -> "good" | "revoked" | "unknown"
@@ -511,6 +532,16 @@ var parseResponse = pkix.makeParser({ pemLabel: "OCSP RESPONSE", PemError: PemEr
511
532
  * envelope or a non-base64 body.
512
533
  *
513
534
  * @example
535
+ * var ca = await pki.key.generate("Ed25519");
536
+ * var caKey = await pki.key.export(ca.privateKey);
537
+ * var caDer = await pki.x509.sign({ subject: "Example CA", subjectPublicKey: await pki.key.export(ca.publicKey),
538
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
539
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["keyCertSign"], subjectKeyIdentifier: true } }, { key: caKey });
540
+ * var leaf = await pki.key.generate("Ed25519");
541
+ * var leafDer = await pki.x509.sign({ subject: "leaf.example", subjectPublicKey: await pki.key.export(leaf.publicKey),
542
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { cert: caDer, key: caKey });
543
+ * var reqDer = await pki.ocsp.buildRequest({ cert: leafDer, issuer: caDer }, {});
544
+ * var pemText = pki.schema.ocsp.pemEncode(reqDer, "OCSP REQUEST");
514
545
  * var der = pki.schema.ocsp.pemDecode(pemText, "OCSP REQUEST");
515
546
  */
516
547
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "OCSP RESPONSE", PemError); }
@@ -528,6 +559,16 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "OCSP RES
528
559
  * `PemError` on a malformed label.
529
560
  *
530
561
  * @example
562
+ * var ca = await pki.key.generate("Ed25519");
563
+ * var caKey = await pki.key.export(ca.privateKey);
564
+ * var caDer = await pki.x509.sign({ subject: "Example CA", subjectPublicKey: await pki.key.export(ca.publicKey),
565
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
566
+ * extensions: { basicConstraints: { cA: true }, keyUsage: ["keyCertSign"], subjectKeyIdentifier: true } }, { key: caKey });
567
+ * var leaf = await pki.key.generate("Ed25519");
568
+ * var leafDer = await pki.x509.sign({ subject: "leaf.example", subjectPublicKey: await pki.key.export(leaf.publicKey),
569
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { cert: caDer, key: caKey });
570
+ * var der = await pki.ocsp.sign({ responderID: "byName", responses: [{ cert: leafDer, issuer: caDer, status: "good" }] },
571
+ * { cert: caDer, key: caKey });
531
572
  * var pem = pki.schema.ocsp.pemEncode(der);
532
573
  */
533
574
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "OCSP RESPONSE", PemError); }
@@ -515,6 +515,11 @@ function _buildBag(rec, state, ctx) {
515
515
  * (`pkcs8/*`) -- all `PkiError` subclasses.
516
516
  *
517
517
  * @example
518
+ * var pair = await pki.key.generate("Ed25519");
519
+ * var key = await pki.key.export(pair.privateKey);
520
+ * var cert = await pki.x509.sign({ subject: "Signer", subjectPublicKey: await pki.key.export(pair.publicKey),
521
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
522
+ * var der = await pki.pkcs12.build({ key: key, cert: cert }, { password: "changeit" });
518
523
  * var store = pki.schema.pkcs12.parse(der);
519
524
  * store.safeBags.map(function (b) { return b.type; });
520
525
  */
@@ -536,6 +541,12 @@ var parse = pkix.makeParser({
536
541
  * convenience for stores that transit text channels.
537
542
  *
538
543
  * @example
544
+ * var pair = await pki.key.generate("Ed25519");
545
+ * var key = await pki.key.export(pair.privateKey);
546
+ * var cert = await pki.x509.sign({ subject: "Signer", subjectPublicKey: await pki.key.export(pair.publicKey),
547
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
548
+ * var p12 = await pki.pkcs12.build({ key: key, cert: cert }, { password: "changeit" });
549
+ * var pemText = pki.schema.pkcs12.pemEncode(p12);
539
550
  * var der = pki.schema.pkcs12.pemDecode(pemText);
540
551
  */
541
552
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "PKCS12", PemError); }
@@ -551,6 +562,11 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "PKCS12",
551
562
  * Wrap DER bytes in a PEM envelope (default label `PKCS12`).
552
563
  *
553
564
  * @example
565
+ * var pair = await pki.key.generate("Ed25519");
566
+ * var key = await pki.key.export(pair.privateKey);
567
+ * var cert = await pki.x509.sign({ subject: "Signer", subjectPublicKey: await pki.key.export(pair.publicKey),
568
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") }, { key: key });
569
+ * var der = await pki.pkcs12.build({ key: key, cert: cert }, { password: "changeit" });
554
570
  * var pem = pki.schema.pkcs12.pemEncode(der);
555
571
  */
556
572
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "PKCS12", PemError); }
@@ -114,6 +114,8 @@ var ENCRYPTED_PRIVATE_KEY_INFO = schema.seq([
114
114
  * and a leaf-level codec fault surfaces as `asn1/*`.
115
115
  *
116
116
  * @example
117
+ * var pair = await pki.key.generate("Ed25519");
118
+ * var der = await pki.key.export(pair.privateKey);
117
119
  * var key = pki.schema.pkcs8.parse(der);
118
120
  * key.privateKeyAlgorithm.oid; // -> "1.3.101.112" (Ed25519)
119
121
  * key.privateKey; // -> Buffer (the inner key encoding)
@@ -134,6 +136,8 @@ var parse = pkix.makeParser({ pemLabel: "PRIVATE KEY", PemError: PemError, Error
134
136
  * separate concern from structural validation.
135
137
  *
136
138
  * @example
139
+ * var pair = await pki.key.generate("Ed25519");
140
+ * var der = await pki.key.encrypt(await pki.key.export(pair.privateKey), "s3cr3t");
137
141
  * var enc = pki.schema.pkcs8.parseEncrypted(der);
138
142
  * enc.encryptionAlgorithm.oid; // -> "1.2.840.113549.1.5.13" (PBES2)
139
143
  */
@@ -152,6 +156,8 @@ var parseEncrypted = pkix.makeParser({ pemLabel: "ENCRYPTED PRIVATE KEY", PemErr
152
156
  * body.
153
157
  *
154
158
  * @example
159
+ * var pair = await pki.key.generate("Ed25519");
160
+ * var pemText = await pki.key.export(pair.privateKey, { format: "pem" });
155
161
  * var der = pki.schema.pkcs8.pemDecode(pemText);
156
162
  */
157
163
  function pemDecode(text, label) { return pkix.pemDecode(text, label || "PRIVATE KEY", PemError); }
@@ -167,6 +173,8 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || "PRIVATE
167
173
  * Wrap DER bytes in a PEM private-key envelope (default label `PRIVATE KEY`).
168
174
  *
169
175
  * @example
176
+ * var pair = await pki.key.generate("Ed25519");
177
+ * var der = await pki.key.export(pair.privateKey);
170
178
  * var pem = pki.schema.pkcs8.pemEncode(der);
171
179
  */
172
180
  function pemEncode(der, label) { return pkix.pemEncode(der, label || "PRIVATE KEY", PemError); }
@@ -237,7 +237,7 @@ var SMIME_CAPABILITIES = schema.seqOf(SMIME_CAPABILITY, {
237
237
  * @primitive pki.schema.smime.parseSigningCertificate
238
238
  * @signature pki.schema.smime.parseSigningCertificate(der) -> { certs, policies }
239
239
  * @since 0.1.22
240
- * @status experimental
240
+ * @status stable
241
241
  * @spec RFC 5035, RFC 2634
242
242
  * @related pki.schema.smime.parseSigningCertificateV2, pki.schema.smime.decodeAttribute
243
243
  *
@@ -262,7 +262,7 @@ var parseSigningCertificate = pkix.makeParser({ pemLabel: null, PemError: PemErr
262
262
  * @primitive pki.schema.smime.parseSigningCertificateV2
263
263
  * @signature pki.schema.smime.parseSigningCertificateV2(der) -> { certs, policies }
264
264
  * @since 0.1.22
265
- * @status experimental
265
+ * @status stable
266
266
  * @spec RFC 5035, RFC 5816
267
267
  * @related pki.schema.smime.parseSigningCertificate, pki.schema.smime.decodeAttribute
268
268
  *
@@ -286,7 +286,7 @@ var parseSigningCertificateV2 = pkix.makeParser({ pemLabel: null, PemError: PemE
286
286
  * @primitive pki.schema.smime.parseSmimeCapabilities
287
287
  * @signature pki.schema.smime.parseSmimeCapabilities(der) -> { capabilities }
288
288
  * @since 0.1.22
289
- * @status experimental
289
+ * @status stable
290
290
  * @spec RFC 8551
291
291
  * @related pki.schema.smime.decodeAttribute
292
292
  *
@@ -308,7 +308,7 @@ var parseSmimeCapabilities = pkix.makeParser({ pemLabel: null, PemError: PemErro
308
308
  * @primitive pki.schema.smime.decodeAttribute
309
309
  * @signature pki.schema.smime.decodeAttribute(attr) -> { kind, ... }
310
310
  * @since 0.1.22
311
- * @status experimental
311
+ * @status stable
312
312
  * @spec RFC 8551, RFC 5035
313
313
  * @related pki.schema.smime.parseSigningCertificate, pki.schema.cms.parse
314
314
  *
package/lib/schema-tsp.js CHANGED
@@ -313,7 +313,7 @@ var TIME_STAMP_REQ = schema.seq([
313
313
  * @primitive pki.schema.tsp.parseRequest
314
314
  * @signature pki.schema.tsp.parseRequest(input) -> timeStampReq
315
315
  * @since 0.2.19
316
- * @status experimental
316
+ * @status stable
317
317
  * @spec RFC 3161
318
318
  * @related pki.schema.tsp.parse, pki.tsp.request
319
319
  *
@@ -324,6 +324,8 @@ var TIME_STAMP_REQ = schema.seq([
324
324
  * is the raw digest. A malformed structure throws a typed `TspError`.
325
325
  *
326
326
  * @example
327
+ * var der = pki.tsp.request({ hashAlgorithm: "sha256", hashedMessage: Buffer.from(await pki.webcrypto.subtle.digest("SHA-256", Buffer.from("hello"))) },
328
+ * { certReq: true });
327
329
  * var req = pki.schema.tsp.parseRequest(der);
328
330
  * req.certReq; // -> boolean
329
331
  * req.messageImprint.hashedMessage; // -> Buffer (the raw digest)
@@ -346,6 +348,15 @@ var parseRequest = pkix.makeParser({ pemLabel: null, PemError: PemError, ErrorCl
346
348
  * `TspError` (`tsp/*`); a leaf-level codec fault surfaces as `asn1/*`.
347
349
  *
348
350
  * @example
351
+ * var pair = await pki.key.generate("Ed25519");
352
+ * var key = await pki.key.export(pair.privateKey);
353
+ * var cert = await pki.x509.sign({ subject: "Example TSA", subjectPublicKey: await pki.key.export(pair.publicKey),
354
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
355
+ * extensions: { keyUsage: ["digitalSignature"], extendedKeyUsage: ["timeStamping"], extendedKeyUsageCritical: true } },
356
+ * { key: key });
357
+ * var token = await pki.tsp.sign({ hashAlgorithm: "sha256", hashedMessage: Buffer.from(await pki.webcrypto.subtle.digest("SHA-256", Buffer.from("hello"))) },
358
+ * { cert: cert, key: key }, { policy: "1.3.6.1.4.1.1", serialNumber: 1 });
359
+ * var der = pki.schema.tsp.parseToken(token).eContent; // the raw TSTInfo the TSA signed
349
360
  * var tst = pki.schema.tsp.parseTstInfo(der);
350
361
  * tst.genTime; // -> Date
351
362
  * tst.messageImprint.hashedMessage; // -> Buffer (the raw digest)
@@ -367,6 +378,15 @@ var parseTstInfo = pkix.makeParser({ pemLabel: null, PemError: PemError, ErrorCl
367
378
  * `PKIFailureInfo` named bits. A malformed structure throws a typed `TspError`.
368
379
  *
369
380
  * @example
381
+ * var pair = await pki.key.generate("Ed25519");
382
+ * var key = await pki.key.export(pair.privateKey);
383
+ * var cert = await pki.x509.sign({ subject: "Example TSA", subjectPublicKey: await pki.key.export(pair.publicKey),
384
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
385
+ * extensions: { keyUsage: ["digitalSignature"], extendedKeyUsage: ["timeStamping"], extendedKeyUsageCritical: true } },
386
+ * { key: key });
387
+ * var token = await pki.tsp.sign({ hashAlgorithm: "sha256", hashedMessage: Buffer.from(await pki.webcrypto.subtle.digest("SHA-256", Buffer.from("hello"))) },
388
+ * { cert: cert, key: key }, { policy: "1.3.6.1.4.1.1", serialNumber: 1 });
389
+ * var der = pki.tsp.response(token, {});
370
390
  * var res = pki.schema.tsp.parse(der);
371
391
  * res.status; // -> 0 (granted)
372
392
  * res.timeStampToken.tstInfo.genTime; // -> Date (a granted token is decoded)
@@ -394,6 +414,14 @@ var parse = pkix.makeParser({ pemLabel: null, PemError: PemError, ErrorClass: Ts
394
414
  * material.
395
415
  *
396
416
  * @example
417
+ * var pair = await pki.key.generate("Ed25519");
418
+ * var key = await pki.key.export(pair.privateKey);
419
+ * var cert = await pki.x509.sign({ subject: "Example TSA", subjectPublicKey: await pki.key.export(pair.publicKey),
420
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z"),
421
+ * extensions: { keyUsage: ["digitalSignature"], extendedKeyUsage: ["timeStamping"], extendedKeyUsageCritical: true } },
422
+ * { key: key });
423
+ * var tokenDer = await pki.tsp.sign({ hashAlgorithm: "sha256", hashedMessage: Buffer.from(await pki.webcrypto.subtle.digest("SHA-256", Buffer.from("hello"))) },
424
+ * { cert: cert, key: key }, { policy: "1.3.6.1.4.1.1", serialNumber: 1 });
397
425
  * var token = pki.schema.tsp.parseToken(tokenDer);
398
426
  * token.tstInfo.genTime; // -> Date
399
427
  * token.signerInfo.sid; // -> the TSA signer identifier
@@ -466,6 +494,8 @@ function parseToken(input) {
466
494
  * envelope or a non-base64 body.
467
495
  *
468
496
  * @example
497
+ * var req = pki.tsp.request({ hashAlgorithm: "sha256", hashedMessage: Buffer.from(await pki.webcrypto.subtle.digest("SHA-256", Buffer.from("hello"))) }, {});
498
+ * var pemText = pki.schema.tsp.pemEncode(req, "TSP REQUEST");
469
499
  * var der = pki.schema.tsp.pemDecode(pemText);
470
500
  */
471
501
  // Decode a raw GeneralName TLV (the tsa field and the ESS issuerSerial issuer are surfaced raw) into
@@ -490,6 +520,7 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label || null, Pem
490
520
  * `pemDecode`, which accepts any label). Omitting it throws `pem/bad-label`.
491
521
  *
492
522
  * @example
523
+ * var der = pki.tsp.request({ hashAlgorithm: "sha256", hashedMessage: Buffer.from(await pki.webcrypto.subtle.digest("SHA-256", Buffer.from("hello"))) }, {});
493
524
  * var pem = pki.schema.tsp.pemEncode(der, "TSP RESPONSE");
494
525
  */
495
526
  function pemEncode(der, label) { return pkix.pemEncode(der, label, PemError); }
@@ -55,6 +55,10 @@ var PemError = frameworkError.PemError;
55
55
  * missing / mismatched envelope or a non-base64 body.
56
56
  *
57
57
  * @example
58
+ * var pair = await pki.key.generate("Ed25519");
59
+ * var pemText = await pki.x509.sign({ subject: "example.com", subjectPublicKey: await pki.key.export(pair.publicKey),
60
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
61
+ * { key: await pki.key.export(pair.privateKey) }, { pem: true });
58
62
  * var der = pki.schema.x509.pemDecode(pemText);
59
63
  */
60
64
  function pemDecode(text, label) { return pkix.pemDecode(text, label === null ? null : (label || "CERTIFICATE"), PemError); }
@@ -70,6 +74,10 @@ function pemDecode(text, label) { return pkix.pemDecode(text, label === null ? n
70
74
  * Wrap DER bytes in a PEM envelope with 64-column base64 lines.
71
75
  *
72
76
  * @example
77
+ * var pair = await pki.key.generate("Ed25519");
78
+ * var der = await pki.x509.sign({ subject: "example.com", subjectPublicKey: await pki.key.export(pair.publicKey),
79
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
80
+ * { key: await pki.key.export(pair.privateKey) });
73
81
  * var pem = pki.schema.x509.pemEncode(der, "CERTIFICATE");
74
82
  */
75
83
  function pemEncode(der, label) { return pkix.pemEncode(der, label, PemError); }
@@ -213,10 +221,15 @@ var CERTIFICATE = pkix.signedEnvelope(NS, CERTIFICATE_TBS, {
213
221
  * certificate and `Asn1Error` when the underlying DER is malformed.
214
222
  *
215
223
  * @example
224
+ * var pair = await pki.key.generate("Ed25519");
225
+ * var pemString = await pki.x509.sign({ subject: [{ commonName: "example.com" }, { organizationName: "Example" }],
226
+ * subjectPublicKey: await pki.key.export(pair.publicKey),
227
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
228
+ * { key: await pki.key.export(pair.privateKey) }, { pem: true });
216
229
  * var cert = pki.schema.x509.parse(pemString);
217
230
  * cert.subject.dn; // "CN=example.com, O=Example"
218
231
  * cert.validity.notAfter; // Date
219
- * cert.signatureAlgorithm.name; // "sha256WithRSAEncryption"
232
+ * cert.signatureAlgorithm.name; // "Ed25519" (the algorithm the issuer signed with)
220
233
  */
221
234
  var parse = pkix.makeParser({ pemLabel: "CERTIFICATE", PemError: PemError, ErrorClass: CertificateError, prefix: "x509", what: "certificate", topSchema: CERTIFICATE, ns: NS });
222
235
 
package/lib/shbs.js CHANGED
@@ -300,7 +300,7 @@ function _asBytes(x, label) { return guard.bytes.source(x, ShbsError, "shbs/bad-
300
300
  * @primitive pki.shbs.verify
301
301
  * @signature pki.shbs.verify(publicKey, message, signature) -> boolean
302
302
  * @since 0.2.1
303
- * @status experimental
303
+ * @status stable
304
304
  * @spec RFC 8554 sec. 6, RFC 9802, RFC 9708
305
305
  * @related pki.shbs.verifyLms
306
306
  *
@@ -315,6 +315,12 @@ function _asBytes(x, label) { return guard.bytes.source(x, ShbsError, "shbs/bad-
315
315
  * typed `ShbsError`. VERIFY ONLY -- this module never signs.
316
316
  *
317
317
  * @example
318
+ * // throws: shbs/bad-public-key -- an Ed25519 key is not an HSS public key, and
319
+ * // the verifier fails closed on the wrong key type rather than returning true
320
+ * var pair = await pki.key.generate("Ed25519");
321
+ * var der = await pki.x509.sign({ subject: "example.com", subjectPublicKey: await pki.key.export(pair.publicKey),
322
+ * notBefore: new Date("2026-01-01T00:00:00Z"), notAfter: new Date("2036-01-01T00:00:00Z") },
323
+ * { key: await pki.key.export(pair.privateKey) });
318
324
  * var cert = pki.schema.x509.parse(der);
319
325
  * var ok = pki.shbs.verify(cert.subjectPublicKeyInfo.publicKey.bytes,
320
326
  * cert.tbsBytes, cert.signatureValue.bytes);
@@ -327,7 +333,7 @@ function verify(publicKey, message, signature) {
327
333
  * @primitive pki.shbs.verifyLms
328
334
  * @signature pki.shbs.verifyLms(publicKey, message, signature) -> boolean
329
335
  * @since 0.2.1
330
- * @status experimental
336
+ * @status stable
331
337
  * @spec RFC 8554 sec. 5
332
338
  * @related pki.shbs.verify
333
339
  *
@@ -337,8 +343,10 @@ function verify(publicKey, message, signature) {
337
343
  * a well-formed signature, a typed `ShbsError` for a malformed blob.
338
344
  *
339
345
  * @example
340
- * // lmsPublicKey / lmsSignature are raw LMS blobs (an HSS level, or a bare
341
- * // LMS-signed artifact). Shown here on arbitrary bytes, which fail closed.
346
+ * // throws: shbs/unsupported-parameter-set -- lmsPublicKey / lmsSignature are raw
347
+ * // LMS blobs (an HSS level, or a bare LMS-signed artifact); arbitrary bytes carry
348
+ * // no recognized LMS typecode, so the verifier refuses them instead of returning
349
+ * var bytes = Buffer.alloc(64);
342
350
  * var ok = pki.shbs.verifyLms(bytes, bytes, bytes);
343
351
  */
344
352
  function verifyLms(publicKey, message, signature) {
package/lib/sigstore.js CHANGED
@@ -117,6 +117,8 @@ function _b64(s, label) {
117
117
  * bundle object (structure only -- no cryptographic verification).
118
118
  *
119
119
  * @example
120
+ * // requires: `bundle` -- a Sigstore bundle as cosign or npm provenance emits it
121
+ * // (the JSON object, a JSON string, or its raw bytes)
120
122
  * var b = pki.sigstore.parseBundle(bundle);
121
123
  * b.mediaType; // "application/vnd.dev.sigstore.bundle.v0.3+json"
122
124
  */
@@ -571,6 +573,8 @@ function _statement(payload, payloadType, expectedPredicate) {
571
573
  * time: Date, // optional check-date override (default: the Rekor integratedTime)
572
574
  *
573
575
  * @example
576
+ * // requires: `bundle` from cosign / npm provenance, and `sigstoreTrust` built from
577
+ * // the public-good trusted_root.json (the Fulcio + Rekor material it pins)
574
578
  * var out = await pki.sigstore.verifyBundle(bundle, sigstoreTrust);
575
579
  * out.verified; // true
576
580
  * out.subjects[0].digest; // { sha512: "..." } -- confirm against your tarball