@blamejs/pki 0.6.39 → 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 +25 -0
- package/lib/acme.js +24 -13
- package/lib/asn1-der.js +5 -5
- package/lib/attrcert-sign.js +16 -16
- 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 +25 -20
- package/lib/cmp-verify.js +8 -12
- 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 +13 -13
- 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 +25 -25
- package/lib/crmf-sign.js +11 -11
- package/lib/csr-sign.js +4 -4
- package/lib/ct.js +33 -25
- 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 +3 -3
- package/lib/guard-compress.js +5 -5
- package/lib/guard-identifier.js +46 -2
- package/lib/guard-json.js +1 -1
- package/lib/guard-list.js +16 -0
- package/lib/guard-name.js +1 -1
- package/lib/guard-parsed.js +1 -1
- package/lib/guard-time.js +3 -1
- package/lib/guard-verdict.js +7 -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/ip-utils.js +1 -1
- 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 +127 -117
- package/lib/pbes2.js +2 -2
- package/lib/pkcs12-build.js +26 -24
- 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 +24 -14
- package/lib/smime.js +16 -16
- package/lib/tls-cert-compress.js +6 -6
- package/lib/trust.js +9 -9
- package/lib/tsp-sign.js +30 -30
- 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 +58 -54
- 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/cmp-session.js
CHANGED
|
@@ -30,13 +30,13 @@ var OID_IMPLICIT_CONFIRM = oid.byName("implicitConfirm");
|
|
|
30
30
|
var _engine = null;
|
|
31
31
|
function setEngine(engine) { _engine = engine; }
|
|
32
32
|
|
|
33
|
-
var HASHLESS_SIG_OIDS =
|
|
33
|
+
var HASHLESS_SIG_OIDS = Object.create(null);
|
|
34
34
|
(function () {
|
|
35
35
|
var names = ["Ed25519", "Ed448", "id-ml-dsa-44", "id-ml-dsa-65", "id-ml-dsa-87"];
|
|
36
36
|
["sha2", "shake"].forEach(function (h) { ["128s", "128f", "192s", "192f", "256s", "256f"].forEach(function (s) { names.push("id-slh-dsa-" + h + "-" + s); }); });
|
|
37
37
|
names.forEach(function (n) { var o = oid.byName(n); if (o) HASHLESS_SIG_OIDS[o] = 1; });
|
|
38
38
|
})();
|
|
39
|
-
var SIG_OID_TO_HASH =
|
|
39
|
+
var SIG_OID_TO_HASH = Object.create(null);
|
|
40
40
|
[["sha256WithRSAEncryption", "SHA-256"], ["sha384WithRSAEncryption", "SHA-384"], ["sha512WithRSAEncryption", "SHA-512"],
|
|
41
41
|
["ecdsaWithSHA256", "SHA-256"], ["ecdsaWithSHA384", "SHA-384"], ["ecdsaWithSHA512", "SHA-512"]].forEach(function (row) {
|
|
42
42
|
var o = oid.byName(row[0]); if (o) SIG_OID_TO_HASH[o] = row[1];
|
|
@@ -46,24 +46,24 @@ var OID_RSA_ENCRYPTION = oid.byName("rsaEncryption");
|
|
|
46
46
|
var OID_IDP = oid.byName("issuingDistributionPoint");
|
|
47
47
|
var OID_BASIC_CONSTRAINTS = oid.byName("basicConstraints");
|
|
48
48
|
var OID_KEY_USAGE = oid.byName("keyUsage");
|
|
49
|
-
var HASH_OID_TO_DIGEST =
|
|
49
|
+
var HASH_OID_TO_DIGEST = Object.create(null);
|
|
50
50
|
[["sha256", "SHA-256"], ["sha384", "SHA-384"], ["sha512", "SHA-512"]].forEach(function (row) { var o = oid.byName(row[0]); if (o) HASH_OID_TO_DIGEST[o] = row[1]; });
|
|
51
|
-
var COMPOSITE_PH_HASHALG = { "SHA-256": "sha256", "SHA-384": "sha384", "SHA-512": "sha512" };
|
|
51
|
+
var COMPOSITE_PH_HASHALG = Object.assign(Object.create(null), { "SHA-256": "sha256", "SHA-384": "sha384", "SHA-512": "sha512" });
|
|
52
52
|
|
|
53
|
-
var KNOWN_SESSION_OPTS = {
|
|
53
|
+
var KNOWN_SESSION_OPTS = Object.assign(Object.create(null), {
|
|
54
54
|
url: 1, key: 1, cert: 1, mac: 1, trustAnchors: 1, intermediates: 1, recipient: 1, sender: 1,
|
|
55
55
|
extraCerts: 1, implicitConfirm: 1, maxPolls: 1, maxTotalWait: 1, sleep: 1, time: 1,
|
|
56
56
|
transport: 1, tls: 1, headers: 1, timeout: 1, maxResponseBytes: 1, proxy: 1, pss: 1, digestAlgorithm: 1,
|
|
57
57
|
acceptCert: 1, senderKID: 1, recipKID: 1, expectedSender: 1,
|
|
58
|
-
};
|
|
58
|
+
});
|
|
59
59
|
|
|
60
60
|
var TRANSCRIPT_RETAIN_RESPONSES = 2;
|
|
61
61
|
var DEFAULT_MAX_POLLS = 20;
|
|
62
62
|
var DEFAULT_MAX_TOTAL_WAIT = retryAfter.MAX_RETRY_AFTER_SECONDS;
|
|
63
63
|
var DEFAULT_CERT_REQ_ID = 0;
|
|
64
64
|
var P10CR_CERT_REQ_ID = -1;
|
|
65
|
-
var ENROLL_ARMS = { ir: 1, cr: 1, kur: 1, p10cr: 1 };
|
|
66
|
-
var RESPONSE_ARM = { ir: "ip", cr: "cp", kur: "kup", p10cr: "cp", rr: "rp", genm: "genp" };
|
|
65
|
+
var ENROLL_ARMS = Object.assign(Object.create(null), { ir: 1, cr: 1, kur: 1, p10cr: 1 });
|
|
66
|
+
var RESPONSE_ARM = Object.assign(Object.create(null), { ir: "ip", cr: "cp", kur: "kup", p10cr: "cp", rr: "rp", genm: "genp" });
|
|
67
67
|
var WHOLE_MESSAGE_CERT_REQ_ID = -1;
|
|
68
68
|
|
|
69
69
|
var INFO_OPS = Object.assign(Object.create(null), {
|
|
@@ -72,7 +72,7 @@ var INFO_OPS = Object.assign(Object.create(null), {
|
|
|
72
72
|
certReqTemplate: { name: "certReqTemplate", requestOid: "certReqTemplate", responseOid: "certReqTemplate", value: false, read: "readCertReqTemplate" },
|
|
73
73
|
crlUpdate: { name: "crlUpdate", requestOid: "crlStatusList", responseOid: "crls", value: "crlStatus", read: "readCrls" },
|
|
74
74
|
});
|
|
75
|
-
var KNOWN_REVOKE_KEYS = { certificate: 1, certDetails: 1, reason: 1 };
|
|
75
|
+
var KNOWN_REVOKE_KEYS = Object.assign(Object.create(null), { certificate: 1, certDetails: 1, reason: 1 });
|
|
76
76
|
var RSA_ARCS = ["rsaEncryption", "rsaSignatureWithripemd160", "id-TA-RSA-v1-5-SHA-256",
|
|
77
77
|
"sigS-ISO9796-1-DFUE", "sigS-ISO9796-2Withrsa", "sigS-ISO9796-2rndWithrsa"].map(function (n) {
|
|
78
78
|
return oid.toArcs(oid.byName(n)).slice(0, -1);
|
|
@@ -97,7 +97,7 @@ var CRL_REASON_NAMES = Object.create(null);
|
|
|
97
97
|
Object.keys(constants.NAMES.CRL_REASON).forEach(function (v) { CRL_REASON_NAMES[constants.NAMES.CRL_REASON[v]] = 1; });
|
|
98
98
|
|
|
99
99
|
function _isGranted(code) { return code === 0 || code === 1; }
|
|
100
|
-
var PKI_STATUS_NAMES = { 0: "accepted", 1: "grantedWithMods", 2: "rejection", 3: "waiting" };
|
|
100
|
+
var PKI_STATUS_NAMES = Object.assign(Object.create(null), { 0: "accepted", 1: "grantedWithMods", 2: "rejection", 3: "waiting" });
|
|
101
101
|
|
|
102
102
|
function _certReqIdEq(a, b) { return a != null && b != null && BigInt(a) === BigInt(b); }
|
|
103
103
|
|
|
@@ -308,6 +308,11 @@ function session(opts) {
|
|
|
308
308
|
guard.identifier.assertPlainRecord(opts, _err, "cmp/bad-input", "opts");
|
|
309
309
|
guard.identifier.optionsObject(opts, _err, "cmp/bad-input", "opts");
|
|
310
310
|
guard.identifier.assertKnownKeys(opts, KNOWN_SESSION_OPTS, _err, "cmp/bad-input", "unknown session opts field ");
|
|
311
|
+
/** @internal Taken from the caller's object, before the copy below keeps own properties only. A
|
|
312
|
+
* defaults bag carries its options on a prototype, so checking the copy would find no transport,
|
|
313
|
+
* drop the one the caller supplied, and send the session to the default client instead. */
|
|
314
|
+
var _transport = guard.identifier.assertCallableOption(opts, "transport", _err, "cmp/bad-input",
|
|
315
|
+
"opts.transport", "(url, reqDer, opts) => Promise<{ responseBytes, status }>");
|
|
311
316
|
opts = Object.assign({}, opts);
|
|
312
317
|
if (typeof opts.url !== "string" || !opts.url) throw _err("cmp/bad-input", "opts.url (the CMP endpoint) is required");
|
|
313
318
|
|
|
@@ -349,7 +354,6 @@ function session(opts) {
|
|
|
349
354
|
if (opts.acceptCert != null && typeof opts.acceptCert !== "function") throw _err("cmp/bad-input", "opts.acceptCert must be a function (certDer, info) => boolean");
|
|
350
355
|
if (opts.implicitConfirm != null && typeof opts.implicitConfirm !== "boolean") throw _err("cmp/bad-input", "opts.implicitConfirm must be a boolean");
|
|
351
356
|
if (opts.sleep != null && typeof opts.sleep !== "function") throw _err("cmp/bad-input", "opts.sleep must be a function (delayMs) => Promise");
|
|
352
|
-
if (opts.transport != null && typeof opts.transport !== "function") throw _err("cmp/bad-input", "opts.transport must be a function (url, reqDer, opts) => Promise<{ responseBytes, status }>");
|
|
353
357
|
if (opts.acceptCert != null && opts.implicitConfirm) throw _err("cmp/bad-input", "opts.acceptCert cannot be combined with opts.implicitConfirm -- implicit confirmation leaves no certConf leg to reject on (drop implicitConfirm to vet a grant)");
|
|
354
358
|
|
|
355
359
|
if (opts.time != null) guard.time.assertValid(opts.time, _err, "cmp/bad-input", "opts.time (the verify/validation clock)");
|
|
@@ -413,7 +417,7 @@ function session(opts) {
|
|
|
413
417
|
return o;
|
|
414
418
|
}
|
|
415
419
|
function _verifyOpts(fresh, signerCertOverride, extraIntermediates, responseExtra) {
|
|
416
|
-
var o = { transactionID: transactionID, expectRecipNonce: fresh };
|
|
420
|
+
var o = Object.assign(Object.create(null), { transactionID: transactionID, expectRecipNonce: fresh });
|
|
417
421
|
if (isMac) o.sharedSecret = opts.mac.secret;
|
|
418
422
|
else if (opts.trustAnchors != null) o.trustAnchors = opts.trustAnchors;
|
|
419
423
|
var issuers = Array.isArray(responseExtra) ? responseExtra : [];
|
|
@@ -430,8 +434,9 @@ function session(opts) {
|
|
|
430
434
|
return o;
|
|
431
435
|
}
|
|
432
436
|
function _transferOpts() {
|
|
433
|
-
var o =
|
|
434
|
-
["
|
|
437
|
+
var o = Object.create(null);
|
|
438
|
+
["tls", "headers", "timeout", "maxResponseBytes"].forEach(function (k) { if (opts[k] != null) o[k] = opts[k]; });
|
|
439
|
+
if (_transport !== undefined) o.transport = _transport;
|
|
435
440
|
if (_proxySnap != null) o.proxy = _proxySnap;
|
|
436
441
|
return o;
|
|
437
442
|
}
|
|
@@ -443,12 +448,12 @@ function session(opts) {
|
|
|
443
448
|
_recordTranscript({ direction: "out", arm: arm, bytes: reqDer });
|
|
444
449
|
var engaged = false;
|
|
445
450
|
var topts = _transferOpts();
|
|
446
|
-
if (
|
|
451
|
+
if (_transport !== undefined) topts.transport = function (a) { engaged = true; return _transport(a); };
|
|
447
452
|
var res;
|
|
448
453
|
try {
|
|
449
454
|
res = await cmp.transfer(opts.url, reqDer, topts);
|
|
450
455
|
} catch (e) {
|
|
451
|
-
var reached =
|
|
456
|
+
var reached = _transport !== undefined
|
|
452
457
|
? engaged
|
|
453
458
|
: !(e && (e.code === "cmp/bad-url" || e.code === "cmp/no-trust-anchors" || e.code === "cmp/bad-input"));
|
|
454
459
|
if (reached) started = true;
|
|
@@ -507,7 +512,7 @@ function session(opts) {
|
|
|
507
512
|
if (!Buffer.isBuffer(c)) return;
|
|
508
513
|
var k = c.toString("base64");
|
|
509
514
|
if (caPubsSeen[k]) {
|
|
510
|
-
if (isGrantLeg) { for (var pi = 0; pi < caPubsAccum.length; pi++) { if (caPubsAccum[pi].toString("base64") === k) {
|
|
515
|
+
if (isGrantLeg) { for (var pi = 0; pi < caPubsAccum.length; pi++) { if (caPubsAccum[pi].toString("base64") === k) { guard.list.append(caPubsAccum, caPubsAccum.splice(pi, 1)[0]); if (pi < caPubsWaitingCount) caPubsWaitingCount--; break; } } }
|
|
511
516
|
return;
|
|
512
517
|
}
|
|
513
518
|
try { x509.parse(c); } catch (e) { throw _err("cmp/bad-cert-response", "an authenticated caPubs entry is not a valid X.509 certificate", e); }
|
|
@@ -522,7 +527,7 @@ function session(opts) {
|
|
|
522
527
|
if (caPubsAccum.length >= CAPUBS_MAX || caPubsBytes + c.length > caPubsByteBudget) return;
|
|
523
528
|
caPubsSeen[k] = 1;
|
|
524
529
|
caPubsBytes += c.length;
|
|
525
|
-
|
|
530
|
+
guard.list.append(caPubsAccum, Buffer.from(c));
|
|
526
531
|
if (!isGrantLeg) caPubsWaitingCount++;
|
|
527
532
|
});
|
|
528
533
|
if (isGrantLeg) return { state: "granted", resp: resp, code: code };
|
|
@@ -592,7 +597,7 @@ function session(opts) {
|
|
|
592
597
|
var len = Buffer.isBuffer(entry.bytes) ? entry.bytes.length : 0;
|
|
593
598
|
var over = transcriptBytes + len > transcriptCap;
|
|
594
599
|
if (!over) transcriptBytes += len;
|
|
595
|
-
|
|
600
|
+
guard.list.append(transcript, over
|
|
596
601
|
? guard.verdict.of(entry, { byteLength: len, bytes: null, truncated: true })
|
|
597
602
|
: guard.verdict.of(entry));
|
|
598
603
|
}
|
|
@@ -703,7 +708,7 @@ function session(opts) {
|
|
|
703
708
|
var k = _certIdentity(c);
|
|
704
709
|
if (k != null && seenChain[k]) return;
|
|
705
710
|
if (k != null) seenChain[k] = 1;
|
|
706
|
-
|
|
711
|
+
guard.list.append(chain, c);
|
|
707
712
|
});
|
|
708
713
|
await _validateLeaf(leaf, caPubsAccum);
|
|
709
714
|
var info = { status: PKI_STATUS_NAMES[granted.code] || granted.code, grantedWithMods: granted.code === 1 };
|
package/lib/cmp-verify.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
var intrinsic = require("./guard-intrinsic");
|
|
8
8
|
var _sizeOf = intrinsic.sizeOf;
|
|
9
|
-
var util = { types: intrinsic.types };
|
|
9
|
+
var util = intrinsic.assign(intrinsic.create(null), { types: intrinsic.types });
|
|
10
10
|
var _isBuffer = intrinsic.isBuffer;
|
|
11
11
|
var _bufferFrom = intrinsic.bufferFrom;
|
|
12
12
|
var _fromCharCode = intrinsic.fromCharCode;
|
|
@@ -49,10 +49,10 @@ var NS = pkix.makeNS("cmp", CmpError, oid);
|
|
|
49
49
|
var PBMAC1_PARAMS = pkix.pbmac1Params(NS);
|
|
50
50
|
var _certExtDecoders = pkix.certExtensionDecoders(NS).byOid;
|
|
51
51
|
|
|
52
|
-
var KNOWN_VERIFY_OPTS = {
|
|
52
|
+
var KNOWN_VERIFY_OPTS = intrinsic.assign(intrinsic.create(null), {
|
|
53
53
|
sharedSecret: 1, signerCert: 1, trustAnchors: 1, intermediates: 1, time: 1,
|
|
54
54
|
transactionID: 1, expectRecipNonce: 1, revocationChecker: 1, maxIterations: 1,
|
|
55
|
-
};
|
|
55
|
+
});
|
|
56
56
|
|
|
57
57
|
var PRF_HASH = _create(null);
|
|
58
58
|
PRF_HASH[oid.byName("hmacWithSHA256")] = "SHA-256";
|
|
@@ -65,7 +65,7 @@ var PBMAC1_MIN_SALT = 8;
|
|
|
65
65
|
var PBMAC1_MAX_SALT = constants.LIMITS.PBKDF2_MAX_SALT;
|
|
66
66
|
var PBMAC1_KEYLEN_MIN = 20;
|
|
67
67
|
var PBMAC1_KEYLEN_MAX = 1024;
|
|
68
|
-
var PRF_HLEN = { "SHA-256": 32, "SHA-384": 48, "SHA-512": 64 };
|
|
68
|
+
var PRF_HLEN = intrinsic.assign(intrinsic.create(null), { "SHA-256": 32, "SHA-384": 48, "SHA-512": 64 });
|
|
69
69
|
|
|
70
70
|
var UNSUPPORTED_MAC_OIDS = _create(null);
|
|
71
71
|
["passwordBasedMac", "dhBasedMac", "kemBasedMac"].forEach(function (n) {
|
|
@@ -77,7 +77,7 @@ var _engine = null;
|
|
|
77
77
|
function setEngine(engine) { _engine = engine; }
|
|
78
78
|
|
|
79
79
|
function _verdict(m, type, protectionAlg, valid, trusted, code, reason, signer) {
|
|
80
|
-
|
|
80
|
+
return guard.verdict.of({
|
|
81
81
|
valid: valid,
|
|
82
82
|
trusted: trusted,
|
|
83
83
|
protectionType: type,
|
|
@@ -88,9 +88,7 @@ function _verdict(m, type, protectionAlg, valid, trusted, code, reason, signer)
|
|
|
88
88
|
recipNonce: m.header.recipNonce || null,
|
|
89
89
|
header: m.header,
|
|
90
90
|
body: m.body,
|
|
91
|
-
};
|
|
92
|
-
if (code) { v.code = code; v.reason = reason; }
|
|
93
|
-
return v;
|
|
91
|
+
}, code ? { code: code, reason: reason } : null);
|
|
94
92
|
}
|
|
95
93
|
function _ok(m, type, alg, trusted, signer) { return _verdict(m, type, alg, true, trusted, null, null, signer); }
|
|
96
94
|
function _fail(m, type, alg, code, reason, signer) { return _verdict(m, type, alg, false, false, code, reason, signer || null); }
|
|
@@ -438,7 +436,7 @@ async function _verifySignature(m, protectedPart, protectionAlg, protection, opt
|
|
|
438
436
|
|
|
439
437
|
if (opts.trustAnchors == null) return _ok(m, "signature", protectionAlg, false, signer);
|
|
440
438
|
var trust = await _chainSigner(signer, m, opts, extra);
|
|
441
|
-
if (trust.chain) signer
|
|
439
|
+
if (trust.chain) guard.verdict.set(signer, "chain", trust.chain);
|
|
442
440
|
return _verdict(m, "signature", protectionAlg, true, trust.trusted, trust.trusted ? null : "cmp/untrusted-signer", trust.reason, signer);
|
|
443
441
|
}
|
|
444
442
|
|
|
@@ -521,9 +519,7 @@ function _boundExtraCerts(extra) {
|
|
|
521
519
|
|
|
522
520
|
var _defineOwn = Object.defineProperty;
|
|
523
521
|
var _Date = Date;
|
|
524
|
-
|
|
525
|
-
_defineOwn(arr, arr.length, { value: v, writable: true, enumerable: true, configurable: true });
|
|
526
|
-
}
|
|
522
|
+
var _append = guard.list.append;
|
|
527
523
|
|
|
528
524
|
function _certList(v) {
|
|
529
525
|
if (v == null) return [];
|
package/lib/cms-decrypt.js
CHANGED
|
@@ -160,7 +160,7 @@ function _kekIdMatches(ri, kekId) {
|
|
|
160
160
|
return Buffer.compare(id, guard.bytes.view(kekId, CmsError, "cms/bad-input", "kekId")) === 0;
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
var _passThrough = { "cms/unsupported-algorithm": 1, "cms/unsupported-recipient-type": 1, "cms/bad-input": 1, "cms/iteration-limit": 1, "cms/missing-key-derivation": 1, "cms/no-encrypted-content": 1 };
|
|
163
|
+
var _passThrough = intrinsic.assign(intrinsic.create(null), { "cms/unsupported-algorithm": 1, "cms/unsupported-recipient-type": 1, "cms/bad-input": 1, "cms/iteration-limit": 1, "cms/missing-key-derivation": 1, "cms/no-encrypted-content": 1 });
|
|
164
164
|
|
|
165
165
|
async function _acquireCek(ri, km, opts) {
|
|
166
166
|
try {
|
|
@@ -478,10 +478,10 @@ function _oaepHashFromParams(paramsBytes) {
|
|
|
478
478
|
if (label != null && label.length > 0) throw _err("cms/unsupported-algorithm", "a non-empty OAEP label is not supported");
|
|
479
479
|
return hashName;
|
|
480
480
|
}
|
|
481
|
-
var HASH_W3C =
|
|
481
|
+
var HASH_W3C = intrinsic.create(null); HASH_W3C[O("sha1")] = "SHA-1"; HASH_W3C[O("sha256")] = "SHA-256"; HASH_W3C[O("sha384")] = "SHA-384"; HASH_W3C[O("sha512")] = "SHA-512";
|
|
482
482
|
function _hashW3c(o) { if (!HASH_W3C[o]) throw _err("cms/unsupported-algorithm", "unsupported OAEP hash " + o); return HASH_W3C[o]; }
|
|
483
483
|
|
|
484
|
-
var X963_HASH =
|
|
484
|
+
var X963_HASH = intrinsic.create(null);
|
|
485
485
|
[["dhSinglePass-stdDH-sha1kdf-scheme", "SHA-1"], ["dhSinglePass-stdDH-sha224kdf-scheme", "SHA-224"], ["dhSinglePass-stdDH-sha256kdf-scheme", "SHA-256"], ["dhSinglePass-stdDH-sha384kdf-scheme", "SHA-384"], ["dhSinglePass-stdDH-sha512kdf-scheme", "SHA-512"],
|
|
486
486
|
["dhSinglePass-cofactorDH-sha1kdf-scheme", "SHA-1"], ["dhSinglePass-cofactorDH-sha224kdf-scheme", "SHA-224"], ["dhSinglePass-cofactorDH-sha256kdf-scheme", "SHA-256"], ["dhSinglePass-cofactorDH-sha384kdf-scheme", "SHA-384"], ["dhSinglePass-cofactorDH-sha512kdf-scheme", "SHA-512"]
|
|
487
487
|
].forEach(function (r) { X963_HASH[O(r[0])] = r[1]; });
|
|
@@ -498,10 +498,10 @@ function _originatorSpki(originator) {
|
|
|
498
498
|
if (v.algorithm.parameters != null) algKids.push(b.raw(v.algorithm.parameters));
|
|
499
499
|
return b.sequence([b.sequence(algKids), b.bitString(v.publicKey.bytes, v.publicKey.unusedBits)]);
|
|
500
500
|
}
|
|
501
|
-
var MONT =
|
|
501
|
+
var MONT = intrinsic.create(null); MONT[O("X25519")] = { name: "X25519", hkdf: "SHA-256" }; MONT[O("X448")] = { name: "X448", hkdf: "SHA-512" };
|
|
502
502
|
function _isMont(spki) { var o = asn1.read.oid(asn1.decode(spki).children[0].children[0]); return !!MONT[o]; }
|
|
503
503
|
function _montName(spki) { return MONT[asn1.read.oid(asn1.decode(spki).children[0].children[0])]; }
|
|
504
|
-
var CURVE =
|
|
504
|
+
var CURVE = intrinsic.create(null); CURVE[O("prime256v1")] = { curve: "P-256" }; CURVE[O("secp384r1")] = { curve: "P-384" }; CURVE[O("secp521r1")] = { curve: "P-521" };
|
|
505
505
|
function _ecCurveFromCert(cert) {
|
|
506
506
|
var spki = x509.parse(_normCertDer(cert)).subjectPublicKeyInfo;
|
|
507
507
|
if (spki.algorithm.oid !== O("ecPublicKey") || spki.algorithm.parameters == null) return null;
|
|
@@ -512,7 +512,7 @@ function _withEcCurveParams(spki, curveOid) {
|
|
|
512
512
|
var alg = node.children[0];
|
|
513
513
|
return b.sequence([b.sequence([b.raw(alg.children[0].bytes), b.oid(curveOid)]), b.raw(node.children[1].bytes)]);
|
|
514
514
|
}
|
|
515
|
-
var MLKEM =
|
|
515
|
+
var MLKEM = intrinsic.create(null); MLKEM[O("id-ml-kem-512")] = "ML-KEM-512"; MLKEM[O("id-ml-kem-768")] = "ML-KEM-768"; MLKEM[O("id-ml-kem-1024")] = "ML-KEM-1024";
|
|
516
516
|
function _mlkemName(o) { return MLKEM[o]; }
|
|
517
517
|
|
|
518
518
|
function _explicitSetOf(implicitBytes) {
|
|
@@ -521,8 +521,8 @@ function _explicitSetOf(implicitBytes) {
|
|
|
521
521
|
return out;
|
|
522
522
|
}
|
|
523
523
|
|
|
524
|
-
var MAC_HASH = { hmacWithSHA256: "SHA-256", hmacWithSHA384: "SHA-384", hmacWithSHA512: "SHA-512" };
|
|
525
|
-
var DIGEST_WC = { sha256: "SHA-256", sha384: "SHA-384", sha512: "SHA-512" };
|
|
524
|
+
var MAC_HASH = intrinsic.assign(intrinsic.create(null), { hmacWithSHA256: "SHA-256", hmacWithSHA384: "SHA-384", hmacWithSHA512: "SHA-512" });
|
|
525
|
+
var DIGEST_WC = intrinsic.assign(intrinsic.create(null), { sha256: "SHA-256", sha384: "SHA-384", sha512: "SHA-512" });
|
|
526
526
|
var MAC_KEY_MIN_OCTETS = 16;
|
|
527
527
|
function _isDerNull(p) { return Buffer.isBuffer(p) && p.length === 2 && p[0] === 0x05 && p[1] === 0x00; }
|
|
528
528
|
|
package/lib/cms-encrypt.js
CHANGED
|
@@ -100,11 +100,11 @@ async function _buildKtri(cek, cert, opts) {
|
|
|
100
100
|
return { tag: null, _riVersion: rid.riVersion, node: b.sequence([b.integer(BigInt(rid.riVersion)), rid.node, keyEncAlg, b.octetString(encryptedKey)]) };
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
var EC_KA =
|
|
103
|
+
var EC_KA = intrinsic.create(null);
|
|
104
104
|
EC_KA[O("prime256v1")] = { curve: "P-256", hash: "SHA-256", scheme: "dhSinglePass-stdDH-sha256kdf-scheme" };
|
|
105
105
|
EC_KA[O("secp384r1")] = { curve: "P-384", hash: "SHA-384", scheme: "dhSinglePass-stdDH-sha384kdf-scheme" };
|
|
106
106
|
EC_KA[O("secp521r1")] = { curve: "P-521", hash: "SHA-512", scheme: "dhSinglePass-stdDH-sha512kdf-scheme" };
|
|
107
|
-
var MONT_KA =
|
|
107
|
+
var MONT_KA = intrinsic.create(null);
|
|
108
108
|
MONT_KA[O("X25519")] = { name: "X25519", hkdf: "SHA-256", scheme: "dhSinglePass-stdDH-hkdf-sha256-scheme" };
|
|
109
109
|
MONT_KA[O("X448")] = { name: "X448", hkdf: "SHA-512", scheme: "dhSinglePass-stdDH-hkdf-sha512-scheme" };
|
|
110
110
|
|
|
@@ -202,11 +202,11 @@ async function _buildPwri(cek, desc) {
|
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
-
var KEM_WRAP =
|
|
205
|
+
var KEM_WRAP = intrinsic.create(null);
|
|
206
206
|
KEM_WRAP[O("id-ml-kem-512")] = "aes128-wrap";
|
|
207
207
|
KEM_WRAP[O("id-ml-kem-768")] = "aes256-wrap";
|
|
208
208
|
KEM_WRAP[O("id-ml-kem-1024")] = "aes256-wrap";
|
|
209
|
-
var KEM_WC =
|
|
209
|
+
var KEM_WC = intrinsic.create(null); KEM_WC[O("id-ml-kem-512")] = "ML-KEM-512"; KEM_WC[O("id-ml-kem-768")] = "ML-KEM-768"; KEM_WC[O("id-ml-kem-1024")] = "ML-KEM-1024";
|
|
210
210
|
|
|
211
211
|
function _kemOtherInfo(wrapName, kekBytes, ukm) {
|
|
212
212
|
var kids = [_algId(wrapName, "absent"), b.integer(BigInt(kekBytes))];
|
|
@@ -285,10 +285,10 @@ function _pwriWrapIv(kek, cek, iv) {
|
|
|
285
285
|
var PRF_HASH = intrinsic.assign(intrinsic.create(null), { hmacWithSHA1: "SHA-1", hmacWithSHA256: "SHA-256", hmacWithSHA384: "SHA-384", hmacWithSHA512: "SHA-512" });
|
|
286
286
|
function _prfHash(prf) { if (!PRF_HASH[guard.text.keyOf(prf)]) throw _err("cms/bad-input", "unsupported pwri prf " + guard.text.showValue(prf)); return PRF_HASH[guard.text.keyOf(prf)]; }
|
|
287
287
|
|
|
288
|
-
var _PWRI_KEYS = { password: 1, iterations: 1, prf: 1, salt: 1 };
|
|
289
|
-
var _KEKRI_KEYS = { kek: 1, kekId: 1 };
|
|
290
|
-
var _KTRI_RECIPIENT_KEYS = { cert: 1, oaepHash: 1, keyIdentifier: 1 };
|
|
291
|
-
var _AGREE_RECIPIENT_KEYS = { cert: 1, keyIdentifier: 1, ukm: 1 };
|
|
288
|
+
var _PWRI_KEYS = intrinsic.assign(intrinsic.create(null), { password: 1, iterations: 1, prf: 1, salt: 1 });
|
|
289
|
+
var _KEKRI_KEYS = intrinsic.assign(intrinsic.create(null), { kek: 1, kekId: 1 });
|
|
290
|
+
var _KTRI_RECIPIENT_KEYS = intrinsic.assign(intrinsic.create(null), { cert: 1, oaepHash: 1, keyIdentifier: 1 });
|
|
291
|
+
var _AGREE_RECIPIENT_KEYS = intrinsic.assign(intrinsic.create(null), { cert: 1, keyIdentifier: 1, ukm: 1 });
|
|
292
292
|
|
|
293
293
|
var _RECIPIENT_DEFAULTS = ["oaepHash", "keyIdentifier", "ukm"];
|
|
294
294
|
|
|
@@ -358,21 +358,21 @@ function _envelopedVersion(recips, hasUnprotected) {
|
|
|
358
358
|
return forcesTwo ? 2 : 0;
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
-
var _ENCRYPT_OPTS_AEAD = {
|
|
361
|
+
var _ENCRYPT_OPTS_AEAD = intrinsic.assign(intrinsic.create(null), {
|
|
362
362
|
contentEncryptionAlgorithm: 1, contentType: 1, authAttrs: 1, oaepHash: 1, keyIdentifier: 1,
|
|
363
363
|
ukm: 1, pem: 1,
|
|
364
|
-
};
|
|
365
|
-
var _ENCRYPT_OPTS_CBC = {
|
|
364
|
+
});
|
|
365
|
+
var _ENCRYPT_OPTS_CBC = intrinsic.assign(intrinsic.create(null), {
|
|
366
366
|
contentEncryptionAlgorithm: 1, contentType: 1, oaepHash: 1, keyIdentifier: 1, ukm: 1, pem: 1,
|
|
367
|
-
};
|
|
368
|
-
var _AUTHENTICATE_OPTS_ATTRS = {
|
|
367
|
+
});
|
|
368
|
+
var _AUTHENTICATE_OPTS_ATTRS = intrinsic.assign(intrinsic.create(null), {
|
|
369
369
|
macAlgorithm: 1, digestAlgorithm: 1, authenticatedAttributes: 1, authAttrs: 1, contentType: 1,
|
|
370
370
|
keyIdentifier: 1, oaepHash: 1, ukm: 1, pem: 1,
|
|
371
|
-
};
|
|
372
|
-
var _AUTHENTICATE_OPTS_BARE = {
|
|
371
|
+
});
|
|
372
|
+
var _AUTHENTICATE_OPTS_BARE = intrinsic.assign(intrinsic.create(null), {
|
|
373
373
|
macAlgorithm: 1, authenticatedAttributes: 1, contentType: 1,
|
|
374
374
|
keyIdentifier: 1, oaepHash: 1, ukm: 1, pem: 1,
|
|
375
|
-
};
|
|
375
|
+
});
|
|
376
376
|
|
|
377
377
|
function encrypt(content, recipients, opts) {
|
|
378
378
|
return guard.bytes.fixedCall(CmsError, "cms/bad-input", [
|
|
@@ -404,7 +404,7 @@ async function _encryptImpl(content, recipients, opts) {
|
|
|
404
404
|
|
|
405
405
|
if (!recipients.length) throw _err("cms/bad-input", "at least one recipient is required (RFC 5652 sec. 6.1)");
|
|
406
406
|
var recips = [];
|
|
407
|
-
var consumed =
|
|
407
|
+
var consumed = intrinsic.create(null);
|
|
408
408
|
for (var i = 0; i < recipients.length; i++) recips.push(await _buildRecipient(cek, recipients[i], opts, consumed));
|
|
409
409
|
_assertDefaultsConsumed(opts, consumed);
|
|
410
410
|
var riNodes = recips.map(_taggedRecipient);
|
|
@@ -440,7 +440,7 @@ async function _envelopedData(contentBytes, contentStream, cek, ca, contentType,
|
|
|
440
440
|
|
|
441
441
|
function _assertAuthAttrs(pairs, forbidden) {
|
|
442
442
|
var dense = pkiBuild.reqDenseArray(pairs, "authAttrs", _err, "cms/bad-input");
|
|
443
|
-
var seenTypes =
|
|
443
|
+
var seenTypes = intrinsic.create(null);
|
|
444
444
|
dense.forEach(function (p) {
|
|
445
445
|
var node;
|
|
446
446
|
try { node = asn1.decode(p); } catch (e) { throw _err("cms/bad-input", "an authenticated attribute is not well-formed DER", e); }
|
|
@@ -458,10 +458,10 @@ function _assertAuthAttrs(pairs, forbidden) {
|
|
|
458
458
|
return dense;
|
|
459
459
|
}
|
|
460
460
|
|
|
461
|
-
var AUTH_ENVELOPED_FORBIDDEN = {
|
|
461
|
+
var AUTH_ENVELOPED_FORBIDDEN = intrinsic.assign(intrinsic.create(null), {
|
|
462
462
|
oid: O("messageDigest"),
|
|
463
463
|
why: "authAttrs must not carry the message-digest attribute in an AuthEnvelopedData: its value is the unencrypted hash of the plaintext, which enables content tracking and confirmation of a guessed plaintext (RFC 5083 sec. 2.1, sec. 5)",
|
|
464
|
-
};
|
|
464
|
+
});
|
|
465
465
|
|
|
466
466
|
async function _authEnvelopedData(contentBytes, contentStream, cek, ca, contentType, opts, riNodes, recips) {
|
|
467
467
|
var nonce = nodeCrypto.randomBytes(12);
|
|
@@ -489,8 +489,8 @@ async function _authEnvelopedData(contentBytes, contentStream, cek, ca, contentT
|
|
|
489
489
|
return b.sequence(kids);
|
|
490
490
|
}
|
|
491
491
|
|
|
492
|
-
var _ENCRYPTED_DATA_CEK_KEYS = { cek: 1 };
|
|
493
|
-
var _ENCRYPTED_DATA_PW_KEYS = { password: 1, iterations: 1, salt: 1, prf: 1 };
|
|
492
|
+
var _ENCRYPTED_DATA_CEK_KEYS = intrinsic.assign(intrinsic.create(null), { cek: 1 });
|
|
493
|
+
var _ENCRYPTED_DATA_PW_KEYS = intrinsic.assign(intrinsic.create(null), { password: 1, iterations: 1, salt: 1, prf: 1 });
|
|
494
494
|
|
|
495
495
|
async function _encryptedData(contentBytes, contentStream, desc, ca, contentType, opts, cek) {
|
|
496
496
|
if (ca.aead) throw _err("cms/bad-input", "EncryptedData supports only CBC content encryption");
|
package/lib/cms-sign.js
CHANGED
|
@@ -25,26 +25,26 @@ function _err(code, message, cause) { return new CmsError(code, message, cause);
|
|
|
25
25
|
function _signE(kind, message, cause) { return new CmsError("cms/" + kind, message, cause); }
|
|
26
26
|
function O(name) { return oid.byName(name); }
|
|
27
27
|
|
|
28
|
-
var KNOWN_SIGN_OPTS = {
|
|
28
|
+
var KNOWN_SIGN_OPTS = intrinsic.assign(intrinsic.create(null), {
|
|
29
29
|
signedAttributes: 1, signingTime: 1, additionalSignedAttributes: 1, unsignedAttributes: 1,
|
|
30
30
|
sid: 1, eContentType: 1, detached: 1, certificates: 1, pem: 1,
|
|
31
|
-
};
|
|
32
|
-
var KNOWN_SIGNER_CERT_KEYS = { cert: 1, key: 1, pss: 1, digestAlgorithm: 1, combinedRsaSig: 1 };
|
|
33
|
-
var KNOWN_SIGNER_KEY_ONLY_KEYS = { spki: 1, keyIdentifier: 1, key: 1, pss: 1, digestAlgorithm: 1, combinedRsaSig: 1 };
|
|
34
|
-
var KNOWN_COUNTERSIGN_OPTS = {
|
|
31
|
+
});
|
|
32
|
+
var KNOWN_SIGNER_CERT_KEYS = intrinsic.assign(intrinsic.create(null), { cert: 1, key: 1, pss: 1, digestAlgorithm: 1, combinedRsaSig: 1 });
|
|
33
|
+
var KNOWN_SIGNER_KEY_ONLY_KEYS = intrinsic.assign(intrinsic.create(null), { spki: 1, keyIdentifier: 1, key: 1, pss: 1, digestAlgorithm: 1, combinedRsaSig: 1 });
|
|
34
|
+
var KNOWN_COUNTERSIGN_OPTS = intrinsic.assign(intrinsic.create(null), {
|
|
35
35
|
signerIndex: 1, countersignatureOf: 1, signingTime: 1, certificates: 1, pem: 1,
|
|
36
36
|
signedAttributes: 1, additionalSignedAttributes: 1, sid: 1,
|
|
37
|
-
};
|
|
37
|
+
});
|
|
38
38
|
var NS = pkix.makeNS("cms", CmsError, oid);
|
|
39
39
|
var _b = pkiBuild.makeBuilder({
|
|
40
40
|
ErrorClass: CmsError, prefix: "cms", O: O, NS: NS,
|
|
41
41
|
NAME_SCHEMA: pkix.name(NS), SPKI_SCHEMA: pkix.spki(NS), EXT_DECODERS: {},
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
var DIGEST_HASH = {
|
|
44
|
+
var DIGEST_HASH = intrinsic.assign(intrinsic.create(null), {
|
|
45
45
|
sha256: "SHA-256", sha384: "SHA-384", sha512: "SHA-512",
|
|
46
46
|
shake128: "SHAKE128", shake256: "SHAKE256",
|
|
47
|
-
};
|
|
47
|
+
});
|
|
48
48
|
|
|
49
49
|
var OID_DATA = O("data");
|
|
50
50
|
var OID_PKI_DATA = O("id-cct-PKIData");
|
|
@@ -73,7 +73,7 @@ function _buildSid(cert, useSki) {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
function _buildSignedAttrs(pairs) {
|
|
76
|
-
var seenTypes =
|
|
76
|
+
var seenTypes = intrinsic.create(null);
|
|
77
77
|
var attrs = intrinsic.map(pairs, function (p) {
|
|
78
78
|
if (intrinsic.hasOwn(seenTypes, p.type)) throw _err("cms/bad-input", "signedAttrs must not repeat an attribute type (RFC 5652 sec. 5.3): " + p.type);
|
|
79
79
|
seenTypes[p.type] = 1;
|
|
@@ -92,7 +92,7 @@ function _resolveAttrPairs(list, what) {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
var UNSIGNED_FORBIDDEN =
|
|
95
|
+
var UNSIGNED_FORBIDDEN = intrinsic.create(null);
|
|
96
96
|
UNSIGNED_FORBIDDEN[O("contentType")] = "content-type";
|
|
97
97
|
UNSIGNED_FORBIDDEN[O("messageDigest")] = "message-digest";
|
|
98
98
|
UNSIGNED_FORBIDDEN[O("signingTime")] = "signing-time";
|
|
@@ -102,7 +102,7 @@ function _buildUnsignedAttrs(list) {
|
|
|
102
102
|
if (!intrinsic.isArray(list)) throw _err("cms/bad-input", "opts.unsignedAttributes must be an array of { type, values }");
|
|
103
103
|
if (!list.length) return null;
|
|
104
104
|
var pairs = _resolveAttrPairs(list, "an unsigned attribute value");
|
|
105
|
-
var seen =
|
|
105
|
+
var seen = intrinsic.create(null);
|
|
106
106
|
intrinsic.forEach(pairs, function (p) {
|
|
107
107
|
if (intrinsic.hasOwn(UNSIGNED_FORBIDDEN, p.type)) throw _err("cms/bad-input", "the " + UNSIGNED_FORBIDDEN[p.type] + " attribute must not appear as an unsigned attribute (RFC 5652 sec. 11)");
|
|
108
108
|
if (intrinsic.hasOwn(seen, p.type)) throw _err("cms/bad-input", "unsignedAttrs must not repeat an attribute type (RFC 5652 sec. 5.3): " + p.type);
|
|
@@ -277,7 +277,7 @@ async function _signStream(stream, signers, opts) {
|
|
|
277
277
|
}
|
|
278
278
|
if (opts.signingTime != null && opts.signingTime !== false) guard.time.assertValid(opts.signingTime, _err, "cms/bad-input", "signingTime");
|
|
279
279
|
var rcs = intrinsic.map(list, function (s) { return _resolveSignerContext(s, opts); });
|
|
280
|
-
var digestNames = [], seenDigest =
|
|
280
|
+
var digestNames = [], seenDigest = intrinsic.create(null);
|
|
281
281
|
intrinsic.forEach(rcs, function (r) { if (!seenDigest[r.scheme.digest]) { seenDigest[r.scheme.digest] = 1; intrinsic.push(digestNames, r.scheme.digest); } });
|
|
282
282
|
var wcNames = intrinsic.map(digestNames, function (n) { return DIGEST_HASH[n]; });
|
|
283
283
|
var digests;
|
|
@@ -286,7 +286,7 @@ async function _signStream(stream, signers, opts) {
|
|
|
286
286
|
} catch (e) {
|
|
287
287
|
guard.bytes.translateStreamError(e, _err, "cms/bad-input");
|
|
288
288
|
}
|
|
289
|
-
var byName =
|
|
289
|
+
var byName = intrinsic.create(null);
|
|
290
290
|
intrinsic.forEach(digestNames, function (n, i) { byName[n] = intrinsic.bufferFrom(digests[i]); });
|
|
291
291
|
var built = [];
|
|
292
292
|
for (var _ip = 0; _ip < rcs.length; _ip++) {
|
|
@@ -322,7 +322,7 @@ function _sign(content, signers, opts) {
|
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
function _assembleSignedData(built, eContentType, opts, contentBuf) {
|
|
325
|
-
var seen =
|
|
325
|
+
var seen = intrinsic.create(null), digestAlgs = [];
|
|
326
326
|
intrinsic.forEach(built, function (x) { var k = intrinsic.bufToString(x.digestAlgId, "hex"); if (!seen[k]) { seen[k] = 1; intrinsic.push(digestAlgs, x.digestAlgId); } });
|
|
327
327
|
var v3 = intrinsic.some(built, function (x) { return x.version === 3; }) || eContentType !== OID_DATA;
|
|
328
328
|
var version = v3 ? 3 : 1;
|
|
@@ -342,14 +342,14 @@ function _assembleSignedData(built, eContentType, opts, contentBuf) {
|
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
function _dedupe(ders) {
|
|
345
|
-
var seen =
|
|
345
|
+
var seen = intrinsic.create(null), out = [];
|
|
346
346
|
intrinsic.forEach(ders, function (d) { var k = intrinsic.bufToString(d, "hex"); if (!seen[k]) { seen[k] = 1; intrinsic.push(out, d); } });
|
|
347
347
|
return out;
|
|
348
348
|
}
|
|
349
349
|
|
|
350
350
|
// certificates and/or CRLs and signs nothing. Documented by the @primitive block in cms-verify.js
|
|
351
351
|
// (the @module pki.cms home).
|
|
352
|
-
var KNOWN_CERTS_ONLY_OPTS = { crls: 1, pem: 1 };
|
|
352
|
+
var KNOWN_CERTS_ONLY_OPTS = intrinsic.assign(intrinsic.create(null), { crls: 1, pem: 1 });
|
|
353
353
|
|
|
354
354
|
function _certsOnlyList(v, what) {
|
|
355
355
|
if (v == null) return [];
|
|
@@ -529,7 +529,7 @@ function _countersign(cmsInput, signers, opts) {
|
|
|
529
529
|
list.forEach(function (cs) { jobs.push({ t: t, p: _buildCountersignature(preimage, cs, opts) }); });
|
|
530
530
|
});
|
|
531
531
|
return Promise.all(jobs.map(function (j) { return j.p; })).then(function (built) {
|
|
532
|
-
var byTarget =
|
|
532
|
+
var byTarget = intrinsic.create(null), certDers = [];
|
|
533
533
|
built.forEach(function (res, i) { (byTarget[jobs[i].t] = byTarget[jobs[i].t] || []).push(res.value); certDers.push(res.certDer); });
|
|
534
534
|
|
|
535
535
|
var newSiSet = b.set(siSet.children.map(function (siNode, idx) {
|
package/lib/cms-verify.js
CHANGED
|
@@ -111,9 +111,9 @@ function _findSignerCerts(sid, parsedCerts) {
|
|
|
111
111
|
for (var i = 0; i < parsedCerts.length; i++) {
|
|
112
112
|
var c = parsedCerts[i];
|
|
113
113
|
if (sid.subjectKeyIdentifier != null) {
|
|
114
|
-
if (c.ski && intrinsic.bufferEquals(c.ski, _toBuf(sid.subjectKeyIdentifier, "sid.subjectKeyIdentifier")))
|
|
114
|
+
if (c.ski && intrinsic.bufferEquals(c.ski, _toBuf(sid.subjectKeyIdentifier, "sid.subjectKeyIdentifier"))) guard.list.append(out, c);
|
|
115
115
|
} else if (sid.issuer && sid.serialNumberHex != null) {
|
|
116
|
-
if (c.cert.serialNumberHex === sid.serialNumberHex && guard.name.dnEqual(c.cert.issuer.rdns, sid.issuer.rdns, _err, "cms/bad-name", "the signer certificate issuer"))
|
|
116
|
+
if (c.cert.serialNumberHex === sid.serialNumberHex && guard.name.dnEqual(c.cert.issuer.rdns, sid.issuer.rdns, _err, "cms/bad-name", "the signer certificate issuer")) guard.list.append(out, c);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
return out;
|
|
@@ -147,7 +147,7 @@ function _certSki(cert) {
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
var OID_MGF1 = oid.byName("mgf1");
|
|
150
|
-
var PSS_HASH =
|
|
150
|
+
var PSS_HASH = intrinsic.create(null);
|
|
151
151
|
PSS_HASH[oid.byName("sha256")] = "SHA-256";
|
|
152
152
|
PSS_HASH[oid.byName("sha384")] = "SHA-384";
|
|
153
153
|
PSS_HASH[oid.byName("sha512")] = "SHA-512";
|
|
@@ -391,10 +391,10 @@ async function _verifyCountersignatures(si, parsedCerts) {
|
|
|
391
391
|
var values = [];
|
|
392
392
|
intrinsic.forEach(si.unsignedAttrs || [], function (a) {
|
|
393
393
|
if (a.type !== OID_COUNTERSIGNATURE) return;
|
|
394
|
-
intrinsic.forEach(a.values, function (v) {
|
|
394
|
+
intrinsic.forEach(a.values, function (v) { guard.list.append(values, v && v.bytes ? v.bytes : v); });
|
|
395
395
|
});
|
|
396
396
|
var out = [];
|
|
397
|
-
for (var _cp = 0; _cp < values.length; _cp++)
|
|
397
|
+
for (var _cp = 0; _cp < values.length; _cp++) guard.list.append(out, await _verifyOneCountersig(values[_cp], targetSig, parsedCerts));
|
|
398
398
|
return out;
|
|
399
399
|
}
|
|
400
400
|
|
|
@@ -492,10 +492,10 @@ function _snapshotIfBytes(input, label) {
|
|
|
492
492
|
|
|
493
493
|
async function _resolveContentDigests(parsed, streamSource) {
|
|
494
494
|
if (streamSource == null) return null;
|
|
495
|
-
var names = [], seen =
|
|
495
|
+
var names = [], seen = intrinsic.create(null);
|
|
496
496
|
intrinsic.forEach(parsed.signerInfos, function (si) {
|
|
497
497
|
var dn = si.digestAlgorithm.name;
|
|
498
|
-
if (si.signedAttrsBytes && _supportedDigest(dn) && !seen[dn]) { seen[dn] = 1;
|
|
498
|
+
if (si.signedAttrsBytes && _supportedDigest(dn) && !seen[dn]) { seen[dn] = 1; guard.list.append(names, dn); }
|
|
499
499
|
});
|
|
500
500
|
if (!names.length) return {};
|
|
501
501
|
var ds;
|
|
@@ -504,12 +504,12 @@ async function _resolveContentDigests(parsed, streamSource) {
|
|
|
504
504
|
} catch (e) {
|
|
505
505
|
guard.bytes.translateStreamError(e, _err, "cms/bad-input");
|
|
506
506
|
}
|
|
507
|
-
var byName =
|
|
507
|
+
var byName = intrinsic.create(null);
|
|
508
508
|
intrinsic.forEach(names, function (n, i) { byName[n] = intrinsic.bufferFrom(ds[i]); });
|
|
509
509
|
return byName;
|
|
510
510
|
}
|
|
511
511
|
|
|
512
|
-
var _VERIFY_OPTS = { certs: 1, content: 1, trustAnchors: 1, time: 1, requiredEku: 1, checkPurpose: 1 };
|
|
512
|
+
var _VERIFY_OPTS = intrinsic.assign(intrinsic.create(null), { certs: 1, content: 1, trustAnchors: 1, time: 1, requiredEku: 1, checkPurpose: 1 });
|
|
513
513
|
|
|
514
514
|
function verify(input, opts) {
|
|
515
515
|
return guard.async.deferred(function () { return _verify(input, opts); });
|
|
@@ -546,7 +546,7 @@ async function _verify(input, opts) {
|
|
|
546
546
|
var siOne = parsed.signerInfos[_sp];
|
|
547
547
|
var verdict = await _verifyOne(siOne, content, eContentType, parsedCerts, null, digestByName);
|
|
548
548
|
var counters = await _verifyCountersignatures(siOne, parsedCerts);
|
|
549
|
-
|
|
549
|
+
guard.list.append(signers, guard.verdict.of(verdict, {
|
|
550
550
|
countersignatures: counters,
|
|
551
551
|
unsignedAttrs: _surfaceUnsignedAttrs(siOne),
|
|
552
552
|
signedAttributesPresent: !!siOne.signedAttrsBytes,
|
|
@@ -581,7 +581,7 @@ function _cloneAnchorValue(v, depth) {
|
|
|
581
581
|
" levels, so it cannot be copied before the chain is walked; pass the anchor as certificate DER or a { name, publicKey, algorithm } tuple");
|
|
582
582
|
}
|
|
583
583
|
if (Array.isArray(v)) return v.map(function (e) { return _cloneAnchorValue(e, depth + 1); });
|
|
584
|
-
var out =
|
|
584
|
+
var out = intrinsic.create(null), k;
|
|
585
585
|
for (k in v) {
|
|
586
586
|
if (!intrinsic.hasOwn(v, k)) continue;
|
|
587
587
|
out[k] = _cloneAnchorValue(v[k], depth + 1);
|
|
@@ -677,7 +677,7 @@ function _addCert(out, der) {
|
|
|
677
677
|
try {
|
|
678
678
|
cert = x509.parse(buf);
|
|
679
679
|
} catch (_e2) { return; }
|
|
680
|
-
|
|
680
|
+
guard.list.append(out, { cert: cert, der: buf, ski: _certSki(cert) });
|
|
681
681
|
}
|
|
682
682
|
|
|
683
683
|
/**
|
|
@@ -983,7 +983,7 @@ var compress = cmsCompress.compress;
|
|
|
983
983
|
*/
|
|
984
984
|
var decompress = cmsCompress.decompress;
|
|
985
985
|
|
|
986
|
-
var KNOWN_PARSE_CERTS_ONLY_OPTS = { maxCerts: 1 };
|
|
986
|
+
var KNOWN_PARSE_CERTS_ONLY_OPTS = intrinsic.assign(intrinsic.create(null), { maxCerts: 1 });
|
|
987
987
|
function _certsOnlyInputDer(input, verb) {
|
|
988
988
|
if (guard.bytes.isByteSource(input)) {
|
|
989
989
|
var buf = guard.bytes.snapshotSource(input, CmsError, "cms/bad-input", verb + " input");
|
package/lib/composite-kem.js
CHANGED
|
@@ -45,7 +45,7 @@ function _pemToDer(text, label) {
|
|
|
45
45
|
catch (e) { throw _err("kem/bad-key", "the PEM input is not a valid " + label + " block", e); }
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
var COMPOSITE_KEM =
|
|
48
|
+
var COMPOSITE_KEM = Object.create(null);
|
|
49
49
|
function _comp(name, mlkemBits, label, trad) {
|
|
50
50
|
var mlOidName = "id-ml-kem-" + mlkemBits;
|
|
51
51
|
var kp = oid.kemParams(mlOidName);
|
package/lib/composite-sig.js
CHANGED
|
@@ -17,13 +17,13 @@ function _codeOf(e, fallback) {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
var COMPOSITE_PREFIX = Buffer.from("CompositeAlgorithmSignatures2025", "ascii");
|
|
20
|
-
var MLDSA_COMPONENT = {
|
|
20
|
+
var MLDSA_COMPONENT = Object.assign(Object.create(null), {
|
|
21
21
|
"ML-DSA-44": { pk: 1312, sig: 2420, oid: "id-ml-dsa-44" },
|
|
22
22
|
"ML-DSA-65": { pk: 1952, sig: 3309, oid: "id-ml-dsa-65" },
|
|
23
23
|
"ML-DSA-87": { pk: 2592, sig: 4627, oid: "id-ml-dsa-87" },
|
|
24
|
-
};
|
|
25
|
-
var EC_CURVE_OID = { "P-256": "prime256v1", "P-384": "secp384r1", "P-521": "secp521r1" };
|
|
26
|
-
var PH_CMS = { "SHA-256": "sha256", "SHA-512": "sha512", "SHAKE256": "shake256" };
|
|
24
|
+
});
|
|
25
|
+
var EC_CURVE_OID = Object.assign(Object.create(null), { "P-256": "prime256v1", "P-384": "secp384r1", "P-521": "secp521r1" });
|
|
26
|
+
var PH_CMS = Object.assign(Object.create(null), { "SHA-256": "sha256", "SHA-512": "sha512", "SHAKE256": "shake256" });
|
|
27
27
|
var COMPOSITE_ALGS = Object.create(null);
|
|
28
28
|
function _comp(name, mldsa, ph, label, trad) {
|
|
29
29
|
var sz = MLDSA_COMPONENT[mldsa];
|