@blamejs/pki 0.6.40 → 0.6.41

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 (74) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/lib/acme.js +24 -13
  3. package/lib/asn1-der.js +5 -5
  4. package/lib/attrcert-sign.js +14 -14
  5. package/lib/cbor-det.js +2 -2
  6. package/lib/cmc-build.js +16 -16
  7. package/lib/cmc-verify.js +5 -5
  8. package/lib/cmp-build.js +29 -19
  9. package/lib/cmp-session.js +21 -16
  10. package/lib/cmp-verify.js +4 -4
  11. package/lib/cms-decrypt.js +8 -8
  12. package/lib/cms-encrypt.js +22 -22
  13. package/lib/cms-sign.js +17 -17
  14. package/lib/cms-verify.js +6 -6
  15. package/lib/composite-kem.js +1 -1
  16. package/lib/composite-sig.js +4 -4
  17. package/lib/constants.js +13 -9
  18. package/lib/crl-sign.js +17 -17
  19. package/lib/crmf-sign.js +11 -11
  20. package/lib/csr-sign.js +2 -2
  21. package/lib/ct.js +19 -11
  22. package/lib/edwards-point.js +2 -2
  23. package/lib/est.js +74 -43
  24. package/lib/guard-async.js +17 -1
  25. package/lib/guard-bytes.js +2 -2
  26. package/lib/guard-compress.js +5 -5
  27. package/lib/guard-identifier.js +45 -1
  28. package/lib/guard-name.js +1 -1
  29. package/lib/guard-time.js +3 -1
  30. package/lib/hpke.js +10 -10
  31. package/lib/http-digest.js +2 -2
  32. package/lib/http-transport.js +3 -3
  33. package/lib/inspect.js +9 -9
  34. package/lib/jose.js +14 -14
  35. package/lib/key.js +7 -7
  36. package/lib/lint.js +6 -4
  37. package/lib/merkle.js +2 -2
  38. package/lib/mime.js +2 -2
  39. package/lib/ocsp-verify.js +1 -1
  40. package/lib/ocsp.js +5 -5
  41. package/lib/oid.js +3 -3
  42. package/lib/path-validate.js +32 -22
  43. package/lib/pbes2.js +2 -2
  44. package/lib/pkcs12-build.js +15 -15
  45. package/lib/pki-build.js +2 -2
  46. package/lib/scep.js +47 -16
  47. package/lib/schema-all.js +1 -1
  48. package/lib/schema-attrcert.js +4 -3
  49. package/lib/schema-c509.js +23 -23
  50. package/lib/schema-cmc.js +6 -6
  51. package/lib/schema-cmp.js +3 -3
  52. package/lib/schema-cms.js +15 -8
  53. package/lib/schema-crmf.js +1 -1
  54. package/lib/schema-csr.js +1 -1
  55. package/lib/schema-engine.js +2 -1
  56. package/lib/schema-pkcs12.js +1 -1
  57. package/lib/schema-pkix.js +3 -0
  58. package/lib/schema-tsp.js +2 -2
  59. package/lib/shbs.js +2 -2
  60. package/lib/sign-scheme.js +9 -9
  61. package/lib/sigstore.js +9 -8
  62. package/lib/smime.js +12 -12
  63. package/lib/tls-cert-compress.js +6 -6
  64. package/lib/trust.js +9 -9
  65. package/lib/tsp-sign.js +11 -11
  66. package/lib/validator-attcert.js +2 -2
  67. package/lib/validator-cose.js +5 -5
  68. package/lib/validator-sig.js +3 -3
  69. package/lib/validator-tpm.js +5 -4
  70. package/lib/webauthn.js +12 -12
  71. package/lib/webcrypto.js +22 -14
  72. package/lib/x509-sign.js +8 -8
  73. package/package.json +1 -1
  74. package/sbom.cdx.json +6 -6
package/lib/webauthn.js CHANGED
@@ -59,7 +59,7 @@ function _ucmp(a, b) {
59
59
  return Buffer.compare(strip(a), strip(b)) === 0;
60
60
  }
61
61
  function _isInteger(node) { return !!node && !node.constructed && node.tagClass === "universal" && node.tagNumber === asn1.TAGS.INTEGER; }
