@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
@@ -80,7 +80,7 @@ var ANCHOR_SPKI_SCHEMA = pkix.spki(NS);
80
80
 
81
81
  var subtle = webcrypto.webcrypto.subtle;
82
82
 
83
- var OID = {
83
+ var OID = intrinsic.assign(intrinsic.create(null), {
84
84
  basicConstraints: oid.byName("basicConstraints"),
85
85
  keyUsage: oid.byName("keyUsage"),
86
86
  nameConstraints: oid.byName("nameConstraints"),
@@ -98,9 +98,9 @@ var OID = {
98
98
  authorityKeyIdentifier: oid.byName("authorityKeyIdentifier"),
99
99
  authorityInfoAccess: oid.byName("authorityInfoAccess"),
100
100
  caIssuers: oid.byName("caIssuers"),
101
- };
101
+ });
102
102
 
103
- var PROCESSED_EXTENSIONS = {};
103
+ var PROCESSED_EXTENSIONS = intrinsic.create(null);
104
104
  [OID.basicConstraints, OID.keyUsage, OID.nameConstraints, OID.certificatePolicies,
105
105
  OID.policyMappings, OID.policyConstraints, OID.inhibitAnyPolicy, OID.subjectAltName,
106
106
  OID.extKeyUsage, OID.cRLDistributionPoints].
@@ -137,7 +137,7 @@ _sig("id-ml-dsa-87", { name: "ML-DSA-87" }, { name: "ML-DSA-87" }, "absent", fal
137
137
 
138
138
  var OID_RSA_PSS = oid.byName("rsassaPss");
139
139
  var OID_MGF1 = oid.byName("mgf1");
140
- var HASH_BY_OID = {};
140
+ var HASH_BY_OID = intrinsic.create(null);
141
141
  HASH_BY_OID[oid.byName("sha256")] = "SHA-256";
142
142
  HASH_BY_OID[oid.byName("sha384")] = "SHA-384";
143
143
  HASH_BY_OID[oid.byName("sha512")] = "SHA-512";
@@ -244,7 +244,7 @@ function compositeKeyUsageCheck(cert) {
244
244
  return { ok: true };
245
245
  }
246
246
 
247
- var ML_KEM_OIDS = {};
247
+ var ML_KEM_OIDS = intrinsic.create(null);
248
248
  ["id-ml-kem-512", "id-ml-kem-768", "id-ml-kem-1024"].forEach(function (n) { ML_KEM_OIDS[oid.byName(n)] = true; });
249
249
 
250
250
  function kemKeyUsageCheck(cert) {
@@ -806,7 +806,7 @@ function prepareNext(state, cert, i, checks) {
806
806
  function applyPolicyMappings(state, mappings, i) {
807
807
  var depth = i;
808
808
  if (state.policyMapping > 0) {
809
- var mappedFrom = {};
809
+ var mappedFrom = intrinsic.create(null);
810
810
  mappings.forEach(function (m) { guard.list.append(mappedFrom[m.issuerDomainPolicy] = mappedFrom[m.issuerDomainPolicy] || [], m.subjectDomainPolicy); });
811
811
  var depthI = leavesAt(state.validPolicyTree, depth);
812
812
  var anyNodes = depthI.filter(function (nd) { return nd.validPolicy === OID.anyPolicy; });
@@ -821,7 +821,7 @@ function applyPolicyMappings(state, mappings, i) {
821
821
  }
822
822
  });
823
823
  } else {
824
- var mappedSet = {};
824
+ var mappedSet = intrinsic.create(null);
825
825
  mappings.forEach(function (m) { mappedSet[m.issuerDomainPolicy] = true; });
826
826
  if (!state.validPolicyTree) return;
827
827
  leavesAt(state.validPolicyTree, depth).forEach(function (node) {
@@ -835,7 +835,7 @@ function applyPolicyMappings(state, mappings, i) {
835
835
  }
836
836
  }
837
837
 
838
- var TARGET_UNPROCESSED_IF_CRITICAL = {};
838
+ var TARGET_UNPROCESSED_IF_CRITICAL = intrinsic.create(null);
839
839
  TARGET_UNPROCESSED_IF_CRITICAL[OID.policyMappings] = true;
840
840
  Object.freeze(TARGET_UNPROCESSED_IF_CRITICAL);
841
841
 
@@ -939,13 +939,13 @@ function validateCriticalExtensionStructure(cert) {
939
939
  * });
940
940
  * res.valid; // boolean; res.results[0].checks carries the per-check codes
941
941
  */
942
- var _VALIDATE_OPTS = {
942
+ var _VALIDATE_OPTS = intrinsic.assign(intrinsic.create(null), {
943
943
  checkPurpose: 1, ctLogList: 1, ctPolicy: 1, historicalMode: 1, initialAnyPolicyInhibit: 1,
944
944
  initialExcludedSubtrees: 1, initialExplicitPolicy: 1, initialPermittedSubtrees: 1,
945
945
  initialPolicyMappingInhibit: 1, maxPathCerts: 1, maxPolicyNodes: 1, requireRevocation: 1,
946
946
  requiredEku: 1, revocationChecker: 1, softFail: 1, time: 1, trustAnchors: 1,
947
947
  userInitialPolicySet: 1, verifier: 1
948
- };
948
+ });
949
949
 
950
950
  var OID_SCT_LIST = oid.byName("signedCertificateTimestampList");
951
951
  async function ctGateCheck(leaf, certs, anchor, ctLogList, ctPolicy, n, at) {
@@ -1015,7 +1015,7 @@ async function validate(path, opts) {
1015
1015
  var exclRawOnce = opts.initialExcludedSubtrees;
1016
1016
  var singleOpts = function (a) {
1017
1017
  var keys = intrinsic.ownKeys(opts);
1018
- var o = {};
1018
+ var o = intrinsic.create(null);
1019
1019
  for (var ki = 0; ki < keys.length; ki++) { o[keys[ki]] = opts[keys[ki]]; }
1020
1020
  o.trustAnchors = a;
1021
1021
  if (permRawOnce != null) o.initialPermittedSubtrees = callerPermitted;
@@ -1248,12 +1248,12 @@ function userConstrainedPolicies(state, n) {
1248
1248
  var uips = state.userInitialPolicySet;
1249
1249
  var anyUser = contains(uips, OID.anyPolicy);
1250
1250
  var leaves = leavesAt(state.validPolicyTree, n);
1251
- var explicit = {}, hasAnyLeaf = false;
1251
+ var explicit = intrinsic.create(null), hasAnyLeaf = false;
1252
1252
  leaves.forEach(function (node) {
1253
1253
  if (node.validPolicy === OID.anyPolicy) hasAnyLeaf = true;
1254
1254
  else explicit[node.validPolicy] = true;
1255
1255
  });
1256
- var set = {};
1256
+ var set = intrinsic.create(null);
1257
1257
  Object.keys(explicit).forEach(function (p) { if (anyUser || contains(uips, p)) set[p] = true; });
1258
1258
  if (hasAnyLeaf) {
1259
1259
  if (anyUser) set[OID.anyPolicy] = true;
@@ -1941,7 +1941,7 @@ function resolvePurposeOpts(opts) {
1941
1941
  }
1942
1942
 
1943
1943
  function _snapshotConstraintMap(m, E, code, who) {
1944
- var out = {};
1944
+ var out = intrinsic.create(null);
1945
1945
  var proto = intrinsic.getPrototypeOf(m);
1946
1946
  if (proto !== null && proto !== intrinsic.ObjectProto) throw E(code, who + ": a trustAnchor constraint map must be a plain object (its own entries only), not one with a custom or cross-realm prototype");
1947
1947
  var keys = intrinsic.getOwnPropertyNames(m);
@@ -2468,7 +2468,9 @@ function _aiaParseBody(body, contentType, maxCerts) {
2468
2468
  }
2469
2469
 
2470
2470
  async function _aiaFetchOne(uri, aia) {
2471
- var res = await aia.transport({ method: "GET", url: uri, tls: aia.tls, timeout: aia.timeout, maxResponseBytes: aia.maxResponseBytes, blockPrivateAddresses: true });
2471
+ var res = await guard.async.invoked(aia.transport,
2472
+ [{ method: "GET", url: uri, tls: aia.tls, timeout: aia.timeout, maxResponseBytes: aia.maxResponseBytes, blockPrivateAddresses: true }],
2473
+ E, "path/bad-input", "opts.transport");
2472
2474
  res = res || {};
2473
2475
  if (res.status !== 200) throw E("path/aia-status", "an AIA fetch returned HTTP " + res.status + " (only 200 is a cert source; no redirect following)");
2474
2476
  var body = guard.bytes.isByteSource(res.body)
@@ -2476,7 +2478,7 @@ async function _aiaFetchOne(uri, aia) {
2476
2478
  : Buffer.from(res.body == null ? "" : String(res.body), "latin1");
2477
2479
  if (body.length === 0) throw E("path/aia-empty", "an AIA fetch returned an empty body");
2478
2480
  if (body.length > aia.maxResponseBytes) throw E("path/aia-too-large", "an AIA response exceeds the " + aia.maxResponseBytes + "-byte cap");
2479
- var headers = {};
2481
+ var headers = intrinsic.create(null);
2480
2482
  Object.keys(res.headers || {}).forEach(function (k) { headers[k.toLowerCase()] = res.headers[k]; });
2481
2483
  return _aiaParseBody(body, headers["content-type"], aia.maxCertsPerResponse);
2482
2484
  }
@@ -2509,6 +2511,11 @@ async function _fetchAiaIssuers(current, aia) {
2509
2511
  intrinsic.setAdd(aia.fetchedUrls, uris[k]);
2510
2512
  aia.fetches += 1;
2511
2513
  var certs;
2514
+ /** @internal Every failure of a fetch is skipped and the next URL tried, because AIA is a
2515
+ * best-effort source of issuers and one unreachable host must not fail a build that another URL
2516
+ * can complete. A transport that throws where a rejecting one would only reject is the same
2517
+ * failure reported a different way, so the two are treated alike rather than one of them ending
2518
+ * the build. */
2512
2519
  try { certs = await _aiaFetchOne(uris[k], aia); }
2513
2520
  catch (_e2) { continue; }
2514
2521
  for (var c = 0; c < certs.length; c++) {
@@ -2591,11 +2598,11 @@ async function _fetchAiaIssuers(current, aia) {
2591
2598
  * result.valid; // true when a path to a trust anchor was found and validated
2592
2599
  */
2593
2600
  var _BUILD_OPTS = (function () {
2594
- var o = {
2601
+ var o = intrinsic.assign(intrinsic.create(null), {
2595
2602
  aiaTimeout: 1, candidates: 1, direction: 1, fetchAia: 1, intermediates: 1, maxAiaFetches: 1,
2596
2603
  maxAiaPerCert: 1, maxCandidatesConsidered: 1, maxDepth: 1, maxPathCerts: 1,
2597
2604
  maxResponseBytes: 1, time: 1, tls: 1, transport: 1, trustAnchors: 1, validate: 1
2598
- };
2605
+ });
2599
2606
  Object.keys(_VALIDATE_OPTS).forEach(function (k) { o[k] = 1; });
2600
2607
  return o;
2601
2608
  })();
@@ -2604,6 +2611,12 @@ async function build(leaf, opts) {
2604
2611
  opts = guard.identifier.optionsObject(opts, E, "path/bad-input", "build: opts");
2605
2612
  guard.identifier.assertKnownKeys(opts, _BUILD_OPTS, E, "path/bad-input",
2606
2613
  "pki.path.build has an unknown option (the anchor option is `trustAnchors`). The unknown option was: ");
2614
+ /** @internal Checked at the door, before any certificate is parsed, and whether or not AIA
2615
+ * fetching is on: supplying a transport that cannot be called is a wiring fault at the moment it
2616
+ * is written. The checked value is the one used below, since reading the option again would ask a
2617
+ * second time and an accessor can answer differently on each read. */
2618
+ var checkedTransport = guard.identifier.assertCallableOption(opts, "transport", E, "path/bad-input",
2619
+ "build: opts.transport", "(request) -> Promise<{ status, headers, body }>");
2607
2620
  var leafCert;
2608
2621
  try { leafCert = coerceCert(leaf); }
2609
2622
  catch (e) { throw E("path/bad-input", "build: the leaf certificate did not parse", e); }
@@ -2652,13 +2665,10 @@ async function build(leaf, opts) {
2652
2665
 
2653
2666
  var aiaCtx = null;
2654
2667
  if (opts.fetchAia === true) {
2655
- if (opts.transport !== undefined && typeof opts.transport !== "function") {
2656
- throw E("path/bad-input", "build: opts.transport must be a transport function (request) -> Promise<{ status, headers, body }>");
2657
- }
2658
2668
  if (opts.aiaTimeout !== undefined) {
2659
2669
  guard.limits.cap(opts.aiaTimeout, "build: opts.aiaTimeout", 1, { E: E, code: "path/bad-input", min: 1, max: httpTransport.MAX_TIMEOUT });
2660
2670
  }
2661
- var aiaTransport = opts.transport || httpTransport.https({ E: E, errPrefix: "path" });
2671
+ var aiaTransport = checkedTransport || httpTransport.https({ E: E, errPrefix: "path" });
2662
2672
  aiaCtx = {
2663
2673
  transport: aiaTransport,
2664
2674
  transportGuardsAddresses: aiaTransport.blocksPrivateAddresses === true,
package/lib/pbes2.js CHANGED
@@ -14,9 +14,9 @@ var b = asn1.build;
14
14
  function O(n) { return oid.byName(n); }
15
15
 
16
16
  var PRF_NODE_BY_NAME = Object.assign(Object.create(null), { hmacWithSHA1: "sha1", hmacWithSHA256: "sha256", hmacWithSHA384: "sha384", hmacWithSHA512: "sha512" });
17
- var PRF_NODE_BY_OID = {}; Object.keys(PRF_NODE_BY_NAME).forEach(function (n) { PRF_NODE_BY_OID[O(n)] = PRF_NODE_BY_NAME[n]; });
17
+ var PRF_NODE_BY_OID = Object.create(null); Object.keys(PRF_NODE_BY_NAME).forEach(function (n) { PRF_NODE_BY_OID[O(n)] = PRF_NODE_BY_NAME[n]; });
18
18
 
19
- var CONTENT_KEYBITS = {}, CONTENT_MODE = {};
19
+ var CONTENT_KEYBITS = Object.create(null), CONTENT_MODE = Object.create(null);
20
20
  [["aes128-CBC", 128, "cbc"], ["aes192-CBC", 192, "cbc"], ["aes256-CBC", 256, "cbc"],
21
21
  ["aes128-GCM", 128, "gcm"], ["aes192-GCM", 192, "gcm"], ["aes256-GCM", 256, "gcm"]].forEach(function (r) {
22
22
  CONTENT_KEYBITS[O(r[0])] = r[1];
@@ -69,14 +69,14 @@ var DIGEST_NAME = intrinsic.assign(intrinsic.create(null), { sha1: "sha1", sha25
69
69
  var _MISSING_PASSWORD = "a password must be a string, Buffer, or Uint8Array -- an omitted password " +
70
70
  "is not the empty password; pass \"\" to use the empty one deliberately";
71
71
 
72
- var _INTEGRITY_OPTS = { mode: 1, signer: 1, signers: 1, certificates: 1, sid: 1, signingTime: 1 };
73
- var _BUILD_SPEC_FULL_KEYS = { safeContents: 1 };
74
- var _BUILD_SPEC_SHORTHAND_KEYS = { key: 1, cert: 1, ca: 1, friendlyName: 1, localKeyId: 1 };
75
- var _BUILD_OPTS_FULL = { integrity: 1, mac: 1, password: 1, pem: 1 };
76
- var _BUILD_OPTS_SHORTHAND = { integrity: 1, mac: 1, password: 1, pem: 1, recipientCerts: 1 };
77
- var _SAFE_RECIPIENTS_KEYS = { bags: 1, recipients: 1, contentEncryptionAlgorithm: 1 };
78
- var _SAFE_PASSWORD_KEYS = { bags: 1, encrypt: 1 };
79
- var _SAFE_PLAINTEXT_KEYS = { bags: 1 };
72
+ var _INTEGRITY_OPTS = intrinsic.assign(intrinsic.create(null), { mode: 1, signer: 1, signers: 1, certificates: 1, sid: 1, signingTime: 1 });
73
+ var _BUILD_SPEC_FULL_KEYS = intrinsic.assign(intrinsic.create(null), { safeContents: 1 });
74
+ var _BUILD_SPEC_SHORTHAND_KEYS = intrinsic.assign(intrinsic.create(null), { key: 1, cert: 1, ca: 1, friendlyName: 1, localKeyId: 1 });
75
+ var _BUILD_OPTS_FULL = intrinsic.assign(intrinsic.create(null), { integrity: 1, mac: 1, password: 1, pem: 1 });
76
+ var _BUILD_OPTS_SHORTHAND = intrinsic.assign(intrinsic.create(null), { integrity: 1, mac: 1, password: 1, pem: 1, recipientCerts: 1 });
77
+ var _SAFE_RECIPIENTS_KEYS = intrinsic.assign(intrinsic.create(null), { bags: 1, recipients: 1, contentEncryptionAlgorithm: 1 });
78
+ var _SAFE_PASSWORD_KEYS = intrinsic.assign(intrinsic.create(null), { bags: 1, encrypt: 1 });
79
+ var _SAFE_PLAINTEXT_KEYS = intrinsic.assign(intrinsic.create(null), { bags: 1 });
80
80
  var _BAG_KEYS_BY_TYPE = intrinsic.assign(intrinsic.create(null), {
81
81
  key: { type: 1, friendlyName: 1, localKeyId: 1, key: 1 },
82
82
  shroudedKey: { type: 1, friendlyName: 1, localKeyId: 1, key: 1, encrypt: 1 },
@@ -85,15 +85,15 @@ var _BAG_KEYS_BY_TYPE = intrinsic.assign(intrinsic.create(null), {
85
85
  secret: { type: 1, friendlyName: 1, localKeyId: 1, secretTypeId: 1, secretValue: 1 },
86
86
  safeContents: { type: 1, friendlyName: 1, localKeyId: 1, nested: 1 },
87
87
  });
88
- var _ENCRYPT_KEYS = { password: 1, cipher: 1, salt: 1, iterations: 1, prf: 1 };
89
- var _MAC_KEYS = { algorithm: 1, hash: 1, salt: 1, iterations: 1, keyLength: 1, password: 1 };
90
- var _MAC_KEYS_HMAC = { algorithm: 1, hash: 1, salt: 1, iterations: 1, password: 1 };
91
- var _MAC_KEYS_PBMAC1 = { algorithm: 1, hash: 1, salt: 1, iterations: 1, keyLength: 1, password: 1 };
92
- var _OPEN_OPTS = {
88
+ var _ENCRYPT_KEYS = intrinsic.assign(intrinsic.create(null), { password: 1, cipher: 1, salt: 1, iterations: 1, prf: 1 });
89
+ var _MAC_KEYS = intrinsic.assign(intrinsic.create(null), { algorithm: 1, hash: 1, salt: 1, iterations: 1, keyLength: 1, password: 1 });
90
+ var _MAC_KEYS_HMAC = intrinsic.assign(intrinsic.create(null), { algorithm: 1, hash: 1, salt: 1, iterations: 1, password: 1 });
91
+ var _MAC_KEYS_PBMAC1 = intrinsic.assign(intrinsic.create(null), { algorithm: 1, hash: 1, salt: 1, iterations: 1, keyLength: 1, password: 1 });
92
+ var _OPEN_OPTS = intrinsic.assign(intrinsic.create(null), {
93
93
  allowUnauthenticated: 1, importAlgorithm: 1, keys: 1, maxIterations: 1, signerCerts: 1,
94
94
  recipientKey: 1, recipientCert: 1, recipientIndex: 1,
95
- };
96
- var _VERIFY_MAC_OPTS = { maxIterations: 1 };
95
+ });
96
+ var _VERIFY_MAC_OPTS = intrinsic.assign(intrinsic.create(null), { maxIterations: 1 });
97
97
 
98
98
  function _p12PasswordOwned(pw) {
99
99
  if (Buffer.isBuffer(pw)) return { bytes: guard.bytes.view(pw, Pkcs12Error, "pkcs12/bad-input", "the password"), owned: false };
package/lib/pki-build.js CHANGED
@@ -421,7 +421,7 @@ function makeBuilder(ctx) {
421
421
  function extSan(entries) { return encodeGeneralNames(entries); }
422
422
  function extCertPolicies(names) {
423
423
  if (!_isArray(names) || !names.length) throw E("bad-input", "certificatePolicies must list at least one policy OID");
424
- var seen = {};
424
+ var seen = intrinsic.create(null);
425
425
  return b.sequence(names.map(function (n) {
426
426
  var pOid = _resolveOid(n, "certificate policy");
427
427
  if (seen[pOid]) throw E("bad-input", "duplicate certificate policy " + guard.text.showValue(n) + " (RFC 5280 sec. 4.2.1.4)");
@@ -491,7 +491,7 @@ function makeBuilder(ctx) {
491
491
  var EXT_DECODERS = ctx.EXT_DECODERS;
492
492
  if (_isArray(extSpec)) {
493
493
  if (!extSpec.length) throw E("bad-input", "the requested extensions list must carry at least one extension");
494
- var seen = {};
494
+ var seen = intrinsic.create(null);
495
495
  return b.sequence(extSpec.map(function (e, i) {
496
496
  var der = reqDer(e, "extension");
497
497
  assertValidExtension(der, i);
package/lib/scep.js CHANGED
@@ -308,8 +308,8 @@ async function build(spec) {
308
308
  throw e;
309
309
  }
310
310
  }
311
- var _REQUEST_KEYS = { messageType: 1, messageData: 1, recipient: 1, requestSubject: 1, issuer: 1, certificate: 1, serialNumber: 1, signer: 1, transactionId: 1, senderNonce: 1 };
312
- var _CERTREP_KEYS = { messageType: 1, signer: 1, transactionId: 1, senderNonce: 1, pkiStatus: 1, recipientNonce: 1, certificates: 1, crls: 1, recipient: 1, failInfo: 1, failInfoText: 1 };
311
+ var _REQUEST_KEYS = Object.assign(Object.create(null), { messageType: 1, messageData: 1, recipient: 1, requestSubject: 1, issuer: 1, certificate: 1, serialNumber: 1, signer: 1, transactionId: 1, senderNonce: 1 });
312
+ var _CERTREP_KEYS = Object.assign(Object.create(null), { messageType: 1, signer: 1, transactionId: 1, senderNonce: 1, pkiStatus: 1, recipientNonce: 1, certificates: 1, crls: 1, recipient: 1, failInfo: 1, failInfoText: 1 });
313
313
 
314
314
  async function _buildCertRep(spec) {
315
315
  if (spec.signer == null || typeof spec.signer !== "object") throw _err("scep/bad-input", "a signer { cert, key } is required");
@@ -602,7 +602,7 @@ async function parse(bytes, opts) {
602
602
  }
603
603
  return out;
604
604
  }
605
- var _PARSE_KEYS = { recipientKey: 1, expectedSenderNonce: 1, signerCert: 1 };
605
+ var _PARSE_KEYS = Object.assign(Object.create(null), { recipientKey: 1, expectedSenderNonce: 1, signerCert: 1 });
606
606
 
607
607
  var DEFAULT_TIMEOUT = C.TIME.seconds(30);
608
608
  var MAX_TIMEOUT = C.TIME.seconds(600);
@@ -700,7 +700,7 @@ function _drive(method, url, body, headers, opts, transport, budgets) {
700
700
  var req = { method: curMethod, url: current.href, headers: headers, tls: _hopTls(current), timeout: budgets.timeout, maxResponseBytes: budgets.maxResponseBytes };
701
701
  if (proxySnap != null) req.proxy = proxySnap;
702
702
  if (curBody != null) req.body = curBody;
703
- return guard.async.awaited(transport(req), _err, "scep/bad-input", "opts.transport").then(function (res) {
703
+ return guard.async.invoked(transport, [req], _err, "scep/bad-input", "opts.transport").then(function (res) {
704
704
  res = res || {};
705
705
  var blen = _responseLen(res.body);
706
706
  if (blen > budgets.maxResponseBytes) throw _err("scep/response-too-large", "the response body (" + blen + " bytes) exceeds the " + budgets.maxResponseBytes + "-byte cap");
@@ -718,8 +718,21 @@ function _drive(method, url, body, headers, opts, transport, budgets) {
718
718
  return step(url);
719
719
  }
720
720
  function _snapshotProxy(p) { return httpTransport.snapshotProxy(p); }
721
- function _client(method, url, body, headers, opts) {
722
- var transport = opts.transport || httpTransport.https({ E: _err, errPrefix: "scep" });
721
+
722
+ /** @internal Refused at every network verb's door and again where the value is used. The checked
723
+ * value is RETURNED and it is that one the caller uses: reading the option again would ask a second
724
+ * time, and an accessor can answer differently on each read. */
725
+ function _assertTransport(opts) {
726
+ return guard.identifier.assertCallableOption(opts, "transport", _err, "scep/bad-input", "opts.transport",
727
+ "(request) => Promise<{ status, headers, body }>");
728
+ }
729
+
730
+ /** @internal `checked` is the transport the verb already took at its door. Taking it again here
731
+ * would ask the caller's options a second time, and anything read in between could change the
732
+ * answer, so a verb that holds one passes it and this reads the option only when none was held. */
733
+ function _client(method, url, body, headers, opts, checked) {
734
+ var resolved = checked !== undefined ? checked : _assertTransport(opts);
735
+ var transport = resolved || httpTransport.https({ E: _err, errPrefix: "scep" });
723
736
  var budgets = {
724
737
  timeout: guard.limits.cap(opts.timeout, "timeout", DEFAULT_TIMEOUT, { E: _err, code: "scep/bad-input", min: 1, max: MAX_TIMEOUT }),
725
738
  maxResponseBytes: guard.limits.cap(opts.maxResponseBytes, "maxResponseBytes", C.LIMITS.HTTP_MAX_RESPONSE_BYTES, { E: _err, code: "scep/bad-input", min: 1, max: C.LIMITS.HTTP_MAX_RESPONSE_BYTES }),
@@ -740,8 +753,8 @@ function _requireOk(res, expected, what) {
740
753
  return _bodyBuf(res.body);
741
754
  }
742
755
 
743
- var CAP_CANON = { AES: "AES", DES3: "DES3", GETNEXTCACERT: "GetNextCACert", POSTPKIOPERATION: "POSTPKIOperation",
744
- RENEWAL: "Renewal", "SHA-1": "SHA-1", "SHA-256": "SHA-256", "SHA-512": "SHA-512", SCEPSTANDARD: "SCEPStandard" };
756
+ var CAP_CANON = Object.assign(Object.create(null), { AES: "AES", DES3: "DES3", GETNEXTCACERT: "GetNextCACert", POSTPKIOPERATION: "POSTPKIOperation",
757
+ RENEWAL: "Renewal", "SHA-1": "SHA-1", "SHA-256": "SHA-256", "SHA-512": "SHA-512", SCEPSTANDARD: "SCEPStandard" });
745
758
  function _splitLines(s) {
746
759
  var out = [], start = 0, i, n = s.length;
747
760
  for (i = 0; i < n; i++) if (s.charCodeAt(i) === 0x0a) { out.push(s.slice(start, i)); start = i + 1; }
@@ -770,7 +783,7 @@ function _splitLines(s) {
770
783
  */
771
784
  function parseCapabilities(text) {
772
785
  var raw = Buffer.isBuffer(text) ? text.toString("latin1") : String(text == null ? "" : text);
773
- var set = {}, lines = _splitLines(raw), i;
786
+ var set = Object.create(null), lines = _splitLines(raw), i;
774
787
  for (i = 0; i < lines.length; i++) {
775
788
  var kw = _foldUpper(_trim(lines[i]));
776
789
  if (kw !== "" && CAP_CANON[kw]) set[CAP_CANON[kw]] = true;
@@ -810,14 +823,21 @@ function _assertStrongProfile(caps, profile) {
810
823
  async function getCACaps(baseUrl, opts) {
811
824
  opts = guard.identifier.optionsObject(opts, _err, "scep/bad-input", "pki.scep.getCACaps options");
812
825
  guard.identifier.assertKnownKeys(opts, _CACAPS_KEYS, _err, "scep/bad-input", "pki.scep.getCACaps has an unknown option: ");
826
+ var checkedTransport = _assertTransport(opts);
813
827
  var profile = { expectSCEPStandard: !!opts.expectSCEPStandard, requireStrongProfile: !!opts.requireStrongProfile };
814
- var res = await _client("GET", _scepUrl(baseUrl, "GetCACaps"), null, {}, opts);
828
+ var res = await _client("GET", _scepUrl(baseUrl, "GetCACaps"), null, {}, opts, checkedTransport);
815
829
  if (res.status === 200) {
816
830
  var caps = parseCapabilities(_requireOk(res, [CT_PLAIN], "GetCACaps"));
817
831
  _assertStrongProfile(caps, profile);
818
832
  return caps;
819
833
  }
820
- if (res.status === 204 || res.status === 400 || res.status === 404 || res.status === 405 || res.status === 501) { _assertStrongProfile({}, profile); return {}; }
834
+ /** @internal Built the way parseCapabilities builds one, so a CA that advertises nothing yields a
835
+ * capabilities map of the same shape as one that advertises something. */
836
+ if (res.status === 204 || res.status === 400 || res.status === 404 || res.status === 405 || res.status === 501) {
837
+ var none = Object.create(null);
838
+ _assertStrongProfile(none, profile);
839
+ return none;
840
+ }
821
841
  throw _err("scep/http-error", "the SCEP GetCACaps returned HTTP " + res.status);
822
842
  }
823
843
 
@@ -882,8 +902,9 @@ function _normalizeFingerprint(fp, algName) {
882
902
  async function getCACert(baseUrl, opts) {
883
903
  opts = guard.identifier.optionsObject(opts, _err, "scep/bad-input", "pki.scep.getCACert options");
884
904
  guard.identifier.assertKnownKeys(opts, _CACERT_KEYS, _err, "scep/bad-input", "pki.scep.getCACert has an unknown option: ");
905
+ var checkedTransport = _assertTransport(opts);
885
906
  var fp = opts.expectedFingerprint != null ? _normalizeFingerprint(opts.expectedFingerprint, opts.fingerprintAlgorithm) : null;
886
- var res = await _client("GET", _scepUrl(baseUrl, "GetCACert"), null, {}, opts);
907
+ var res = await _client("GET", _scepUrl(baseUrl, "GetCACert"), null, {}, opts, checkedTransport);
887
908
  var body = _requireOk(res, [CT_CA_CERT, CT_CA_RA_CERT], "GetCACert");
888
909
  var ct = _mediaType(_header(res.headers, "content-type")), certs, single = false;
889
910
  if (ct === CT_CA_CERT) {
@@ -937,11 +958,12 @@ async function getCACert(baseUrl, opts) {
937
958
  async function getNextCACert(baseUrl, opts) {
938
959
  opts = guard.identifier.optionsObject(opts, _err, "scep/bad-input", "pki.scep.getNextCACert options");
939
960
  guard.identifier.assertKnownKeys(opts, _NEXTCACERT_KEYS, _err, "scep/bad-input", "pki.scep.getNextCACert has an unknown option: ");
961
+ var checkedTransport = _assertTransport(opts);
940
962
  if (opts.caCertificate == null) throw _err("scep/bad-input", "a caCertificate (the current SCEP CA certificate DER) is required to authenticate the GetNextCACert response (RFC 8894 sec. 4.7.1)");
941
963
  var currentCa = guard.bytes.snapshotSource(opts.caCertificate, ScepError, "scep/bad-input", "the caCertificate");
942
964
  _assertSigningKeyUsage(currentCa, "the caCertificate");
943
965
  var url = _scepUrl(baseUrl, "GetNextCACert");
944
- var res = await _client("GET", url, null, {}, opts);
966
+ var res = await _client("GET", url, null, {}, opts, checkedTransport);
945
967
  var body = _requireOk(res, [CT_NEXT_CA_CERT], "GetNextCACert");
946
968
  var v;
947
969
  try { v = await cmsVerify.verify(body, { certs: [currentCa] }); }
@@ -1019,6 +1041,10 @@ async function _pollForIssuance(ctx) {
1019
1041
  async function _pkiOperation(messageType, baseUrl, opts, verbName) {
1020
1042
  opts = guard.identifier.optionsObject(opts, _err, "scep/bad-input", "pki.scep." + verbName + " options");
1021
1043
  guard.identifier.assertKnownKeys(opts, _ENROLL_KEYS, _err, "scep/bad-input", "pki.scep." + verbName + " has an unknown option: ");
1044
+ /** @internal Held from the door and forwarded below. The options this verb reads on the way there
1045
+ * are the caller's, and reading the transport again afterwards would let one of them change what
1046
+ * comes back, so the value that was checked is the value that is used. */
1047
+ var checkedTransport = _assertTransport(opts);
1022
1048
  if (opts.csr == null) throw _err("scep/bad-input", "a csr (PKCS#10 DER) is required");
1023
1049
  if (opts.caCert == null) throw _err("scep/bad-input", "a caCert (the SCEP CA certificate DER) is required");
1024
1050
  if (opts.signer == null || typeof opts.signer !== "object") throw _err("scep/bad-input", "a signer { cert, key } is required");
@@ -1029,7 +1055,6 @@ async function _pkiOperation(messageType, baseUrl, opts, verbName) {
1029
1055
  var recipientKey = _captureRecipientKey(opts.recipientKey);
1030
1056
  var signer = { cert: guard.bytes.snapshotSource(opts.signer.cert, ScepError, "scep/bad-input", "signer.cert"), key: opts.signer.key };
1031
1057
  var clientOpts = {
1032
- transport: opts.transport,
1033
1058
  tls: opts.tls != null ? Object.assign({}, opts.tls) : opts.tls,
1034
1059
  maxRedirects: opts.maxRedirects,
1035
1060
  allowCrossOriginRedirect: opts.allowCrossOriginRedirect,
@@ -1037,6 +1062,9 @@ async function _pkiOperation(messageType, baseUrl, opts, verbName) {
1037
1062
  maxResponseBytes: opts.maxResponseBytes,
1038
1063
  proxy: _snapshotProxy(opts.proxy),
1039
1064
  };
1065
+ /** @internal The value held from the door, carried only when the caller supplied one, so an
1066
+ * omitted transport does not arrive downstream as a key that is present and undefined. */
1067
+ if (checkedTransport !== undefined) clientOpts.transport = checkedTransport;
1040
1068
  var postUrl = _scepUrl(baseUrl, "PKIOperation");
1041
1069
  var httpMethod = _pkiMethod(opts);
1042
1070
  var csrView = guard.bytes.snapshotSource(opts.csr, ScepError, "scep/bad-input", "the csr");
@@ -1168,6 +1196,8 @@ function _resolveQueryTarget(opts) {
1168
1196
  async function _queryOperation(messageType, baseUrl, opts, verbName) {
1169
1197
  opts = guard.identifier.optionsObject(opts, _err, "scep/bad-input", "pki.scep." + verbName + " options");
1170
1198
  guard.identifier.assertKnownKeys(opts, _QUERY_KEYS, _err, "scep/bad-input", "pki.scep." + verbName + " has an unknown option: ");
1199
+ /** @internal Held from the door and forwarded below, so a later read cannot answer differently. */
1200
+ var checkedTransport = _assertTransport(opts);
1171
1201
  if (opts.caCert == null) throw _err("scep/bad-input", "a caCert (the SCEP CA certificate DER) is required");
1172
1202
  if (opts.signer == null || typeof opts.signer !== "object") throw _err("scep/bad-input", "a signer { cert, key } is required");
1173
1203
  if (opts.recipientKey == null || typeof opts.recipientKey !== "object") throw _err("scep/bad-input", "a recipientKey { cert, key } is required to decrypt the CA response");
@@ -1176,7 +1206,8 @@ async function _queryOperation(messageType, baseUrl, opts, verbName) {
1176
1206
  var recipientKey = _captureRecipientKey(opts.recipientKey);
1177
1207
  var signer = { cert: guard.bytes.snapshotSource(opts.signer.cert, ScepError, "scep/bad-input", "signer.cert"), key: opts.signer.key };
1178
1208
  var want = _resolveQueryTarget(opts);
1179
- var clientOpts = { transport: opts.transport, tls: opts.tls != null ? Object.assign({}, opts.tls) : opts.tls, maxRedirects: opts.maxRedirects, allowCrossOriginRedirect: opts.allowCrossOriginRedirect, timeout: opts.timeout, maxResponseBytes: opts.maxResponseBytes, proxy: _snapshotProxy(opts.proxy) };
1209
+ var clientOpts = { tls: opts.tls != null ? Object.assign({}, opts.tls) : opts.tls, maxRedirects: opts.maxRedirects, allowCrossOriginRedirect: opts.allowCrossOriginRedirect, timeout: opts.timeout, maxResponseBytes: opts.maxResponseBytes, proxy: _snapshotProxy(opts.proxy) };
1210
+ if (checkedTransport !== undefined) clientOpts.transport = checkedTransport;
1180
1211
  var senderNonce = nodeCrypto.randomBytes(16);
1181
1212
  var transactionId = opts.transactionId != null ? opts.transactionId : _defaultTransactionId();
1182
1213
  var httpMethod = _pkiMethod(opts);
@@ -1287,7 +1318,7 @@ async function getCrl(baseUrl, opts) {
1287
1318
  return { crl: match, crls: crls, transactionId: q.transactionId };
1288
1319
  }
1289
1320
 
1290
- var _TRANSPORT_KEYS = { transport: 1, timeout: 1, maxResponseBytes: 1, maxRedirects: 1, tls: 1, allowCrossOriginRedirect: 1, proxy: 1 };
1321
+ var _TRANSPORT_KEYS = Object.assign(Object.create(null), { transport: 1, timeout: 1, maxResponseBytes: 1, maxRedirects: 1, tls: 1, allowCrossOriginRedirect: 1, proxy: 1 });
1291
1322
  function _withKeys(extra) { var o = {}, k; for (k in _TRANSPORT_KEYS) o[k] = 1; for (k in extra) o[k] = 1; return o; }
1292
1323
  var _CACAPS_KEYS = _withKeys({ expectSCEPStandard: 1, requireStrongProfile: 1 });
1293
1324
  var _CACERT_KEYS = _withKeys({ expectedFingerprint: 1, fingerprintAlgorithm: 1 });
package/lib/schema-all.js CHANGED
@@ -53,7 +53,7 @@ var frameworkError = require("./framework-error");
53
53
  var SchemaError = frameworkError.SchemaError;
54
54
  var PemError = frameworkError.PemError;
55
55
 
56
- var ENTRY = { pemLabel: null, PemError: PemError, ErrorClass: SchemaError, prefix: "schema", what: "input", ber: true };
56
+ var ENTRY = Object.assign(Object.create(null), { pemLabel: null, PemError: PemError, ErrorClass: SchemaError, prefix: "schema", what: "input", ber: true });
57
57
 
58
58
  var FORMATS = [
59
59
  {
@@ -280,7 +280,7 @@ var ATTRIBUTE_CERTIFICATE = pkix.signedEnvelope(NS, ACINFO, {
280
280
  * ac.attributes[0].name; // "role"
281
281
  * ac.validity.notAfterTime;// Date
282
282
  */
283
- var PARSE_OPTS = { pemLabel: "ATTRIBUTE CERTIFICATE", PemError: PemError, ErrorClass: AttrCertError, prefix: "attrcert", what: "attribute certificate" };
283
+ var PARSE_OPTS = intrinsic.assign(intrinsic.create(null), { pemLabel: "ATTRIBUTE CERTIFICATE", PemError: PemError, ErrorClass: AttrCertError, prefix: "attrcert", what: "attribute certificate" });
284
284
 
285
285
  function _legacyV1Error() {
286
286
  return new AttrCertError("attrcert/legacy-v1-not-supported", "AttributeCertificateV1 (X.509-1997) is obsolete and not parsed by this build (RFC 5755 sec. 1)");
@@ -448,6 +448,7 @@ function _decodeClassList(node, C) {
448
448
  var bs;
449
449
  try { bs = asn1.read.bitString(node); } catch (e) { throw NS.E(C, "Clearance classList must be a BIT STRING", e); }
450
450
  schema.assertMinimalNamedBits(bs.unusedBits, bs.bytes, function (m) { throw NS.E(C, m); });
451
+ // allow:registry-table-inherits-object-prototype -- the classList record an operator reads by field name, whose keys are the fixed _CLASSLIST_NAMES; the omitted-classList default at the foot of this file builds the same shape
451
452
  var names = [], flags = {}, reserved = [];
452
453
  var total = bs.bytes.length * 8 - bs.unusedBits;
453
454
  for (var bit = 0; bit < total; bit++) {
@@ -490,7 +491,7 @@ function _clearance(buf) {
490
491
  return { policyId: policyId, classList: classList, securityCategories: securityCategories };
491
492
  }
492
493
 
493
- var _ATTR_VALUE_DECODERS = {};
494
+ var _ATTR_VALUE_DECODERS = intrinsic.create(null);
494
495
  _ATTR_VALUE_DECODERS[_Oav("role")] = _role;
495
496
  _ATTR_VALUE_DECODERS[_Oav("clearance")] = _clearance;
496
497
  _ATTR_VALUE_DECODERS[oid.fromArcs([2, 5, 1, 5, 55])] = _clearance;
@@ -570,7 +571,7 @@ function _aaControls(buf) {
570
571
  return out;
571
572
  }
572
573
 
573
- var _AC_EXT_DECODERS = {};
574
+ var _AC_EXT_DECODERS = intrinsic.create(null);
574
575
  _AC_EXT_DECODERS[_Oav("acAuditIdentity")] = _acAuditIdentity;
575
576
  _AC_EXT_DECODERS[_Oav("targetInformation")] = _targetInformation;
576
577
  _AC_EXT_DECODERS[_Oav("noRevAvail")] = _noRevAvail;
@@ -51,17 +51,17 @@ var NO_EXPIRY_SECONDS = 253402300799n;
51
51
 
52
52
  function _name(n) { var d = oid.byName(n); if (!d) { throw new Error("schema-c509: unregistered OID name " + JSON.stringify(n)); } return n; }
53
53
 
54
- var SIG_ALG_BY_INT = {
54
+ var SIG_ALG_BY_INT = Object.assign(Object.create(null), {
55
55
  0: _name("ecdsaWithSHA256"),
56
56
  1: _name("ecdsaWithSHA384"),
57
57
  2: _name("ecdsaWithSHA512"),
58
- };
59
- var PK_ALG_BY_INT = {
58
+ });
59
+ var PK_ALG_BY_INT = Object.assign(Object.create(null), {
60
60
  0: { alg: _name("rsaEncryption") },
61
61
  1: { alg: _name("ecPublicKey"), curve: _name("prime256v1") },
62
62
  2: { alg: _name("ecPublicKey"), curve: _name("secp384r1") },
63
63
  3: { alg: _name("ecPublicKey"), curve: _name("secp521r1") },
64
- };
64
+ });
65
65
  var EC_FIELD_BYTES = Object.assign(Object.create(null), { "prime256v1": 32, "secp384r1": 48, "secp521r1": 66 });
66
66
  /** @internal Curve identity follows the dotted OID; pki.oid.register can rename one at any time. */
67
67
  var EC_CURVE_BY_OID = Object.create(null);
@@ -69,7 +69,7 @@ Object.keys(EC_FIELD_BYTES).forEach(function (n) { EC_CURVE_BY_OID[oid.byName(n)
69
69
  var SIG_ALG_BY_OID = Object.create(null);
70
70
  Object.keys(SIG_ALG_BY_INT).forEach(function (k) { SIG_ALG_BY_OID[oid.byName(SIG_ALG_BY_INT[k])] = SIG_ALG_BY_INT[k]; });
71
71
 
72
- var ATTR_BY_INT = {
72
+ var ATTR_BY_INT = Object.assign(Object.create(null), {
73
73
  0: _name("emailAddress"),
74
74
  1: _name("commonName"),
75
75
  2: _name("surname"),
@@ -81,8 +81,8 @@ var ATTR_BY_INT = {
81
81
  8: _name("organizationName"),
82
82
  9: _name("organizationalUnitName"),
83
83
  10: _name("title"),
84
- };
85
- var EXT_BY_INT = {
84
+ });
85
+ var EXT_BY_INT = Object.assign(Object.create(null), {
86
86
  1: _name("subjectKeyIdentifier"),
87
87
  2: _name("keyUsage"),
88
88
  3: _name("subjectAltName"),
@@ -106,7 +106,7 @@ var EXT_BY_INT = {
106
106
  35: _name("autonomousSysIdsV2"),
107
107
  36: _name("ocspNoCheck"),
108
108
  38: _name("tlsFeature"),
109
- };
109
+ });
110
110
  var EXT_COMPACT = Object.assign(Object.create(null), {
111
111
  subjectKeyIdentifier: 1, keyUsage: 1, basicConstraints: 1, authorityKeyIdentifier: 1,
112
112
  extKeyUsage: 1, inhibitAnyPolicy: 1, ocspNoCheck: 1, tlsFeature: 1,
@@ -115,31 +115,31 @@ var EXT_COMPACT = Object.assign(Object.create(null), {
115
115
  policyMappings: 1, policyConstraints: 1, subjectDirectoryAttributes: 1,
116
116
  ipAddrBlocks: 1, autonomousSysIds: 1, ipAddrBlocksV2: 1, autonomousSysIdsV2: 1,
117
117
  });
118
- var EKU_BY_INT = {
118
+ var EKU_BY_INT = Object.assign(Object.create(null), {
119
119
  0: _name("anyExtendedKeyUsage"), 1: _name("serverAuth"), 2: _name("clientAuth"),
120
120
  3: _name("codeSigning"), 4: _name("emailProtection"), 8: _name("timeStamping"), 9: _name("ocspSigning"),
121
121
  10: _name("pkinitClientAuth"), 11: _name("pkinitKdc"), 12: _name("secureShellClient"), 13: _name("secureShellServer"),
122
122
  14: _name("bundleSecurity"), 15: _name("cmcCA"), 16: _name("cmcRA"), 17: _name("cmcArchive"), 18: _name("cmKGA"),
123
123
  20: _name("fanDevice"),
124
- };
125
- var EKU_TO_INT = {};
124
+ });
125
+ var EKU_TO_INT = Object.create(null);
126
126
  Object.keys(EKU_BY_INT).forEach(function (k) { EKU_TO_INT[oid.byName(EKU_BY_INT[k])] = Number(k); });
127
127
 
128
128
  var NS = pkix.makeNS("c509", C509Error, oid);
129
129
  var GN_LEAF = pkix.generalName(NS, { decodeValue: true });
130
130
  var GN_LEAF_SUBTREE = pkix.generalName(NS, { decodeValue: true, subtreeBase: true });
131
131
 
132
- var ON_NAME_BY_INT = { "-1": _name("hardwareModuleName"), "-2": _name("smtpUtf8Mailbox"), "-3": _name("macAddress") };
133
- var ON_INT_BY_OID = {};
132
+ var ON_NAME_BY_INT = Object.assign(Object.create(null), { "-1": _name("hardwareModuleName"), "-2": _name("smtpUtf8Mailbox"), "-3": _name("macAddress") });
133
+ var ON_INT_BY_OID = Object.create(null);
134
134
  Object.keys(ON_NAME_BY_INT).forEach(function (k) { ON_INT_BY_OID[oid.byName(ON_NAME_BY_INT[k])] = Number(k); });
135
- var IA_BY_INT = {
135
+ var IA_BY_INT = Object.assign(Object.create(null), {
136
136
  1: _name("ocsp"), 2: _name("caIssuers"), 3: _name("id-ad-timeStamping"), 5: _name("id-ad-caRepository"),
137
137
  10: _name("id-ad-rpkiManifest"), 11: _name("id-ad-signedObject"), 13: _name("id-ad-rpkiNotify"),
138
- };
139
- var IA_TO_INT = {};
138
+ });
139
+ var IA_TO_INT = Object.create(null);
140
140
  Object.keys(IA_BY_INT).forEach(function (k) { IA_TO_INT[oid.byName(IA_BY_INT[k])] = Number(k); });
141
141
 
142
- var CP_BY_INT = {
142
+ var CP_BY_INT = Object.assign(Object.create(null), {
143
143
  0: _name("anyPolicy"), 1: _name("domain-validated"), 2: _name("organization-validated"),
144
144
  3: _name("individual-validated"), 4: _name("ev-guidelines"),
145
145
  7: _name("id-cp-ipAddr-asNumber"), 8: _name("id-cp-ipAddr-asNumber-v2"),
@@ -150,11 +150,11 @@ var CP_BY_INT = {
150
150
  33: _name("id-rspRole-dp-pb-v2"), 34: _name("id-rspRole-dp-pb"),
151
151
  35: _name("id-rspRole-ds-tls-v2"), 36: _name("id-rspRole-ds-tls"),
152
152
  37: _name("id-rspRole-ds-auth-v2"), 38: _name("id-rspRole-ds-auth"),
153
- };
154
- var CP_TO_INT = {};
153
+ });
154
+ var CP_TO_INT = Object.create(null);
155
155
  Object.keys(CP_BY_INT).forEach(function (k) { CP_TO_INT[oid.byName(CP_BY_INT[k])] = Number(k); });
156
- var PQ_BY_INT = { 1: _name("cps"), 2: _name("unotice") };
157
- var PQ_TO_INT = {};
156
+ var PQ_BY_INT = Object.assign(Object.create(null), { 1: _name("cps"), 2: _name("unotice") });
157
+ var PQ_TO_INT = Object.create(null);
158
158
  Object.keys(PQ_BY_INT).forEach(function (k) { PQ_TO_INT[oid.byName(PQ_BY_INT[k])] = Number(k); });
159
159
 
160
160
 
@@ -543,7 +543,7 @@ function _ipIntToSeq(n) {
543
543
  out[0] -= 1;
544
544
  return Buffer.from(out);
545
545
  }
546
- var _IP_WIDTH = { 1: 4, 2: 16 };
546
+ var _IP_WIDTH = Object.assign(Object.create(null), { 1: 4, 2: 16 });
547
547
 
548
548
  function _ipLow(seq, width) {
549
549
  var v = Buffer.alloc(width);
@@ -1013,7 +1013,7 @@ function _extValueToDer(name, node, isNative) {
1013
1013
  if (node.majorType !== 4 || !node.children) throw _err("c509/bad-extensions", "a certificatePolicies value must be a CBOR array");
1014
1014
  var cpKids = node.children;
1015
1015
  if (cpKids.length === 0 || cpKids.length % 2 !== 0) throw _err("c509/bad-extensions", "a certificatePolicies array must be non-empty (policyIdentifier, qualifiers) pairs (sec. 3.3)");
1016
- var polInfos = [], seenPolicy = {};
1016
+ var polInfos = [], seenPolicy = Object.create(null);
1017
1017
  for (var cpi = 0; cpi + 1 < cpKids.length; cpi += 2) {
1018
1018
  var quals = cpKids[cpi + 1];
1019
1019
  if (quals.majorType !== 4 || !quals.children) throw _err("c509/bad-extensions", "a certificatePolicies qualifiers slot must be a CBOR array");
package/lib/schema-cmc.js CHANGED
@@ -62,21 +62,21 @@ var OID_RA_IDENTITY_WITNESS = O("id-cmc-raIdentityWitness");
62
62
 
63
63
  var BODY_PART_MAX = 4294967295n;
64
64
 
65
- var STATUS_BY_VALUE = {
65
+ var STATUS_BY_VALUE = Object.assign(Object.create(null), {
66
66
  0: "success", 2: "failed", 3: "pending", 4: "noSupport",
67
67
  5: "confirmRequired", 6: "popRequired", 7: "partial",
68
- };
68
+ });
69
69
 
70
- var FAIL_INFO_BY_VALUE = {
70
+ var FAIL_INFO_BY_VALUE = Object.assign(Object.create(null), {
71
71
  0: "badAlg", 1: "badMessageCheck", 2: "badRequest", 3: "badTime", 4: "badCertId",
72
72
  5: "unsupportedExt", 6: "mustArchiveKeys", 7: "badIdentity", 8: "popRequired",
73
73
  9: "popFailed", 10: "noKeyReuse", 11: "internalCAError", 12: "tryLater",
74
74
  13: "authDataFail",
75
- };
75
+ });
76
76
 
77
- var CMC_CARRIERS = { signedData: 1, authData: 1 };
77
+ var CMC_CARRIERS = Object.assign(Object.create(null), { signedData: 1, authData: 1 });
78
78
 
79
- var CONTROL_PLACEMENT = {};
79
+ var CONTROL_PLACEMENT = Object.create(null);
80
80
  CONTROL_PLACEMENT[OID_RESPONSE_BODY] = "pkiResponse";
81
81
  CONTROL_PLACEMENT[OID_RA_IDENTITY_WITNESS] = "pkiData";
82
82