@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.
- package/CHANGELOG.md +25 -0
- package/README.md +1 -1
- package/lib/acme.js +24 -13
- package/lib/asn1-der.js +5 -5
- package/lib/attrcert-sign.js +14 -14
- package/lib/cbor-det.js +2 -2
- package/lib/cmc-build.js +16 -16
- package/lib/cmc-verify.js +5 -5
- package/lib/cmp-build.js +29 -19
- package/lib/cmp-session.js +21 -16
- package/lib/cmp-verify.js +4 -4
- package/lib/cms-decrypt.js +8 -8
- package/lib/cms-encrypt.js +22 -22
- package/lib/cms-sign.js +17 -17
- package/lib/cms-verify.js +6 -6
- package/lib/composite-kem.js +1 -1
- package/lib/composite-sig.js +4 -4
- package/lib/constants.js +13 -9
- package/lib/crl-sign.js +17 -17
- package/lib/crmf-sign.js +11 -11
- package/lib/csr-sign.js +2 -2
- package/lib/ct.js +19 -11
- package/lib/edwards-point.js +2 -2
- package/lib/est.js +74 -43
- package/lib/guard-async.js +17 -1
- package/lib/guard-bytes.js +2 -2
- package/lib/guard-compress.js +5 -5
- package/lib/guard-identifier.js +45 -1
- package/lib/guard-name.js +272 -1
- package/lib/guard-time.js +3 -1
- package/lib/hpke.js +10 -10
- package/lib/http-digest.js +2 -2
- package/lib/http-transport.js +3 -3
- package/lib/inspect.js +9 -9
- package/lib/jose.js +14 -14
- package/lib/key.js +7 -7
- package/lib/lint.js +6 -4
- package/lib/merkle.js +2 -2
- package/lib/mime.js +2 -2
- package/lib/ocsp-verify.js +1 -1
- package/lib/ocsp.js +5 -5
- package/lib/oid.js +3 -3
- package/lib/path-validate.js +50 -120
- package/lib/pbes2.js +2 -2
- package/lib/pkcs12-build.js +15 -15
- package/lib/pki-build.js +2 -2
- package/lib/scep.js +47 -16
- package/lib/schema-all.js +1 -1
- package/lib/schema-attrcert.js +4 -3
- package/lib/schema-c509.js +23 -23
- package/lib/schema-cmc.js +6 -6
- package/lib/schema-cmp.js +3 -3
- package/lib/schema-cms.js +15 -8
- package/lib/schema-crmf.js +1 -1
- package/lib/schema-csr.js +1 -1
- package/lib/schema-engine.js +2 -1
- package/lib/schema-pkcs12.js +1 -1
- package/lib/schema-pkix.js +3 -0
- package/lib/schema-tsp.js +2 -2
- package/lib/shbs.js +2 -2
- package/lib/sign-scheme.js +9 -9
- package/lib/sigstore.js +9 -8
- package/lib/smime.js +12 -12
- package/lib/tls-cert-compress.js +6 -6
- package/lib/trust.js +179 -10
- package/lib/tsp-sign.js +11 -11
- package/lib/validator-attcert.js +2 -2
- package/lib/validator-cose.js +5 -5
- package/lib/validator-sig.js +3 -3
- package/lib/validator-tpm.js +5 -4
- package/lib/webauthn.js +12 -12
- package/lib/webcrypto.js +22 -14
- package/lib/x509-sign.js +8 -8
- package/package.json +1 -1
- 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 =
|
|
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 =
|
|
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];
|
package/lib/pkcs12-build.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
722
|
-
|
|
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 =
|
|
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
|
-
|
|
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 = {
|
|
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
|
{
|
package/lib/schema-attrcert.js
CHANGED
|
@@ -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;
|
package/lib/schema-c509.js
CHANGED
|
@@ -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 =
|
|
288
|
-
|
|
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;
|
package/lib/schema-crmf.js
CHANGED
|
@@ -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) {
|
package/lib/schema-engine.js
CHANGED
|
@@ -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++) {
|
package/lib/schema-pkcs12.js
CHANGED
|
@@ -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++) {
|
package/lib/schema-pkix.js
CHANGED
|
@@ -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 });
|