62
- var COSE_ALG_HASH = { "-7": "sha256", "-9": "sha256", "-257": "sha256", "-37": "sha256", "-35": "sha384", "-51": "sha384", "-258": "sha384", "-38": "sha384", "-36": "sha512", "-52": "sha512", "-259": "sha512", "-39": "sha512", "-65535": "sha1" };
62
+ var COSE_ALG_HASH = intrinsic.assign(intrinsic.create(null), { "-7": "sha256", "-9": "sha256", "-257": "sha256", "-37": "sha256", "-35": "sha384", "-51": "sha384", "-258": "sha384", "-38": "sha384", "-36": "sha512", "-52": "sha512", "-259": "sha512", "-39": "sha512", "-65535": "sha1" });
63
63
  function _coseAlgHash(alg, E) {
64
64
  var h = COSE_ALG_HASH[String(alg)];
65
65
  if (!h) throw E("webauthn/unsupported-algorithm", "no hash mapping for COSE algorithm " + alg);
@@ -154,7 +154,7 @@ function parseCoseKey(bytes) {
154
154
  }
155
155
 
156
156
 
157
- var COSE_ALG = {
157
+ var COSE_ALG = intrinsic.assign(intrinsic.create(null), {
158
158
  "-7": { imp: { name: "ECDSA", namedCurve: "P-256" }, verify: { name: "ECDSA", hash: "SHA-256" }, ecdsa: 32 },
159
159
  "-35": { imp: { name: "ECDSA", namedCurve: "P-384" }, verify: { name: "ECDSA", hash: "SHA-384" }, ecdsa: 48 },
160
160
  "-36": { imp: { name: "ECDSA", namedCurve: "P-521" }, verify: { name: "ECDSA", hash: "SHA-512" }, ecdsa: 66 },
@@ -171,7 +171,7 @@ var COSE_ALG = {
171
171
  "-38": { imp: { name: "RSA-PSS", hash: "SHA-384" }, verify: { name: "RSA-PSS", saltLength: 48 }, ecdsa: 0 },
172
172
  "-39": { imp: { name: "RSA-PSS", hash: "SHA-512" }, verify: { name: "RSA-PSS", saltLength: 64 }, ecdsa: 0 },
173
173
  "-65535": { imp: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-1" }, verify: { name: "RSASSA-PKCS1-v1_5" }, ecdsa: 0 },
174
- };
174
+ });
175
175
 
176
176
  function _derEcdsaToRaw(der, curve) { return validator.sig.ecdsaDerToP1363(der, curve, WebauthnError, "webauthn/bad-signature"); }
177
177
 
@@ -186,7 +186,7 @@ function _verifySig(alg, sig, spkiBytes, message, E) {
186
186
  .then(function (key) { return subtle.verify(ver, key, s, message); })
187
187
  .catch(function (e) { throw _err("webauthn/verify-error", "the attestation signature could not be evaluated", e); });
188
188
  }
189
- var ED_OID_NAME = {};
189
+ var ED_OID_NAME = intrinsic.create(null);
190
190
  ED_OID_NAME[oid.byName("Ed25519")] = "Ed25519";
191
191
  ED_OID_NAME[oid.byName("Ed448")] = "Ed448";
192
192
  function _edName(spkiBytes, E) {
@@ -325,7 +325,7 @@ function _attRead(map, key, reader, what) {
325
325
  function _algOf(attStmt) { return Number(_attRead(attStmt, "alg", cbor.read.int, "an integer")); }
326
326
  function _sigOf(attStmt) { return _attRead(attStmt, "sig", cbor.read.byteString, "a byte string"); }
327
327
  function _requireAttShape(attStmt, allowed, required) {
328
- var have = {};
328
+ var have = intrinsic.create(null);
329
329
  cbor.read.map(attStmt).forEach(function (kv) {
330
330
  if (kv[0].majorType !== 3) throw _err("webauthn/bad-att-stmt", "the attestation statement has a non-text-string field key");
331
331
  have[cbor.read.textString(kv[0])] = true;
@@ -333,7 +333,7 @@ function _requireAttShape(attStmt, allowed, required) {
333
333
  Object.keys(have).forEach(function (k) { if (allowed.indexOf(k) === -1) throw _err("webauthn/bad-att-stmt", "the attestation statement carries an unexpected field '" + k + "'"); });
334
334
  required.forEach(function (k) { if (!have[k]) throw _err("webauthn/bad-att-stmt", "the attestation statement is missing the '" + k + "' field"); });
335
335
  }
336
- var ATT_STMT_MAJOR = { compound: 4 };
336
+ var ATT_STMT_MAJOR = intrinsic.assign(intrinsic.create(null), { compound: 4 });
337
337
 
338
338
  var _AAGUID_SIGNED_BY_FMT = Object.assign(Object.create(null), { "fido-u2f": false });
339
339
  function _aaguidIsSigned(fmt) { return _AAGUID_SIGNED_BY_FMT[fmt] !== false; }
@@ -353,7 +353,7 @@ function _cloneParsed(v, depth) {
353
353
  if (Array.isArray(v)) return v.map(function (x) { return _cloneParsed(x, depth + 1); });
354
354
  if (guard.time.isDate(v)) return new Date(guard.time.instantOf(v));
355
355
  if (v && typeof v === "object") {
356
- var out = {};
356
+ var out = intrinsic.create(null);
357
357
  Object.keys(v).forEach(function (k) { out[k] = _cloneParsed(v[k], depth + 1); });
358
358
  return out;
359
359
  }
@@ -501,13 +501,13 @@ function _readX5c(attStmt) {
501
501
  try { return x509.parse(der); } catch (e) { throw _err("webauthn/bad-att-stmt", "an x5c certificate is not a well-formed X.509 certificate", e); }
502
502
  });
503
503
  }
504
- var _exts = { find: _findExt, decode: _decodeExt };
504
+ var _exts = intrinsic.assign(intrinsic.create(null), { find: _findExt, decode: _decodeExt });
505
505
  function _requireV3(cert) { validator.attcert.requireV3(cert, WebauthnError, "webauthn/bad-att-cert"); }
506
506
  function _checkPackedCert(cert) { validator.attcert.packedCert(cert, _exts, WebauthnError, "webauthn/bad-att-cert"); }
507
507
  function _checkAikCert(cert) { validator.attcert.aikCert(cert, _exts, WebauthnError, "webauthn/bad-att-cert"); }
508
508
  function _checkAaguidExt(cert, aaguid) { validator.attcert.aaguidExt(cert, aaguid, _exts, WebauthnError, "webauthn/bad-att-cert", "webauthn/aaguid-mismatch"); }
509
509
 
510
- var VERIFIERS = {
510
+ var VERIFIERS = intrinsic.assign(intrinsic.create(null), {
511
511
  packed: function (att, clientDataHash) {
512
512
  var isX5c = !!cbor.read.mapGet(att.attStmt, "x5c");
513
513
  _requireAttShape(att.attStmt, isX5c ? ["alg", "sig", "x5c"] : ["alg", "sig"], isX5c ? ["alg", "sig", "x5c"] : ["alg", "sig"]);
@@ -722,7 +722,7 @@ var VERIFIERS = {
722
722
  }
723
723
  return Promise.resolve(_result("none", "None", [], att));
724
724
  },
725
- };
725
+ });
726
726
 
727
727
  function _isPlainObject(v) { return !!v && typeof v === "object" && !Array.isArray(v); }
728
728
 
@@ -1473,7 +1473,7 @@ var _ASSERT_OPTS = Object.assign(Object.create(null), {
1473
1473
  function _snapshotAssertion(input) {
1474
1474
  if (!_isPlainObject(input)) throw _err("webauthn/bad-input", "pki.webauthn.verifyAssertion takes an options object");
1475
1475
  guard.identifier.assertKnownKeys(input, _ASSERT_OPTS, _err, "webauthn/bad-input", "verifyAssertion input has an unknown key ");
1476
- var out = {}, k;
1476
+ var out = intrinsic.create(null), k;
1477
1477
  for (k in input) { if (_hasOwn(input, k)) out[k] = input[k]; }
1478
1478
  ["authenticatorData", "clientDataJSON", "clientDataHash", "signature", "expectedChallenge"].forEach(function (f) {
1479
1479
  if (_isBufferSource(out[f])) out[f] = guard.bytes.snapshotSource(out[f], WebauthnError, "webauthn/bad-input", f);
@@ -1482,7 +1482,7 @@ function _snapshotAssertion(input) {
1482
1482
  out.credentialPublicKey = guard.bytes.snapshotSource(out.credentialPublicKey, WebauthnError,
1483
1483
  "webauthn/bad-input", "credentialPublicKey");
1484
1484
  } else if (_isPlainObject(out.credentialPublicKey)) {
1485
- var key = {}, kk;
1485
+ var key = intrinsic.create(null), kk;
1486
1486
  for (kk in out.credentialPublicKey) {
1487
1487
  if (!_hasOwn(out.credentialPublicKey, kk)) continue;
1488
1488
  var v;
package/lib/webcrypto.js CHANGED
@@ -116,7 +116,7 @@ function _normalizeAlg(algorithm, who) {
116
116
  if (!alg || typeof alg.name !== "string") {
117
117
  throw new WebCryptoError("webcrypto/syntax", (who || "operation") + ": algorithm must be a string or an object with a name");
118
118
  }
119
- var out = {};
119
+ var out = intrinsic.create(null);
120
120
  for (var k in alg) { if (_hasOwn(alg, k)) out[k] = alg[k]; }
121
121
  out.name = _toUpperCase(alg.name);
122
122
  return out;
@@ -125,7 +125,7 @@ function _normalizeAlg(algorithm, who) {
125
125
  var _STD_ALG_NAME = intrinsic.assign(intrinsic.create(null), { "RSASSA-PKCS1-V1_5": "RSASSA-PKCS1-v1_5", "ED25519": "Ed25519", "ED448": "Ed448" });
126
126
  function _stdName(name) { return _STD_ALG_NAME[name] || name; }
127
127
 
128
- var HASH_NODE = {
128
+ var HASH_NODE = intrinsic.assign(intrinsic.create(null), {
129
129
  "SHA-1": "sha1",
130
130
  "SHA-224": "sha224",
131
131
  "SHA-256": "sha256",
@@ -134,12 +134,12 @@ var HASH_NODE = {
134
134
  "SHA3-256": "sha3-256",
135
135
  "SHA3-384": "sha3-384",
136
136
  "SHA3-512": "sha3-512",
137
- };
137
+ });
138
138
 
139
- var XOF_NODE = {
139
+ var XOF_NODE = intrinsic.assign(intrinsic.create(null), {
140
140
  "SHAKE128": { node: "shake128", length: 32 },
141
141
  "SHAKE256": { node: "shake256", length: 64 },
142
- };
142
+ });
143
143
 
144
144
  function _hashNode(h, who) {
145
145
  var name = (typeof h === "string") ? h : (h && h.name);
@@ -148,10 +148,10 @@ function _hashNode(h, who) {
148
148
  return node;
149
149
  }
150
150
 
151
- var HMAC_BLOCK_BITS = {
151
+ var HMAC_BLOCK_BITS = intrinsic.assign(intrinsic.create(null), {
152
152
  "SHA-1": 512, "SHA-256": 512, "SHA-384": 1024, "SHA-512": 1024,
153
153
  "SHA3-256": 1088, "SHA3-384": 832, "SHA3-512": 576,
154
- };
154
+ });
155
155
 
156
156
  function _hmacLengthBits(alg, who) {
157
157
  var name = (typeof alg.hash === "string") ? alg.hash : (alg.hash && alg.hash.name);
@@ -859,7 +859,7 @@ function _nodeKey(fn, who) {
859
859
  }
860
860
  }
861
861
 
862
- var ML_KEM_INNER = {};
862
+ var ML_KEM_INNER = intrinsic.create(null);
863
863
  ["id-ml-kem-512", "id-ml-kem-768", "id-ml-kem-1024"].forEach(function (n) {
864
864
  var row = oid.kemParams(n);
865
865
  ML_KEM_INNER[oid.byName(n)] = { ek: row.ek, dk: row.dk };
@@ -891,7 +891,7 @@ function _validateMlKemInner(innerBytes, sizes) {
891
891
  throw new WebCryptoError("webcrypto/data", "an ML-KEM private key must be the seed, expandedKey, or both CHOICE (RFC 9935 sec. 6)");
892
892
  }
893
893
 
894
- var PKCS8_INNER_VALIDATORS = {};
894
+ var PKCS8_INNER_VALIDATORS = intrinsic.create(null);
895
895
  _forEach(_keys(ML_KEM_INNER), function (o) { PKCS8_INNER_VALIDATORS[o] = function (inner) { _validateMlKemInner(inner, ML_KEM_INNER[o]); }; });
896
896
 
897
897
  function _preValidatePkcs8(p8, name) {
@@ -974,14 +974,22 @@ function _importRawPublic(name, alg, raw, extractable, usages) {
974
974
  throw new WebCryptoError("webcrypto/not-supported", "importKey raw: unsupported public-key algorithm " + _stringify(name));
975
975
  }
976
976
 
977
+ /** @internal Each inner set is asked whether it holds the key's own type, so it answers from its own
978
+ * entries alone: a type naming an Object.prototype member would otherwise resolve to a truthy
979
+ * inherited value and pass a key the algorithm does not accept. */
980
+ function _typeSet(names) {
981
+ var t = intrinsic.create(null);
982
+ _forEach(names, function (n) { t[n] = 1; });
983
+ return t;
984
+ }
977
985
  var IMPORT_KEY_TYPE = intrinsic.assign(intrinsic.create(null), {
978
- "RSASSA-PKCS1-V1_5": { rsa: 1 }, "RSA-PSS": { rsa: 1, "rsa-pss": 1 }, "RSA-OAEP": { rsa: 1 },
979
- "ECDSA": { ec: 1 }, "ECDH": { ec: 1 },
980
- "ED25519": { ed25519: 1 }, "ED448": { ed448: 1 },
981
- "X25519": { x25519: 1 }, "X448": { x448: 1 },
986
+ "RSASSA-PKCS1-V1_5": _typeSet(["rsa"]), "RSA-PSS": _typeSet(["rsa", "rsa-pss"]), "RSA-OAEP": _typeSet(["rsa"]),
987
+ "ECDSA": _typeSet(["ec"]), "ECDH": _typeSet(["ec"]),
988
+ "ED25519": _typeSet(["ed25519"]), "ED448": _typeSet(["ed448"]),
989
+ "X25519": _typeSet(["x25519"]), "X448": _typeSet(["x448"]),
982
990
  });
983
991
  [ML_DSA_NODE, ML_KEM_NODE, SLH_DSA_NODE].forEach(function (m) {
984
- _forEach(_keys(m), function (webName) { var t = {}; t[m[webName]] = 1; IMPORT_KEY_TYPE[webName] = t; });
992
+ _forEach(_keys(m), function (webName) { IMPORT_KEY_TYPE[webName] = _typeSet([m[webName]]); });
985
993
  });
986
994
  function _algFromImport(name, alg, keyObject) {
987
995
  var wantType = IMPORT_KEY_TYPE[name];
package/lib/x509-sign.js CHANGED
@@ -40,18 +40,18 @@ function O(n) { return oid.byName(n); }
40
40
 
41
41
  var OID_SKI = O("subjectKeyIdentifier");
42
42
 
43
- var KNOWN_SPEC_KEYS = {
43
+ var KNOWN_SPEC_KEYS = intrinsic.assign(intrinsic.create(null), {
44
44
  subject: 1, subjectPublicKey: 1, notBefore: 1, notAfter: 1, serialNumber: 1, extensions: 1,
45
- };
46
- var KNOWN_ISSUER_CERT_KEYS = { key: 1, cert: 1 };
47
- var KNOWN_ISSUER_EXPLICIT_KEYS = { key: 1, name: 1, publicKey: 1 };
48
- var KNOWN_SIGN_OPTS = { digestAlgorithm: 1, pem: 1, pss: 1 };
45
+ });
46
+ var KNOWN_ISSUER_CERT_KEYS = intrinsic.assign(intrinsic.create(null), { key: 1, cert: 1 });
47
+ var KNOWN_ISSUER_EXPLICIT_KEYS = intrinsic.assign(intrinsic.create(null), { key: 1, name: 1, publicKey: 1 });
48
+ var KNOWN_SIGN_OPTS = intrinsic.assign(intrinsic.create(null), { digestAlgorithm: 1, pem: 1, pss: 1 });
49
49
 
50
- var KNOWN_EXT_KEYS = {
50
+ var KNOWN_EXT_KEYS = intrinsic.assign(intrinsic.create(null), {
51
51
  subjectKeyIdentifier: 1, authorityKeyIdentifier: 1, keyUsage: 1, keyUsageCritical: 1,
52
52
  extendedKeyUsage: 1, extendedKeyUsageCritical: 1, basicConstraints: 1, subjectAltName: 1,
53
53
  certificatePolicies: 1, certificatePoliciesCritical: 1,
54
- };
54
+ });
55
55
 
56
56
  var _b = pkiBuild.makeBuilder({ ErrorClass: CertificateError, prefix: "x509", O: O, NS: NS, NAME_SCHEMA: NAME_SCHEMA, SPKI_SCHEMA: SPKI_SCHEMA, EXT_DECODERS: EXT_DECODERS });
57
57
  var _encodeName = _b.encodeName, _isEmptyName = _b.isEmptyName, _reqDer = _b.reqDer,
@@ -80,7 +80,7 @@ function _akiKeyId(val, ctx) {
80
80
  function _buildExtensions(extSpec, ctx) {
81
81
  if (extSpec == null) return [];
82
82
  if (_isArray(extSpec)) {
83
- var seenExt = {}, arrCa = false, arrKeyCertSign = false, arrPathLen = false;
83
+ var seenExt = intrinsic.create(null), arrCa = false, arrKeyCertSign = false, arrPathLen = false;
84
84
  var oidBc = O("basicConstraints"), oidKu = O("keyUsage");
85
85
  var arr = extSpec.map(function (e, i) {
86
86
  var der = _reqDer(e, "extension");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/pki",
3
- "version": "0.6.40",
3
+ "version": "0.6.41",
4
4
  "description": "Pure-JavaScript PKI toolkit that owns its stack — X.509, ASN.1/DER, CMS, PQC-first.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "blamejs contributors",
package/sbom.cdx.json CHANGED
@@ -2,10 +2,10 @@
2
2
  "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
3
3
  "bomFormat": "CycloneDX",
4
4
  "specVersion": "1.5",
5
- "serialNumber": "urn:uuid:2af62d9e-82a4-4f11-8c8c-7b2c8b1ae891",
5
+ "serialNumber": "urn:uuid:c14ed2d9-f3d5-4322-88e1-51afbe3a3fbe",
6
6
  "version": 1,
7
7
  "metadata": {
8
- "timestamp": "2026-09-05T15:01:32.918Z",
8
+ "timestamp": "2026-09-06T02:19:25.175Z",
9
9
  "lifecycles": [
10
10
  {
11
11
  "phase": "build"
@@ -19,14 +19,14 @@
19
19
  }
20
20
  ],
21
21
  "component": {
22
- "bom-ref": "@blamejs/pki@0.6.40",
22
+ "bom-ref": "@blamejs/pki@0.6.41",
23
23
  "type": "application",
24
24
  "name": "pki",
25
- "version": "0.6.40",
25
+ "version": "0.6.41",
26
26
  "scope": "required",
27
27
  "author": "blamejs contributors",
28
28
  "description": "Pure-JavaScript PKI toolkit that owns its stack — X.509, ASN.1/DER, CMS, PQC-first.",
29
- "purl": "pkg:npm/%40blamejs/pki@0.6.40",
29
+ "purl": "pkg:npm/%40blamejs/pki@0.6.41",
30
30
  "properties": [],
31
31
  "externalReferences": [
32
32
  {
@@ -54,7 +54,7 @@
54
54
  "components": [],
55
55
  "dependencies": [
56
56
  {
57
- "ref": "@blamejs/pki@0.6.40",
57
+ "ref": "@blamejs/pki@0.6.41",
58
58
  "dependsOn": []
59
59
  }
60
60
  ]