@blamejs/pki 0.6.40 → 0.6.42

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 (75) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +1 -1
  3. package/lib/acme.js +24 -13
  4. package/lib/asn1-der.js +5 -5
  5. package/lib/attrcert-sign.js +14 -14
  6. package/lib/cbor-det.js +2 -2
  7. package/lib/cmc-build.js +16 -16
  8. package/lib/cmc-verify.js +5 -5
  9. package/lib/cmp-build.js +29 -19
  10. package/lib/cmp-session.js +21 -16
  11. package/lib/cmp-verify.js +4 -4
  12. package/lib/cms-decrypt.js +8 -8
  13. package/lib/cms-encrypt.js +22 -22
  14. package/lib/cms-sign.js +17 -17
  15. package/lib/cms-verify.js +6 -6
  16. package/lib/composite-kem.js +1 -1
  17. package/lib/composite-sig.js +4 -4
  18. package/lib/constants.js +13 -9
  19. package/lib/crl-sign.js +17 -17
  20. package/lib/crmf-sign.js +11 -11
  21. package/lib/csr-sign.js +2 -2
  22. package/lib/ct.js +19 -11
  23. package/lib/edwards-point.js +2 -2
  24. package/lib/est.js +74 -43
  25. package/lib/guard-async.js +17 -1
  26. package/lib/guard-bytes.js +2 -2
  27. package/lib/guard-compress.js +5 -5
  28. package/lib/guard-identifier.js +45 -1
  29. package/lib/guard-name.js +272 -1
  30. package/lib/guard-time.js +3 -1
  31. package/lib/hpke.js +10 -10
  32. package/lib/http-digest.js +2 -2
  33. package/lib/http-transport.js +3 -3
  34. package/lib/inspect.js +9 -9
  35. package/lib/jose.js +14 -14
  36. package/lib/key.js +7 -7
  37. package/lib/lint.js +6 -4
  38. package/lib/merkle.js +2 -2
  39. package/lib/mime.js +2 -2
  40. package/lib/ocsp-verify.js +1 -1
  41. package/lib/ocsp.js +5 -5
  42. package/lib/oid.js +3 -3
  43. package/lib/path-validate.js +50 -120
  44. package/lib/pbes2.js +2 -2
  45. package/lib/pkcs12-build.js +15 -15
  46. package/lib/pki-build.js +2 -2
  47. package/lib/scep.js +47 -16
  48. package/lib/schema-all.js +1 -1
  49. package/lib/schema-attrcert.js +4 -3
  50. package/lib/schema-c509.js +23 -23
  51. package/lib/schema-cmc.js +6 -6
  52. package/lib/schema-cmp.js +3 -3
  53. package/lib/schema-cms.js +15 -8
  54. package/lib/schema-crmf.js +1 -1
  55. package/lib/schema-csr.js +1 -1
  56. package/lib/schema-engine.js +2 -1
  57. package/lib/schema-pkcs12.js +1 -1
  58. package/lib/schema-pkix.js +3 -0
  59. package/lib/schema-tsp.js +2 -2
  60. package/lib/shbs.js +2 -2
  61. package/lib/sign-scheme.js +9 -9
  62. package/lib/sigstore.js +9 -8
  63. package/lib/smime.js +12 -12
  64. package/lib/tls-cert-compress.js +6 -6
  65. package/lib/trust.js +179 -10
  66. package/lib/tsp-sign.js +11 -11
  67. package/lib/validator-attcert.js +2 -2
  68. package/lib/validator-cose.js +5 -5
  69. package/lib/validator-sig.js +3 -3
  70. package/lib/validator-tpm.js +5 -4
  71. package/lib/webauthn.js +12 -12
  72. package/lib/webcrypto.js +22 -14
  73. package/lib/x509-sign.js +8 -8
  74. package/package.json +1 -1
  75. package/sbom.cdx.json +6 -6
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
 
