@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.
- package/CHANGELOG.md +13 -0
- 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 +1 -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 +32 -22
- 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 +9 -9
- 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/path-validate.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|