@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.
- package/CHANGELOG.md +37 -1
- package/MIGRATING.md +2 -2
- package/README.md +142 -137
- package/index.js +4 -0
- package/lib/acme.js +73 -1
- package/lib/asn1-der.js +2 -0
- package/lib/attrcert-sign.js +4 -0
- package/lib/cbor-det.js +32 -16
- package/lib/cmc-build.js +880 -0
- package/lib/cmc-verify.js +657 -0
- package/lib/cmp-build.js +8 -7
- package/lib/cmp-verify.js +11 -1
- package/lib/cms-sign.js +170 -8
- package/lib/cms-verify.js +80 -14
- package/lib/crl-sign.js +22 -0
- package/lib/crmf-sign.js +5 -2
- package/lib/csr-sign.js +3 -0
- package/lib/ct.js +72 -0
- package/lib/est.js +828 -32
- package/lib/framework-error.js +13 -0
- package/lib/guard-bytes.js +37 -1
- package/lib/guard-range.js +23 -1
- package/lib/http-transport.js +9 -3
- package/lib/inspect.js +28 -5
- package/lib/jose.js +15 -0
- package/lib/lint.js +4 -0
- package/lib/merkle.js +5 -5
- package/lib/ocsp.js +139 -11
- package/lib/oid.js +69 -1
- package/lib/path-validate.js +27 -4
- package/lib/pkcs12-build.js +12 -0
- package/lib/schema-all.js +19 -1
- package/lib/schema-attrcert.js +27 -0
- package/lib/schema-c509.js +6 -0
- package/lib/schema-cmc.js +791 -0
- package/lib/schema-cmp.js +25 -0
- package/lib/schema-cms.js +17 -1
- package/lib/schema-crl.js +23 -1
- package/lib/schema-crmf.js +13 -0
- package/lib/schema-csr.js +11 -0
- package/lib/schema-csrattrs.js +6 -0
- package/lib/schema-engine.js +6 -2
- package/lib/schema-ocsp.js +41 -0
- package/lib/schema-pkcs12.js +16 -0
- package/lib/schema-pkcs8.js +8 -0
- package/lib/schema-smime.js +4 -4
- package/lib/schema-tsp.js +32 -1
- package/lib/schema-x509.js +14 -1
- package/lib/shbs.js +12 -4
- package/lib/sigstore.js +4 -0
- package/lib/smime.js +28 -7
- package/lib/tls-cert-compress.js +15 -3
- package/lib/trust.js +27 -4
- package/lib/tsp-sign.js +41 -6
- package/lib/vendor/README.md +19 -19
- package/lib/webauthn.js +895 -26
- package/lib/x509-sign.js +3 -0
- package/package.json +1 -1
- 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); }
|
package/lib/schema-crmf.js
CHANGED
|
@@ -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); }
|
package/lib/schema-csrattrs.js
CHANGED
|
@@ -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
|
*/
|
package/lib/schema-engine.js
CHANGED
|
@@ -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
|
|
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
|
|
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,
|
package/lib/schema-ocsp.js
CHANGED
|
@@ -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); }
|
package/lib/schema-pkcs12.js
CHANGED
|
@@ -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); }
|
package/lib/schema-pkcs8.js
CHANGED
|
@@ -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); }
|
package/lib/schema-smime.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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); }
|
package/lib/schema-x509.js
CHANGED
|
@@ -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; // "
|
|
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
|
|
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
|
|
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
|
|
341
|
-
* // LMS-signed artifact)
|
|
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
|