package/lib/schema-cmp.js CHANGED
@@ -462,15 +462,15 @@ var POLL_REP_CONTENT = schema.seqOf(POLL_REP_ENTRY, {
462
462
  var BODY_ARMS = ["ir", "ip", "cr", "cp", "p10cr", "popdecc", "popdecr", "kur", "kup",
463
463
  "krr", "krp", "rr", "rp", "ccr", "ccp", "ckuann", "cann", "rann", "crlann",
464
464
  "pkiconf", "nested", "genm", "genp", "error", "certConf", "pollReq", "pollRep"];
465
- var CRMF_ARMS = { 0: true, 2: true, 7: true, 9: true, 13: true };
466
- var DECODED_ARMS = {
465
+ var CRMF_ARMS = Object.assign(Object.create(null), { 0: true, 2: true, 7: true, 9: true, 13: true });
466
+ var DECODED_ARMS = Object.assign(Object.create(null), {
467
467
  1: CERT_REP_MESSAGE, 3: CERT_REP_MESSAGE, 8: CERT_REP_MESSAGE, 14: CERT_REP_MESSAGE,
468
468
  10: KEY_REC_REP_CONTENT,
469
469
  11: REV_REQ_CONTENT, 12: REV_REP_CONTENT,
470
470
  21: GEN_MSG_CONTENT, 22: GEN_MSG_CONTENT,
471
471
  23: ERROR_MSG_CONTENT, 24: CERT_CONFIRM_CONTENT,
472
472
  25: POLL_REQ_CONTENT, 26: POLL_REP_CONTENT,
473
- };
473
+ });
474
474
 
475
475
  var BODY = schema.decode(function (n, ctx) {
476
476
  if (n.tagClass !== "context" || !n.children) {
package/lib/schema-cms.js CHANGED
@@ -84,17 +84,17 @@ var OID_COMPRESSED_DATA = oid.byName("compressedData");
84
84
  var OID_DATA = oid.byName("data");
85
85
  var OID_ORI_KEM = oid.byName("kem");
86
86
 
87
- var WRAP_KEK_LENGTHS = {};
87
+ var WRAP_KEK_LENGTHS = Object.create(null);
88
88
  WRAP_KEK_LENGTHS[oid.byName("aes128-wrap")] = 16;
89
89
  WRAP_KEK_LENGTHS[oid.byName("aes192-wrap")] = 24;
90
90
  WRAP_KEK_LENGTHS[oid.byName("aes256-wrap")] = 32;
91
91
 
92
- var KEM_CT_LENGTHS = {};
92
+ var KEM_CT_LENGTHS = Object.create(null);
93
93
  ["id-ml-kem-512", "id-ml-kem-768", "id-ml-kem-1024"].forEach(function (n) { KEM_CT_LENGTHS[oid.byName(n)] = oid.kemParams(n).ct; });
94
94
 
95
95
  var AEAD_GCM_ICVLENS = new Set([12, 13, 14, 15, 16]);
96
96
  var AEAD_CCM_ICVLENS = new Set([4, 6, 8, 10, 12, 14, 16]);
97
- var AEAD_ALGS = {};
97
+ var AEAD_ALGS = Object.create(null);
98
98
  ["aes128-GCM", "aes192-GCM", "aes256-GCM"].forEach(function (n) { AEAD_ALGS[oid.byName(n)] = "gcm"; });
99
99
  ["aes128-CCM", "aes192-CCM", "aes256-CCM"].forEach(function (n) { AEAD_ALGS[oid.byName(n)] = "ccm"; });
100
100
 
@@ -107,15 +107,15 @@ var OID_MESSAGE_DIGEST = oid.byName("messageDigest");
107
107
  var OID_SIGNING_TIME = oid.byName("signingTime");
108
108
  var OID_COUNTERSIGNATURE = oid.byName("countersignature");
109
109
 
110
- var ATTR_FORBIDDEN_IN = {};
110
+ var ATTR_FORBIDDEN_IN = Object.create(null);
111
111
  ATTR_FORBIDDEN_IN[OID_CONTENT_TYPE] = { unsigned: true, unauth: true, unprotected: true };
112
112
  ATTR_FORBIDDEN_IN[OID_MESSAGE_DIGEST] = { unsigned: true, unauth: true, unprotected: true };
113
113
  ATTR_FORBIDDEN_IN[OID_SIGNING_TIME] = { unsigned: true, unauth: true, unprotected: true };
114
114
  ATTR_FORBIDDEN_IN[OID_COUNTERSIGNATURE] = { signed: true, auth: true, unauth: true, unprotected: true };
115
- var ATTR_PLACE_LABELS = {
115
+ var ATTR_PLACE_LABELS = Object.assign(Object.create(null), {
116
116
  signed: "a signed attribute", unsigned: "an unsigned attribute", auth: "an authenticated attribute",
117
117
  unauth: "an unauthenticated attribute", unprotected: "an unprotected attribute",
118
- };
118
+ });
119
119
 
120
120
  function _checkAttrPlacement(attrs, place) {
121
121
  for (var i = 0; i < attrs.length; i++) {
@@ -284,8 +284,14 @@ function rawElement(item) {
284
284
  return { bytes: item.node.bytes, tagClass: item.node.tagClass, tagNumber: item.node.tagNumber };
285
285
  }
286
286
 
287
- var CERT_CHOICE_TAGS = { universal: {}, context: { 0: true, 1: true, 2: true, 3: true } };
288
- var CRL_CHOICE_TAGS = { universal: {}, context: { 1: true } };
287
+ var CERT_CHOICE_TAGS = Object.assign(Object.create(null), {
288
+ universal: Object.create(null),
289
+ context: Object.assign(Object.create(null), { 0: true, 1: true, 2: true, 3: true }),
290
+ });
291
+ var CRL_CHOICE_TAGS = Object.assign(Object.create(null), {
292
+ universal: Object.create(null),
293
+ context: Object.assign(Object.create(null), { 1: true }),
294
+ });
289
295
  CERT_CHOICE_TAGS.universal[asn1.TAGS.SEQUENCE] = true;
290
296
  CRL_CHOICE_TAGS.universal[asn1.TAGS.SEQUENCE] = true;
291
297
  function rawChoiceElement(allowed, code, what) {
@@ -510,6 +516,7 @@ function keyIdentifierSchema(keyIdName, assert, code, what) {
510
516
  ], {
511
517
  assert: assert, code: code, what: what,
512
518
  build: function (m) {
519
+ // allow:registry-table-inherits-object-prototype -- a fixed-shape parse record read as rid / kekid, whose one computed key is the keyIdName argument both callers pass as a string literal
513
520
  var out = {};
514
521
  out[keyIdName] = m.fields[keyIdName].value;
515
522
  out.date = m.fields.date.present ? m.fields.date.value : null;
@@ -140,7 +140,7 @@ var POPO_SIGNING_KEY = schema.seq([
140
140
  },
141
141
  });
142
142
 
143
- var POPOPRIVKEY_METHODS = { 0: "thisMessage", 1: "subsequentMessage", 2: "dhMAC", 3: "agreeMAC", 4: "encryptedKey" };
143
+ var POPOPRIVKEY_METHODS = Object.assign(Object.create(null), { 0: "thisMessage", 1: "subsequentMessage", 2: "dhMAC", 3: "agreeMAC", 4: "encryptedKey" });
144
144
  function popoPrivKey(type) {
145
145
  return schema.decode(function (n, ctx) {
146
146
  if (!n.children || n.children.length !== 1) {
package/lib/schema-csr.js CHANGED
@@ -52,7 +52,7 @@ var DIRECTORY_STRING_TAGS = [
52
52
  asn1.TAGS.UTF8_STRING, asn1.TAGS.PRINTABLE_STRING, asn1.TAGS.TELETEX_STRING,
53
53
  asn1.TAGS.UNIVERSAL_STRING, asn1.TAGS.BMP_STRING,
54
54
  ];
55
- var RECOGNIZED_ATTRIBUTE_VALUE = {};
55
+ var RECOGNIZED_ATTRIBUTE_VALUE = Object.create(null);
56
56
  RECOGNIZED_ATTRIBUTE_VALUE[oid.byName("extensionRequest")] = function (node, ctx) {
57
57
  try { return { extensions: schema.walk(EXTENSIONS, node, ctx).result }; }
58
58
  catch (e) {
@@ -279,6 +279,7 @@ function _walkSeq(schema, node, ctx) {
279
279
  var kids = _assertShape(schema, node, ctx);
280
280
  _assertArity(schema, kids, ctx);
281
281
 
282
+ // allow:registry-table-inherits-object-prototype -- the record a schema's own check and build callbacks read as m.fields, whose keys are the field names that schema declared rather than anything the input supplies
282
283
  var fields = {};
283
284
  var idx = 0;
284
285
  for (var f = 0; f < schema.fields.length; f++) {
@@ -322,7 +323,7 @@ function _walkSeq(schema, node, ctx) {
322
323
  }
323
324
 
324
325
  function _consumeTrailing(fld, kids, start, fields, ctx) {
325
- var byTag = {};
326
+ var byTag = Object.create(null);
326
327
  for (var m = 0; m < fld.members.length; m++) byTag[fld.members[m].tag] = fld.members[m];
327
328
  var last = fld.minTag != null ? fld.minTag - 1 : -1;
328
329
  for (var i = start; i < kids.length; i++) {
@@ -176,7 +176,7 @@ var SAFE_BAG = schema.seq([
176
176
  var attributes = [];
177
177
  var friendlyName = null;
178
178
  var localKeyId = null;
179
- var seen = {};
179
+ var seen = Object.create(null);
180
180
  if (m.fields.bagAttributes.present) {
181
181
  var items = m.fields.bagAttributes.value.items;
182
182
  for (var i = 0; i < items.length; i++) {
@@ -676,6 +676,7 @@ function certExtensionDecoders(ns) {
676
676
  for (var z = 0; z < bs.bytes.length; z++) { if (bs.bytes[z] !== 0) { anyBit = true; break; } }
677
677
  if (!anyBit) throw ns.E(C, "KeyUsage must assert at least one bit (RFC 5280 sec. 4.2.1.3)");
678
678
  schema.assertMinimalNamedBits(bs.unusedBits, bs.bytes, function (m) { throw ns.E(C, m); });
679
+ // allow:registry-table-inherits-object-prototype -- the decoded KeyUsage record, whose keys are the fixed KU_BITS names the schema declares rather than anything the certificate supplies
679
680
  var out = {};
680
681
  _forEach(KU_BITS, function (nm, bit) {
681
682
  var byte = bit >> 3, mask = 0x80 >> (bit & 7);
@@ -821,6 +822,7 @@ function certExtensionDecoders(ns) {
821
822
  function authorityKeyIdentifier(buf) {
822
823
  var C = ns.prefix + "/bad-extension-value";
823
824
  var kids = seqChildren(buf, C, "AuthorityKeyIdentifier");
825
+ // allow:registry-table-inherits-object-prototype -- the decoded AuthorityKeyIdentifier record, read by the three field names the schema declares rather than by anything the certificate supplies
824
826
  var out = { keyIdentifier: null, authorityCertIssuer: null, authorityCertSerialNumber: null };
825
827
  var lastTag = -1;
826
828
  _forEach(kids, function (k) {
@@ -867,6 +869,7 @@ function certExtensionDecoders(ns) {
867
869
  if (dp.tagClass !== "universal" || dp.tagNumber !== _T.SEQUENCE || !dp.children) {
868
870
  throw ns.E(C, "DistributionPoint must be a SEQUENCE { distributionPoint?, reasons?, cRLIssuer? }");
869
871
  }
872
+ // allow:registry-table-inherits-object-prototype -- the decoded DistributionPoint record, read by the three field names the schema declares rather than by anything the certificate supplies
870
873
  var out = { distributionPoint: null, reasons: null, cRLIssuer: null };
871
874
  var lastTag = -1;
872
875
  _forEach(dp.children, function (f) {
package/lib/schema-tsp.js CHANGED
@@ -58,10 +58,10 @@ var OID_SIGNING_CERT_V2 = oid.byName("signingCertificateV2");
58
58
 
59
59
  var TAGS = asn1.TAGS;
60
60
 
61
- var FAILURE_BITS = {
61
+ var FAILURE_BITS = Object.assign(Object.create(null), {
62
62
  0: "badAlg", 2: "badRequest", 5: "badDataFormat", 14: "timeNotAvailable",
63
63
  15: "unacceptedPolicy", 16: "unacceptedExtension", 17: "addInfoNotAvailable", 25: "systemFailure",
64
- };
64
+ });
65
65
 
66
66
 
67
67
  var GEN_TIME = pkix.generalizedTime(NS, { code: "tsp/bad-gentime", message: "genTime must be a GeneralizedTime (RFC 3161 sec. 2.4.2)", allowFractional: true });