@blamejs/core 0.18.43 → 0.18.44
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 +106 -0
- package/NOTICE +1 -1
- package/README.md +3 -2
- package/index.js +2 -0
- package/lib/chain-writer.js +103 -4
- package/lib/file-type.js +19 -2
- package/lib/framework-error.js +10 -0
- package/lib/gate-contract.js +255 -12
- package/lib/guard-all.js +1 -0
- package/lib/guard-archive.js +14 -0
- package/lib/guard-auth.js +1 -3
- package/lib/guard-country.js +480 -0
- package/lib/guard-csv.js +5 -0
- package/lib/guard-email.js +7 -7
- package/lib/guard-filename.js +11 -9
- package/lib/guard-graphql.js +1 -3
- package/lib/guard-html.js +6 -7
- package/lib/guard-image.js +15 -1
- package/lib/guard-json.js +3 -7
- package/lib/guard-jwt.js +8 -3
- package/lib/guard-markdown.js +946 -2
- package/lib/guard-oauth.js +1 -3
- package/lib/guard-pdf.js +8 -0
- package/lib/guard-regex.js +5 -4
- package/lib/guard-smtp-command.js +4 -2
- package/lib/guard-sql.js +10 -0
- package/lib/guard-svg.js +2 -1
- package/lib/guard-text.js +10 -0
- package/lib/guard-yaml.js +13 -2
- package/lib/middleware/index.js +3 -0
- package/lib/middleware/shared-secret-header.js +334 -0
- package/lib/time.js +282 -0
- package/lib/vendor/MANIFEST.json +12 -12
- package/lib/vendor/blamejs-pki.cjs +858 -304
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// @blamejs/pki v0.5.
|
|
1
|
+
// @blamejs/pki v0.5.23 — vendored (Apache-2.0). Zero-dep pure CJS.
|
|
2
2
|
// https://github.com/blamejs/pki Exports: x509, crl, pkcs12, key, webcrypto, schema, csr, cms, ...
|
|
3
3
|
// Backs lib/mtls-engine-default.js (PQC-capable CA + PKCS#12 engine).
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -141,7 +141,7 @@ var require_package = __commonJS({
|
|
|
141
141
|
"node_modules/@blamejs/pki/package.json"(exports2, module2) {
|
|
142
142
|
module2.exports = {
|
|
143
143
|
name: "@blamejs/pki",
|
|
144
|
-
version: "0.5.
|
|
144
|
+
version: "0.5.23",
|
|
145
145
|
description: "Pure-JavaScript PKI toolkit that owns its stack \u2014 X.509, ASN.1/DER, CMS, PQC-first.",
|
|
146
146
|
license: "Apache-2.0",
|
|
147
147
|
author: "blamejs contributors",
|
|
@@ -713,6 +713,7 @@ var require_guard_intrinsic = __commonJS({
|
|
|
713
713
|
var _bufferIsBuffer = Buffer.isBuffer;
|
|
714
714
|
var _bufferByteLength = Buffer.byteLength;
|
|
715
715
|
var _bufferCompare = Buffer.compare;
|
|
716
|
+
var _bufferEquals = uncurry(Buffer.prototype.equals);
|
|
716
717
|
var _isView = ArrayBuffer.isView;
|
|
717
718
|
var _isInteger = Number.isInteger;
|
|
718
719
|
var _isSafeInteger = Number.isSafeInteger;
|
|
@@ -732,6 +733,8 @@ var require_guard_intrinsic = __commonJS({
|
|
|
732
733
|
var _mathFloor = Math.floor;
|
|
733
734
|
var _mathCeil = Math.ceil;
|
|
734
735
|
var _mathMin = Math.min;
|
|
736
|
+
var _mathMax = Math.max;
|
|
737
|
+
var _parseInt = parseInt;
|
|
735
738
|
var _promiseResolve = Promise.resolve;
|
|
736
739
|
var _promiseReject = Promise.reject;
|
|
737
740
|
var _arrForEach = uncurry(Array.prototype.forEach);
|
|
@@ -744,6 +747,14 @@ var require_guard_intrinsic = __commonJS({
|
|
|
744
747
|
var _arrConcat = uncurry(Array.prototype.concat);
|
|
745
748
|
var _arrSlice = uncurry(Array.prototype.slice);
|
|
746
749
|
var _arrJoin = uncurry(Array.prototype.join);
|
|
750
|
+
var _arrPush = uncurry(Array.prototype.push);
|
|
751
|
+
var _strToUpperCase = uncurry(String.prototype.toUpperCase);
|
|
752
|
+
var _strToLowerCase = uncurry(String.prototype.toLowerCase);
|
|
753
|
+
var _strIndexOf = uncurry(String.prototype.indexOf);
|
|
754
|
+
var _taSubarray = uncurry(Uint8Array.prototype.subarray);
|
|
755
|
+
var _abSlice = uncurry(ArrayBuffer.prototype.slice);
|
|
756
|
+
var _numToString = uncurry(Number.prototype.toString);
|
|
757
|
+
var _bigIntToString = uncurry(BigInt.prototype.toString);
|
|
747
758
|
var _setAdd = uncurry(Set.prototype.add);
|
|
748
759
|
var _setHas = uncurry(Set.prototype.has);
|
|
749
760
|
var _mapGet = uncurry(Map.prototype.get);
|
|
@@ -812,6 +823,7 @@ var require_guard_intrinsic = __commonJS({
|
|
|
812
823
|
isBuffer: _bufferIsBuffer,
|
|
813
824
|
byteLength: _bufferByteLength,
|
|
814
825
|
compare: _bufferCompare,
|
|
826
|
+
bufferEquals: _bufferEquals,
|
|
815
827
|
isView: _isView,
|
|
816
828
|
isInteger: _isInteger,
|
|
817
829
|
isSafeInteger: _isSafeInteger,
|
|
@@ -831,6 +843,16 @@ var require_guard_intrinsic = __commonJS({
|
|
|
831
843
|
floor: _mathFloor,
|
|
832
844
|
ceil: _mathCeil,
|
|
833
845
|
min: _mathMin,
|
|
846
|
+
max: _mathMax,
|
|
847
|
+
parseInt: _parseInt,
|
|
848
|
+
push: _arrPush,
|
|
849
|
+
toUpperCase: _strToUpperCase,
|
|
850
|
+
toLowerCase: _strToLowerCase,
|
|
851
|
+
stringIndexOf: _strIndexOf,
|
|
852
|
+
subarray: _taSubarray,
|
|
853
|
+
arrayBufferSlice: _abSlice,
|
|
854
|
+
numberToString: _numToString,
|
|
855
|
+
bigIntToString: _bigIntToString,
|
|
834
856
|
promiseResolve: _promiseResolve,
|
|
835
857
|
promiseReject: _promiseReject,
|
|
836
858
|
forEach: _arrForEach,
|
|
@@ -2198,13 +2220,52 @@ var require_webcrypto = __commonJS({
|
|
|
2198
2220
|
var constants = require_constants();
|
|
2199
2221
|
var asn1 = require_asn1_der();
|
|
2200
2222
|
var oid = require_oid();
|
|
2223
|
+
var intrinsic = require_guard_intrinsic();
|
|
2224
|
+
var _isArray = intrinsic.isArray;
|
|
2225
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
2226
|
+
var _stringify = intrinsic.stringify;
|
|
2227
|
+
var _bufferFrom = intrinsic.bufferFrom;
|
|
2228
|
+
var _bufToString = intrinsic.uncurry(Buffer.prototype.toString);
|
|
2229
|
+
var _bufferConcat = intrinsic.bufferConcat;
|
|
2230
|
+
var _bufferAlloc = intrinsic.bufferAlloc;
|
|
2231
|
+
var _isBuffer = intrinsic.isBuffer;
|
|
2232
|
+
var _keys = intrinsic.keys;
|
|
2233
|
+
var _map = intrinsic.map;
|
|
2234
|
+
var _forEach = intrinsic.forEach;
|
|
2235
|
+
var _indexOf = intrinsic.indexOf;
|
|
2236
|
+
var _isInteger = intrinsic.isInteger;
|
|
2237
|
+
var _join = intrinsic.join;
|
|
2238
|
+
var _filter = intrinsic.filter;
|
|
2239
|
+
var _arraySlice = intrinsic.arraySlice;
|
|
2240
|
+
var _defineProperty = intrinsic.defineProperty;
|
|
2241
|
+
var _max = intrinsic.max;
|
|
2242
|
+
var _parseInt = intrinsic.parseInt;
|
|
2243
|
+
var _isFinite = intrinsic.isFinite;
|
|
2244
|
+
var _String = intrinsic.String;
|
|
2245
|
+
var _Number = intrinsic.Number;
|
|
2246
|
+
var _BigInt = intrinsic.BigInt;
|
|
2247
|
+
var _Uint8Array = intrinsic.Uint8Array;
|
|
2248
|
+
var _assign = intrinsic.assign;
|
|
2249
|
+
var _create = intrinsic.create;
|
|
2250
|
+
var _isView = intrinsic.isView;
|
|
2251
|
+
var _toUpperCase = intrinsic.toUpperCase;
|
|
2252
|
+
var _toLowerCase = intrinsic.toLowerCase;
|
|
2253
|
+
var _stringIndexOf = intrinsic.stringIndexOf;
|
|
2254
|
+
var _subarray = intrinsic.subarray;
|
|
2255
|
+
var _arrayBufferSlice = intrinsic.arrayBufferSlice;
|
|
2256
|
+
var _numberToString = intrinsic.numberToString;
|
|
2257
|
+
var _bigIntToString = intrinsic.bigIntToString;
|
|
2258
|
+
var _push = intrinsic.push;
|
|
2259
|
+
var _concat = intrinsic.concat;
|
|
2260
|
+
var _resolve = intrinsic.uncurry(intrinsic.promiseResolve);
|
|
2261
|
+
var _types = intrinsic.types;
|
|
2201
2262
|
var WebCryptoError = frameworkError.defineClass("WebCryptoError", { withCause: true });
|
|
2202
2263
|
var MAX_RANDOM_BYTES = 65536;
|
|
2203
2264
|
function _toBuf(data, who) {
|
|
2204
2265
|
return guard.bytes.source(data, WebCryptoError, "webcrypto/data", who || "input");
|
|
2205
2266
|
}
|
|
2206
2267
|
function _toArrayBuffer(buf) {
|
|
2207
|
-
return buf.buffer
|
|
2268
|
+
return _arrayBufferSlice(buf.buffer, buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
2208
2269
|
}
|
|
2209
2270
|
function _wcErr(code, msg) {
|
|
2210
2271
|
return new WebCryptoError(code, msg);
|
|
@@ -2213,7 +2274,7 @@ var require_webcrypto = __commonJS({
|
|
|
2213
2274
|
return guard.encoding.base64url(s, null, _wcErr, "webcrypto/data", who || "base64url value");
|
|
2214
2275
|
}
|
|
2215
2276
|
function _bufToB64url(buf) {
|
|
2216
|
-
return
|
|
2277
|
+
return _bufToString(_bufferFrom(buf), "base64url");
|
|
2217
2278
|
}
|
|
2218
2279
|
function _normalizeAlg(algorithm, who) {
|
|
2219
2280
|
var alg = typeof algorithm === "string" ? { name: algorithm } : algorithm;
|
|
@@ -2222,9 +2283,9 @@ var require_webcrypto = __commonJS({
|
|
|
2222
2283
|
}
|
|
2223
2284
|
var out = {};
|
|
2224
2285
|
for (var k in alg) {
|
|
2225
|
-
if (
|
|
2286
|
+
if (_hasOwn(alg, k)) out[k] = alg[k];
|
|
2226
2287
|
}
|
|
2227
|
-
out.name = alg.name
|
|
2288
|
+
out.name = _toUpperCase(alg.name);
|
|
2228
2289
|
return out;
|
|
2229
2290
|
}
|
|
2230
2291
|
var _STD_ALG_NAME = { "RSASSA-PKCS1-V1_5": "RSASSA-PKCS1-v1_5", "ED25519": "Ed25519", "ED448": "Ed448" };
|
|
@@ -2247,8 +2308,8 @@ var require_webcrypto = __commonJS({
|
|
|
2247
2308
|
};
|
|
2248
2309
|
function _hashNode(h, who) {
|
|
2249
2310
|
var name = typeof h === "string" ? h : h && h.name;
|
|
2250
|
-
var node = HASH_NODE[
|
|
2251
|
-
if (!node) throw new WebCryptoError("webcrypto/not-supported", (who || "operation") + ": unsupported hash " +
|
|
2311
|
+
var node = HASH_NODE[_toUpperCase(_String(name))];
|
|
2312
|
+
if (!node) throw new WebCryptoError("webcrypto/not-supported", (who || "operation") + ": unsupported hash " + _stringify(name));
|
|
2252
2313
|
return node;
|
|
2253
2314
|
}
|
|
2254
2315
|
var HMAC_BLOCK_BITS = {
|
|
@@ -2262,10 +2323,10 @@ var require_webcrypto = __commonJS({
|
|
|
2262
2323
|
};
|
|
2263
2324
|
function _hmacLengthBits(alg, who) {
|
|
2264
2325
|
var name = typeof alg.hash === "string" ? alg.hash : alg.hash && alg.hash.name;
|
|
2265
|
-
var blockBits = HMAC_BLOCK_BITS[
|
|
2266
|
-
if (!blockBits) throw new WebCryptoError("webcrypto/not-supported", who + ": unsupported hash " +
|
|
2326
|
+
var blockBits = HMAC_BLOCK_BITS[_toUpperCase(_String(name))];
|
|
2327
|
+
if (!blockBits) throw new WebCryptoError("webcrypto/not-supported", who + ": unsupported hash " + _stringify(name));
|
|
2267
2328
|
if (alg.length == null) return blockBits;
|
|
2268
|
-
if (typeof alg.length !== "number" || !
|
|
2329
|
+
if (typeof alg.length !== "number" || !_isFinite(alg.length) || alg.length <= 0 || alg.length % 8 !== 0) {
|
|
2269
2330
|
throw new WebCryptoError("webcrypto/syntax", who + ": HMAC length must be a positive multiple of 8 bits");
|
|
2270
2331
|
}
|
|
2271
2332
|
return alg.length;
|
|
@@ -2289,10 +2350,10 @@ var require_webcrypto = __commonJS({
|
|
|
2289
2350
|
"shake-256s",
|
|
2290
2351
|
"shake-256f"
|
|
2291
2352
|
].forEach(function(s) {
|
|
2292
|
-
SLH_DSA_NODE["SLH-DSA-" + s
|
|
2353
|
+
SLH_DSA_NODE["SLH-DSA-" + _toUpperCase(s)] = "slh-dsa-" + s;
|
|
2293
2354
|
});
|
|
2294
2355
|
var SIGN_VERIFY_NAMES = {};
|
|
2295
|
-
["RSASSA-PKCS1-V1_5", "RSA-PSS", "ECDSA", "ED25519", "ED448", "HMAC"].concat(
|
|
2356
|
+
["RSASSA-PKCS1-V1_5", "RSA-PSS", "ECDSA", "ED25519", "ED448", "HMAC"].concat(_keys(ML_DSA_NODE), _keys(SLH_DSA_NODE)).forEach(function(n) {
|
|
2296
2357
|
SIGN_VERIFY_NAMES[n] = true;
|
|
2297
2358
|
});
|
|
2298
2359
|
var ENCRYPT_DECRYPT_NAMES = { "RSA-OAEP": true, "AES-GCM": true, "AES-CBC": true, "AES-CTR": true };
|
|
@@ -2302,8 +2363,11 @@ var require_webcrypto = __commonJS({
|
|
|
2302
2363
|
this.type = type;
|
|
2303
2364
|
this.extractable = !!extractable;
|
|
2304
2365
|
this.algorithm = algorithm;
|
|
2305
|
-
|
|
2306
|
-
|
|
2366
|
+
if (usages != null && !_isArray(usages)) {
|
|
2367
|
+
throw new WebCryptoError("webcrypto/syntax", "usages must be an array of key-usage strings");
|
|
2368
|
+
}
|
|
2369
|
+
this.usages = usages ? _arraySlice(usages) : [];
|
|
2370
|
+
_defineProperty(this, "_handle", { value: handle, enumerable: false });
|
|
2307
2371
|
}
|
|
2308
2372
|
function _requireOwnKey(key, who) {
|
|
2309
2373
|
if (key instanceof CryptoKey) return;
|
|
@@ -2314,27 +2378,30 @@ var require_webcrypto = __commonJS({
|
|
|
2314
2378
|
}
|
|
2315
2379
|
function _requireUsage(key, usage) {
|
|
2316
2380
|
_requireOwnKey(key, usage);
|
|
2317
|
-
if (key.usages
|
|
2318
|
-
throw new WebCryptoError("webcrypto/invalid-access", "key is not permitted for '" + usage + "' (usages: " + key.usages
|
|
2381
|
+
if (_indexOf(key.usages, usage) === -1) {
|
|
2382
|
+
throw new WebCryptoError("webcrypto/invalid-access", "key is not permitted for '" + usage + "' (usages: " + _join(key.usages, ",") + ")");
|
|
2319
2383
|
}
|
|
2320
2384
|
}
|
|
2321
2385
|
function _requireAlgMatch(alg, key, who) {
|
|
2322
2386
|
var keyName = key && key.algorithm && key.algorithm.name;
|
|
2323
|
-
if (
|
|
2324
|
-
throw new WebCryptoError("webcrypto/invalid-access", who + ": algorithm " +
|
|
2387
|
+
if (_toUpperCase(_String(keyName)) !== alg.name) {
|
|
2388
|
+
throw new WebCryptoError("webcrypto/invalid-access", who + ": algorithm " + _stringify(alg.name) + " does not match the key's algorithm " + _stringify(keyName));
|
|
2325
2389
|
}
|
|
2326
2390
|
}
|
|
2327
2391
|
function SubtleCrypto() {
|
|
2328
2392
|
}
|
|
2329
2393
|
SubtleCrypto.prototype.digest = async function digest(algorithm, data) {
|
|
2330
2394
|
var name = _normalizeAlg(algorithm, "digest").name;
|
|
2331
|
-
var xof = XOF_NODE[
|
|
2395
|
+
var xof = XOF_NODE[_toUpperCase(_String(name))];
|
|
2332
2396
|
var h = xof ? nodeCrypto.createHash(xof.node, { outputLength: xof.length }) : nodeCrypto.createHash(_hashNode(name, "digest"));
|
|
2333
2397
|
h.update(_toBuf(data, "digest"));
|
|
2334
2398
|
return _toArrayBuffer(h.digest());
|
|
2335
2399
|
};
|
|
2336
2400
|
SubtleCrypto.prototype.generateKey = async function generateKey(algorithm, extractable, keyUsages) {
|
|
2337
2401
|
var alg = _normalizeAlg(algorithm, "generateKey");
|
|
2402
|
+
if (keyUsages != null && !_isArray(keyUsages)) {
|
|
2403
|
+
throw new WebCryptoError("webcrypto/syntax", "generateKey: keyUsages must be an array of key-usage strings");
|
|
2404
|
+
}
|
|
2338
2405
|
var usages = keyUsages || [];
|
|
2339
2406
|
var name = alg.name;
|
|
2340
2407
|
if (name === "AES-GCM" || name === "AES-CBC" || name === "AES-CTR" || name === "AES-KW") {
|
|
@@ -2350,10 +2417,10 @@ var require_webcrypto = __commonJS({
|
|
|
2350
2417
|
}
|
|
2351
2418
|
var pair = _generateKeyPair(alg);
|
|
2352
2419
|
var pubAlg = pair.algorithm;
|
|
2353
|
-
var privUsages = usages
|
|
2420
|
+
var privUsages = _filter(usages, function(u) {
|
|
2354
2421
|
return u === "sign" || u === "deriveKey" || u === "deriveBits" || u === "decrypt" || u === "unwrapKey" || u === "decapsulateKey" || u === "decapsulateBits";
|
|
2355
2422
|
});
|
|
2356
|
-
var pubUsages = usages
|
|
2423
|
+
var pubUsages = _filter(usages, function(u) {
|
|
2357
2424
|
return u === "verify" || u === "encrypt" || u === "wrapKey" || u === "encapsulateKey" || u === "encapsulateBits";
|
|
2358
2425
|
});
|
|
2359
2426
|
return {
|
|
@@ -2372,11 +2439,11 @@ var require_webcrypto = __commonJS({
|
|
|
2372
2439
|
algorithm = { name: _stdName(name), modulusLength: alg.modulusLength || 2048, publicExponent: alg.publicExponent, hash: rsaHash };
|
|
2373
2440
|
} else if (name === "ECDSA" || name === "ECDH") {
|
|
2374
2441
|
var curve = alg.namedCurve;
|
|
2375
|
-
if (!CURVE_NODE[curve]) throw new WebCryptoError("webcrypto/not-supported", name + ": unsupported curve " +
|
|
2442
|
+
if (!CURVE_NODE[curve]) throw new WebCryptoError("webcrypto/not-supported", name + ": unsupported curve " + _stringify(curve));
|
|
2376
2443
|
kp = nodeCrypto.generateKeyPairSync("ec", { namedCurve: CURVE_NODE[curve] });
|
|
2377
2444
|
algorithm = { name, namedCurve: curve };
|
|
2378
2445
|
} else if (name === "ED25519" || name === "ED448" || name === "X25519" || name === "X448") {
|
|
2379
|
-
kp = nodeCrypto.generateKeyPairSync(name
|
|
2446
|
+
kp = nodeCrypto.generateKeyPairSync(_toLowerCase(name));
|
|
2380
2447
|
algorithm = { name: _stdName(name) };
|
|
2381
2448
|
} else if (ML_DSA_NODE[name]) {
|
|
2382
2449
|
kp = nodeCrypto.generateKeyPairSync(ML_DSA_NODE[name]);
|
|
@@ -2388,7 +2455,7 @@ var require_webcrypto = __commonJS({
|
|
|
2388
2455
|
kp = nodeCrypto.generateKeyPairSync(SLH_DSA_NODE[name]);
|
|
2389
2456
|
algorithm = { name };
|
|
2390
2457
|
} else {
|
|
2391
|
-
throw new WebCryptoError("webcrypto/not-supported", "generateKey: unsupported algorithm " +
|
|
2458
|
+
throw new WebCryptoError("webcrypto/not-supported", "generateKey: unsupported algorithm " + _stringify(name));
|
|
2392
2459
|
}
|
|
2393
2460
|
return { publicKey: kp.publicKey, privateKey: kp.privateKey, algorithm };
|
|
2394
2461
|
}
|
|
@@ -2409,18 +2476,18 @@ var require_webcrypto = __commonJS({
|
|
|
2409
2476
|
if (b.length === 0) {
|
|
2410
2477
|
throw new WebCryptoError("webcrypto/syntax", "publicExponent must be a non-empty BigInteger octet string");
|
|
2411
2478
|
}
|
|
2412
|
-
var v =
|
|
2479
|
+
var v = _BigInt("0x" + _bufToString(b, "hex"));
|
|
2413
2480
|
if (v > 0xffffffffn) {
|
|
2414
|
-
throw new WebCryptoError("webcrypto/syntax", "publicExponent " + v
|
|
2481
|
+
throw new WebCryptoError("webcrypto/syntax", "publicExponent " + _bigIntToString(v) + " exceeds the 2^32-1 bound");
|
|
2415
2482
|
}
|
|
2416
|
-
return
|
|
2483
|
+
return _Number(v);
|
|
2417
2484
|
}
|
|
2418
2485
|
SubtleCrypto.prototype.sign = async function sign(algorithm, key, data) {
|
|
2419
2486
|
var alg = _normalizeAlg(algorithm, "sign");
|
|
2420
2487
|
_requireUsage(key, "sign");
|
|
2421
2488
|
var buf = _toBuf(data, "sign");
|
|
2422
2489
|
var name = alg.name;
|
|
2423
|
-
if (!SIGN_VERIFY_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "sign: unsupported algorithm " +
|
|
2490
|
+
if (!SIGN_VERIFY_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "sign: unsupported algorithm " + _stringify(name));
|
|
2424
2491
|
_requireAlgMatch(alg, key, "sign");
|
|
2425
2492
|
if (name === "RSASSA-PKCS1-V1_5") {
|
|
2426
2493
|
return _toArrayBuffer(nodeCrypto.sign(_hashNode(key.algorithm.hash, "sign"), buf, key._handle));
|
|
@@ -2446,7 +2513,7 @@ var require_webcrypto = __commonJS({
|
|
|
2446
2513
|
hm.update(buf);
|
|
2447
2514
|
return _toArrayBuffer(hm.digest());
|
|
2448
2515
|
}
|
|
2449
|
-
throw new WebCryptoError("webcrypto/not-supported", "sign: unsupported algorithm " +
|
|
2516
|
+
throw new WebCryptoError("webcrypto/not-supported", "sign: unsupported algorithm " + _stringify(name));
|
|
2450
2517
|
};
|
|
2451
2518
|
SubtleCrypto.prototype.verify = async function verify(algorithm, key, signature, data) {
|
|
2452
2519
|
var alg = _normalizeAlg(algorithm, "verify");
|
|
@@ -2454,7 +2521,7 @@ var require_webcrypto = __commonJS({
|
|
|
2454
2521
|
var sig = _toBuf(signature, "verify");
|
|
2455
2522
|
var buf = _toBuf(data, "verify");
|
|
2456
2523
|
var name = alg.name;
|
|
2457
|
-
if (!SIGN_VERIFY_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "verify: unsupported algorithm " +
|
|
2524
|
+
if (!SIGN_VERIFY_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "verify: unsupported algorithm " + _stringify(name));
|
|
2458
2525
|
_requireAlgMatch(alg, key, "verify");
|
|
2459
2526
|
if (name === "RSASSA-PKCS1-V1_5") {
|
|
2460
2527
|
return nodeCrypto.verify(_hashNode(key.algorithm.hash, "verify"), buf, key._handle, sig);
|
|
@@ -2481,7 +2548,7 @@ var require_webcrypto = __commonJS({
|
|
|
2481
2548
|
var digest = hm.digest();
|
|
2482
2549
|
return guard.crypto.constantTimeEqual(digest, sig);
|
|
2483
2550
|
}
|
|
2484
|
-
throw new WebCryptoError("webcrypto/not-supported", "verify: unsupported algorithm " +
|
|
2551
|
+
throw new WebCryptoError("webcrypto/not-supported", "verify: unsupported algorithm " + _stringify(name));
|
|
2485
2552
|
};
|
|
2486
2553
|
function _runCipher(fn, who) {
|
|
2487
2554
|
try {
|
|
@@ -2495,7 +2562,7 @@ var require_webcrypto = __commonJS({
|
|
|
2495
2562
|
_requireUsage(key, "encrypt");
|
|
2496
2563
|
var buf = _toBuf(data, "encrypt");
|
|
2497
2564
|
var name = alg.name;
|
|
2498
|
-
if (!ENCRYPT_DECRYPT_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "encrypt: unsupported algorithm " +
|
|
2565
|
+
if (!ENCRYPT_DECRYPT_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "encrypt: unsupported algorithm " + _stringify(name));
|
|
2499
2566
|
_requireAlgMatch(alg, key, "encrypt");
|
|
2500
2567
|
if (name === "RSA-OAEP") {
|
|
2501
2568
|
return _toArrayBuffer(nodeCrypto.publicEncrypt({
|
|
@@ -2513,7 +2580,7 @@ var require_webcrypto = __commonJS({
|
|
|
2513
2580
|
var cipher = nodeCrypto.createCipheriv("aes-" + key.algorithm.length + "-gcm", kb, iv, { authTagLength: (alg.tagLength || 128) / 8 });
|
|
2514
2581
|
if (aad) cipher.setAAD(aad);
|
|
2515
2582
|
var ct = guard.secret.cipherFinish(cipher, buf, WebCryptoError, "webcrypto/operation", "an AES-GCM encrypt intermediate");
|
|
2516
|
-
return
|
|
2583
|
+
return _bufferConcat([ct, cipher.getAuthTag()]);
|
|
2517
2584
|
});
|
|
2518
2585
|
}, "encrypt"));
|
|
2519
2586
|
}
|
|
@@ -2536,14 +2603,14 @@ var require_webcrypto = __commonJS({
|
|
|
2536
2603
|
});
|
|
2537
2604
|
}, "encrypt"));
|
|
2538
2605
|
}
|
|
2539
|
-
throw new WebCryptoError("webcrypto/not-supported", "encrypt: unsupported algorithm " +
|
|
2606
|
+
throw new WebCryptoError("webcrypto/not-supported", "encrypt: unsupported algorithm " + _stringify(name));
|
|
2540
2607
|
};
|
|
2541
2608
|
SubtleCrypto.prototype.decrypt = async function decrypt(algorithm, key, data) {
|
|
2542
2609
|
var alg = _normalizeAlg(algorithm, "decrypt");
|
|
2543
2610
|
_requireUsage(key, "decrypt");
|
|
2544
2611
|
var buf = _toBuf(data, "decrypt");
|
|
2545
2612
|
var name = alg.name;
|
|
2546
|
-
if (!ENCRYPT_DECRYPT_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "decrypt: unsupported algorithm " +
|
|
2613
|
+
if (!ENCRYPT_DECRYPT_NAMES[name]) throw new WebCryptoError("webcrypto/not-supported", "decrypt: unsupported algorithm " + _stringify(name));
|
|
2547
2614
|
_requireAlgMatch(alg, key, "decrypt");
|
|
2548
2615
|
if (name === "RSA-OAEP") {
|
|
2549
2616
|
var oaepOut = nodeCrypto.privateDecrypt({
|
|
@@ -2562,8 +2629,8 @@ var require_webcrypto = __commonJS({
|
|
|
2562
2629
|
var tagLen = (alg.tagLength || 128) / 8;
|
|
2563
2630
|
var iv = _toBuf(alg.iv, "AES-GCM iv");
|
|
2564
2631
|
if (buf.length < tagLen) throw new WebCryptoError("webcrypto/operation", "decrypt: AES-GCM ciphertext is shorter than its authentication tag");
|
|
2565
|
-
var ct = buf
|
|
2566
|
-
var tag =
|
|
2632
|
+
var ct = _subarray(buf, 0, buf.length - tagLen);
|
|
2633
|
+
var tag = _subarray(buf, buf.length - tagLen);
|
|
2567
2634
|
var gcmAad = alg.additionalData ? _toBuf(alg.additionalData, "AES-GCM aad") : null;
|
|
2568
2635
|
return _toArrayBuffer(_runCipher(function() {
|
|
2569
2636
|
return _withSecretBytes(key, function(kb) {
|
|
@@ -2593,7 +2660,7 @@ var require_webcrypto = __commonJS({
|
|
|
2593
2660
|
});
|
|
2594
2661
|
}, "decrypt"));
|
|
2595
2662
|
}
|
|
2596
|
-
throw new WebCryptoError("webcrypto/not-supported", "decrypt: unsupported algorithm " +
|
|
2663
|
+
throw new WebCryptoError("webcrypto/not-supported", "decrypt: unsupported algorithm " + _stringify(name));
|
|
2597
2664
|
};
|
|
2598
2665
|
function _withSecretBytes(key, fn) {
|
|
2599
2666
|
var kb = key._handle.export();
|
|
@@ -2624,11 +2691,11 @@ var require_webcrypto = __commonJS({
|
|
|
2624
2691
|
}
|
|
2625
2692
|
}
|
|
2626
2693
|
function _requireDeriveLength(length, who) {
|
|
2627
|
-
if (typeof length !== "number" || !
|
|
2694
|
+
if (typeof length !== "number" || !_isFinite(length) || length <= 0 || length % 8 !== 0) {
|
|
2628
2695
|
throw new WebCryptoError("webcrypto/operation", who + ": length must be a positive multiple of 8 bits");
|
|
2629
2696
|
}
|
|
2630
2697
|
}
|
|
2631
|
-
var _PBKDF2_MAX_CONCURRENT =
|
|
2698
|
+
var _PBKDF2_MAX_CONCURRENT = _max(1, (_parseInt(process.env.UV_THREADPOOL_SIZE, 10) || 4) - 2);
|
|
2632
2699
|
var _pbkdf2InFlight = 0;
|
|
2633
2700
|
var _pbkdf2Waiters = [];
|
|
2634
2701
|
function _pbkdf2Async(pw, salt, iterations, keylen, digest) {
|
|
@@ -2664,7 +2731,7 @@ var require_webcrypto = __commonJS({
|
|
|
2664
2731
|
if (length / 8 > secret.length) {
|
|
2665
2732
|
throw new WebCryptoError("webcrypto/operation", name + ": requested " + length + " bits but the shared secret has " + secret.length * 8);
|
|
2666
2733
|
}
|
|
2667
|
-
return _toArrayBuffer(secret
|
|
2734
|
+
return _toArrayBuffer(_subarray(secret, 0, length / 8));
|
|
2668
2735
|
} finally {
|
|
2669
2736
|
guard.secret.zeroize(secret, WebCryptoError, "webcrypto/operation", "the raw key-agreement shared secret");
|
|
2670
2737
|
}
|
|
@@ -2672,8 +2739,8 @@ var require_webcrypto = __commonJS({
|
|
|
2672
2739
|
if (name === "HKDF") {
|
|
2673
2740
|
_requireDeriveLength(length, "HKDF");
|
|
2674
2741
|
return _withSecretBytes(key, function(ikm) {
|
|
2675
|
-
var derived = nodeCrypto.hkdfSync(_hashNode(alg.hash, "HKDF"), ikm, _toBuf(alg.salt, "HKDF salt"), _toBuf(alg.info ||
|
|
2676
|
-
return derived instanceof ArrayBuffer ? derived : _toArrayBuffer(
|
|
2742
|
+
var derived = nodeCrypto.hkdfSync(_hashNode(alg.hash, "HKDF"), ikm, _toBuf(alg.salt, "HKDF salt"), _toBuf(alg.info || _bufferAlloc(0), "HKDF info"), length / 8);
|
|
2743
|
+
return derived instanceof ArrayBuffer ? derived : _toArrayBuffer(_bufferFrom(derived));
|
|
2677
2744
|
});
|
|
2678
2745
|
}
|
|
2679
2746
|
if (name === "PBKDF2") {
|
|
@@ -2691,7 +2758,7 @@ var require_webcrypto = __commonJS({
|
|
|
2691
2758
|
if (name === "X963KDF") {
|
|
2692
2759
|
_requireDeriveLength(length, "X963KDF");
|
|
2693
2760
|
return _withSecretBytes(key, function(z) {
|
|
2694
|
-
var derived = _x963Kdf(_hashNode(alg.hash, "X963KDF"), z, _toBuf(alg.info ||
|
|
2761
|
+
var derived = _x963Kdf(_hashNode(alg.hash, "X963KDF"), z, _toBuf(alg.info || _bufferAlloc(0), "X963KDF SharedInfo"), length / 8);
|
|
2695
2762
|
try {
|
|
2696
2763
|
return _toArrayBuffer(derived);
|
|
2697
2764
|
} finally {
|
|
@@ -2699,21 +2766,21 @@ var require_webcrypto = __commonJS({
|
|
|
2699
2766
|
}
|
|
2700
2767
|
});
|
|
2701
2768
|
}
|
|
2702
|
-
throw new WebCryptoError("webcrypto/not-supported", "deriveBits: unsupported algorithm " +
|
|
2769
|
+
throw new WebCryptoError("webcrypto/not-supported", "deriveBits: unsupported algorithm " + _stringify(name));
|
|
2703
2770
|
}
|
|
2704
2771
|
function _x963Kdf(hashNode, z, sharedInfo, lenBytes) {
|
|
2705
2772
|
var blocks = [], counter = 1, got = 0;
|
|
2706
2773
|
while (got < lenBytes) {
|
|
2707
2774
|
if (counter > 4294967295) throw new WebCryptoError("webcrypto/operation", "X963KDF: requested output exceeds the counter range");
|
|
2708
|
-
var ctr =
|
|
2775
|
+
var ctr = _bufferAlloc(4);
|
|
2709
2776
|
ctr.writeUInt32BE(counter, 0);
|
|
2710
2777
|
var h = nodeCrypto.createHash(hashNode).update(z).update(ctr).update(sharedInfo).digest();
|
|
2711
|
-
blocks
|
|
2778
|
+
_push(blocks, h);
|
|
2712
2779
|
got += h.length;
|
|
2713
2780
|
counter += 1;
|
|
2714
2781
|
}
|
|
2715
|
-
var joined =
|
|
2716
|
-
var exact =
|
|
2782
|
+
var joined = _bufferConcat(blocks);
|
|
2783
|
+
var exact = _bufferAlloc(lenBytes);
|
|
2717
2784
|
joined.copy(exact, 0, 0, lenBytes);
|
|
2718
2785
|
guard.secret.zeroize(joined, WebCryptoError, "webcrypto/operation", "the KDF accumulator");
|
|
2719
2786
|
for (var bi = 0; bi < blocks.length; bi++) guard.secret.zeroize(blocks[bi], WebCryptoError, "webcrypto/operation", "a KDF block");
|
|
@@ -2722,18 +2789,18 @@ var require_webcrypto = __commonJS({
|
|
|
2722
2789
|
SubtleCrypto.prototype.deriveBits = async function deriveBits(algorithm, key, length) {
|
|
2723
2790
|
var alg = _normalizeAlg(algorithm, "deriveBits");
|
|
2724
2791
|
_requireUsage(key, "deriveBits");
|
|
2725
|
-
if (!DERIVE_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "deriveBits: unsupported algorithm " +
|
|
2792
|
+
if (!DERIVE_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "deriveBits: unsupported algorithm " + _stringify(alg.name));
|
|
2726
2793
|
_requireAlgMatch(alg, key, "deriveBits");
|
|
2727
2794
|
return _deriveBitsRaw(alg, key, length);
|
|
2728
2795
|
};
|
|
2729
2796
|
SubtleCrypto.prototype.deriveKey = async function deriveKey(algorithm, baseKey, derivedKeyType, extractable, keyUsages) {
|
|
2730
2797
|
_requireUsage(baseKey, "deriveKey");
|
|
2731
2798
|
var alg = _normalizeAlg(algorithm, "deriveKey");
|
|
2732
|
-
if (!DERIVE_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "deriveKey: unsupported algorithm " +
|
|
2799
|
+
if (!DERIVE_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "deriveKey: unsupported algorithm " + _stringify(alg.name));
|
|
2733
2800
|
_requireAlgMatch(alg, baseKey, "deriveKey");
|
|
2734
2801
|
var dk = _normalizeAlg(derivedKeyType, "deriveKey");
|
|
2735
2802
|
var bits;
|
|
2736
|
-
if (dk.name
|
|
2803
|
+
if (_stringIndexOf(dk.name, "AES") === 0) {
|
|
2737
2804
|
if (dk.length !== 128 && dk.length !== 192 && dk.length !== 256) {
|
|
2738
2805
|
throw new WebCryptoError("webcrypto/syntax", "deriveKey: " + dk.name + " length must be 128/192/256");
|
|
2739
2806
|
}
|
|
@@ -2747,15 +2814,15 @@ var require_webcrypto = __commonJS({
|
|
|
2747
2814
|
try {
|
|
2748
2815
|
return await this.importKey("raw", raw, dk, extractable, keyUsages);
|
|
2749
2816
|
} finally {
|
|
2750
|
-
guard.secret.zeroize(new
|
|
2817
|
+
guard.secret.zeroize(new _Uint8Array(raw), WebCryptoError, "webcrypto/operation", "the derived key material");
|
|
2751
2818
|
}
|
|
2752
2819
|
};
|
|
2753
2820
|
SubtleCrypto.prototype.encapsulateBits = async function encapsulateBits(algorithm, encapsulationKey) {
|
|
2754
2821
|
var alg = _normalizeAlg(algorithm, "encapsulateBits");
|
|
2755
2822
|
_requireUsage(encapsulationKey, "encapsulateBits");
|
|
2756
|
-
if (!ML_KEM_NODE[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "encapsulateBits: unsupported algorithm " +
|
|
2823
|
+
if (!ML_KEM_NODE[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "encapsulateBits: unsupported algorithm " + _stringify(alg.name));
|
|
2757
2824
|
_requireAlgMatch(alg, encapsulationKey, "encapsulateBits");
|
|
2758
|
-
if (encapsulationKey.type !== "public") throw new WebCryptoError("webcrypto/invalid-access", "encapsulateBits requires a public (encapsulation) key, got " +
|
|
2825
|
+
if (encapsulationKey.type !== "public") throw new WebCryptoError("webcrypto/invalid-access", "encapsulateBits requires a public (encapsulation) key, got " + _stringify(encapsulationKey.type));
|
|
2759
2826
|
var r;
|
|
2760
2827
|
try {
|
|
2761
2828
|
r = nodeCrypto.encapsulate(encapsulationKey._handle);
|
|
@@ -2771,9 +2838,9 @@ var require_webcrypto = __commonJS({
|
|
|
2771
2838
|
SubtleCrypto.prototype.decapsulateBits = async function decapsulateBits(algorithm, decapsulationKey, ciphertext) {
|
|
2772
2839
|
var alg = _normalizeAlg(algorithm, "decapsulateBits");
|
|
2773
2840
|
_requireUsage(decapsulationKey, "decapsulateBits");
|
|
2774
|
-
if (!ML_KEM_NODE[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "decapsulateBits: unsupported algorithm " +
|
|
2841
|
+
if (!ML_KEM_NODE[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "decapsulateBits: unsupported algorithm " + _stringify(alg.name));
|
|
2775
2842
|
_requireAlgMatch(alg, decapsulationKey, "decapsulateBits");
|
|
2776
|
-
if (decapsulationKey.type !== "private") throw new WebCryptoError("webcrypto/invalid-access", "decapsulateBits requires a private (decapsulation) key, got " +
|
|
2843
|
+
if (decapsulationKey.type !== "private") throw new WebCryptoError("webcrypto/invalid-access", "decapsulateBits requires a private (decapsulation) key, got " + _stringify(decapsulationKey.type));
|
|
2777
2844
|
var ct = _toBuf(ciphertext, "decapsulateBits ciphertext");
|
|
2778
2845
|
var kemRow = oid.kemParams("id-" + ML_KEM_NODE[alg.name]);
|
|
2779
2846
|
if (kemRow && ct.length !== kemRow.ct) {
|
|
@@ -2796,19 +2863,19 @@ var require_webcrypto = __commonJS({
|
|
|
2796
2863
|
};
|
|
2797
2864
|
SubtleCrypto.prototype.wrapKey = async function wrapKey(format, key, wrappingKey, wrapAlgorithm) {
|
|
2798
2865
|
var exported = await this.exportKey(format, key);
|
|
2799
|
-
var bytes = format === "jwk" ?
|
|
2866
|
+
var bytes = format === "jwk" ? _bufferFrom(_stringify(exported)) : _bufferFrom(exported);
|
|
2800
2867
|
try {
|
|
2801
2868
|
var alg = _normalizeAlg(wrapAlgorithm, "wrapKey");
|
|
2802
2869
|
_requireUsage(wrappingKey, "wrapKey");
|
|
2803
|
-
if (alg.name !== "AES-KW" && !ENCRYPT_DECRYPT_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "wrapKey: unsupported algorithm " +
|
|
2870
|
+
if (alg.name !== "AES-KW" && !ENCRYPT_DECRYPT_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "wrapKey: unsupported algorithm " + _stringify(alg.name));
|
|
2804
2871
|
_requireAlgMatch(alg, wrappingKey, "wrapKey");
|
|
2805
2872
|
if (alg.name === "AES-KW") {
|
|
2806
2873
|
if (bytes.length < 16 || bytes.length % 8 !== 0) {
|
|
2807
|
-
throw new WebCryptoError("webcrypto/operation", "wrapKey: AES-KW requires the serialized key be a multiple of 8 bytes (>= 16); got " + bytes.length + " -- format " +
|
|
2874
|
+
throw new WebCryptoError("webcrypto/operation", "wrapKey: AES-KW requires the serialized key be a multiple of 8 bytes (>= 16); got " + bytes.length + " -- format " + _stringify(format) + " is not AES-KW-wrappable");
|
|
2808
2875
|
}
|
|
2809
2876
|
try {
|
|
2810
2877
|
return _withSecretBytes(wrappingKey, function(wkBytes) {
|
|
2811
|
-
var c = nodeCrypto.createCipheriv("aes" + wrappingKey.algorithm.length + "-wrap", wkBytes,
|
|
2878
|
+
var c = nodeCrypto.createCipheriv("aes" + wrappingKey.algorithm.length + "-wrap", wkBytes, _bufferFrom("A6A6A6A6A6A6A6A6", "hex"));
|
|
2812
2879
|
return _toArrayBuffer(guard.secret.cipherFinish(c, bytes, WebCryptoError, "webcrypto/operation", "an AES-KW wrap intermediate"));
|
|
2813
2880
|
});
|
|
2814
2881
|
} catch (e) {
|
|
@@ -2824,7 +2891,7 @@ var require_webcrypto = __commonJS({
|
|
|
2824
2891
|
SubtleCrypto.prototype.unwrapKey = async function unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages) {
|
|
2825
2892
|
var alg = _normalizeAlg(unwrapAlgorithm, "unwrapKey");
|
|
2826
2893
|
_requireUsage(unwrappingKey, "unwrapKey");
|
|
2827
|
-
if (alg.name !== "AES-KW" && !ENCRYPT_DECRYPT_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "unwrapKey: unsupported algorithm " +
|
|
2894
|
+
if (alg.name !== "AES-KW" && !ENCRYPT_DECRYPT_NAMES[alg.name]) throw new WebCryptoError("webcrypto/not-supported", "unwrapKey: unsupported algorithm " + _stringify(alg.name));
|
|
2828
2895
|
_requireAlgMatch(alg, unwrappingKey, "unwrapKey");
|
|
2829
2896
|
var bytes;
|
|
2830
2897
|
if (alg.name === "AES-KW") {
|
|
@@ -2834,7 +2901,7 @@ var require_webcrypto = __commonJS({
|
|
|
2834
2901
|
}
|
|
2835
2902
|
try {
|
|
2836
2903
|
bytes = _withSecretBytes(unwrappingKey, function(kwBytes) {
|
|
2837
|
-
var d = nodeCrypto.createDecipheriv("aes" + unwrappingKey.algorithm.length + "-wrap", kwBytes,
|
|
2904
|
+
var d = nodeCrypto.createDecipheriv("aes" + unwrappingKey.algorithm.length + "-wrap", kwBytes, _bufferFrom("A6A6A6A6A6A6A6A6", "hex"));
|
|
2838
2905
|
return guard.secret.cipherFinish(d, wrapped, WebCryptoError, "webcrypto/operation", "the unwrapped key material");
|
|
2839
2906
|
});
|
|
2840
2907
|
} catch (e) {
|
|
@@ -2842,7 +2909,7 @@ var require_webcrypto = __commonJS({
|
|
|
2842
2909
|
}
|
|
2843
2910
|
} else {
|
|
2844
2911
|
var unwrapKeyClone = _cloneWithUsage(unwrappingKey, "decrypt");
|
|
2845
|
-
bytes =
|
|
2912
|
+
bytes = _bufferFrom(await this.decrypt(unwrapAlgorithm, unwrapKeyClone, wrappedKey));
|
|
2846
2913
|
}
|
|
2847
2914
|
var keyData;
|
|
2848
2915
|
if (format === "jwk") {
|
|
@@ -2866,7 +2933,7 @@ var require_webcrypto = __commonJS({
|
|
|
2866
2933
|
}
|
|
2867
2934
|
};
|
|
2868
2935
|
function _cloneWithUsage(key, usage) {
|
|
2869
|
-
var k = new CryptoKey(key.type, key.extractable, key.algorithm, key.usages
|
|
2936
|
+
var k = new CryptoKey(key.type, key.extractable, key.algorithm, _concat(key.usages, [usage]), key._handle);
|
|
2870
2937
|
return k;
|
|
2871
2938
|
}
|
|
2872
2939
|
function _assertAesImportLen(name, byteLen) {
|
|
@@ -2915,7 +2982,7 @@ var require_webcrypto = __commonJS({
|
|
|
2915
2982
|
throw new WebCryptoError("webcrypto/data", "an ML-KEM private key must be the seed, expandedKey, or both CHOICE (RFC 9935 sec. 6)");
|
|
2916
2983
|
}
|
|
2917
2984
|
var PKCS8_INNER_VALIDATORS = {};
|
|
2918
|
-
|
|
2985
|
+
_forEach(_keys(ML_KEM_INNER), function(o) {
|
|
2919
2986
|
PKCS8_INNER_VALIDATORS[o] = function(inner) {
|
|
2920
2987
|
_validateMlKemInner(inner, ML_KEM_INNER[o]);
|
|
2921
2988
|
};
|
|
@@ -2968,7 +3035,7 @@ var require_webcrypto = __commonJS({
|
|
|
2968
3035
|
}
|
|
2969
3036
|
if (format === "jwk") {
|
|
2970
3037
|
var jwk = keyData;
|
|
2971
|
-
if (jwk === null || typeof jwk !== "object" ||
|
|
3038
|
+
if (jwk === null || typeof jwk !== "object" || _isArray(jwk)) {
|
|
2972
3039
|
throw new WebCryptoError("webcrypto/data", "importKey jwk: keyData must be a JsonWebKey object");
|
|
2973
3040
|
}
|
|
2974
3041
|
if (jwk.kty === "oct") {
|
|
@@ -2978,13 +3045,13 @@ var require_webcrypto = __commonJS({
|
|
|
2978
3045
|
var a2 = name === "HMAC" ? { name, hash: _hashObj(alg.hash, "importKey jwk HMAC"), length: kbuf.length * 8 } : { name, length: kbuf.length * 8 };
|
|
2979
3046
|
return new CryptoKey("secret", extractable, a2, usages, s2);
|
|
2980
3047
|
}
|
|
2981
|
-
var isPrivate =
|
|
3048
|
+
var isPrivate = _hasOwn(jwk, "d") || jwk.kty === "AKP" && _hasOwn(jwk, "priv");
|
|
2982
3049
|
var ko = _nodeKey(function() {
|
|
2983
3050
|
return isPrivate ? nodeCrypto.createPrivateKey({ key: jwk, format: "jwk" }) : nodeCrypto.createPublicKey({ key: jwk, format: "jwk" });
|
|
2984
3051
|
}, "importKey jwk");
|
|
2985
3052
|
return new CryptoKey(isPrivate ? "private" : "public", isPrivate ? extractable : true, _algFromImport(name, alg, ko), usages, ko);
|
|
2986
3053
|
}
|
|
2987
|
-
throw new WebCryptoError("webcrypto/not-supported", "importKey: unsupported format " +
|
|
3054
|
+
throw new WebCryptoError("webcrypto/not-supported", "importKey: unsupported format " + _stringify(format));
|
|
2988
3055
|
};
|
|
2989
3056
|
function _importRawPublic(name, alg, raw, extractable, usages) {
|
|
2990
3057
|
if (name === "ED25519" || name === "ED448" || name === "X25519" || name === "X448") {
|
|
@@ -2995,11 +3062,11 @@ var require_webcrypto = __commonJS({
|
|
|
2995
3062
|
if (name === "ECDSA" || name === "ECDH") {
|
|
2996
3063
|
var fb = CURVE_FIELD_BYTES[alg.namedCurve];
|
|
2997
3064
|
if (!fb || raw[0] !== 4 || raw.length !== 1 + 2 * fb) throw new WebCryptoError("webcrypto/data", "importKey raw EC: expected an uncompressed point for " + alg.namedCurve);
|
|
2998
|
-
var ecjwk = { kty: "EC", crv: alg.namedCurve, x: _bufToB64url(raw
|
|
3065
|
+
var ecjwk = { kty: "EC", crv: alg.namedCurve, x: _bufToB64url(_subarray(raw, 1, 1 + fb)), y: _bufToB64url(_subarray(raw, 1 + fb)) };
|
|
2999
3066
|
var eck = nodeCrypto.createPublicKey({ key: ecjwk, format: "jwk" });
|
|
3000
3067
|
return new CryptoKey("public", true, { name, namedCurve: alg.namedCurve }, usages, eck);
|
|
3001
3068
|
}
|
|
3002
|
-
throw new WebCryptoError("webcrypto/not-supported", "importKey raw: unsupported public-key algorithm " +
|
|
3069
|
+
throw new WebCryptoError("webcrypto/not-supported", "importKey raw: unsupported public-key algorithm " + _stringify(name));
|
|
3003
3070
|
}
|
|
3004
3071
|
var IMPORT_KEY_TYPE = {
|
|
3005
3072
|
"RSASSA-PKCS1-V1_5": { rsa: 1 },
|
|
@@ -3013,7 +3080,7 @@ var require_webcrypto = __commonJS({
|
|
|
3013
3080
|
"X448": { x448: 1 }
|
|
3014
3081
|
};
|
|
3015
3082
|
[ML_DSA_NODE, ML_KEM_NODE, SLH_DSA_NODE].forEach(function(m) {
|
|
3016
|
-
|
|
3083
|
+
_forEach(_keys(m), function(webName) {
|
|
3017
3084
|
var t = {};
|
|
3018
3085
|
t[m[webName]] = 1;
|
|
3019
3086
|
IMPORT_KEY_TYPE[webName] = t;
|
|
@@ -3030,7 +3097,7 @@ var require_webcrypto = __commonJS({
|
|
|
3030
3097
|
throw new WebCryptoError("webcrypto/not-supported", name + ": imported key uses an unsupported EC curve");
|
|
3031
3098
|
}
|
|
3032
3099
|
if (alg.namedCurve && alg.namedCurve !== actualCurve) {
|
|
3033
|
-
throw new WebCryptoError("webcrypto/data", name + ": importKey namedCurve " +
|
|
3100
|
+
throw new WebCryptoError("webcrypto/data", name + ": importKey namedCurve " + _stringify(alg.namedCurve) + " does not match the imported key's curve " + _stringify(actualCurve));
|
|
3034
3101
|
}
|
|
3035
3102
|
return { name, namedCurve: actualCurve };
|
|
3036
3103
|
}
|
|
@@ -3069,19 +3136,19 @@ var require_webcrypto = __commonJS({
|
|
|
3069
3136
|
}
|
|
3070
3137
|
return _toArrayBuffer(_rawPublic(key));
|
|
3071
3138
|
}
|
|
3072
|
-
throw new WebCryptoError("webcrypto/not-supported", "exportKey: unsupported format " +
|
|
3139
|
+
throw new WebCryptoError("webcrypto/not-supported", "exportKey: unsupported format " + _stringify(format));
|
|
3073
3140
|
};
|
|
3074
3141
|
function _rawPublic(key) {
|
|
3075
3142
|
var jwk = key._handle.export({ format: "jwk" });
|
|
3076
3143
|
if (jwk.kty === "OKP") return _b64urlToBuf(jwk.x);
|
|
3077
|
-
if (jwk.kty === "EC") return
|
|
3144
|
+
if (jwk.kty === "EC") return _bufferConcat([_bufferFrom([4]), _b64urlToBuf(jwk.x), _b64urlToBuf(jwk.y)]);
|
|
3078
3145
|
throw new WebCryptoError("webcrypto/not-supported", "exportKey raw: unsupported key type " + jwk.kty);
|
|
3079
3146
|
}
|
|
3080
3147
|
function Crypto() {
|
|
3081
3148
|
this.subtle = new SubtleCrypto();
|
|
3082
3149
|
}
|
|
3083
3150
|
Crypto.prototype.getRandomValues = function getRandomValues(typedArray) {
|
|
3084
|
-
if (!
|
|
3151
|
+
if (!_isView(typedArray) || _types.isFloat32Array(typedArray) || _types.isFloat64Array(typedArray) || _types.isDataView(typedArray)) {
|
|
3085
3152
|
throw new WebCryptoError("webcrypto/data", "getRandomValues: expected an integer TypedArray");
|
|
3086
3153
|
}
|
|
3087
3154
|
var out = guard.bytes.outputView(typedArray, WebCryptoError, "webcrypto/data", "getRandomValues");
|
|
@@ -3104,18 +3171,18 @@ var require_webcrypto = __commonJS({
|
|
|
3104
3171
|
}
|
|
3105
3172
|
}
|
|
3106
3173
|
var _crypto = new Crypto();
|
|
3107
|
-
var _EXPORT_FORMAT =
|
|
3174
|
+
var _EXPORT_FORMAT = _assign(_create(null), { "private": "pkcs8", "public": "spki", "secret": "raw" });
|
|
3108
3175
|
function isCryptoKeyLike(x) {
|
|
3109
|
-
return !!x && typeof x === "object" && typeof x.type === "string" && typeof x.extractable === "boolean" && !!x.algorithm && typeof x.algorithm === "object" && typeof x.algorithm.name === "string" &&
|
|
3176
|
+
return !!x && typeof x === "object" && typeof x.type === "string" && typeof x.extractable === "boolean" && !!x.algorithm && typeof x.algorithm === "object" && typeof x.algorithm.name === "string" && _isArray(x.usages);
|
|
3110
3177
|
}
|
|
3111
3178
|
function exportAnyKey(key, E, code) {
|
|
3112
3179
|
var format = _EXPORT_FORMAT[key && key.type];
|
|
3113
3180
|
if (!format) throw E(code, "a CryptoKey with a private, public, or secret type is required");
|
|
3114
3181
|
if (key instanceof CryptoKey) {
|
|
3115
|
-
return Promise
|
|
3182
|
+
return _resolve(Promise).then(function() {
|
|
3116
3183
|
return _crypto.subtle.exportKey(format, key);
|
|
3117
3184
|
}).then(function(b) {
|
|
3118
|
-
return
|
|
3185
|
+
return _bufferFrom(b);
|
|
3119
3186
|
});
|
|
3120
3187
|
}
|
|
3121
3188
|
if (!key.extractable) {
|
|
@@ -3123,31 +3190,31 @@ var require_webcrypto = __commonJS({
|
|
|
3123
3190
|
}
|
|
3124
3191
|
var handle = key._handle;
|
|
3125
3192
|
if (handle instanceof nodeCrypto.KeyObject && handle.type === key.type) {
|
|
3126
|
-
return Promise
|
|
3193
|
+
return _resolve(Promise).then(function() {
|
|
3127
3194
|
return format === "raw" ? handle.export() : handle.export({ format: "der", type: format });
|
|
3128
3195
|
}).then(function(b) {
|
|
3129
|
-
return
|
|
3196
|
+
return _bufferFrom(b);
|
|
3130
3197
|
}, function(e) {
|
|
3131
3198
|
throw E(code, "the CryptoKey comes from a different copy of this WebCrypto engine and its key material could not be read; import it through pki.webcrypto.subtle, or pass the key as DER", e);
|
|
3132
3199
|
});
|
|
3133
3200
|
}
|
|
3134
|
-
return Promise
|
|
3201
|
+
return _resolve(Promise).then(function() {
|
|
3135
3202
|
return nodeCrypto.webcrypto.subtle.exportKey(format, key);
|
|
3136
3203
|
}).then(function(b) {
|
|
3137
|
-
return
|
|
3204
|
+
return _bufferFrom(b);
|
|
3138
3205
|
}, function(e) {
|
|
3139
3206
|
throw E(code, "the CryptoKey comes from a different WebCrypto implementation and could not be exported for re-import; import it through pki.webcrypto.subtle, or pass the key as DER", e);
|
|
3140
3207
|
});
|
|
3141
3208
|
}
|
|
3142
3209
|
function adoptKey(key, importParams, usages, E, code) {
|
|
3143
|
-
if (key instanceof CryptoKey) return Promise
|
|
3144
|
-
if (!
|
|
3210
|
+
if (key instanceof CryptoKey) return _resolve(Promise, key);
|
|
3211
|
+
if (!_isArray(key.usages)) throw E(code, "a CryptoKey carrying its permitted usages is required");
|
|
3145
3212
|
for (var i = 0; i < usages.length; i++) {
|
|
3146
|
-
if (key.usages
|
|
3147
|
-
throw E(code, "the CryptoKey is not permitted for '" + usages[i] + "' (usages: " + key.usages
|
|
3213
|
+
if (_indexOf(key.usages, usages[i]) === -1) {
|
|
3214
|
+
throw E(code, "the CryptoKey is not permitted for '" + usages[i] + "' (usages: " + _join(key.usages, ",") + ")");
|
|
3148
3215
|
}
|
|
3149
3216
|
}
|
|
3150
|
-
return Promise
|
|
3217
|
+
return _resolve(Promise).then(function() {
|
|
3151
3218
|
return exportAnyKey(key, E, code);
|
|
3152
3219
|
}).then(function(der) {
|
|
3153
3220
|
return _crypto.subtle.importKey(_EXPORT_FORMAT[key.type], der, importParams || key.algorithm, false, usages);
|
|
@@ -4012,6 +4079,39 @@ var require_guard_crypto = __commonJS({
|
|
|
4012
4079
|
}
|
|
4013
4080
|
});
|
|
4014
4081
|
|
|
4082
|
+
// node_modules/@blamejs/pki/lib/guard-list.js
|
|
4083
|
+
var require_guard_list = __commonJS({
|
|
4084
|
+
"node_modules/@blamejs/pki/lib/guard-list.js"(exports2, module2) {
|
|
4085
|
+
"use strict";
|
|
4086
|
+
function contains(list, value) {
|
|
4087
|
+
if (!list) return false;
|
|
4088
|
+
for (var i = 0, n = list.length; i < n; i++) if (list[i] === value) return true;
|
|
4089
|
+
return false;
|
|
4090
|
+
}
|
|
4091
|
+
function containsAll(list, values) {
|
|
4092
|
+
if (!values) return true;
|
|
4093
|
+
for (var i = 0, n = values.length; i < n; i++) if (!contains(list, values[i])) return false;
|
|
4094
|
+
return true;
|
|
4095
|
+
}
|
|
4096
|
+
function anyMatches(list, predicate) {
|
|
4097
|
+
if (!list) return false;
|
|
4098
|
+
for (var i = 0, n = list.length; i < n; i++) if (predicate(list[i], i)) return true;
|
|
4099
|
+
return false;
|
|
4100
|
+
}
|
|
4101
|
+
function allMatch(list, predicate) {
|
|
4102
|
+
if (!list) return true;
|
|
4103
|
+
for (var i = 0, n = list.length; i < n; i++) if (!predicate(list[i], i)) return false;
|
|
4104
|
+
return true;
|
|
4105
|
+
}
|
|
4106
|
+
module2.exports = {
|
|
4107
|
+
contains,
|
|
4108
|
+
containsAll,
|
|
4109
|
+
anyMatches,
|
|
4110
|
+
allMatch
|
|
4111
|
+
};
|
|
4112
|
+
}
|
|
4113
|
+
});
|
|
4114
|
+
|
|
4015
4115
|
// node_modules/@blamejs/pki/lib/guard-range.js
|
|
4016
4116
|
var require_guard_range = __commonJS({
|
|
4017
4117
|
"node_modules/@blamejs/pki/lib/guard-range.js"(exports2, module2) {
|
|
@@ -4724,6 +4824,7 @@ var require_guard_all = __commonJS({
|
|
|
4724
4824
|
var text = require_guard_text();
|
|
4725
4825
|
var limits = require_guard_limits();
|
|
4726
4826
|
var crypto = require_guard_crypto();
|
|
4827
|
+
var list = require_guard_list();
|
|
4727
4828
|
var range = require_guard_range();
|
|
4728
4829
|
var time = require_guard_time();
|
|
4729
4830
|
var name = require_guard_name();
|
|
@@ -4736,12 +4837,12 @@ var require_guard_all = __commonJS({
|
|
|
4736
4837
|
var secret = require_guard_secret();
|
|
4737
4838
|
var parsed = require_guard_parsed();
|
|
4738
4839
|
var async_ = require_guard_async();
|
|
4739
|
-
var intrinsic = require_guard_intrinsic();
|
|
4740
4840
|
module2.exports = {
|
|
4741
4841
|
bytes,
|
|
4742
4842
|
text,
|
|
4743
4843
|
limits,
|
|
4744
4844
|
crypto,
|
|
4845
|
+
list,
|
|
4745
4846
|
range,
|
|
4746
4847
|
time,
|
|
4747
4848
|
name,
|
|
@@ -4753,8 +4854,7 @@ var require_guard_all = __commonJS({
|
|
|
4753
4854
|
compress,
|
|
4754
4855
|
secret,
|
|
4755
4856
|
parsed,
|
|
4756
|
-
async: async_
|
|
4757
|
-
intrinsic
|
|
4857
|
+
async: async_
|
|
4758
4858
|
};
|
|
4759
4859
|
}
|
|
4760
4860
|
});
|
|
@@ -4766,6 +4866,8 @@ var require_asn1_der = __commonJS({
|
|
|
4766
4866
|
var constants = require_constants();
|
|
4767
4867
|
var frameworkError = require_framework_error();
|
|
4768
4868
|
var guard = require_guard_all();
|
|
4869
|
+
var intrinsic = require_guard_intrinsic();
|
|
4870
|
+
var _isArray = intrinsic.isArray;
|
|
4769
4871
|
var Asn1Error = frameworkError.Asn1Error;
|
|
4770
4872
|
var OidError = frameworkError.OidError;
|
|
4771
4873
|
function _asn1Error(c, m) {
|
|
@@ -5400,7 +5502,7 @@ var require_asn1_der = __commonJS({
|
|
|
5400
5502
|
// encoder composes, so the minimal-encoding rule lives once (the CHECK side is
|
|
5401
5503
|
// schema.assertMinimalNamedBits). No bits asserted -> the empty BIT STRING.
|
|
5402
5504
|
namedBitString: function(positions) {
|
|
5403
|
-
if (!
|
|
5505
|
+
if (!_isArray(positions)) throw new Asn1Error("asn1/bad-bit-string", "namedBitString requires an array of bit positions");
|
|
5404
5506
|
var hi = -1, i, p;
|
|
5405
5507
|
for (i = 0; i < positions.length; i++) {
|
|
5406
5508
|
p = positions[i];
|
|
@@ -5498,7 +5600,7 @@ var require_asn1_der = __commonJS({
|
|
|
5498
5600
|
return content;
|
|
5499
5601
|
}
|
|
5500
5602
|
function _asBufferArray(arr, who) {
|
|
5501
|
-
if (!
|
|
5603
|
+
if (!_isArray(arr)) throw new Asn1Error("asn1/bad-children", who + ": expected an array of TLV buffers");
|
|
5502
5604
|
return arr.map(function(b) {
|
|
5503
5605
|
return _asBuffer(b, who);
|
|
5504
5606
|
});
|
|
@@ -7074,6 +7176,8 @@ var require_validator_attcert = __commonJS({
|
|
|
7074
7176
|
"use strict";
|
|
7075
7177
|
var oid = require_oid();
|
|
7076
7178
|
var asn1 = require_asn1_der();
|
|
7179
|
+
var guard = require_guard_all();
|
|
7180
|
+
var _asserts = guard.list.contains;
|
|
7077
7181
|
function requireV3(cert, E, code) {
|
|
7078
7182
|
if (cert.version !== 3) throw new E(code, "an attestation certificate must be X.509 version 3");
|
|
7079
7183
|
}
|
|
@@ -7103,7 +7207,7 @@ var require_validator_attcert = __commonJS({
|
|
|
7103
7207
|
assertNotCa(cert, exts, E, code);
|
|
7104
7208
|
if ((cert.subject.rdns || []).length !== 0) throw new E(code, "the tpm AIK certificate subject MUST be empty (WebAuthn 8.3.1)");
|
|
7105
7209
|
var eku = exts.decode(cert, "extKeyUsage");
|
|
7106
|
-
if (!eku || !Array.isArray(eku.value) || eku.value
|
|
7210
|
+
if (!eku || !Array.isArray(eku.value) || !_asserts(eku.value, oid.byName("tcgKpAikCertificate"))) {
|
|
7107
7211
|
throw new E(code, "the tpm AIK certificate lacks the tcg-kp-AIKCertificate extended key purpose (WebAuthn 8.3.1)");
|
|
7108
7212
|
}
|
|
7109
7213
|
var san = exts.decode(cert, "subjectAltName");
|
|
@@ -7991,6 +8095,8 @@ var require_ct = __commonJS({
|
|
|
7991
8095
|
var constants = require_constants();
|
|
7992
8096
|
var frameworkError = require_framework_error();
|
|
7993
8097
|
var guard = require_guard_all();
|
|
8098
|
+
var intrinsic = require_guard_intrinsic();
|
|
8099
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
7994
8100
|
var ByteReader = require_byte_reader();
|
|
7995
8101
|
var ByteWriter = require_byte_writer();
|
|
7996
8102
|
var oid = require_oid();
|
|
@@ -8345,7 +8451,7 @@ var require_ct = __commonJS({
|
|
|
8345
8451
|
function _parseLogState(state) {
|
|
8346
8452
|
if (state == null || typeof state !== "object") throw _ctErr("ct/bad-state", "a CT log entry is missing its state");
|
|
8347
8453
|
var keys = Object.keys(state);
|
|
8348
|
-
if (keys.length !== 1 || !
|
|
8454
|
+
if (keys.length !== 1 || !_hasOwn(LOG_STATE_TRUST, keys[0])) {
|
|
8349
8455
|
throw _ctErr("ct/bad-state", "a CT log state must carry exactly one recognized member (pending/qualified/usable/readonly/retired/rejected)");
|
|
8350
8456
|
}
|
|
8351
8457
|
var name = keys[0], member = state[name];
|
|
@@ -8603,6 +8709,8 @@ var require_schema_pkix = __commonJS({
|
|
|
8603
8709
|
var constants = require_constants();
|
|
8604
8710
|
var schema = require_schema_engine();
|
|
8605
8711
|
var guard = require_guard_all();
|
|
8712
|
+
var intrinsic = require_guard_intrinsic();
|
|
8713
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
8606
8714
|
var ct = require_ct();
|
|
8607
8715
|
var PEM_RE = /-----BEGIN ([A-Z0-9 ]+)-----([\s\S]*?)-----END \1-----/;
|
|
8608
8716
|
function pemDecode(text, label, PemError) {
|
|
@@ -8690,7 +8798,7 @@ var require_schema_pkix = __commonJS({
|
|
|
8690
8798
|
function versionReader(ns, accept) {
|
|
8691
8799
|
return schema.decode(function(n) {
|
|
8692
8800
|
var key = asn1.read.integer(n).toString();
|
|
8693
|
-
if (
|
|
8801
|
+
if (_hasOwn(accept, key)) return accept[key];
|
|
8694
8802
|
throw ns.E(ns.prefix + "/bad-version", "unsupported version " + key);
|
|
8695
8803
|
});
|
|
8696
8804
|
}
|
|
@@ -11793,6 +11901,8 @@ var require_schema_crl = __commonJS({
|
|
|
11793
11901
|
var pkix = require_schema_pkix();
|
|
11794
11902
|
var oid = require_oid();
|
|
11795
11903
|
var frameworkError = require_framework_error();
|
|
11904
|
+
var intrinsic = require_guard_intrinsic();
|
|
11905
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
11796
11906
|
var CrlError = frameworkError.CrlError;
|
|
11797
11907
|
var PemError = frameworkError.PemError;
|
|
11798
11908
|
var TAGS = asn1.TAGS;
|
|
@@ -11814,7 +11924,7 @@ var require_schema_crl = __commonJS({
|
|
|
11814
11924
|
if (value < 0n) throw new Error("cRLNumber must be non-negative (INTEGER 0..MAX)");
|
|
11815
11925
|
} else if (ext.oid === OID_REASON_CODE) {
|
|
11816
11926
|
var reason = asn1.read.enumerated(asn1.decode(ext.value));
|
|
11817
|
-
if (!
|
|
11927
|
+
if (!_hasOwn(CRL_REASONS, reason.toString())) throw new Error("undefined CRLReason " + reason.toString());
|
|
11818
11928
|
value = Number(reason);
|
|
11819
11929
|
} else if (ext.oid === OID_INVALIDITY_DATE) {
|
|
11820
11930
|
var n = asn1.decode(ext.value);
|
|
@@ -13678,6 +13788,8 @@ var require_schema_ocsp = __commonJS({
|
|
|
13678
13788
|
var oid = require_oid();
|
|
13679
13789
|
var constants = require_constants();
|
|
13680
13790
|
var frameworkError = require_framework_error();
|
|
13791
|
+
var intrinsic = require_guard_intrinsic();
|
|
13792
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
13681
13793
|
var OcspError = frameworkError.OcspError;
|
|
13682
13794
|
var PemError = frameworkError.PemError;
|
|
13683
13795
|
var NS = pkix.makeNS("ocsp", OcspError, oid);
|
|
@@ -13693,13 +13805,13 @@ var require_schema_ocsp = __commonJS({
|
|
|
13693
13805
|
var OCSP_RESPONSE_STATUS = schema.decode(function(n, ctx) {
|
|
13694
13806
|
var v = asn1.read.enumerated(n);
|
|
13695
13807
|
var key = v.toString();
|
|
13696
|
-
if (!
|
|
13808
|
+
if (!_hasOwn(STATUS_NAMES, key)) throw ctx.E("ocsp/bad-response-status", "undefined OCSPResponseStatus " + key + " (RFC 6960 sec. 4.2.1)");
|
|
13697
13809
|
return { code: Number(v), name: STATUS_NAMES[key] };
|
|
13698
13810
|
});
|
|
13699
13811
|
var CRL_REASON = schema.decode(function(n, ctx) {
|
|
13700
13812
|
var v = asn1.read.enumerated(n);
|
|
13701
13813
|
var key = v.toString();
|
|
13702
|
-
if (!
|
|
13814
|
+
if (!_hasOwn(CRL_REASONS, key)) throw ctx.E("ocsp/bad-revocation-reason", "undefined CRLReason " + key + " (RFC 5280 sec. 5.3.1)");
|
|
13703
13815
|
return CRL_REASONS[key];
|
|
13704
13816
|
});
|
|
13705
13817
|
function certificateBytes() {
|
|
@@ -15803,6 +15915,8 @@ var require_schema_attrcert = __commonJS({
|
|
|
15803
15915
|
var pkix = require_schema_pkix();
|
|
15804
15916
|
var oid = require_oid();
|
|
15805
15917
|
var guard = require_guard_all();
|
|
15918
|
+
var intrinsic = require_guard_intrinsic();
|
|
15919
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
15806
15920
|
var frameworkError = require_framework_error();
|
|
15807
15921
|
var AttrCertError = frameworkError.AttrCertError;
|
|
15808
15922
|
var PemError = frameworkError.PemError;
|
|
@@ -15816,7 +15930,7 @@ var require_schema_attrcert = __commonJS({
|
|
|
15816
15930
|
var DIGESTED_OBJECT_TYPE = schema.decode(function(n, ctx) {
|
|
15817
15931
|
var v = asn1.read.enumerated(n);
|
|
15818
15932
|
var k = v.toString();
|
|
15819
|
-
if (!
|
|
15933
|
+
if (!_hasOwn(ODT_NAMES, k)) {
|
|
15820
15934
|
throw ctx.E("attrcert/bad-digested-object-type", "digestedObjectType " + k + " is not a defined value (RFC 5755 sec. 4.1)");
|
|
15821
15935
|
}
|
|
15822
15936
|
if (k === "2") {
|
|
@@ -17578,6 +17692,7 @@ var require_ocsp_verify = __commonJS({
|
|
|
17578
17692
|
"use strict";
|
|
17579
17693
|
var asn1 = require_asn1_der();
|
|
17580
17694
|
var guard = require_guard_all();
|
|
17695
|
+
var intrinsic = require_guard_intrinsic();
|
|
17581
17696
|
var oid = require_oid();
|
|
17582
17697
|
var x509 = require_schema_x509();
|
|
17583
17698
|
var compositeSig = require_composite_sig();
|
|
@@ -17589,12 +17704,15 @@ var require_ocsp_verify = __commonJS({
|
|
|
17589
17704
|
OCSP_CERTID_HASHES[oid.byName("sha384")] = "SHA-384";
|
|
17590
17705
|
OCSP_CERTID_HASHES[oid.byName("sha512")] = "SHA-512";
|
|
17591
17706
|
var OID_OCSP_SIGNING = oid.byName("ocspSigning");
|
|
17707
|
+
var _asserts = guard.list.contains;
|
|
17708
|
+
var _bufferFrom = intrinsic.bufferFrom;
|
|
17709
|
+
var _bytesEqual = intrinsic.bufferEquals;
|
|
17592
17710
|
var OID_OCSP_NOCHECK = oid.byName("ocspNoCheck");
|
|
17593
17711
|
var OID_EKU = oid.byName("extKeyUsage");
|
|
17594
17712
|
var OID_KEY_USAGE = oid.byName("keyUsage");
|
|
17595
17713
|
function ocspDigest(alg, buf) {
|
|
17596
17714
|
return subtle.digest(alg, buf).then(function(h) {
|
|
17597
|
-
return
|
|
17715
|
+
return _bufferFrom(h);
|
|
17598
17716
|
});
|
|
17599
17717
|
}
|
|
17600
17718
|
function ocspKeyValue(spkiDer) {
|
|
@@ -17633,12 +17751,12 @@ var require_ocsp_verify = __commonJS({
|
|
|
17633
17751
|
}
|
|
17634
17752
|
async function ocspCertIdMatches(certID, cert, issuerNameCandidates, issuerKeyBits) {
|
|
17635
17753
|
if (certID.serialNumberHex !== cert.serialNumberHex) return false;
|
|
17636
|
-
var hashName = OCSP_CERTID_HASHES[certID.hashAlgorithm.oid];
|
|
17754
|
+
var hashName = intrinsic.hasOwn(OCSP_CERTID_HASHES, certID.hashAlgorithm.oid) ? OCSP_CERTID_HASHES[certID.hashAlgorithm.oid] : null;
|
|
17637
17755
|
if (!hashName) return false;
|
|
17638
17756
|
var keyHash = await ocspDigest(hashName, issuerKeyBits);
|
|
17639
|
-
if (!certID.issuerKeyHash
|
|
17757
|
+
if (!_bytesEqual(certID.issuerKeyHash, keyHash)) return false;
|
|
17640
17758
|
for (var i = 0; i < issuerNameCandidates.length; i++) {
|
|
17641
|
-
if (certID.issuerNameHash
|
|
17759
|
+
if (_bytesEqual(certID.issuerNameHash, await ocspDigest(hashName, issuerNameCandidates[i]))) return true;
|
|
17642
17760
|
}
|
|
17643
17761
|
return false;
|
|
17644
17762
|
}
|
|
@@ -17647,7 +17765,7 @@ var require_ocsp_verify = __commonJS({
|
|
|
17647
17765
|
var matchesIssuer = false;
|
|
17648
17766
|
try {
|
|
17649
17767
|
if (rid.byName) matchesIssuer = dnEqual(rid.byName.rdns, cert.issuer.rdns);
|
|
17650
|
-
else if (rid.byKey) matchesIssuer = rid.byKey
|
|
17768
|
+
else if (rid.byKey) matchesIssuer = _bytesEqual(rid.byKey, await ocspDigest("SHA-1", issuerKeyBits));
|
|
17651
17769
|
} catch (_e) {
|
|
17652
17770
|
matchesIssuer = false;
|
|
17653
17771
|
}
|
|
@@ -17662,7 +17780,7 @@ var require_ocsp_verify = __commonJS({
|
|
|
17662
17780
|
var identifies = false;
|
|
17663
17781
|
try {
|
|
17664
17782
|
if (rid.byName) identifies = dnEqual(rid.byName.rdns, rc.subject.rdns);
|
|
17665
|
-
else if (rid.byKey) identifies = rid.byKey
|
|
17783
|
+
else if (rid.byKey) identifies = _bytesEqual(rid.byKey, await ocspDigest("SHA-1", ocspKeyValue(rc.subjectPublicKeyInfo.bytes)));
|
|
17666
17784
|
} catch (_e) {
|
|
17667
17785
|
identifies = false;
|
|
17668
17786
|
}
|
|
@@ -17683,7 +17801,7 @@ var require_ocsp_verify = __commonJS({
|
|
|
17683
17801
|
} catch (_e) {
|
|
17684
17802
|
continue;
|
|
17685
17803
|
}
|
|
17686
|
-
if (!eku || eku.value
|
|
17804
|
+
if (!eku || !_asserts(eku.value, OID_OCSP_SIGNING)) continue;
|
|
17687
17805
|
var ku;
|
|
17688
17806
|
try {
|
|
17689
17807
|
ku = decodeExt(rc, OID_KEY_USAGE);
|
|
@@ -17847,11 +17965,20 @@ var require_sign_scheme = __commonJS({
|
|
|
17847
17965
|
var subtle = webcrypto.webcrypto.subtle;
|
|
17848
17966
|
var validator = require_validator_all();
|
|
17849
17967
|
var guard = require_guard_all();
|
|
17968
|
+
var intrinsic = require_guard_intrinsic();
|
|
17850
17969
|
var compositeSig = require_composite_sig();
|
|
17851
17970
|
var b = asn1.build;
|
|
17852
17971
|
function O(name) {
|
|
17853
17972
|
return oid.byName(name);
|
|
17854
17973
|
}
|
|
17974
|
+
var _BigInt = intrinsic.BigInt;
|
|
17975
|
+
var _String = intrinsic.String;
|
|
17976
|
+
var _filter = intrinsic.filter;
|
|
17977
|
+
var _stringify = intrinsic.stringify;
|
|
17978
|
+
var _toUpperCase = intrinsic.toUpperCase;
|
|
17979
|
+
var _isBuffer = intrinsic.isBuffer;
|
|
17980
|
+
var _bufferFrom = intrinsic.bufferFrom;
|
|
17981
|
+
var _isU8 = intrinsic.types.isUint8Array;
|
|
17855
17982
|
var HASH = { sha256: "SHA-256", sha384: "SHA-384", sha512: "SHA-512" };
|
|
17856
17983
|
var NODE_DIGEST = { sha256: "sha256", sha384: "sha384", sha512: "sha512", shake128: "shake128", shake256: "shake256" };
|
|
17857
17984
|
var PSS_SALT = { "SHA-256": 32, "SHA-384": 48, "SHA-512": 64 };
|
|
@@ -17874,6 +18001,11 @@ var require_sign_scheme = __commonJS({
|
|
|
17874
18001
|
"ML-DSA-65": { sha384: 1, sha512: 1, shake256: 1 },
|
|
17875
18002
|
"ML-DSA-87": { sha512: 1, shake256: 1 }
|
|
17876
18003
|
};
|
|
18004
|
+
function mldsaDigestSuitable(mlName, md) {
|
|
18005
|
+
if (!intrinsic.hasOwn(MLDSA_SUITABLE_DIGEST, mlName)) return false;
|
|
18006
|
+
var row = MLDSA_SUITABLE_DIGEST[mlName];
|
|
18007
|
+
return !!row && intrinsic.hasOwn(row, md) && !!row[md];
|
|
18008
|
+
}
|
|
17877
18009
|
var SLHDSA_BY_OID = {};
|
|
17878
18010
|
[
|
|
17879
18011
|
["sha2-128s", "sha256"],
|
|
@@ -17897,7 +18029,7 @@ var require_sign_scheme = __commonJS({
|
|
|
17897
18029
|
function _pssAlgId(digestName) {
|
|
17898
18030
|
var hashAlg = b.sequence([b.oid(O(digestName)), b.nullValue()]);
|
|
17899
18031
|
var mgf = b.sequence([b.oid(O("mgf1")), hashAlg]);
|
|
17900
|
-
var params = b.sequence([b.explicit(0, hashAlg), b.explicit(1, mgf), b.explicit(2, b.integer(
|
|
18032
|
+
var params = b.sequence([b.explicit(0, hashAlg), b.explicit(1, mgf), b.explicit(2, b.integer(_BigInt(PSS_SALT[HASH[digestName]])))]);
|
|
17901
18033
|
return b.sequence([b.oid(O("rsassaPss")), params]);
|
|
17902
18034
|
}
|
|
17903
18035
|
function _pssHashFromSpki(cert, E) {
|
|
@@ -17912,7 +18044,7 @@ var require_sign_scheme = __commonJS({
|
|
|
17912
18044
|
if (node.tagClass !== "universal" || node.tagNumber !== asn1.TAGS.SEQUENCE || !node.children) {
|
|
17913
18045
|
throw E("unsupported-algorithm", "the id-RSASSA-PSS key parameters are not an RSASSA-PSS-params SEQUENCE (RFC 4055 sec. 3.1)");
|
|
17914
18046
|
}
|
|
17915
|
-
var hashField = node.children
|
|
18047
|
+
var hashField = _filter(node.children, function(c) {
|
|
17916
18048
|
return c.tagClass === "context" && c.tagNumber === 0;
|
|
17917
18049
|
})[0];
|
|
17918
18050
|
if (!hashField) return "sha1";
|
|
@@ -17941,15 +18073,15 @@ var require_sign_scheme = __commonJS({
|
|
|
17941
18073
|
var comp = compositeSig.COMPOSITE_ALGS[keyOid];
|
|
17942
18074
|
if (comp) {
|
|
17943
18075
|
if (comp.trad.unsupported) throw E("unsupported-algorithm", "composite " + comp.name + ": " + comp.trad.unsupported);
|
|
17944
|
-
if (so.digestAlgorithm && so.digestAlgorithm !== comp.phCms) throw E("bad-input", "composite " + comp.name + " fixes the digestAlgorithm to " + comp.phCms + " (draft-ietf-lamps-cms-composite-sigs sec. 3.4); " +
|
|
18076
|
+
if (so.digestAlgorithm && so.digestAlgorithm !== comp.phCms) throw E("bad-input", "composite " + comp.name + " fixes the digestAlgorithm to " + comp.phCms + " (draft-ietf-lamps-cms-composite-sigs sec. 3.4); " + _stringify(so.digestAlgorithm) + " conflicts");
|
|
17945
18077
|
return { composite: comp, digest: comp.phCms, digestAlgId: _algId(comp.phCms, "absent"), sigAlgId: _algId(comp.name, "absent") };
|
|
17946
18078
|
}
|
|
17947
18079
|
if (keyOid === O("rsaEncryption") || keyOid === O("rsassaPss")) {
|
|
17948
18080
|
var isPssKey = keyOid === O("rsassaPss");
|
|
17949
18081
|
var pinned = isPssKey ? _pssHashFromSpki(cert, E) : null;
|
|
17950
|
-
if (pinned && so.digestAlgorithm && so.digestAlgorithm !== pinned) throw E("bad-input", "the signer key restricts the RSASSA-PSS digest to " + pinned + ", but digestAlgorithm " +
|
|
18082
|
+
if (pinned && so.digestAlgorithm && so.digestAlgorithm !== pinned) throw E("bad-input", "the signer key restricts the RSASSA-PSS digest to " + pinned + ", but digestAlgorithm " + _stringify(so.digestAlgorithm) + " was requested");
|
|
17951
18083
|
var d = so.digestAlgorithm || pinned || "sha256";
|
|
17952
|
-
if (!HASH[d]) throw E("unsupported-algorithm", "unsupported RSA digest algorithm " +
|
|
18084
|
+
if (!HASH[d]) throw E("unsupported-algorithm", "unsupported RSA digest algorithm " + _stringify(d));
|
|
17953
18085
|
if (so.pss || isPssKey) return { digest: d, digestAlgId: _algId(d, "absent"), sigAlgId: _pssAlgId(d), imp: { name: "RSA-PSS", hash: HASH[d] }, sign: { name: "RSA-PSS", saltLength: PSS_SALT[HASH[d]] }, ecdsaDer: false };
|
|
17954
18086
|
var rsaSigAlgId = so.combinedRsaSig ? _algId(RSA_PKCS1_SIG[d], "null") : _algId("rsaEncryption", "null");
|
|
17955
18087
|
return { digest: d, digestAlgId: _algId(d, "absent"), sigAlgId: rsaSigAlgId, imp: { name: "RSASSA-PKCS1-v1_5", hash: HASH[d] }, sign: { name: "RSASSA-PKCS1-v1_5" }, ecdsaDer: false };
|
|
@@ -17964,13 +18096,13 @@ var require_sign_scheme = __commonJS({
|
|
|
17964
18096
|
var ec = EC_BY_CURVE_OID[curveOid];
|
|
17965
18097
|
if (!ec) throw E("unsupported-algorithm", "the signer key is on an unsupported EC curve");
|
|
17966
18098
|
var de = so.digestAlgorithm || "sha256";
|
|
17967
|
-
if (!HASH[de]) throw E("unsupported-algorithm", "unsupported ECDSA digest algorithm " +
|
|
18099
|
+
if (!HASH[de]) throw E("unsupported-algorithm", "unsupported ECDSA digest algorithm " + _stringify(de));
|
|
17968
18100
|
return { digest: de, digestAlgId: _algId(de, "absent"), sigAlgId: _algId(ECDSA_ALG[de], "absent"), imp: { name: "ECDSA", namedCurve: ec.curve }, sign: { name: "ECDSA", hash: HASH[de] }, ecdsaDer: true, coordLen: ec.coordLen };
|
|
17969
18101
|
}
|
|
17970
18102
|
if (keyOid === O("Ed25519") || keyOid === O("Ed448")) {
|
|
17971
18103
|
var name = keyOid === O("Ed25519") ? "Ed25519" : "Ed448";
|
|
17972
18104
|
var dd = so.digestAlgorithm || (name === "Ed25519" ? "sha512" : "shake256");
|
|
17973
|
-
if (!NODE_DIGEST[dd]) throw E("unsupported-algorithm", "unsupported " + name + " digest algorithm " +
|
|
18105
|
+
if (!NODE_DIGEST[dd]) throw E("unsupported-algorithm", "unsupported " + name + " digest algorithm " + _stringify(dd));
|
|
17974
18106
|
return { digest: dd, digestAlgId: _algId(dd, "absent"), sigAlgId: _algId(name, "absent"), imp: { name }, sign: { name }, ecdsaDer: false };
|
|
17975
18107
|
}
|
|
17976
18108
|
if (MLDSA_BY_OID[keyOid]) {
|
|
@@ -17980,27 +18112,27 @@ var require_sign_scheme = __commonJS({
|
|
|
17980
18112
|
md = "sha512";
|
|
17981
18113
|
} else {
|
|
17982
18114
|
md = so.digestAlgorithm || "sha512";
|
|
17983
|
-
if (!NODE_DIGEST[md]) throw E("unsupported-algorithm", "unsupported ML-DSA message digest " +
|
|
17984
|
-
if (!
|
|
18115
|
+
if (!NODE_DIGEST[md]) throw E("unsupported-algorithm", "unsupported ML-DSA message digest " + _stringify(md));
|
|
18116
|
+
if (!mldsaDigestSuitable(mlName, md)) throw E("unsupported-algorithm", "the " + md + " message digest is below the security strength of " + mlName + " (RFC 9882 sec. 3.3)");
|
|
17985
18117
|
}
|
|
17986
18118
|
return { digest: md, digestAlgId: _algId(md, "absent"), sigAlgId: _algId(oid.name(keyOid), "absent"), imp: { name: mlName }, sign: { name: mlName }, ecdsaDer: false };
|
|
17987
18119
|
}
|
|
17988
18120
|
if (SLHDSA_BY_OID[keyOid]) {
|
|
17989
18121
|
var slh = SLHDSA_BY_OID[keyOid];
|
|
17990
|
-
if (so.digestAlgorithm && so.digestAlgorithm !== slh.digest) throw E("bad-input", "SLH-DSA " + slh.wc + " requires the " + slh.digest + " message digest (RFC 9814 sec. 4); digestAlgorithm " +
|
|
18122
|
+
if (so.digestAlgorithm && so.digestAlgorithm !== slh.digest) throw E("bad-input", "SLH-DSA " + slh.wc + " requires the " + slh.digest + " message digest (RFC 9814 sec. 4); digestAlgorithm " + _stringify(so.digestAlgorithm) + " conflicts");
|
|
17991
18123
|
return { digest: slh.digest, digestAlgId: _algId(slh.digest, "absent"), sigAlgId: _algId(oid.name(keyOid), "absent"), imp: { name: slh.wc }, sign: { name: slh.wc }, ecdsaDer: false };
|
|
17992
18124
|
}
|
|
17993
18125
|
throw E("unsupported-algorithm", "unsupported signer key algorithm " + keyOid);
|
|
17994
18126
|
}
|
|
17995
18127
|
function _assertKeyMatchesScheme(key, imp, E) {
|
|
17996
18128
|
var ka = key.algorithm || {};
|
|
17997
|
-
if (
|
|
18129
|
+
if (_toUpperCase(_String(ka.name)) !== _toUpperCase(_String(imp.name))) throw E("bad-input", "the signer CryptoKey algorithm (" + ka.name + ") does not match the certificate's key algorithm (" + imp.name + ")");
|
|
17998
18130
|
if (imp.hash && (!ka.hash || ka.hash.name !== imp.hash)) throw E("bad-input", "the signer CryptoKey hash (" + (ka.hash && ka.hash.name) + ") does not match the signing digest (" + imp.hash + ")");
|
|
17999
18131
|
if (imp.namedCurve && ka.namedCurve !== imp.namedCurve) throw E("bad-input", "the signer CryptoKey curve (" + ka.namedCurve + ") does not match the certificate curve (" + imp.namedCurve + ")");
|
|
18000
18132
|
}
|
|
18001
18133
|
function _normPkcs8(k, label, E) {
|
|
18002
|
-
if (
|
|
18003
|
-
if (k
|
|
18134
|
+
if (_isBuffer(k)) return guard.bytes.view(k, E, "bad-input", label);
|
|
18135
|
+
if (_isU8(k)) return guard.bytes.snapshot(k, E, "bad-input", label);
|
|
18004
18136
|
if (typeof k === "string") {
|
|
18005
18137
|
try {
|
|
18006
18138
|
return pkcs8.pemDecode(k);
|
|
@@ -18011,19 +18143,19 @@ var require_sign_scheme = __commonJS({
|
|
|
18011
18143
|
throw E("bad-input", label + " must be a PKCS#8 DER Buffer, Uint8Array, or PEM string");
|
|
18012
18144
|
}
|
|
18013
18145
|
function _normCompositeKeys(key, comp, E) {
|
|
18014
|
-
if (!key || typeof key !== "object" ||
|
|
18146
|
+
if (!key || typeof key !== "object" || _isBuffer(key) || _isU8(key) || key.mldsa == null || key.trad == null) {
|
|
18015
18147
|
throw E("bad-input", "a composite " + comp.name + " signer key must be { mldsa: <PKCS#8>, trad: <PKCS#8> }");
|
|
18016
18148
|
}
|
|
18017
18149
|
return { mldsa: _normPkcs8(key.mldsa, "the composite ML-DSA component key", E), trad: _normPkcs8(key.trad, "the composite traditional component key", E) };
|
|
18018
18150
|
}
|
|
18019
18151
|
function _importKey(key, imp, E) {
|
|
18020
|
-
if (key && typeof key === "object" && !
|
|
18152
|
+
if (key && typeof key === "object" && !_isBuffer(key) && !_isU8(key) && key.type === "private") {
|
|
18021
18153
|
_assertKeyMatchesScheme(key, imp, E);
|
|
18022
18154
|
return webcrypto.adoptKey(key, imp, ["sign"], E, "bad-input");
|
|
18023
18155
|
}
|
|
18024
18156
|
var der, owned = false;
|
|
18025
|
-
if (
|
|
18026
|
-
else if (key
|
|
18157
|
+
if (_isBuffer(key)) der = guard.bytes.view(key, E, "bad-input", "the signer private key");
|
|
18158
|
+
else if (_isU8(key)) {
|
|
18027
18159
|
der = guard.bytes.snapshot(key, E, "bad-input", "the signer private key");
|
|
18028
18160
|
owned = true;
|
|
18029
18161
|
} else if (typeof key === "string") {
|
|
@@ -18047,12 +18179,12 @@ var require_sign_scheme = __commonJS({
|
|
|
18047
18179
|
function signOverTbs(scheme, key, signedBytes, E) {
|
|
18048
18180
|
if (scheme.composite) {
|
|
18049
18181
|
return compositeSig.compositeSign(scheme.composite, _normCompositeKeys(key, scheme.composite, E), signedBytes).then(function(sig) {
|
|
18050
|
-
return
|
|
18182
|
+
return _bufferFrom(sig);
|
|
18051
18183
|
});
|
|
18052
18184
|
}
|
|
18053
18185
|
return _importKey(key, scheme.imp, E).then(function(priv) {
|
|
18054
18186
|
return subtle.sign(scheme.sign, priv, signedBytes).then(function(sigRaw) {
|
|
18055
|
-
var sig =
|
|
18187
|
+
var sig = _bufferFrom(sigRaw);
|
|
18056
18188
|
if (scheme.ecdsaDer) sig = validator.sig.rawToEcdsaDer(sig, scheme.coordLen);
|
|
18057
18189
|
return sig;
|
|
18058
18190
|
});
|
|
@@ -18063,6 +18195,7 @@ var require_sign_scheme = __commonJS({
|
|
|
18063
18195
|
pssSpkiPinnedHash,
|
|
18064
18196
|
signOverTbs,
|
|
18065
18197
|
MLDSA_SUITABLE_DIGEST,
|
|
18198
|
+
mldsaDigestSuitable,
|
|
18066
18199
|
SLHDSA_BY_OID
|
|
18067
18200
|
};
|
|
18068
18201
|
}
|
|
@@ -18124,6 +18257,8 @@ var require_pki_build = __commonJS({
|
|
|
18124
18257
|
var schema = require_schema_engine();
|
|
18125
18258
|
var compositeSig = require_composite_sig();
|
|
18126
18259
|
var guard = require_guard_all();
|
|
18260
|
+
var intrinsic = require_guard_intrinsic();
|
|
18261
|
+
var _isArray = intrinsic.isArray;
|
|
18127
18262
|
var oid = require_oid();
|
|
18128
18263
|
var ipUtils = require_ip_utils();
|
|
18129
18264
|
var nodeCrypto = require("crypto");
|
|
@@ -18193,7 +18328,7 @@ var require_pki_build = __commonJS({
|
|
|
18193
18328
|
return spec;
|
|
18194
18329
|
}
|
|
18195
18330
|
if (typeof spec === "string") spec = [{ commonName: spec }];
|
|
18196
|
-
if (!
|
|
18331
|
+
if (!_isArray(spec)) throw E("bad-name", "a name must be a string, an array of RDNs, or raw Name DER");
|
|
18197
18332
|
return b.sequence(spec.map(encodeRdn));
|
|
18198
18333
|
}
|
|
18199
18334
|
function assertValidNameDer(der) {
|
|
@@ -18264,7 +18399,7 @@ var require_pki_build = __commonJS({
|
|
|
18264
18399
|
}
|
|
18265
18400
|
}
|
|
18266
18401
|
function extKeyUsage(names) {
|
|
18267
|
-
if (!
|
|
18402
|
+
if (!_isArray(names) || !names.length) throw E("bad-input", "keyUsage must assert at least one bit (RFC 5280 sec. 4.2.1.3)");
|
|
18268
18403
|
var positions = names.map(function(n) {
|
|
18269
18404
|
var pos = KU_BIT[n];
|
|
18270
18405
|
if (pos == null) throw E("bad-input", "unknown keyUsage bit " + JSON.stringify(n));
|
|
@@ -18286,7 +18421,7 @@ var require_pki_build = __commonJS({
|
|
|
18286
18421
|
throw E("bad-input", "unknown " + label + " " + JSON.stringify(n) + " (expected a registered name or a dotted-decimal OID)");
|
|
18287
18422
|
}
|
|
18288
18423
|
function extExtKeyUsage(names) {
|
|
18289
|
-
if (!
|
|
18424
|
+
if (!_isArray(names) || !names.length) throw E("bad-input", "extendedKeyUsage must list at least one KeyPurposeId");
|
|
18290
18425
|
return b.sequence(names.map(function(n) {
|
|
18291
18426
|
return b.oid(_resolveOid(n, "extendedKeyUsage purpose"));
|
|
18292
18427
|
}));
|
|
@@ -18314,7 +18449,7 @@ var require_pki_build = __commonJS({
|
|
|
18314
18449
|
return b.sequence([b.contextPrimitive(0, keyid)]);
|
|
18315
18450
|
}
|
|
18316
18451
|
function encodeGeneralNames(entries, implicitTag) {
|
|
18317
|
-
if (!
|
|
18452
|
+
if (!_isArray(entries) || !entries.length) throw E("bad-input", "a GeneralNames must carry at least one GeneralName");
|
|
18318
18453
|
var members = entries.map(encodeGeneralName);
|
|
18319
18454
|
if (implicitTag == null) return b.sequence(members);
|
|
18320
18455
|
return b.contextConstructed(implicitTag, Buffer.concat(members));
|
|
@@ -18323,7 +18458,7 @@ var require_pki_build = __commonJS({
|
|
|
18323
18458
|
return encodeGeneralNames(entries);
|
|
18324
18459
|
}
|
|
18325
18460
|
function extCertPolicies(names) {
|
|
18326
|
-
if (!
|
|
18461
|
+
if (!_isArray(names) || !names.length) throw E("bad-input", "certificatePolicies must list at least one policy OID");
|
|
18327
18462
|
var seen = {};
|
|
18328
18463
|
return b.sequence(names.map(function(n) {
|
|
18329
18464
|
var pOid = _resolveOid(n, "certificate policy");
|
|
@@ -18404,7 +18539,7 @@ var require_pki_build = __commonJS({
|
|
|
18404
18539
|
};
|
|
18405
18540
|
function requestedExtensions(extSpec, spki) {
|
|
18406
18541
|
var EXT_DECODERS = ctx.EXT_DECODERS;
|
|
18407
|
-
if (
|
|
18542
|
+
if (_isArray(extSpec)) {
|
|
18408
18543
|
if (!extSpec.length) throw E("bad-input", "the requested extensions list must carry at least one extension");
|
|
18409
18544
|
var seen = {};
|
|
18410
18545
|
return b.sequence(extSpec.map(function(e, i) {
|
|
@@ -19161,6 +19296,8 @@ var require_cmp_build = __commonJS({
|
|
|
19161
19296
|
var CRMF_BODY = { ir: 1, cr: 1, kur: 1 };
|
|
19162
19297
|
var CERT_REP_ARM = { ip: 1, cp: 1, kup: 1, ccp: 1 };
|
|
19163
19298
|
var KNOWN_OPTS_KEYS = { key: 1, cert: 1, mac: 1, extraCerts: 1, pem: 1, pss: 1, digestAlgorithm: 1 };
|
|
19299
|
+
var KNOWN_OPTS_SIG_KEYS = { key: 1, cert: 1, extraCerts: 1, pem: 1, pss: 1, digestAlgorithm: 1 };
|
|
19300
|
+
var KNOWN_OPTS_MAC_KEYS = { mac: 1, extraCerts: 1, pem: 1 };
|
|
19164
19301
|
var KNOWN_MESSAGE_KEYS = { header: 1, body: 1 };
|
|
19165
19302
|
var KNOWN_MAC_KEYS = { secret: 1, salt: 1, iterationCount: 1, prf: 1, keyLength: 1, algorithm: 1 };
|
|
19166
19303
|
var PBMAC1_DEFAULT_ITER = 1e5;
|
|
@@ -19615,7 +19752,16 @@ var require_cmp_build = __commonJS({
|
|
|
19615
19752
|
guard.identifier.assertKnownKeys(message, KNOWN_MESSAGE_KEYS, _err, "cmp/bad-input", function(k) {
|
|
19616
19753
|
return "unknown message field " + JSON.stringify(k) + " (a message carries only header + body)";
|
|
19617
19754
|
});
|
|
19618
|
-
|
|
19755
|
+
var sigForm = opts.key != null || opts.cert != null, macForm = opts.mac != null;
|
|
19756
|
+
guard.identifier.assertKnownKeys(
|
|
19757
|
+
opts,
|
|
19758
|
+
sigForm === macForm ? KNOWN_OPTS_KEYS : sigForm ? KNOWN_OPTS_SIG_KEYS : KNOWN_OPTS_MAC_KEYS,
|
|
19759
|
+
_err,
|
|
19760
|
+
"cmp/bad-input",
|
|
19761
|
+
function(k) {
|
|
19762
|
+
return "unknown opts field " + JSON.stringify(k) + (macForm && (k === "pss" || k === "digestAlgorithm") ? " for MAC protection; the signature parameters are read only by the { key, cert } form" : "");
|
|
19763
|
+
}
|
|
19764
|
+
);
|
|
19619
19765
|
if (message.header == null) throw _err("cmp/bad-input", "message.header is required");
|
|
19620
19766
|
if (message.body == null) throw _err("cmp/bad-input", "message.body is required");
|
|
19621
19767
|
var prot = _resolveProtection(opts);
|
|
@@ -20428,6 +20574,7 @@ var require_cms_sign = __commonJS({
|
|
|
20428
20574
|
var webcrypto = require_webcrypto();
|
|
20429
20575
|
var signScheme = require_sign_scheme();
|
|
20430
20576
|
var guard = require_guard_all();
|
|
20577
|
+
var intrinsic = require_guard_intrinsic();
|
|
20431
20578
|
var pkiBuild = require_pki_build();
|
|
20432
20579
|
var cms = require_schema_cms();
|
|
20433
20580
|
var subtle = webcrypto.webcrypto.subtle;
|
|
@@ -20453,6 +20600,8 @@ var require_cms_sign = __commonJS({
|
|
|
20453
20600
|
certificates: 1,
|
|
20454
20601
|
pem: 1
|
|
20455
20602
|
};
|
|
20603
|
+
var KNOWN_SIGNER_CERT_KEYS = { cert: 1, key: 1, pss: 1, digestAlgorithm: 1, combinedRsaSig: 1 };
|
|
20604
|
+
var KNOWN_SIGNER_KEY_ONLY_KEYS = { spki: 1, keyIdentifier: 1, key: 1, pss: 1, digestAlgorithm: 1, combinedRsaSig: 1 };
|
|
20456
20605
|
var KNOWN_COUNTERSIGN_OPTS = {
|
|
20457
20606
|
signerIndex: 1,
|
|
20458
20607
|
countersignatureOf: 1,
|
|
@@ -20507,7 +20656,7 @@ var require_cms_sign = __commonJS({
|
|
|
20507
20656
|
function _buildSignedAttrs(pairs) {
|
|
20508
20657
|
var seenTypes = {};
|
|
20509
20658
|
var attrs = pairs.map(function(p) {
|
|
20510
|
-
if (
|
|
20659
|
+
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);
|
|
20511
20660
|
seenTypes[p.type] = 1;
|
|
20512
20661
|
return b.sequence([b.oid(p.type), b.set(p.values)]);
|
|
20513
20662
|
});
|
|
@@ -20536,8 +20685,8 @@ var require_cms_sign = __commonJS({
|
|
|
20536
20685
|
var pairs = _resolveAttrPairs(list, "an unsigned attribute value");
|
|
20537
20686
|
var seen = {};
|
|
20538
20687
|
pairs.forEach(function(p) {
|
|
20539
|
-
if (
|
|
20540
|
-
if (
|
|
20688
|
+
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)");
|
|
20689
|
+
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);
|
|
20541
20690
|
seen[p.type] = 1;
|
|
20542
20691
|
});
|
|
20543
20692
|
var setOf = b.set(pairs.map(function(p) {
|
|
@@ -20924,7 +21073,14 @@ var require_cms_sign = __commonJS({
|
|
|
20924
21073
|
return opts.pem ? pkix.pemEncode(newCi, "CMS", frameworkError.PemError) : newCi;
|
|
20925
21074
|
});
|
|
20926
21075
|
}
|
|
20927
|
-
module2.exports = {
|
|
21076
|
+
module2.exports = {
|
|
21077
|
+
sign,
|
|
21078
|
+
countersign,
|
|
21079
|
+
// @internal -- the signer-descriptor field tables, for a verb that AUTHORS signer descriptors
|
|
21080
|
+
// from its own caller's options and gates them at its own door.
|
|
21081
|
+
KNOWN_SIGNER_CERT_KEYS,
|
|
21082
|
+
KNOWN_SIGNER_KEY_ONLY_KEYS
|
|
21083
|
+
};
|
|
20928
21084
|
}
|
|
20929
21085
|
});
|
|
20930
21086
|
|
|
@@ -20940,6 +21096,7 @@ var require_cms_encrypt = __commonJS({
|
|
|
20940
21096
|
var webcrypto = require_webcrypto();
|
|
20941
21097
|
var frameworkError = require_framework_error();
|
|
20942
21098
|
var guard = require_guard_all();
|
|
21099
|
+
var intrinsic = require_guard_intrinsic();
|
|
20943
21100
|
var pbes2 = require_pbes2();
|
|
20944
21101
|
var b = asn1.build;
|
|
20945
21102
|
var subtle = webcrypto.webcrypto.subtle;
|
|
@@ -21213,22 +21370,64 @@ var require_cms_encrypt = __commonJS({
|
|
|
21213
21370
|
if (!PRF_HASH[prf]) throw _err("cms/bad-input", "unsupported pwri prf " + JSON.stringify(prf));
|
|
21214
21371
|
return PRF_HASH[prf];
|
|
21215
21372
|
}
|
|
21216
|
-
|
|
21373
|
+
var _PWRI_KEYS = { password: 1, iterations: 1, prf: 1, salt: 1 };
|
|
21374
|
+
var _KEKRI_KEYS = { kek: 1, kekId: 1 };
|
|
21375
|
+
var _KTRI_RECIPIENT_KEYS = { cert: 1, oaepHash: 1, keyIdentifier: 1 };
|
|
21376
|
+
var _AGREE_RECIPIENT_KEYS = { cert: 1, keyIdentifier: 1, ukm: 1 };
|
|
21377
|
+
var _RECIPIENT_DEFAULTS = ["oaepHash", "keyIdentifier", "ukm"];
|
|
21378
|
+
function _assertRecipientKeys(desc, known, arm) {
|
|
21379
|
+
guard.identifier.assertKnownKeys(desc, known, _err, "cms/bad-input", function(k) {
|
|
21380
|
+
return "unknown field " + JSON.stringify(k) + " on a " + arm + " recipient; that field is not read for this recipient type";
|
|
21381
|
+
});
|
|
21382
|
+
}
|
|
21383
|
+
function _assertDefaultsConsumed(opts, consumed) {
|
|
21384
|
+
for (var i = 0; i < _RECIPIENT_DEFAULTS.length; i++) {
|
|
21385
|
+
var name = _RECIPIENT_DEFAULTS[i];
|
|
21386
|
+
if (opts[name] != null && !consumed[name]) {
|
|
21387
|
+
throw _err("cms/bad-input", "opts." + name + " is a per-recipient default and no recipient of this message reads it" + (name === "oaepHash" ? " (only an RSA certificate recipient does)" : name === "ukm" ? " (only a key-agreement or KEM certificate recipient does)" : " (only a certificate recipient does)"));
|
|
21388
|
+
}
|
|
21389
|
+
}
|
|
21390
|
+
}
|
|
21391
|
+
async function _buildRecipient(cek, desc, opts, consumed) {
|
|
21217
21392
|
if (desc == null || typeof desc !== "object") throw _err("cms/bad-input", "each recipient must be a descriptor object");
|
|
21218
|
-
if (desc.password != null)
|
|
21219
|
-
|
|
21393
|
+
if (desc.password != null) {
|
|
21394
|
+
_assertRecipientKeys(desc, _PWRI_KEYS, "password");
|
|
21395
|
+
return _buildPwri(cek, desc);
|
|
21396
|
+
}
|
|
21397
|
+
if (desc.kek != null) {
|
|
21398
|
+
_assertRecipientKeys(desc, _KEKRI_KEYS, "KEK");
|
|
21399
|
+
return _buildKekri(cek, desc);
|
|
21400
|
+
}
|
|
21220
21401
|
if (desc.cert != null) {
|
|
21221
21402
|
var cert = x509.parse(_normCertDer(desc.cert, "a recipient certificate"));
|
|
21222
21403
|
var keyOid = cert.subjectPublicKeyInfo.algorithm.oid;
|
|
21223
|
-
if (keyOid === O("rsaEncryption") || keyOid === O("rsassaPss"))
|
|
21224
|
-
|
|
21225
|
-
|
|
21404
|
+
if (keyOid === O("rsaEncryption") || keyOid === O("rsassaPss")) {
|
|
21405
|
+
_assertRecipientKeys(desc, _KTRI_RECIPIENT_KEYS, "RSA certificate");
|
|
21406
|
+
return _buildKtri(cek, cert, mergeOpts(opts, desc, _KTRI_RECIPIENT_KEYS, consumed));
|
|
21407
|
+
}
|
|
21408
|
+
if (keyOid === O("ecPublicKey") || MONT_KA[keyOid]) {
|
|
21409
|
+
_assertRecipientKeys(desc, _AGREE_RECIPIENT_KEYS, "key-agreement certificate");
|
|
21410
|
+
return _buildKari(cek, cert, mergeOpts(opts, desc, _AGREE_RECIPIENT_KEYS, consumed));
|
|
21411
|
+
}
|
|
21412
|
+
if (KEM_WC[keyOid]) {
|
|
21413
|
+
_assertRecipientKeys(desc, _AGREE_RECIPIENT_KEYS, "KEM certificate");
|
|
21414
|
+
return _buildKemri(cek, cert, mergeOpts(opts, desc, _AGREE_RECIPIENT_KEYS, consumed));
|
|
21415
|
+
}
|
|
21226
21416
|
throw _err("cms/unsupported-algorithm", "unsupported recipient certificate key algorithm " + keyOid);
|
|
21227
21417
|
}
|
|
21228
21418
|
throw _err("cms/bad-input", "a recipient needs { cert }, { password }, or { kek, kekId }");
|
|
21229
21419
|
}
|
|
21230
|
-
function
|
|
21231
|
-
|
|
21420
|
+
function _pickDefault(desc, opts, name, known, consumed, nullish) {
|
|
21421
|
+
var supplied = desc[name], fromDesc = nullish ? supplied != null : !!supplied;
|
|
21422
|
+
if (!fromDesc && known[name] && consumed && opts[name] != null) consumed[name] = 1;
|
|
21423
|
+
return fromDesc ? supplied : opts[name];
|
|
21424
|
+
}
|
|
21425
|
+
function mergeOpts(opts, desc, known, consumed) {
|
|
21426
|
+
return {
|
|
21427
|
+
oaepHash: _pickDefault(desc, opts, "oaepHash", known, consumed, false),
|
|
21428
|
+
keyIdentifier: _pickDefault(desc, opts, "keyIdentifier", known, consumed, false),
|
|
21429
|
+
ukm: _pickDefault(desc, opts, "ukm", known, consumed, true)
|
|
21430
|
+
};
|
|
21232
21431
|
}
|
|
21233
21432
|
function _taggedRecipient(r) {
|
|
21234
21433
|
if (r.tag == null) return r.node;
|
|
@@ -21244,19 +21443,67 @@ var require_cms_encrypt = __commonJS({
|
|
|
21244
21443
|
});
|
|
21245
21444
|
return forcesTwo ? 2 : 0;
|
|
21246
21445
|
}
|
|
21446
|
+
var _ENCRYPT_OPTS_AEAD = {
|
|
21447
|
+
contentEncryptionAlgorithm: 1,
|
|
21448
|
+
contentType: 1,
|
|
21449
|
+
authAttrs: 1,
|
|
21450
|
+
oaepHash: 1,
|
|
21451
|
+
keyIdentifier: 1,
|
|
21452
|
+
ukm: 1,
|
|
21453
|
+
pem: 1
|
|
21454
|
+
};
|
|
21455
|
+
var _ENCRYPT_OPTS_CBC = {
|
|
21456
|
+
contentEncryptionAlgorithm: 1,
|
|
21457
|
+
contentType: 1,
|
|
21458
|
+
oaepHash: 1,
|
|
21459
|
+
keyIdentifier: 1,
|
|
21460
|
+
ukm: 1,
|
|
21461
|
+
pem: 1
|
|
21462
|
+
};
|
|
21463
|
+
var _AUTHENTICATE_OPTS_ATTRS = {
|
|
21464
|
+
macAlgorithm: 1,
|
|
21465
|
+
digestAlgorithm: 1,
|
|
21466
|
+
authenticatedAttributes: 1,
|
|
21467
|
+
authAttrs: 1,
|
|
21468
|
+
contentType: 1,
|
|
21469
|
+
keyIdentifier: 1,
|
|
21470
|
+
oaepHash: 1,
|
|
21471
|
+
ukm: 1,
|
|
21472
|
+
pem: 1
|
|
21473
|
+
};
|
|
21474
|
+
var _AUTHENTICATE_OPTS_BARE = {
|
|
21475
|
+
macAlgorithm: 1,
|
|
21476
|
+
authenticatedAttributes: 1,
|
|
21477
|
+
contentType: 1,
|
|
21478
|
+
keyIdentifier: 1,
|
|
21479
|
+
oaepHash: 1,
|
|
21480
|
+
ukm: 1,
|
|
21481
|
+
pem: 1
|
|
21482
|
+
};
|
|
21247
21483
|
async function encrypt(content, recipients, opts) {
|
|
21248
21484
|
opts = opts || {};
|
|
21249
|
-
var contentBytes = guard.bytes.view(content, CmsError, "cms/bad-input", "content");
|
|
21250
21485
|
var algName = opts.contentEncryptionAlgorithm || "aes-256-gcm";
|
|
21251
21486
|
var ca = CONTENT_ALGS[algName];
|
|
21252
21487
|
if (!ca) throw _err("cms/bad-input", "unsupported contentEncryptionAlgorithm " + JSON.stringify(algName));
|
|
21488
|
+
guard.identifier.assertKnownKeys(
|
|
21489
|
+
opts,
|
|
21490
|
+
ca.aead ? _ENCRYPT_OPTS_AEAD : _ENCRYPT_OPTS_CBC,
|
|
21491
|
+
_err,
|
|
21492
|
+
"cms/bad-input",
|
|
21493
|
+
function(k) {
|
|
21494
|
+
return "pki.cms.encrypt has an unknown option " + JSON.stringify(k) + (!ca.aead && k === "authAttrs" ? " for a CBC content algorithm; authenticated attributes are carried only by an AuthEnvelopedData, which an AEAD algorithm produces" : "");
|
|
21495
|
+
}
|
|
21496
|
+
);
|
|
21497
|
+
var contentBytes = guard.bytes.view(content, CmsError, "cms/bad-input", "content");
|
|
21253
21498
|
var contentType = opts.contentType || "data";
|
|
21254
21499
|
var cek = nodeCrypto.randomBytes(ca.keyBits / 8);
|
|
21255
21500
|
try {
|
|
21256
21501
|
if (!Array.isArray(recipients)) return _encryptedData(contentBytes, recipients, ca, contentType, opts, cek);
|
|
21257
21502
|
if (!recipients.length) throw _err("cms/bad-input", "at least one recipient is required (RFC 5652 sec. 6.1)");
|
|
21258
21503
|
var recips = [];
|
|
21259
|
-
|
|
21504
|
+
var consumed = {};
|
|
21505
|
+
for (var i = 0; i < recipients.length; i++) recips.push(await _buildRecipient(cek, recipients[i], opts, consumed));
|
|
21506
|
+
_assertDefaultsConsumed(opts, consumed);
|
|
21260
21507
|
var riNodes = recips.map(_taggedRecipient);
|
|
21261
21508
|
if (ca.aead) return _emit(_authEnvelopedData(contentBytes, cek, ca, contentType, opts, riNodes, recips), "authEnvelopedData", opts);
|
|
21262
21509
|
return _emit(_envelopedData(contentBytes, cek, ca, contentType, riNodes, recips), "envelopedData", opts);
|
|
@@ -21292,7 +21539,7 @@ var require_cms_encrypt = __commonJS({
|
|
|
21292
21539
|
} catch (e) {
|
|
21293
21540
|
throw _err("cms/bad-input", "an authenticated attribute type is not an OBJECT IDENTIFIER", e);
|
|
21294
21541
|
}
|
|
21295
|
-
if (
|
|
21542
|
+
if (intrinsic.hasOwn(seenTypes, t)) throw _err("cms/bad-input", "authenticated attributes must not repeat an attribute type (RFC 5652): " + t);
|
|
21296
21543
|
seenTypes[t] = 1;
|
|
21297
21544
|
if (forbidden && t === forbidden.oid) throw _err("cms/bad-input", forbidden.why);
|
|
21298
21545
|
});
|
|
@@ -21321,8 +21568,18 @@ var require_cms_encrypt = __commonJS({
|
|
|
21321
21568
|
void recips;
|
|
21322
21569
|
return b.sequence(kids);
|
|
21323
21570
|
}
|
|
21571
|
+
var _ENCRYPTED_DATA_CEK_KEYS = { cek: 1 };
|
|
21572
|
+
var _ENCRYPTED_DATA_PW_KEYS = { password: 1, iterations: 1, salt: 1, prf: 1 };
|
|
21324
21573
|
function _encryptedData(contentBytes, desc, ca, contentType, opts, cek) {
|
|
21325
21574
|
if (ca.aead) throw _err("cms/bad-input", "EncryptedData supports only CBC content encryption");
|
|
21575
|
+
_assertDefaultsConsumed(opts, {});
|
|
21576
|
+
if (desc != null && typeof desc === "object") {
|
|
21577
|
+
var edKeys = desc.cek != null ? _ENCRYPTED_DATA_CEK_KEYS : _ENCRYPTED_DATA_PW_KEYS;
|
|
21578
|
+
var edArm = desc.cek != null ? "cek" : "password";
|
|
21579
|
+
guard.identifier.assertKnownKeys(desc, edKeys, _err, "cms/bad-input", function(k) {
|
|
21580
|
+
return "unknown field " + JSON.stringify(k) + " on a " + edArm + " EncryptedData descriptor; that field is not read for this arm";
|
|
21581
|
+
});
|
|
21582
|
+
}
|
|
21326
21583
|
var iv = nodeCrypto.randomBytes(16);
|
|
21327
21584
|
var contentAlgNode, encKey;
|
|
21328
21585
|
if (desc && desc.cek != null) {
|
|
@@ -21352,7 +21609,7 @@ var require_cms_encrypt = __commonJS({
|
|
|
21352
21609
|
var contentAlg = pbes2.pbes2AlgId(salt, iterations, prf, ca.oid, iv);
|
|
21353
21610
|
var eci = b.sequence([b.oid(O(contentType)), contentAlg, b.contextPrimitive(0, enc)]);
|
|
21354
21611
|
var inner = b.sequence([b.integer(0n), eci]);
|
|
21355
|
-
return _emit(inner, "encryptedData",
|
|
21612
|
+
return _emit(inner, "encryptedData", opts);
|
|
21356
21613
|
} finally {
|
|
21357
21614
|
guard.secret.zeroize(key, CmsError, "cms/bad-input", "the password-derived content-encryption key");
|
|
21358
21615
|
}
|
|
@@ -21377,22 +21634,33 @@ var require_cms_encrypt = __commonJS({
|
|
|
21377
21634
|
var SUPPORTED_DIGEST = { sha256: 1, sha384: 1, sha512: 1 };
|
|
21378
21635
|
async function authenticate(content, recipients, opts) {
|
|
21379
21636
|
opts = opts || {};
|
|
21637
|
+
var withAttrs = opts.authenticatedAttributes !== false;
|
|
21638
|
+
guard.identifier.assertKnownKeys(
|
|
21639
|
+
opts,
|
|
21640
|
+
withAttrs ? _AUTHENTICATE_OPTS_ATTRS : _AUTHENTICATE_OPTS_BARE,
|
|
21641
|
+
_err,
|
|
21642
|
+
"cms/bad-input",
|
|
21643
|
+
function(k) {
|
|
21644
|
+
return "pki.cms.authenticate has an unknown option " + JSON.stringify(k) + (!withAttrs && (k === "digestAlgorithm" || k === "authAttrs") ? " with authenticatedAttributes: false; the MAC then covers the content octets directly and no attribute set is built" : "");
|
|
21645
|
+
}
|
|
21646
|
+
);
|
|
21380
21647
|
var contentBytes = guard.bytes.view(content, CmsError, "cms/bad-input", "content");
|
|
21381
21648
|
var macName = opts.macAlgorithm || "hmac-sha256";
|
|
21382
21649
|
var mac = MAC_ALGS[macName];
|
|
21383
21650
|
if (!mac) throw _err("cms/bad-input", "unsupported macAlgorithm " + JSON.stringify(macName) + " (hmac-sha256/384/512)");
|
|
21384
21651
|
if (!Array.isArray(recipients) || !recipients.length) throw _err("cms/bad-input", "at least one recipient is required (RFC 5652 sec. 9.1)");
|
|
21385
21652
|
var contentType = opts.contentType || "data";
|
|
21386
|
-
var withAttrs = opts.authenticatedAttributes !== false;
|
|
21387
21653
|
if (contentType !== "data" && !withAttrs) throw _err("cms/bad-input", "AuthenticatedData with a non-data contentType requires authenticated attributes (RFC 5652 sec. 9.1)");
|
|
21388
21654
|
var macKey = nodeCrypto.randomBytes(MAC_KEY_OCTETS);
|
|
21389
21655
|
try {
|
|
21390
21656
|
var recips = [];
|
|
21391
|
-
|
|
21657
|
+
var consumedAuth = {};
|
|
21658
|
+
for (var i = 0; i < recipients.length; i++) recips.push(await _buildRecipient(macKey, recipients[i], opts, consumedAuth));
|
|
21659
|
+
_assertDefaultsConsumed(opts, consumedAuth);
|
|
21392
21660
|
var riNodes = recips.map(_taggedRecipient);
|
|
21393
|
-
var digestName = opts.digestAlgorithm || mac.node;
|
|
21394
21661
|
var digestAlgTagged = null, authAttrsDer = null, preimage;
|
|
21395
21662
|
if (withAttrs) {
|
|
21663
|
+
var digestName = opts.digestAlgorithm || mac.node;
|
|
21396
21664
|
if (!SUPPORTED_DIGEST[digestName]) throw _err("cms/bad-input", "unsupported digestAlgorithm " + JSON.stringify(digestName) + " (sha256/384/512)");
|
|
21397
21665
|
var mdDigest = nodeCrypto.createHash(digestName).update(contentBytes).digest();
|
|
21398
21666
|
var pairs = [
|
|
@@ -21444,6 +21712,7 @@ var require_cms_decrypt = __commonJS({
|
|
|
21444
21712
|
var webcrypto = require_webcrypto();
|
|
21445
21713
|
var frameworkError = require_framework_error();
|
|
21446
21714
|
var guard = require_guard_all();
|
|
21715
|
+
var intrinsic = require_guard_intrinsic();
|
|
21447
21716
|
var pbes2 = require_pbes2();
|
|
21448
21717
|
var b = asn1.build;
|
|
21449
21718
|
var subtle = webcrypto.webcrypto.subtle;
|
|
@@ -21746,8 +22015,8 @@ var require_cms_decrypt = __commonJS({
|
|
|
21746
22015
|
}
|
|
21747
22016
|
function _assertContentCipherMode(eci, ct) {
|
|
21748
22017
|
var oidStr = eci.contentEncryptionAlgorithm.oid;
|
|
21749
|
-
var isAead =
|
|
21750
|
-
if (!isAead && !
|
|
22018
|
+
var isAead = intrinsic.hasOwn(AEAD_ALGS, oidStr);
|
|
22019
|
+
if (!isAead && !intrinsic.hasOwn(CONTENT_MODE, oidStr)) return;
|
|
21751
22020
|
if (ct === "authEnvelopedData") {
|
|
21752
22021
|
if (isAead) return;
|
|
21753
22022
|
throw _err("cms/unsupported-algorithm", "contentEncryptionAlgorithm " + oidStr + " is not an authenticated encryption algorithm, which authEnvelopedData requires (RFC 5083 sec. 2)");
|
|
@@ -21757,9 +22026,9 @@ var require_cms_decrypt = __commonJS({
|
|
|
21757
22026
|
}
|
|
21758
22027
|
async function _openContent(parsed, eci, cek, ct) {
|
|
21759
22028
|
var alg = eci.contentEncryptionAlgorithm;
|
|
21760
|
-
var keyBits =
|
|
22029
|
+
var keyBits = intrinsic.hasOwn(CONTENT_KEYBITS, alg.oid) ? CONTENT_KEYBITS[alg.oid] : 0;
|
|
21761
22030
|
if (!keyBits) {
|
|
21762
|
-
if (
|
|
22031
|
+
if (intrinsic.hasOwn(AEAD_ALGS, alg.oid) && AEAD_ALGS[alg.oid] === "ccm") {
|
|
21763
22032
|
throw _err("cms/unsupported-algorithm", "contentEncryptionAlgorithm " + alg.oid + " is AES-CCM. RFC 5084 sec. 3.1 permits it for this content type; this toolkit implements AES-GCM only for content encryption");
|
|
21764
22033
|
}
|
|
21765
22034
|
throw _err("cms/unsupported-algorithm", "unsupported contentEncryptionAlgorithm " + alg.oid);
|
|
@@ -22192,11 +22461,12 @@ var require_cms_verify = __commonJS({
|
|
|
22192
22461
|
var cmsDecrypt = require_cms_decrypt();
|
|
22193
22462
|
var cmsCompress = require_cms_compress();
|
|
22194
22463
|
var signScheme = require_sign_scheme();
|
|
22195
|
-
var
|
|
22464
|
+
var _mldsaDigestSuitable = signScheme.mldsaDigestSuitable;
|
|
22196
22465
|
var SLHDSA_BY_OID = signScheme.SLHDSA_BY_OID;
|
|
22197
22466
|
var validator = require_validator_all();
|
|
22198
22467
|
var compositeSig = require_composite_sig();
|
|
22199
22468
|
var guard = require_guard_all();
|
|
22469
|
+
var intrinsic = require_guard_intrinsic();
|
|
22200
22470
|
var frameworkError = require_framework_error();
|
|
22201
22471
|
var pkix = require_schema_pkix();
|
|
22202
22472
|
var CmsError = frameworkError.CmsError;
|
|
@@ -22216,7 +22486,7 @@ var require_cms_verify = __commonJS({
|
|
|
22216
22486
|
};
|
|
22217
22487
|
var SIG_HASH = { sha1: "SHA-1", sha256: "SHA-256", sha384: "SHA-384", sha512: "SHA-512" };
|
|
22218
22488
|
function _supportedDigest(name) {
|
|
22219
|
-
return !!DIGEST_HASH[name];
|
|
22489
|
+
return intrinsic.hasOwn(DIGEST_HASH, name) && !!DIGEST_HASH[name];
|
|
22220
22490
|
}
|
|
22221
22491
|
function _computeDigest(name, content) {
|
|
22222
22492
|
return subtle.digest(DIGEST_HASH[name], content).then(function(d) {
|
|
@@ -22454,7 +22724,7 @@ var require_cms_verify = __commonJS({
|
|
|
22454
22724
|
if ((scheme.kind === "mldsa" || scheme.kind === "slhdsa") && si.signedAttrsBytes && (si.digestAlgorithm.name === "shake128" || si.digestAlgorithm.name === "shake256") && dp !== null && dp !== void 0) return Promise.resolve({ ok: false, code: "cms/unsupported-algorithm", sid: si.sid, message: "a SHAKE digestAlgorithm carries no parameters (RFC 8702 sec. 3.1)" });
|
|
22455
22725
|
var sigHash = pss ? pss.hash : scheme.hash || digestHash;
|
|
22456
22726
|
if (scheme.kind !== "eddsa" && scheme.kind !== "mldsa" && scheme.kind !== "slhdsa" && !sigHash || si.signedAttrsBytes && !_supportedDigest(si.digestAlgorithm.name)) return Promise.resolve({ ok: false, code: "cms/unsupported-algorithm", sid: si.sid, message: "unsupported digest algorithm " + JSON.stringify(si.digestAlgorithm.name) });
|
|
22457
|
-
if (scheme.kind === "mldsa" && si.signedAttrsBytes && !
|
|
22727
|
+
if (scheme.kind === "mldsa" && si.signedAttrsBytes && !_mldsaDigestSuitable(scheme.name, si.digestAlgorithm.name)) return Promise.resolve({ ok: false, code: "cms/unsupported-algorithm", sid: si.sid, message: "the " + si.digestAlgorithm.name + " message digest is below the security strength of " + scheme.name + " (RFC 9882 sec. 3.3)" });
|
|
22458
22728
|
if (scheme.kind === "slhdsa" && si.signedAttrsBytes && si.digestAlgorithm.name !== scheme.digest) return Promise.resolve({ ok: false, code: "cms/unsupported-algorithm", sid: si.sid, message: "SLH-DSA " + scheme.name + " requires the " + scheme.digest + " message digest (RFC 9814 sec. 4)" });
|
|
22459
22729
|
var signers = _findSignerCerts(si.sid, parsedCerts);
|
|
22460
22730
|
if (!signers.length) return Promise.resolve({ ok: false, code: "cms/signer-cert-not-found", sid: si.sid, message: "no certificate matches this SignerInfo's signer identifier" });
|
|
@@ -22666,7 +22936,9 @@ var require_cms_verify = __commonJS({
|
|
|
22666
22936
|
});
|
|
22667
22937
|
})).then(function(signers) {
|
|
22668
22938
|
var res = {
|
|
22669
|
-
|
|
22939
|
+
// Signature soundness is decided by comparison for the same reason the trust verdict below
|
|
22940
|
+
// is: `every` replaced after load reports the whole set sound without reading one signer.
|
|
22941
|
+
valid: signers.length > 0 && guard.list.allMatch(signers, function(s) {
|
|
22670
22942
|
return s.ok === true;
|
|
22671
22943
|
}),
|
|
22672
22944
|
eContentType: parsed.encapContentInfo.eContentType,
|
|
@@ -22696,7 +22968,7 @@ var require_cms_verify = __commonJS({
|
|
|
22696
22968
|
});
|
|
22697
22969
|
var out = {}, k;
|
|
22698
22970
|
for (k in v) {
|
|
22699
|
-
if (!
|
|
22971
|
+
if (!intrinsic.hasOwn(v, k)) continue;
|
|
22700
22972
|
out[k] = _cloneAnchorValue(v[k], depth + 1);
|
|
22701
22973
|
}
|
|
22702
22974
|
return out;
|
|
@@ -22736,6 +23008,11 @@ var require_cms_verify = __commonJS({
|
|
|
22736
23008
|
}
|
|
22737
23009
|
return true;
|
|
22738
23010
|
}
|
|
23011
|
+
function _allTrusted(signers) {
|
|
23012
|
+
return guard.list.allMatch(signers, function(s) {
|
|
23013
|
+
return s.trusted === true;
|
|
23014
|
+
});
|
|
23015
|
+
}
|
|
22739
23016
|
function _applyTrust(res, parsedCerts, cfg) {
|
|
22740
23017
|
res.trusted = false;
|
|
22741
23018
|
res.signers.forEach(function(s) {
|
|
@@ -22780,9 +23057,7 @@ var require_cms_verify = __commonJS({
|
|
|
22780
23057
|
});
|
|
22781
23058
|
});
|
|
22782
23059
|
}, Promise.resolve()).then(function() {
|
|
22783
|
-
res.trusted = res.valid && res.signers.length > 0 && res.signers
|
|
22784
|
-
return s.trusted === true;
|
|
22785
|
-
});
|
|
23060
|
+
res.trusted = res.valid && res.signers.length > 0 && _allTrusted(res.signers);
|
|
22786
23061
|
});
|
|
22787
23062
|
}
|
|
22788
23063
|
function _addCert(out, der) {
|
|
@@ -23688,6 +23963,7 @@ var require_path_validate = __commonJS({
|
|
|
23688
23963
|
var cmsVerify = require_cms_verify();
|
|
23689
23964
|
var cmpSession = require_cmp_session();
|
|
23690
23965
|
var guard = require_guard_all();
|
|
23966
|
+
var intrinsic = require_guard_intrinsic();
|
|
23691
23967
|
var constants = require_constants();
|
|
23692
23968
|
var validator = require_validator_all();
|
|
23693
23969
|
var cms = require_schema_cms();
|
|
@@ -23702,6 +23978,13 @@ var require_path_validate = __commonJS({
|
|
|
23702
23978
|
function pathCode(e, fallback) {
|
|
23703
23979
|
return e && typeof e.code === "string" && e.code.indexOf("path/") === 0 ? e.code : fallback;
|
|
23704
23980
|
}
|
|
23981
|
+
var contains = guard.list.contains;
|
|
23982
|
+
var containsAll = guard.list.containsAll;
|
|
23983
|
+
function mapsAnyPolicy(mappings) {
|
|
23984
|
+
return guard.list.anyMatches(mappings, function(m) {
|
|
23985
|
+
return !!m && (m.issuerDomainPolicy === OID.anyPolicy || m.subjectDomainPolicy === OID.anyPolicy);
|
|
23986
|
+
});
|
|
23987
|
+
}
|
|
23705
23988
|
var NS = pkix.makeNS("path", PathError, oid);
|
|
23706
23989
|
var EXT_DECODERS = pkix.certExtensionDecoders(NS).byOid;
|
|
23707
23990
|
var subtle = webcrypto.webcrypto.subtle;
|
|
@@ -24171,7 +24454,7 @@ var require_path_validate = __commonJS({
|
|
|
24171
24454
|
return (Buffer.isBuffer(base) || base instanceof Uint8Array) && (base.length === 8 || base.length === 32);
|
|
24172
24455
|
// iPAddress: address + mask
|
|
24173
24456
|
case 4:
|
|
24174
|
-
return base !== null && typeof base === "object" && !!base.rdns &&
|
|
24457
|
+
return base !== null && typeof base === "object" && !!base.rdns && intrinsic.isArray(base.rdns);
|
|
24175
24458
|
// directoryName
|
|
24176
24459
|
default:
|
|
24177
24460
|
return base !== void 0;
|
|
@@ -24179,7 +24462,7 @@ var require_path_validate = __commonJS({
|
|
|
24179
24462
|
}
|
|
24180
24463
|
function checkedSubtreeSeeds(list, optName) {
|
|
24181
24464
|
if (list === void 0 || list === null) return [];
|
|
24182
|
-
if (!
|
|
24465
|
+
if (!intrinsic.isArray(list)) throw E("path/bad-input", "validate: opts." + optName + " must be an array of { tag, base } subtree entries");
|
|
24183
24466
|
return list.map(function(st) {
|
|
24184
24467
|
if (!st || typeof st !== "object" || !Number.isInteger(st.tag) || st.tag < 0 || st.tag > 8 || !isSubtreeBaseValid(st.tag, st.base)) {
|
|
24185
24468
|
throw E("path/bad-input", "validate: opts." + optName + " entries must be { tag: <GeneralName tag number 0..8>, base: <that form's constraint value> }");
|
|
@@ -24238,7 +24521,7 @@ var require_path_validate = __commonJS({
|
|
|
24238
24521
|
}
|
|
24239
24522
|
var matched = false;
|
|
24240
24523
|
leavesAt(state.validPolicyTree, depth).forEach(function(node) {
|
|
24241
|
-
if (node.expectedPolicySet
|
|
24524
|
+
if (contains(node.expectedPolicySet, p.policyIdentifier)) {
|
|
24242
24525
|
addChild(state, node, p.policyIdentifier, p.qualifiersBytes, [p.policyIdentifier], checks);
|
|
24243
24526
|
matched = true;
|
|
24244
24527
|
}
|
|
@@ -24252,7 +24535,7 @@ var require_path_validate = __commonJS({
|
|
|
24252
24535
|
if (anyPolicyPresent && anyPolicyActive) {
|
|
24253
24536
|
leavesAt(state.validPolicyTree, depth).forEach(function(node) {
|
|
24254
24537
|
node.expectedPolicySet.forEach(function(ep) {
|
|
24255
|
-
var already = node.children
|
|
24538
|
+
var already = guard.list.anyMatches(node.children, function(ch) {
|
|
24256
24539
|
return ch.validPolicy === ep;
|
|
24257
24540
|
});
|
|
24258
24541
|
if (!already) addChild(state, node, ep, anyPolicyQualifiers, [ep], checks);
|
|
@@ -24314,9 +24597,7 @@ var require_path_validate = __commonJS({
|
|
|
24314
24597
|
}
|
|
24315
24598
|
if (!eku) return false;
|
|
24316
24599
|
var purposes = eku.value;
|
|
24317
|
-
var ok = purposes
|
|
24318
|
-
return purposes.indexOf(p) !== -1;
|
|
24319
|
-
});
|
|
24600
|
+
var ok = contains(purposes, OID.anyExtendedKeyUsage) || containsAll(purposes, requiredEku);
|
|
24320
24601
|
checks.push({ name: "extendedKeyUsage", ok, code: ok ? void 0 : "path/eku-not-permitted" });
|
|
24321
24602
|
return !ok;
|
|
24322
24603
|
}
|
|
@@ -24333,9 +24614,7 @@ var require_path_validate = __commonJS({
|
|
|
24333
24614
|
return { fatal: true, error: e };
|
|
24334
24615
|
}
|
|
24335
24616
|
if (pm) {
|
|
24336
|
-
var badAny = pm.value
|
|
24337
|
-
return m.issuerDomainPolicy === OID.anyPolicy || m.subjectDomainPolicy === OID.anyPolicy;
|
|
24338
|
-
});
|
|
24617
|
+
var badAny = mapsAnyPolicy(pm.value);
|
|
24339
24618
|
if (badAny) {
|
|
24340
24619
|
checks.push({ name: "policyMappings", ok: false, code: "path/bad-policy" });
|
|
24341
24620
|
return { fatal: true, error: E("path/bad-policy", "policyMappings must not map to or from anyPolicy (RFC 5280 6.1.4(a))") };
|
|
@@ -24464,8 +24743,8 @@ var require_path_validate = __commonJS({
|
|
|
24464
24743
|
for (var i = 0; i < cert.extensions.length; i++) {
|
|
24465
24744
|
var ext = cert.extensions[i];
|
|
24466
24745
|
if (!ext.critical) continue;
|
|
24467
|
-
if (!PROCESSED_EXTENSIONS
|
|
24468
|
-
if (isTarget && TARGET_UNPROCESSED_IF_CRITICAL
|
|
24746
|
+
if (!intrinsic.hasOwn(PROCESSED_EXTENSIONS, ext.oid)) return ext.oid;
|
|
24747
|
+
if (isTarget && intrinsic.hasOwn(TARGET_UNPROCESSED_IF_CRITICAL, ext.oid)) return ext.oid;
|
|
24469
24748
|
}
|
|
24470
24749
|
return null;
|
|
24471
24750
|
}
|
|
@@ -24511,7 +24790,7 @@ var require_path_validate = __commonJS({
|
|
|
24511
24790
|
"path/bad-input",
|
|
24512
24791
|
"pki.path.validate has an unknown option. The anchor here is `trustAnchor`, singular; pki.path.build takes `trustAnchors`. The unknown option was: "
|
|
24513
24792
|
);
|
|
24514
|
-
if (!
|
|
24793
|
+
if (!intrinsic.isArray(path)) throw E("path/bad-input", "validate: path must be an array of certificates");
|
|
24515
24794
|
var maxCerts = guard.limits.cap(opts.maxPathCerts, "validate: opts.maxPathCerts", constants.LIMITS.PATH_MAX_CERTS, { E, code: "path/bad-input", min: 1 });
|
|
24516
24795
|
if (path.length > maxCerts) throw E("path/bad-input", "validate: the certification path has " + path.length + " certificates, exceeding the maxPathCerts limit (" + maxCerts + ")");
|
|
24517
24796
|
var certs = path.map(function(c, ci) {
|
|
@@ -24523,7 +24802,7 @@ var require_path_validate = __commonJS({
|
|
|
24523
24802
|
guard.time.assertValid(opts.time, E, "path/bad-input", "validate: opts.time (the always-on validity-window check date)");
|
|
24524
24803
|
guard.limits.cap(opts.maxPolicyNodes, "validate: opts.maxPolicyNodes", void 0, { E, code: "path/bad-input", min: 1 });
|
|
24525
24804
|
if (opts.userInitialPolicySet !== void 0) {
|
|
24526
|
-
var uipsOk =
|
|
24805
|
+
var uipsOk = intrinsic.isArray(opts.userInitialPolicySet) && opts.userInitialPolicySet.length > 0 && guard.list.allMatch(opts.userInitialPolicySet, function(p) {
|
|
24527
24806
|
return typeof p === "string" && p.length > 0;
|
|
24528
24807
|
});
|
|
24529
24808
|
if (!uipsOk) throw E("path/bad-input", "validate: opts.userInitialPolicySet must be a non-empty array of policy OID strings");
|
|
@@ -24682,9 +24961,7 @@ var require_path_validate = __commonJS({
|
|
|
24682
24961
|
checks.push({ name: "policyMappings", ok: false, code: "path/bad-policy" });
|
|
24683
24962
|
failed = true;
|
|
24684
24963
|
}
|
|
24685
|
-
if (lpm && lpm.value
|
|
24686
|
-
return m.issuerDomainPolicy === OID.anyPolicy || m.subjectDomainPolicy === OID.anyPolicy;
|
|
24687
|
-
})) {
|
|
24964
|
+
if (lpm && mapsAnyPolicy(lpm.value)) {
|
|
24688
24965
|
checks.push({ name: "policyMappings", ok: false, code: "path/bad-policy" });
|
|
24689
24966
|
failed = true;
|
|
24690
24967
|
}
|
|
@@ -24718,7 +24995,7 @@ var require_path_validate = __commonJS({
|
|
|
24718
24995
|
}
|
|
24719
24996
|
if (checkPurpose && ta.purposes) {
|
|
24720
24997
|
anchorPurposeApplied = true;
|
|
24721
|
-
if (ta.purposes[checkPurpose] !== true) {
|
|
24998
|
+
if (!intrinsic.hasOwn(ta.purposes, checkPurpose) || ta.purposes[checkPurpose] !== true) {
|
|
24722
24999
|
checks.push({ name: "purposeTrust", ok: false, code: "path/purpose-not-trusted" });
|
|
24723
25000
|
failed = true;
|
|
24724
25001
|
}
|
|
@@ -24741,7 +25018,7 @@ var require_path_validate = __commonJS({
|
|
|
24741
25018
|
var policyOk = state.explicitPolicy > 0 || ucps.length > 0;
|
|
24742
25019
|
if (!policyOk) {
|
|
24743
25020
|
var last = state.results[state.results.length - 1];
|
|
24744
|
-
if (!last.checks
|
|
25021
|
+
if (!guard.list.anyMatches(last.checks, function(c) {
|
|
24745
25022
|
return c.code === "path/policy-required";
|
|
24746
25023
|
})) {
|
|
24747
25024
|
last.checks.push({ name: "policy", ok: false, code: "path/policy-required" });
|
|
@@ -24776,7 +25053,7 @@ var require_path_validate = __commonJS({
|
|
|
24776
25053
|
function userConstrainedPolicies(state, n) {
|
|
24777
25054
|
if (!state.validPolicyTree) return [];
|
|
24778
25055
|
var uips = state.userInitialPolicySet;
|
|
24779
|
-
var anyUser = uips
|
|
25056
|
+
var anyUser = contains(uips, OID.anyPolicy);
|
|
24780
25057
|
var leaves = leavesAt(state.validPolicyTree, n);
|
|
24781
25058
|
var explicit = {}, hasAnyLeaf = false;
|
|
24782
25059
|
leaves.forEach(function(node) {
|
|
@@ -24785,7 +25062,7 @@ var require_path_validate = __commonJS({
|
|
|
24785
25062
|
});
|
|
24786
25063
|
var set = {};
|
|
24787
25064
|
Object.keys(explicit).forEach(function(p) {
|
|
24788
|
-
if (anyUser || uips
|
|
25065
|
+
if (anyUser || contains(uips, p)) set[p] = true;
|
|
24789
25066
|
});
|
|
24790
25067
|
if (hasAnyLeaf) {
|
|
24791
25068
|
if (anyUser) set[OID.anyPolicy] = true;
|
|
@@ -25137,7 +25414,7 @@ var require_path_validate = __commonJS({
|
|
|
25137
25414
|
}
|
|
25138
25415
|
for (var dj = 0; dj < classified.deltas.length; dj++) {
|
|
25139
25416
|
var dRec = classified.deltas[dj];
|
|
25140
|
-
if (consumedDeltas
|
|
25417
|
+
if (contains(consumedDeltas, dRec)) continue;
|
|
25141
25418
|
if (dRec.accounted) continue;
|
|
25142
25419
|
if (!await gateCrl(dRec)) continue;
|
|
25143
25420
|
sawUnmergedDelta = true;
|
|
@@ -25229,7 +25506,7 @@ var require_path_validate = __commonJS({
|
|
|
25229
25506
|
var historical = ctx.historicalMode === true;
|
|
25230
25507
|
var issuerNameCandidates = [cert.issuer.bytes];
|
|
25231
25508
|
function addNameCandidate(nm) {
|
|
25232
|
-
if (nm && nm.bytes && !
|
|
25509
|
+
if (nm && nm.bytes && !guard.list.anyMatches(issuerNameCandidates, function(e) {
|
|
25233
25510
|
return e.equals(nm.bytes);
|
|
25234
25511
|
})) issuerNameCandidates.push(nm.bytes);
|
|
25235
25512
|
}
|
|
@@ -25311,7 +25588,7 @@ var require_path_validate = __commonJS({
|
|
|
25311
25588
|
var issuerCtx = { workingPublicKey: issuerCert.subjectPublicKeyInfo.bytes, workingIssuerName: issuerCert.subject, issuerCert };
|
|
25312
25589
|
var issuerNameCandidates = [cert.issuer.bytes];
|
|
25313
25590
|
function add(nm) {
|
|
25314
|
-
if (nm && nm.bytes && !
|
|
25591
|
+
if (nm && nm.bytes && !guard.list.anyMatches(issuerNameCandidates, function(e) {
|
|
25315
25592
|
return e.equals(nm.bytes);
|
|
25316
25593
|
})) issuerNameCandidates.push(nm.bytes);
|
|
25317
25594
|
}
|
|
@@ -25355,20 +25632,20 @@ var require_path_validate = __commonJS({
|
|
|
25355
25632
|
}
|
|
25356
25633
|
function _hasPurposeScopedMetadata(ta) {
|
|
25357
25634
|
if (!ta || typeof ta !== "object") return false;
|
|
25358
|
-
return ["distrustAfter", "purposes"]
|
|
25635
|
+
return guard.list.anyMatches(["distrustAfter", "purposes"], function(k) {
|
|
25359
25636
|
var m = ta[k];
|
|
25360
25637
|
return !!m && typeof m === "object" && Object.keys(m).length > 0;
|
|
25361
25638
|
});
|
|
25362
25639
|
}
|
|
25363
25640
|
function assertAnchorConstraints(ta, checkPurpose) {
|
|
25364
|
-
var d = checkPurpose && ta && ta.distrustAfter ? ta.distrustAfter[checkPurpose] : null;
|
|
25641
|
+
var d = checkPurpose && ta && ta.distrustAfter && intrinsic.hasOwn(ta.distrustAfter, checkPurpose) ? ta.distrustAfter[checkPurpose] : null;
|
|
25365
25642
|
if (d == null) return null;
|
|
25366
25643
|
return guard.time.assertValid(d, E, "path/bad-input", "trustAnchor.distrustAfter." + checkPurpose);
|
|
25367
25644
|
}
|
|
25368
25645
|
function resolvePurposeOpts(opts) {
|
|
25369
25646
|
var requiredEku = null;
|
|
25370
25647
|
if (opts.requiredEku !== void 0) {
|
|
25371
|
-
if (!
|
|
25648
|
+
if (!intrinsic.isArray(opts.requiredEku) || opts.requiredEku.length === 0) {
|
|
25372
25649
|
throw E("path/bad-input", "validate: opts.requiredEku must be a non-empty array of key-purpose OID names or dotted OID strings");
|
|
25373
25650
|
}
|
|
25374
25651
|
requiredEku = opts.requiredEku.map(function(p) {
|
|
@@ -25396,7 +25673,7 @@ var require_path_validate = __commonJS({
|
|
|
25396
25673
|
}
|
|
25397
25674
|
function toAnchor(entry) {
|
|
25398
25675
|
if (entry && typeof entry === "object" && !Buffer.isBuffer(entry) && entry.name && entry.publicKey && entry.algorithm) {
|
|
25399
|
-
if (!
|
|
25676
|
+
if (!intrinsic.isArray(entry.name.rdns) || !Buffer.isBuffer(entry.publicKey) || typeof entry.algorithm !== "string") {
|
|
25400
25677
|
throw E("path/bad-input", "build: a trustAnchor tuple must be { name: { rdns: [...] }, publicKey: Buffer, algorithm: OID string }");
|
|
25401
25678
|
}
|
|
25402
25679
|
return entry;
|
|
@@ -25450,9 +25727,9 @@ var require_path_validate = __commonJS({
|
|
|
25450
25727
|
counter.tick();
|
|
25451
25728
|
n += 1;
|
|
25452
25729
|
var cand = scored[ci].cand, candKey = identityKey(cand);
|
|
25453
|
-
if (frame.keys
|
|
25730
|
+
if (intrinsic.setHas(frame.keys, candKey)) continue;
|
|
25454
25731
|
var childKeys = new Set(frame.keys);
|
|
25455
|
-
|
|
25732
|
+
intrinsic.setAdd(childKeys, candKey);
|
|
25456
25733
|
stack.push({ chain: [cand].concat(frame.chain), hop: frame.hop + 1, keys: childKeys });
|
|
25457
25734
|
}
|
|
25458
25735
|
return n;
|
|
@@ -25509,16 +25786,16 @@ var require_path_validate = __commonJS({
|
|
|
25509
25786
|
if (_isBlockedAiaHost(u.hostname)) continue;
|
|
25510
25787
|
if (net.isIP(u.hostname.replace(/^\[(.*)\]$/, "$1")) === 0 && !aia.transportGuardsAddresses) continue;
|
|
25511
25788
|
u.hash = "";
|
|
25512
|
-
if (aia.fetchedUrls
|
|
25789
|
+
if (intrinsic.setHas(aia.fetchedUrls, u.href) || intrinsic.setHas(seenThisCert, u.href)) continue;
|
|
25513
25790
|
if (seenThisCert.size >= aia.maxPerCert) break;
|
|
25514
|
-
|
|
25791
|
+
intrinsic.setAdd(seenThisCert, u.href);
|
|
25515
25792
|
uris.push(u.href);
|
|
25516
25793
|
}
|
|
25517
25794
|
var out = [];
|
|
25518
25795
|
for (var k = 0; k < uris.length; k++) {
|
|
25519
|
-
if (aia.fetchedUrls
|
|
25796
|
+
if (intrinsic.setHas(aia.fetchedUrls, uris[k])) continue;
|
|
25520
25797
|
if (aia.fetches >= aia.maxFetches) break;
|
|
25521
|
-
aia.fetchedUrls
|
|
25798
|
+
intrinsic.setAdd(aia.fetchedUrls, uris[k]);
|
|
25522
25799
|
aia.fetches += 1;
|
|
25523
25800
|
var certs;
|
|
25524
25801
|
try {
|
|
@@ -25579,7 +25856,7 @@ var require_path_validate = __commonJS({
|
|
|
25579
25856
|
}
|
|
25580
25857
|
var poolInput = opts.candidates !== void 0 ? opts.candidates : opts.intermediates;
|
|
25581
25858
|
if (poolInput === void 0) poolInput = [];
|
|
25582
|
-
if (!
|
|
25859
|
+
if (!intrinsic.isArray(poolInput)) throw E("path/bad-input", "build: opts.candidates must be an array of certificates");
|
|
25583
25860
|
var poolCeiling = constants.LIMITS.PATH_BUILD_MAX_CANDIDATES;
|
|
25584
25861
|
if (poolInput.length > poolCeiling) throw E("path/bad-input", "build: the candidate pool has " + poolInput.length + " certificates, exceeding the " + poolCeiling + " ceiling");
|
|
25585
25862
|
var pool;
|
|
@@ -25589,8 +25866,8 @@ var require_path_validate = __commonJS({
|
|
|
25589
25866
|
throw E("path/bad-input", "build: a candidate certificate did not parse", e);
|
|
25590
25867
|
}
|
|
25591
25868
|
var poolDerKeys = /* @__PURE__ */ new Set();
|
|
25592
|
-
for (var pdk = 0; pdk < pool.length; pdk++)
|
|
25593
|
-
if (!
|
|
25869
|
+
for (var pdk = 0; pdk < pool.length; pdk++) intrinsic.setAdd(poolDerKeys, certDerKey(pool[pdk]));
|
|
25870
|
+
if (!intrinsic.isArray(opts.trustAnchors) || opts.trustAnchors.length === 0) throw E("path/bad-input", "build: opts.trustAnchors must be a non-empty array of anchor tuples or root certificates");
|
|
25594
25871
|
var anchors = opts.trustAnchors.map(toAnchor);
|
|
25595
25872
|
guard.time.assertValid(opts.time, E, "path/bad-input", "build: opts.time (the validity-window check date, forwarded to validate)");
|
|
25596
25873
|
var effectiveMaxCerts = guard.limits.cap(opts.maxPathCerts, "build: opts.maxPathCerts", constants.LIMITS.PATH_MAX_CERTS, { E, code: "path/bad-input", min: 1 });
|
|
@@ -25647,7 +25924,7 @@ var require_path_validate = __commonJS({
|
|
|
25647
25924
|
};
|
|
25648
25925
|
var forwarded = /* @__PURE__ */ Object.create(null);
|
|
25649
25926
|
Object.keys(_VALIDATE_OPTS).forEach(function(k) {
|
|
25650
|
-
if (
|
|
25927
|
+
if (intrinsic.hasOwn(BUILD_ONLY_OPT, k)) return;
|
|
25651
25928
|
if (k in opts) forwarded[k] = opts[k];
|
|
25652
25929
|
});
|
|
25653
25930
|
function validateOpts(anchor) {
|
|
@@ -25686,8 +25963,8 @@ var require_path_validate = __commonJS({
|
|
|
25686
25963
|
var fetched = await _fetchAiaIssuers(fbCur, aiaCtx);
|
|
25687
25964
|
for (var fj = 0; fj < fetched.length; fj++) {
|
|
25688
25965
|
var fdk = certDerKey(fetched[fj]);
|
|
25689
|
-
if (
|
|
25690
|
-
|
|
25966
|
+
if (intrinsic.setHas(poolDerKeys, fdk)) continue;
|
|
25967
|
+
intrinsic.setAdd(poolDerKeys, fdk);
|
|
25691
25968
|
if (pool.length < poolCeiling) pool.push(fetched[fj]);
|
|
25692
25969
|
}
|
|
25693
25970
|
}
|
|
@@ -25768,6 +26045,8 @@ var require_tls_cert_compress = __commonJS({
|
|
|
25768
26045
|
"use strict";
|
|
25769
26046
|
var C = require_constants();
|
|
25770
26047
|
var guard = require_guard_all();
|
|
26048
|
+
var intrinsic = require_guard_intrinsic();
|
|
26049
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
25771
26050
|
var frameworkError = require_framework_error();
|
|
25772
26051
|
var validator = require_validator_all();
|
|
25773
26052
|
var ByteWriter = require_byte_writer();
|
|
@@ -25798,7 +26077,7 @@ var require_tls_cert_compress = __commonJS({
|
|
|
25798
26077
|
}
|
|
25799
26078
|
};
|
|
25800
26079
|
var SUPPORTED = guard.compress.algorithms().filter(function(n) {
|
|
25801
|
-
return
|
|
26080
|
+
return _hasOwn(ALG_BY_NAME, n) && typeof COMPRESS[n] === "function";
|
|
25802
26081
|
});
|
|
25803
26082
|
var MIN_CERT_MSG_BYTES = validator.tls.MIN_CERT_MSG_BYTES;
|
|
25804
26083
|
var MAX_VECTOR_24 = validator.tls.MAX_VECTOR_24;
|
|
@@ -26765,6 +27044,8 @@ var require_cmc_build = __commonJS({
|
|
|
26765
27044
|
var oid = require_oid();
|
|
26766
27045
|
var cmsSign = require_cms_sign();
|
|
26767
27046
|
var guard = require_guard_all();
|
|
27047
|
+
var intrinsic = require_guard_intrinsic();
|
|
27048
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
26768
27049
|
var frameworkError = require_framework_error();
|
|
26769
27050
|
var CmcError = frameworkError.CmcError;
|
|
26770
27051
|
var b = asn1.build;
|
|
@@ -27254,7 +27535,7 @@ var require_cmc_build = __commonJS({
|
|
|
27254
27535
|
if (!s || typeof s !== "object") return s;
|
|
27255
27536
|
var out = {}, k;
|
|
27256
27537
|
for (k in s) {
|
|
27257
|
-
if (!
|
|
27538
|
+
if (!_hasOwn(s, k)) continue;
|
|
27258
27539
|
out[k] = copyValue(s[k], k === "key");
|
|
27259
27540
|
}
|
|
27260
27541
|
return out;
|
|
@@ -27264,7 +27545,7 @@ var require_cmc_build = __commonJS({
|
|
|
27264
27545
|
if (!v || typeof v !== "object" || typeof v.type === "string") return v;
|
|
27265
27546
|
var c = {}, ck;
|
|
27266
27547
|
for (ck in v) {
|
|
27267
|
-
if (!
|
|
27548
|
+
if (!_hasOwn(v, ck)) continue;
|
|
27268
27549
|
var cv = v[ck];
|
|
27269
27550
|
c[ck] = Buffer.isBuffer(cv) || cv instanceof Uint8Array ? _own(Buffer.from(cv), isSecret) : cv;
|
|
27270
27551
|
}
|
|
@@ -27378,6 +27659,8 @@ var require_cmc_verify = __commonJS({
|
|
|
27378
27659
|
var cmsVerify = require_cms_verify();
|
|
27379
27660
|
var cmsDecrypt = require_cms_decrypt();
|
|
27380
27661
|
var guard = require_guard_all();
|
|
27662
|
+
var intrinsic = require_guard_intrinsic();
|
|
27663
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
27381
27664
|
var frameworkError = require_framework_error();
|
|
27382
27665
|
var CmcError = frameworkError.CmcError;
|
|
27383
27666
|
function E(code, message, cause) {
|
|
@@ -27574,7 +27857,7 @@ var require_cmc_verify = __commonJS({
|
|
|
27574
27857
|
function _snapshotSent(sent) {
|
|
27575
27858
|
var out = {}, k;
|
|
27576
27859
|
for (k in sent) {
|
|
27577
|
-
if (
|
|
27860
|
+
if (_hasOwn(sent, k)) out[k] = sent[k];
|
|
27578
27861
|
}
|
|
27579
27862
|
if (out.transactionId != null) {
|
|
27580
27863
|
out.transactionIdValue = guard.range.authoredInteger(out.transactionId, E, "cmc/bad-input", "sent.transactionId");
|
|
@@ -27590,7 +27873,7 @@ var require_cmc_verify = __commonJS({
|
|
|
27590
27873
|
if (out.recipient && typeof out.recipient === "object") {
|
|
27591
27874
|
var r = {}, rk;
|
|
27592
27875
|
for (rk in out.recipient) {
|
|
27593
|
-
if (!
|
|
27876
|
+
if (!_hasOwn(out.recipient, rk)) continue;
|
|
27594
27877
|
r[rk] = _copyAnyBytes(out.recipient[rk]);
|
|
27595
27878
|
}
|
|
27596
27879
|
out.recipient = r;
|
|
@@ -27755,6 +28038,7 @@ var require_tsp_sign = __commonJS({
|
|
|
27755
28038
|
var smime = require_schema_smime();
|
|
27756
28039
|
var schemaTsp = require_schema_tsp();
|
|
27757
28040
|
var guard = require_guard_all();
|
|
28041
|
+
var intrinsic = require_guard_intrinsic();
|
|
27758
28042
|
var frameworkError = require_framework_error();
|
|
27759
28043
|
var pkix = require_schema_pkix();
|
|
27760
28044
|
var pkiBuild = require_pki_build();
|
|
@@ -27817,9 +28101,36 @@ var require_tsp_sign = __commonJS({
|
|
|
27817
28101
|
[opts, "pki.tsp.sign options"]
|
|
27818
28102
|
], _sign);
|
|
27819
28103
|
}
|
|
28104
|
+
var _TSA_KEYS = { cert: 1, key: 1 };
|
|
28105
|
+
var _IMPRINT_KEYS = { hashAlgorithm: 1, hashedMessage: 1 };
|
|
28106
|
+
var _SIGN_OPTS = {
|
|
28107
|
+
policy: 1,
|
|
28108
|
+
serialNumber: 1,
|
|
28109
|
+
genTime: 1,
|
|
28110
|
+
nonce: 1,
|
|
28111
|
+
accuracy: 1,
|
|
28112
|
+
ordering: 1,
|
|
28113
|
+
sid: 1,
|
|
28114
|
+
digestAlgorithm: 1,
|
|
28115
|
+
certHashAlgorithm: 1,
|
|
28116
|
+
additionalSignedAttributes: 1,
|
|
28117
|
+
pss: 1,
|
|
28118
|
+
pem: 1
|
|
28119
|
+
};
|
|
27820
28120
|
function _sign(messageImprint, tsa, opts) {
|
|
27821
28121
|
opts = opts || {};
|
|
28122
|
+
if (messageImprint && typeof messageImprint === "object" && !Buffer.isBuffer(messageImprint)) {
|
|
28123
|
+
guard.identifier.assertKnownKeys(messageImprint, _IMPRINT_KEYS, _err, "tsp/bad-input", function(k) {
|
|
28124
|
+
return "unknown messageImprint field " + JSON.stringify(k) + " (the imprint is { hashAlgorithm, hashedMessage })";
|
|
28125
|
+
});
|
|
28126
|
+
}
|
|
28127
|
+
guard.identifier.assertKnownKeys(opts, _SIGN_OPTS, _err, "tsp/bad-input", "pki.tsp.sign has an unknown option ");
|
|
27822
28128
|
if (typeof opts !== "object" || Buffer.isBuffer(opts)) throw _err("tsp/bad-input", "pki.tsp.sign options must be an object");
|
|
28129
|
+
if (tsa && typeof tsa === "object" && !Buffer.isBuffer(tsa)) {
|
|
28130
|
+
guard.identifier.assertKnownKeys(tsa, _TSA_KEYS, _err, "tsp/bad-input", function(k) {
|
|
28131
|
+
return "unknown TSA field " + JSON.stringify(k) + " (the TSA is { cert, key }; a signing option belongs in the third argument)";
|
|
28132
|
+
});
|
|
28133
|
+
}
|
|
27823
28134
|
var mi = messageImprint || {};
|
|
27824
28135
|
if (!mi.hashAlgorithm || !NODE_DIGEST[mi.hashAlgorithm]) throw _err("tsp/unsupported-algorithm", "messageImprint.hashAlgorithm must be a supported hash name");
|
|
27825
28136
|
if (!Buffer.isBuffer(mi.hashedMessage) && !(mi.hashedMessage instanceof Uint8Array)) throw _err("tsp/bad-input", "messageImprint.hashedMessage must be a Buffer");
|
|
@@ -27848,7 +28159,11 @@ var require_tsp_sign = __commonJS({
|
|
|
27848
28159
|
pem: opts.pem
|
|
27849
28160
|
});
|
|
27850
28161
|
}
|
|
28162
|
+
var _ACCURACY_KEYS = { seconds: 1, millis: 1, micros: 1 };
|
|
27851
28163
|
function _accuracy(a) {
|
|
28164
|
+
guard.identifier.assertKnownKeys(a, _ACCURACY_KEYS, _err, "tsp/bad-input", function(k) {
|
|
28165
|
+
return "unknown accuracy field " + JSON.stringify(k) + "; Accuracy is { seconds?, millis?, micros? }";
|
|
28166
|
+
});
|
|
27852
28167
|
var f = [];
|
|
27853
28168
|
if (a.seconds != null) {
|
|
27854
28169
|
var s = Number(a.seconds);
|
|
@@ -27888,10 +28203,17 @@ var require_tsp_sign = __commonJS({
|
|
|
27888
28203
|
if (!Buffer.isBuffer(mi.hashedMessage) && !(mi.hashedMessage instanceof Uint8Array)) throw _err("tsp/bad-input", "messageImprint.hashedMessage must be a Buffer");
|
|
27889
28204
|
if (mi.hashedMessage.length !== HASH_LEN[mi.hashAlgorithm]) throw _err("tsp/bad-input", "messageImprint.hashedMessage length (" + mi.hashedMessage.length + ") does not match the " + mi.hashAlgorithm + " digest length (" + HASH_LEN[mi.hashAlgorithm] + ")");
|
|
27890
28205
|
}
|
|
28206
|
+
var _REQUEST_OPTS = { reqPolicy: 1, nonce: 1, certReq: 1, extensions: 1, pem: 1 };
|
|
27891
28207
|
function request(messageImprint, opts) {
|
|
27892
28208
|
opts = opts || {};
|
|
27893
28209
|
if (typeof opts !== "object" || Buffer.isBuffer(opts)) throw _err("tsp/bad-input", "pki.tsp.request options must be an object");
|
|
28210
|
+
guard.identifier.assertKnownKeys(opts, _REQUEST_OPTS, _err, "tsp/bad-input", "pki.tsp.request has an unknown option ");
|
|
27894
28211
|
var mi = messageImprint || {};
|
|
28212
|
+
if (mi && typeof mi === "object" && !Buffer.isBuffer(mi)) {
|
|
28213
|
+
guard.identifier.assertKnownKeys(mi, _IMPRINT_KEYS, _err, "tsp/bad-input", function(k) {
|
|
28214
|
+
return "unknown messageImprint field " + JSON.stringify(k) + " (the imprint is { hashAlgorithm, hashedMessage }; a request option belongs in the second argument)";
|
|
28215
|
+
});
|
|
28216
|
+
}
|
|
27895
28217
|
_assertImprint(mi);
|
|
27896
28218
|
var imprint = b.sequence([_hashAlgId(mi.hashAlgorithm), b.octetString(Buffer.from(mi.hashedMessage))]);
|
|
27897
28219
|
var fields = [b.integer(1n), imprint];
|
|
@@ -27900,7 +28222,7 @@ var require_tsp_sign = __commonJS({
|
|
|
27900
28222
|
if (opts.certReq != null && typeof opts.certReq !== "boolean") throw _err("tsp/bad-input", "certReq must be a boolean");
|
|
27901
28223
|
if (opts.certReq === true) fields.push(b.boolean(true));
|
|
27902
28224
|
if (opts.extensions != null) {
|
|
27903
|
-
if (!Array.isArray(opts.extensions) || !opts.extensions
|
|
28225
|
+
if (!Array.isArray(opts.extensions) || !guard.list.allMatch(opts.extensions, function(e) {
|
|
27904
28226
|
return Buffer.isBuffer(e) || e instanceof Uint8Array;
|
|
27905
28227
|
})) throw _err("tsp/bad-input", "extensions must be an array of encoded Extension DER buffers");
|
|
27906
28228
|
var seenExt = {};
|
|
@@ -27920,9 +28242,11 @@ var require_tsp_sign = __commonJS({
|
|
|
27920
28242
|
function parseRequest(input) {
|
|
27921
28243
|
return schemaTsp.parseRequest(input);
|
|
27922
28244
|
}
|
|
28245
|
+
var _RESPONSE_OPTS = { status: 1, statusString: 1, failInfo: 1, pem: 1 };
|
|
27923
28246
|
function response(token, opts) {
|
|
27924
28247
|
opts = opts || {};
|
|
27925
28248
|
if (typeof opts !== "object" || Buffer.isBuffer(opts)) throw _err("tsp/bad-input", "pki.tsp.response options must be an object");
|
|
28249
|
+
guard.identifier.assertKnownKeys(opts, _RESPONSE_OPTS, _err, "tsp/bad-input", "pki.tsp.response has an unknown option ");
|
|
27926
28250
|
var status = opts.status == null ? 0 : Number(opts.status);
|
|
27927
28251
|
if (!Number.isInteger(status) || status < 0 || status > 5) throw _err("tsp/bad-input", "PKIStatus must be an integer in 0..5 (RFC 3161 sec. 2.4.2)");
|
|
27928
28252
|
var granted = status === 0 || status === 1;
|
|
@@ -27953,7 +28277,7 @@ var require_tsp_sign = __commonJS({
|
|
|
27953
28277
|
var _BIND_DIGEST = { sha256: "sha256", sha384: "sha384", sha512: "sha512" };
|
|
27954
28278
|
function _imprintMatches(mi, data) {
|
|
27955
28279
|
var name = mi.hashAlgorithm && mi.hashAlgorithm.name;
|
|
27956
|
-
var nodeAlg = name && _VERIFY_DIGEST[name];
|
|
28280
|
+
var nodeAlg = name && intrinsic.hasOwn(_VERIFY_DIGEST, name) ? _VERIFY_DIGEST[name] : null;
|
|
27957
28281
|
if (!nodeAlg) return "tsp/unsupported-algorithm";
|
|
27958
28282
|
var wantLen = _VERIFY_DIGEST_LEN[name];
|
|
27959
28283
|
if (mi.hashedMessage.length !== wantLen) return "tsp/imprint-mismatch";
|
|
@@ -28102,6 +28426,11 @@ var require_tsp_sign = __commonJS({
|
|
|
28102
28426
|
});
|
|
28103
28427
|
}
|
|
28104
28428
|
var _VERIFY_OPTS = { certs: 1, trustAnchor: 1, nonce: 1, reqPolicy: 1, revocationChecker: 1 };
|
|
28429
|
+
function _anyCritical(extensions) {
|
|
28430
|
+
return guard.list.anyMatches(extensions, function(e) {
|
|
28431
|
+
return !!e && !!e.critical;
|
|
28432
|
+
});
|
|
28433
|
+
}
|
|
28105
28434
|
async function verify(token, data, opts) {
|
|
28106
28435
|
opts = opts || {};
|
|
28107
28436
|
if (typeof opts !== "object" || Buffer.isBuffer(opts)) throw _err("tsp/bad-input", "pki.tsp.verify options must be an object");
|
|
@@ -28112,7 +28441,7 @@ var require_tsp_sign = __commonJS({
|
|
|
28112
28441
|
"tsp/bad-input",
|
|
28113
28442
|
"pki.tsp.verify has an unknown option (note the anchor option here is `trustAnchor`, singular, an anchor tuple -- not the `trustAnchors` certificate list pki.cms.verify takes) "
|
|
28114
28443
|
);
|
|
28115
|
-
if (opts.certs != null && (!Array.isArray(opts.certs) || !opts.certs
|
|
28444
|
+
if (opts.certs != null && (!Array.isArray(opts.certs) || !guard.list.allMatch(opts.certs, function(c) {
|
|
28116
28445
|
return Buffer.isBuffer(c) || c instanceof Uint8Array;
|
|
28117
28446
|
}))) {
|
|
28118
28447
|
throw _err("tsp/bad-input", "pki.tsp.verify opts.certs must be an array of DER certificate Buffers");
|
|
@@ -28140,9 +28469,7 @@ var require_tsp_sign = __commonJS({
|
|
|
28140
28469
|
var wantPolicy = /^\d+(\.\d+)+$/.test(opts.reqPolicy) ? opts.reqPolicy : O(opts.reqPolicy);
|
|
28141
28470
|
if (tst.policy !== wantPolicy) return fail("tsp/policy-mismatch");
|
|
28142
28471
|
}
|
|
28143
|
-
if (tst.extensions && tst.extensions
|
|
28144
|
-
return e.critical;
|
|
28145
|
-
})) {
|
|
28472
|
+
if (tst.extensions && _anyCritical(tst.extensions)) {
|
|
28146
28473
|
return fail("tsp/unknown-critical-extension");
|
|
28147
28474
|
}
|
|
28148
28475
|
var bind = _checkCertBinding(parsed.signerInfo, tsaCertDer);
|
|
@@ -28611,6 +28938,8 @@ var require_x509_sign = __commonJS({
|
|
|
28611
28938
|
var x509 = require_schema_x509();
|
|
28612
28939
|
var signScheme = require_sign_scheme();
|
|
28613
28940
|
var guard = require_guard_all();
|
|
28941
|
+
var intrinsic = require_guard_intrinsic();
|
|
28942
|
+
var _isArray = intrinsic.isArray;
|
|
28614
28943
|
var frameworkError = require_framework_error();
|
|
28615
28944
|
var schema = require_schema_engine();
|
|
28616
28945
|
var pkix = require_schema_pkix();
|
|
@@ -28631,6 +28960,17 @@ var require_x509_sign = __commonJS({
|
|
|
28631
28960
|
return oid.byName(n);
|
|
28632
28961
|
}
|
|
28633
28962
|
var OID_SKI = O("subjectKeyIdentifier");
|
|
28963
|
+
var KNOWN_SPEC_KEYS = {
|
|
28964
|
+
subject: 1,
|
|
28965
|
+
subjectPublicKey: 1,
|
|
28966
|
+
notBefore: 1,
|
|
28967
|
+
notAfter: 1,
|
|
28968
|
+
serialNumber: 1,
|
|
28969
|
+
extensions: 1
|
|
28970
|
+
};
|
|
28971
|
+
var KNOWN_ISSUER_CERT_KEYS = { key: 1, cert: 1 };
|
|
28972
|
+
var KNOWN_ISSUER_EXPLICIT_KEYS = { key: 1, name: 1, publicKey: 1 };
|
|
28973
|
+
var KNOWN_SIGN_OPTS = { digestAlgorithm: 1, pem: 1, pss: 1 };
|
|
28634
28974
|
var KNOWN_EXT_KEYS = {
|
|
28635
28975
|
subjectKeyIdentifier: 1,
|
|
28636
28976
|
authorityKeyIdentifier: 1,
|
|
@@ -28688,7 +29028,7 @@ var require_x509_sign = __commonJS({
|
|
|
28688
29028
|
}
|
|
28689
29029
|
function _buildExtensions(extSpec, ctx) {
|
|
28690
29030
|
if (extSpec == null) return [];
|
|
28691
|
-
if (
|
|
29031
|
+
if (_isArray(extSpec)) {
|
|
28692
29032
|
var seenExt = {}, arrCa = false, arrKeyCertSign = false, arrPathLen = false;
|
|
28693
29033
|
var oidBc = O("basicConstraints"), oidKu = O("keyUsage");
|
|
28694
29034
|
var arr = extSpec.map(function(e, i) {
|
|
@@ -28729,7 +29069,7 @@ var require_x509_sign = __commonJS({
|
|
|
28729
29069
|
if (bc != null) _validateBcSpec(bc);
|
|
28730
29070
|
var caTrue = !!(bc && bc.cA === true);
|
|
28731
29071
|
var ku = extSpec.keyUsage;
|
|
28732
|
-
var assertsKeyCertSign =
|
|
29072
|
+
var assertsKeyCertSign = _isArray(ku) && ku.indexOf("keyCertSign") >= 0;
|
|
28733
29073
|
if (assertsKeyCertSign && !caTrue) throw _err("x509/bad-input", "keyUsage keyCertSign requires basicConstraints cA=TRUE (RFC 5280 sec. 4.2.1.3)");
|
|
28734
29074
|
if (bc && bc.pathLen != null) {
|
|
28735
29075
|
if (!caTrue) throw _err("x509/bad-input", "basicConstraints pathLenConstraint requires cA=TRUE (RFC 5280 sec. 4.2.1.9)");
|
|
@@ -28784,7 +29124,7 @@ var require_x509_sign = __commonJS({
|
|
|
28784
29124
|
}
|
|
28785
29125
|
function _issuedCaInfo(extSpec) {
|
|
28786
29126
|
if (extSpec == null) return { cA: false, pathLen: null };
|
|
28787
|
-
if (!
|
|
29127
|
+
if (!_isArray(extSpec)) {
|
|
28788
29128
|
var bc = extSpec.basicConstraints;
|
|
28789
29129
|
return { cA: !!(bc && bc.cA === true), pathLen: bc && bc.pathLen != null ? Number(bc.pathLen) : null };
|
|
28790
29130
|
}
|
|
@@ -28798,7 +29138,7 @@ var require_x509_sign = __commonJS({
|
|
|
28798
29138
|
}
|
|
28799
29139
|
function _hasCriticalSan(extSpec) {
|
|
28800
29140
|
if (extSpec == null) return false;
|
|
28801
|
-
if (!
|
|
29141
|
+
if (!_isArray(extSpec)) return !!extSpec.subjectAltName;
|
|
28802
29142
|
var sanOid = O("subjectAltName");
|
|
28803
29143
|
for (var i = 0; i < extSpec.length; i++) {
|
|
28804
29144
|
var n = asn1.decode(_reqDer(extSpec[i], "extension"));
|
|
@@ -28817,6 +29157,20 @@ var require_x509_sign = __commonJS({
|
|
|
28817
29157
|
opts = opts || {};
|
|
28818
29158
|
if (!spec || typeof spec !== "object" || Buffer.isBuffer(spec)) throw _err("x509/bad-input", "the certificate spec must be an object");
|
|
28819
29159
|
issuer = issuer || {};
|
|
29160
|
+
guard.identifier.assertKnownKeys(spec, KNOWN_SPEC_KEYS, _err, "x509/bad-input", function(k) {
|
|
29161
|
+
return "unknown certificate spec field " + JSON.stringify(k) + (k === "issuer" ? "; the issuer is the SECOND argument to pki.x509.sign, not a spec field" : "") + (k === "extension" ? "; the extensions spec field is `extensions`" : "");
|
|
29162
|
+
});
|
|
29163
|
+
var byCert = issuer.cert != null;
|
|
29164
|
+
guard.identifier.assertKnownKeys(
|
|
29165
|
+
issuer,
|
|
29166
|
+
byCert ? KNOWN_ISSUER_CERT_KEYS : KNOWN_ISSUER_EXPLICIT_KEYS,
|
|
29167
|
+
_err,
|
|
29168
|
+
"x509/bad-input",
|
|
29169
|
+
function(k) {
|
|
29170
|
+
return "unknown issuer field " + JSON.stringify(k) + " for the " + (byCert ? "certificate form; issuer.cert supplies the name and the public key, so they are not read here" : "explicit form; the issuer takes { key, name, publicKey }, or { key, cert } to take both from a certificate");
|
|
29171
|
+
}
|
|
29172
|
+
);
|
|
29173
|
+
guard.identifier.assertKnownKeys(opts, KNOWN_SIGN_OPTS, _err, "x509/bad-input", "pki.x509.sign has an unknown option ");
|
|
28820
29174
|
if (issuer.key == null) throw _err("x509/bad-input", "a signing key (issuer.key, a PKCS#8 private key) is required");
|
|
28821
29175
|
var spki = _reqDer(spec.subjectPublicKey, "spec.subjectPublicKey (the SPKI DER of the certified key)");
|
|
28822
29176
|
_assertValidSpki(spki, "spec.subjectPublicKey");
|
|
@@ -28844,12 +29198,13 @@ var require_x509_sign = __commonJS({
|
|
|
28844
29198
|
guard.time.assertValid(spec.notAfter, _err, "x509/bad-input", "notAfter");
|
|
28845
29199
|
if (guard.time.instantOf(spec.notBefore) > guard.time.instantOf(spec.notAfter)) throw _err("x509/bad-input", "notBefore must not be after notAfter (RFC 5280 sec. 4.1.2.5)");
|
|
28846
29200
|
var validityDer = b.sequence([_timeDer(spec.notBefore, "notBefore"), _timeDer(spec.notAfter, "notAfter")]);
|
|
28847
|
-
var
|
|
28848
|
-
|
|
29201
|
+
var extSpec = spec.extensions;
|
|
29202
|
+
var exts = _buildExtensions(extSpec, { spki, issuerSpki, issuerCert, subjectEmpty });
|
|
29203
|
+
if (subjectEmpty && !_hasCriticalSan(extSpec)) {
|
|
28849
29204
|
throw _err("x509/bad-input", "an empty subject requires a critical subjectAltName (RFC 5280 sec. 4.1.2.6)");
|
|
28850
29205
|
}
|
|
28851
29206
|
if (issuerPathLen != null) {
|
|
28852
|
-
var issued = _issuedCaInfo(
|
|
29207
|
+
var issued = _issuedCaInfo(extSpec);
|
|
28853
29208
|
var selfIssued = guard.name.dnEqual(
|
|
28854
29209
|
schema.walk(NAME_SCHEMA, asn1.decode(subjectDer), NS).result.rdns,
|
|
28855
29210
|
schema.walk(NAME_SCHEMA, asn1.decode(issuerDer), NS).result.rdns,
|
|
@@ -29030,6 +29385,8 @@ var require_attrcert_sign = __commonJS({
|
|
|
29030
29385
|
var x509 = require_schema_x509();
|
|
29031
29386
|
var signScheme = require_sign_scheme();
|
|
29032
29387
|
var guard = require_guard_all();
|
|
29388
|
+
var intrinsic = require_guard_intrinsic();
|
|
29389
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
29033
29390
|
var pkix = require_schema_pkix();
|
|
29034
29391
|
var schema = require_schema_engine();
|
|
29035
29392
|
require_path_validate();
|
|
@@ -29361,10 +29718,10 @@ var require_attrcert_sign = __commonJS({
|
|
|
29361
29718
|
return b.sequence(attrs);
|
|
29362
29719
|
}
|
|
29363
29720
|
function _assertRevocationSchemesExclusive(seen) {
|
|
29364
|
-
if (!
|
|
29721
|
+
if (!_hasOwn(seen, O("noRevAvail"))) return;
|
|
29365
29722
|
var names = Object.keys(REVOCATION_POINTERS);
|
|
29366
29723
|
for (var i = 0; i < names.length; i++) {
|
|
29367
|
-
if (
|
|
29724
|
+
if (_hasOwn(seen, names[i])) {
|
|
29368
29725
|
throw _err("attrcert/bad-input", "an attribute certificate must not carry both noRevAvail and a " + REVOCATION_POINTERS[names[i]] + " revocation pointer (RFC 5755 sec. 6)");
|
|
29369
29726
|
}
|
|
29370
29727
|
}
|
|
@@ -29619,7 +29976,7 @@ var require_attrcert_sign = __commonJS({
|
|
|
29619
29976
|
for (var i = 0; i < ac.extensions.length; i++) {
|
|
29620
29977
|
var e = ac.extensions[i];
|
|
29621
29978
|
if (e.critical !== true) continue;
|
|
29622
|
-
if (!
|
|
29979
|
+
if (!_hasOwn(SUPPORTED_CRITICAL, e.oid)) return e.oid;
|
|
29623
29980
|
if (e.decoded === null || e.decoded === void 0 || e.decoded.opaque === true) return e.oid;
|
|
29624
29981
|
}
|
|
29625
29982
|
return null;
|
|
@@ -29645,7 +30002,7 @@ var require_attrcert_sign = __commonJS({
|
|
|
29645
30002
|
}
|
|
29646
30003
|
var revocationStatus = null;
|
|
29647
30004
|
if (o.revocationStatus !== void 0) {
|
|
29648
|
-
if (typeof o.revocationStatus !== "string" || !
|
|
30005
|
+
if (typeof o.revocationStatus !== "string" || !_hasOwn(REVOCATION_STATUS, o.revocationStatus)) {
|
|
29649
30006
|
throw _err("attrcert/bad-input", 'pki.attrcert.verify opts.revocationStatus must be "notRevoked" or "revoked"');
|
|
29650
30007
|
}
|
|
29651
30008
|
revocationStatus = o.revocationStatus;
|
|
@@ -29665,7 +30022,7 @@ var require_attrcert_sign = __commonJS({
|
|
|
29665
30022
|
var e = ac.extensions[i];
|
|
29666
30023
|
if (e.name === "noRevAvail") out.noRevAvail = true;
|
|
29667
30024
|
var p = REVOCATION_POINTERS[e.oid];
|
|
29668
|
-
if (p !== void 0 &&
|
|
30025
|
+
if (p !== void 0 && _hasOwn(REVOCATION_POINTERS, e.oid)) out.pointer = p;
|
|
29669
30026
|
}
|
|
29670
30027
|
return out;
|
|
29671
30028
|
}
|
|
@@ -29757,6 +30114,8 @@ var require_crl_sign = __commonJS({
|
|
|
29757
30114
|
var x509Schema = require_schema_x509();
|
|
29758
30115
|
var signScheme = require_sign_scheme();
|
|
29759
30116
|
var guard = require_guard_all();
|
|
30117
|
+
var intrinsic = require_guard_intrinsic();
|
|
30118
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
29760
30119
|
var frameworkError = require_framework_error();
|
|
29761
30120
|
var pkix = require_schema_pkix();
|
|
29762
30121
|
var schema = require_schema_engine();
|
|
@@ -29801,7 +30160,33 @@ var require_crl_sign = __commonJS({
|
|
|
29801
30160
|
REASON_BY_NAME[CRL_REASON[v]] = Number(v);
|
|
29802
30161
|
});
|
|
29803
30162
|
var KNOWN_CRL_EXT_KEYS = { authorityKeyIdentifier: 1, issuingDistributionPoint: 1, deltaCRLIndicator: 1, freshestCRL: 1, authorityInfoAccess: 1 };
|
|
30163
|
+
var KNOWN_SPEC_KEYS = {
|
|
30164
|
+
issuer: 1,
|
|
30165
|
+
thisUpdate: 1,
|
|
30166
|
+
nextUpdate: 1,
|
|
30167
|
+
revoked: 1,
|
|
30168
|
+
crlNumber: 1,
|
|
30169
|
+
extensions: 1
|
|
30170
|
+
};
|
|
30171
|
+
var KNOWN_SPEC_KEYS_ISSUER_NAMED = {
|
|
30172
|
+
thisUpdate: 1,
|
|
30173
|
+
nextUpdate: 1,
|
|
30174
|
+
revoked: 1,
|
|
30175
|
+
crlNumber: 1,
|
|
30176
|
+
extensions: 1
|
|
30177
|
+
};
|
|
30178
|
+
var KNOWN_ISSUER_CERT_KEYS = { key: 1, cert: 1 };
|
|
30179
|
+
var KNOWN_ISSUER_EXPLICIT_KEYS = { key: 1, name: 1, publicKey: 1 };
|
|
30180
|
+
var KNOWN_SIGN_OPTS = { digestAlgorithm: 1, pem: 1, pss: 1 };
|
|
29804
30181
|
var KNOWN_IDP_KEYS = { fullName: 1, onlyContainsUserCerts: 1, onlyContainsCACerts: 1, onlyContainsAttributeCerts: 1, indirectCRL: 1 };
|
|
30182
|
+
var KNOWN_REVOKED_KEYS = {
|
|
30183
|
+
serialNumber: 1,
|
|
30184
|
+
revocationDate: 1,
|
|
30185
|
+
reason: 1,
|
|
30186
|
+
invalidityDate: 1,
|
|
30187
|
+
certificateIssuer: 1,
|
|
30188
|
+
extensions: 1
|
|
30189
|
+
};
|
|
29805
30190
|
var REQUIRED_CRITICALITY = {};
|
|
29806
30191
|
[
|
|
29807
30192
|
["cRLNumber", false],
|
|
@@ -29857,10 +30242,10 @@ var require_crl_sign = __commonJS({
|
|
|
29857
30242
|
var codeNum;
|
|
29858
30243
|
if (typeof reason === "number") codeNum = reason;
|
|
29859
30244
|
else if (typeof reason === "string") {
|
|
29860
|
-
if (!
|
|
30245
|
+
if (!_hasOwn(REASON_BY_NAME, reason)) throw _err("crl/bad-reason-code", "unknown CRLReason " + JSON.stringify(reason));
|
|
29861
30246
|
codeNum = REASON_BY_NAME[reason];
|
|
29862
30247
|
} else throw _err("crl/bad-reason-code", "reason must be a CRLReason name or number");
|
|
29863
|
-
if (!
|
|
30248
|
+
if (!_hasOwn(CRL_REASON, String(codeNum))) throw _err("crl/bad-reason-code", "undefined or reserved CRLReason " + codeNum + " (RFC 5280 sec. 5.3.1)");
|
|
29864
30249
|
if (codeNum === 8 && !isDelta) throw _err("crl/bad-reason-code", "removeFromCRL(8) may appear only in a delta CRL (RFC 5280 sec. 5.3.1)");
|
|
29865
30250
|
return codeNum;
|
|
29866
30251
|
}
|
|
@@ -29964,7 +30349,7 @@ var require_crl_sign = __commonJS({
|
|
|
29964
30349
|
var extnId = asn1.read.oid(node.children[0]);
|
|
29965
30350
|
if (seen[extnId]) throw _err("crl/bad-input", "duplicate extension " + extnId + " (RFC 5280 sec. 5.2)");
|
|
29966
30351
|
seen[extnId] = true;
|
|
29967
|
-
if (
|
|
30352
|
+
if (_hasOwn(REQUIRED_CRITICALITY, extnId)) {
|
|
29968
30353
|
if (node.children.length === 3 !== REQUIRED_CRITICALITY[extnId]) {
|
|
29969
30354
|
throw _err("crl/bad-input", "pre-encoded " + (oid.name(extnId) || extnId) + " extension has the wrong criticality (RFC 5280 sec. 5.2 requires it " + (REQUIRED_CRITICALITY[extnId] ? "critical" : "non-critical") + ")");
|
|
29970
30355
|
}
|
|
@@ -30012,6 +30397,9 @@ var require_crl_sign = __commonJS({
|
|
|
30012
30397
|
var anyExt = false, seenSerials = {};
|
|
30013
30398
|
var entries = entryList.map(function(e, idx) {
|
|
30014
30399
|
if (!e || typeof e !== "object" || Buffer.isBuffer(e)) throw _err("crl/bad-input", "each revoked entry must be an object");
|
|
30400
|
+
guard.identifier.assertKnownKeys(e, KNOWN_REVOKED_KEYS, _err, "crl/bad-input", function(k) {
|
|
30401
|
+
return "unknown field " + JSON.stringify(k) + " in revoked entry [" + idx + "]; an entry is { serialNumber, revocationDate, reason?, invalidityDate?, extensions? }";
|
|
30402
|
+
});
|
|
30015
30403
|
if (e.serialNumber == null) throw _err("crl/bad-input", "revoked entry [" + idx + "] requires a serialNumber");
|
|
30016
30404
|
var serialTlv = _serialInteger(e.serialNumber);
|
|
30017
30405
|
var serialKey = asn1.decode(serialTlv).content.toString("hex");
|
|
@@ -30044,13 +30432,13 @@ var require_crl_sign = __commonJS({
|
|
|
30044
30432
|
if (seen[extnId]) throw _err("crl/bad-input", "duplicate entry extension " + extnId + " in revoked entry [" + idx + "]");
|
|
30045
30433
|
seen[extnId] = true;
|
|
30046
30434
|
if (extnId === O("certificateIssuer")) throw _err("crl/bad-input", _CERT_ISSUER_DEFERRED);
|
|
30047
|
-
if (
|
|
30435
|
+
if (_hasOwn(REQUIRED_ENTRY_CRITICALITY, extnId)) {
|
|
30048
30436
|
if (xnode.children.length === 3 !== REQUIRED_ENTRY_CRITICALITY[extnId]) throw _err("crl/bad-input", "pre-encoded entry extension " + (oid.name(extnId) || extnId) + " has the wrong criticality (RFC 5280 sec. 5.3 requires it " + (REQUIRED_ENTRY_CRITICALITY[extnId] ? "critical" : "non-critical") + ")");
|
|
30049
30437
|
var einner = _extInner(xnode, oid.name(extnId) || extnId);
|
|
30050
30438
|
if (extnId === O("reasonCode")) {
|
|
30051
30439
|
if (einner.tagClass !== "universal" || einner.tagNumber !== TAGS.ENUMERATED) throw _err("crl/bad-reason-code", "pre-encoded reasonCode value must be an ENUMERATED (RFC 5280 sec. 5.3.1)");
|
|
30052
30440
|
var rc = asn1.read.enumerated(einner);
|
|
30053
|
-
if (!
|
|
30441
|
+
if (!_hasOwn(CRL_REASON, rc.toString())) throw _err("crl/bad-reason-code", "pre-encoded reasonCode " + rc + " is undefined or reserved (RFC 5280 sec. 5.3.1)");
|
|
30054
30442
|
if (rc === 8n && !isDelta) throw _err("crl/bad-reason-code", "removeFromCRL(8) may appear only in a delta CRL (RFC 5280 sec. 5.3.1)");
|
|
30055
30443
|
} else if (extnId === O("invalidityDate")) {
|
|
30056
30444
|
if (einner.tagClass !== "universal" || einner.tagNumber !== TAGS.GENERALIZED_TIME) throw _err("crl/bad-input", "pre-encoded invalidityDate value must be a GeneralizedTime (RFC 5280 sec. 5.3.2)");
|
|
@@ -30093,9 +30481,29 @@ var require_crl_sign = __commonJS({
|
|
|
30093
30481
|
opts = opts || {};
|
|
30094
30482
|
if (!spec || typeof spec !== "object" || Buffer.isBuffer(spec)) throw _err("crl/bad-input", "the CRL spec must be an object");
|
|
30095
30483
|
issuer = issuer || {};
|
|
30484
|
+
var byCert = issuer.cert != null, byName = issuer.name != null;
|
|
30485
|
+
guard.identifier.assertKnownKeys(
|
|
30486
|
+
spec,
|
|
30487
|
+
byCert || byName ? KNOWN_SPEC_KEYS_ISSUER_NAMED : KNOWN_SPEC_KEYS,
|
|
30488
|
+
_err,
|
|
30489
|
+
"crl/bad-input",
|
|
30490
|
+
function(k) {
|
|
30491
|
+
return "unknown CRL spec field " + JSON.stringify(k) + (k === "revokedCertificates" ? "; the producer reads `revoked` (the parser reports the same list as `revokedCertificates`)" : k === "issuer" ? "; the issuer argument already names one, through " + (byCert ? "issuer.cert" : "issuer.name") + ", and that is the name the CRL is signed under" : "");
|
|
30492
|
+
}
|
|
30493
|
+
);
|
|
30494
|
+
guard.identifier.assertKnownKeys(
|
|
30495
|
+
issuer,
|
|
30496
|
+
byCert ? KNOWN_ISSUER_CERT_KEYS : KNOWN_ISSUER_EXPLICIT_KEYS,
|
|
30497
|
+
_err,
|
|
30498
|
+
"crl/bad-input",
|
|
30499
|
+
function(k) {
|
|
30500
|
+
return "unknown issuer field " + JSON.stringify(k) + " for the " + (byCert ? "certificate form; issuer.cert supplies the name and the public key, so they are not read here" : "explicit form; the issuer takes { key, name, publicKey }, or { key, cert } to take both from a certificate");
|
|
30501
|
+
}
|
|
30502
|
+
);
|
|
30503
|
+
guard.identifier.assertKnownKeys(opts, KNOWN_SIGN_OPTS, _err, "crl/bad-input", "pki.crl.sign has an unknown option ");
|
|
30096
30504
|
if (issuer.key == null) throw _err("crl/bad-input", "a signing key (issuer.key, a PKCS#8 private key) is required");
|
|
30097
30505
|
var issuerDer, issuerSpki, issuerCert = null;
|
|
30098
|
-
if (
|
|
30506
|
+
if (byCert) {
|
|
30099
30507
|
issuerCert = _parseIssuerCert(issuer.cert);
|
|
30100
30508
|
_assertIssuerCanSignCrl(issuerCert);
|
|
30101
30509
|
issuerDer = pkiBuild.tbsNameField(issuerCert, "subject");
|
|
@@ -30103,7 +30511,7 @@ var require_crl_sign = __commonJS({
|
|
|
30103
30511
|
} else {
|
|
30104
30512
|
issuerSpki = _reqDer(issuer.publicKey, "issuer.publicKey (the issuer SPKI DER)");
|
|
30105
30513
|
_assertValidSpki(issuerSpki, "issuer.publicKey");
|
|
30106
|
-
var dnSource =
|
|
30514
|
+
var dnSource = byName ? issuer.name : spec.issuer;
|
|
30107
30515
|
if (dnSource == null) throw _err("crl/bad-issuer", "an issuer distinguished name is required (issuer.name or spec.issuer) when no issuer.cert is given");
|
|
30108
30516
|
issuerDer = _encodeName(dnSource);
|
|
30109
30517
|
}
|
|
@@ -30458,6 +30866,7 @@ var require_key = __commonJS({
|
|
|
30458
30866
|
}
|
|
30459
30867
|
var algorithm = opts.algorithm != null ? opts.algorithm : _inferAlgorithm(detected);
|
|
30460
30868
|
var isPublic = detected.format === "spki";
|
|
30869
|
+
if (opts.usages != null && !Array.isArray(opts.usages)) throw _err("key/bad-input", "opts.usages must be an array of key-usage strings");
|
|
30461
30870
|
var usages = opts.usages || _importUsages(_algName(algorithm), isPublic);
|
|
30462
30871
|
var extractable = opts.extractable != null ? opts.extractable : false;
|
|
30463
30872
|
try {
|
|
@@ -30478,6 +30887,7 @@ var require_key = __commonJS({
|
|
|
30478
30887
|
"pki.key.generate has an unknown option (the WebCrypto spelling is `extractable`): "
|
|
30479
30888
|
);
|
|
30480
30889
|
var extractable = opts.extractable != null ? opts.extractable : true;
|
|
30890
|
+
if (opts.usages != null && !Array.isArray(opts.usages)) throw _err("key/bad-input", "opts.usages must be an array of key-usage strings");
|
|
30481
30891
|
var usages = opts.usages || _generateUsages(_algName(algorithm));
|
|
30482
30892
|
var pair;
|
|
30483
30893
|
try {
|
|
@@ -30940,10 +31350,12 @@ var require_pkcs12_build = __commonJS({
|
|
|
30940
31350
|
var schemaCrl = require_schema_crl();
|
|
30941
31351
|
var key = require_key();
|
|
30942
31352
|
var cms = require_cms_verify();
|
|
31353
|
+
var cmsSign = require_cms_sign();
|
|
30943
31354
|
var cmsDecrypt = require_cms_decrypt();
|
|
30944
31355
|
var schemaPkcs12 = require_schema_pkcs12();
|
|
30945
31356
|
var pkix = require_schema_pkix();
|
|
30946
31357
|
var guard = require_guard_all();
|
|
31358
|
+
var intrinsic = require_guard_intrinsic();
|
|
30947
31359
|
var frameworkError = require_framework_error();
|
|
30948
31360
|
var C = require_constants();
|
|
30949
31361
|
var b = asn1.build;
|
|
@@ -30978,6 +31390,36 @@ var require_pkcs12_build = __commonJS({
|
|
|
30978
31390
|
var DIGEST_NAME = { sha1: "sha1", sha256: "sha256", sha384: "sha384", sha512: "sha512" };
|
|
30979
31391
|
var _MISSING_PASSWORD = 'a password must be a string, Buffer, or Uint8Array -- an omitted password is not the empty password; pass "" to use the empty one deliberately';
|
|
30980
31392
|
var _INTEGRITY_OPTS = { mode: 1, signer: 1, signers: 1, certificates: 1, sid: 1, signingTime: 1 };
|
|
31393
|
+
var _BUILD_SPEC_FULL_KEYS = { safeContents: 1 };
|
|
31394
|
+
var _BUILD_SPEC_SHORTHAND_KEYS = { key: 1, cert: 1, ca: 1, friendlyName: 1, localKeyId: 1 };
|
|
31395
|
+
var _BUILD_OPTS_FULL = { integrity: 1, mac: 1, password: 1, pem: 1 };
|
|
31396
|
+
var _BUILD_OPTS_SHORTHAND = { integrity: 1, mac: 1, password: 1, pem: 1, recipientCerts: 1 };
|
|
31397
|
+
var _SAFE_RECIPIENTS_KEYS = { bags: 1, recipients: 1, contentEncryptionAlgorithm: 1 };
|
|
31398
|
+
var _SAFE_PASSWORD_KEYS = { bags: 1, encrypt: 1 };
|
|
31399
|
+
var _SAFE_PLAINTEXT_KEYS = { bags: 1 };
|
|
31400
|
+
var _BAG_KEYS_BY_TYPE = {
|
|
31401
|
+
key: { type: 1, friendlyName: 1, localKeyId: 1, key: 1 },
|
|
31402
|
+
shroudedKey: { type: 1, friendlyName: 1, localKeyId: 1, key: 1, encrypt: 1 },
|
|
31403
|
+
cert: { type: 1, friendlyName: 1, localKeyId: 1, cert: 1 },
|
|
31404
|
+
crl: { type: 1, friendlyName: 1, localKeyId: 1, crl: 1 },
|
|
31405
|
+
secret: { type: 1, friendlyName: 1, localKeyId: 1, secretTypeId: 1, secretValue: 1 },
|
|
31406
|
+
safeContents: { type: 1, friendlyName: 1, localKeyId: 1, nested: 1 }
|
|
31407
|
+
};
|
|
31408
|
+
var _ENCRYPT_KEYS = { password: 1, cipher: 1, salt: 1, iterations: 1, prf: 1 };
|
|
31409
|
+
var _MAC_KEYS = { algorithm: 1, hash: 1, salt: 1, iterations: 1, keyLength: 1, password: 1 };
|
|
31410
|
+
var _MAC_KEYS_HMAC = { algorithm: 1, hash: 1, salt: 1, iterations: 1, password: 1 };
|
|
31411
|
+
var _MAC_KEYS_PBMAC1 = { algorithm: 1, hash: 1, salt: 1, iterations: 1, keyLength: 1, password: 1 };
|
|
31412
|
+
var _OPEN_OPTS = {
|
|
31413
|
+
allowUnauthenticated: 1,
|
|
31414
|
+
importAlgorithm: 1,
|
|
31415
|
+
keys: 1,
|
|
31416
|
+
maxIterations: 1,
|
|
31417
|
+
signerCerts: 1,
|
|
31418
|
+
recipientKey: 1,
|
|
31419
|
+
recipientCert: 1,
|
|
31420
|
+
recipientIndex: 1
|
|
31421
|
+
};
|
|
31422
|
+
var _VERIFY_MAC_OPTS = { maxIterations: 1 };
|
|
30981
31423
|
function _p12PasswordOwned(pw) {
|
|
30982
31424
|
if (Buffer.isBuffer(pw)) return { bytes: guard.bytes.view(pw, Pkcs12Error, "pkcs12/bad-input", "the password"), owned: false };
|
|
30983
31425
|
return { bytes: _p12Encode(pw), owned: true };
|
|
@@ -31085,6 +31527,11 @@ var require_pkcs12_build = __commonJS({
|
|
|
31085
31527
|
}
|
|
31086
31528
|
function _buildBag(bag, opts, depth) {
|
|
31087
31529
|
if (!bag || typeof bag !== "object") throw _err("pkcs12/bad-input", "each bag must be an object with a type");
|
|
31530
|
+
if (intrinsic.hasOwn(_BAG_KEYS_BY_TYPE, bag.type)) {
|
|
31531
|
+
guard.identifier.assertKnownKeys(bag, _BAG_KEYS_BY_TYPE[bag.type], _err, "pkcs12/bad-input", function(k) {
|
|
31532
|
+
return "unknown field " + JSON.stringify(k) + " on a " + JSON.stringify(bag.type) + " bag; that field is not read for this bag type";
|
|
31533
|
+
});
|
|
31534
|
+
}
|
|
31088
31535
|
switch (bag.type) {
|
|
31089
31536
|
case "key": {
|
|
31090
31537
|
var keyDer = _coerceDer(bag.key, "keyBag key");
|
|
@@ -31103,10 +31550,11 @@ var require_pkcs12_build = __commonJS({
|
|
|
31103
31550
|
throw _err("pkcs12/bad-input", "shroudedKey key is not a well-formed PKCS#8 PrivateKeyInfo", e2);
|
|
31104
31551
|
}
|
|
31105
31552
|
var enc = bag.encrypt || {};
|
|
31553
|
+
var bagPbe = _pbeOpts(enc);
|
|
31106
31554
|
var pw = _pbePasswordOwned(enc.password != null ? enc.password : opts.password);
|
|
31107
31555
|
var r;
|
|
31108
31556
|
try {
|
|
31109
|
-
r = pbes2.pbes2Encrypt(pw.bytes, kDer,
|
|
31557
|
+
r = pbes2.pbes2Encrypt(pw.bytes, kDer, bagPbe, _err, "pkcs12");
|
|
31110
31558
|
} finally {
|
|
31111
31559
|
_wipePw(pw);
|
|
31112
31560
|
}
|
|
@@ -31170,6 +31618,9 @@ var require_pkcs12_build = __commonJS({
|
|
|
31170
31618
|
return der;
|
|
31171
31619
|
}
|
|
31172
31620
|
function _pbeOpts(enc) {
|
|
31621
|
+
guard.identifier.assertKnownKeys(enc, _ENCRYPT_KEYS, _err, "pkcs12/bad-input", function(k) {
|
|
31622
|
+
return "unknown encrypt field " + JSON.stringify(k) + "; the PBE descriptor is { password?, cipher?, salt?, iterations?, prf? }";
|
|
31623
|
+
});
|
|
31173
31624
|
var cipher = CIPHER_NAME[enc.cipher || "aes-256-cbc"];
|
|
31174
31625
|
if (!cipher) throw _err("pkcs12/bad-input", "unsupported PBES2 cipher " + JSON.stringify(enc.cipher) + " (aes-128-cbc / aes-192-cbc / aes-256-cbc)");
|
|
31175
31626
|
return {
|
|
@@ -31191,6 +31642,15 @@ var require_pkcs12_build = __commonJS({
|
|
|
31191
31642
|
var hasRecipients = sc.recipients !== void 0;
|
|
31192
31643
|
var hasEncrypt = sc.encrypt !== void 0;
|
|
31193
31644
|
if (hasEncrypt && hasRecipients) throw _err("pkcs12/bad-input", "a safeContents cannot combine encrypt (password) and recipients (public-key) -- one ContentInfo is one privacy type (RFC 7292 sec. 4.1)");
|
|
31645
|
+
guard.identifier.assertKnownKeys(
|
|
31646
|
+
sc,
|
|
31647
|
+
hasRecipients ? _SAFE_RECIPIENTS_KEYS : hasEncrypt ? _SAFE_PASSWORD_KEYS : _SAFE_PLAINTEXT_KEYS,
|
|
31648
|
+
_err,
|
|
31649
|
+
"pkcs12/bad-input",
|
|
31650
|
+
function(k) {
|
|
31651
|
+
return "unknown safeContents field " + JSON.stringify(k) + " for a " + (hasRecipients ? "public-key safe; it takes { bags, recipients, contentEncryptionAlgorithm? }" : hasEncrypt ? "password safe; it takes { bags, encrypt } and its cipher comes from encrypt.cipher" : "plaintext safe; it takes { bags }, and a privacy directive must be encrypt or recipients");
|
|
31652
|
+
}
|
|
31653
|
+
);
|
|
31194
31654
|
var safeContentsDer = _buildSafeContents(sc.bags || [], opts, 0);
|
|
31195
31655
|
if (hasRecipients) {
|
|
31196
31656
|
if (!Array.isArray(sc.recipients) || !sc.recipients.length) throw _err("pkcs12/bad-input", "safeContents.recipients must be a non-empty array of recipient descriptors (RFC 5652 sec. 6.1)");
|
|
@@ -31206,10 +31666,11 @@ var require_pkcs12_build = __commonJS({
|
|
|
31206
31666
|
return b.sequence([b.oid(O("data")), b.explicit(0, b.octetString(safeContentsDer))]);
|
|
31207
31667
|
}
|
|
31208
31668
|
if (!sc.encrypt || typeof sc.encrypt !== "object") throw _err("pkcs12/bad-input", "safeContents.encrypt must be an object { password? } (RFC 7292 sec. 5.1) -- omit it entirely for a plaintext safe");
|
|
31669
|
+
var safePbe = _pbeOpts(sc.encrypt);
|
|
31209
31670
|
var pw = _pbePasswordOwned(sc.encrypt.password != null ? sc.encrypt.password : opts.password);
|
|
31210
31671
|
var r;
|
|
31211
31672
|
try {
|
|
31212
|
-
r = pbes2.pbes2Encrypt(pw.bytes, safeContentsDer,
|
|
31673
|
+
r = pbes2.pbes2Encrypt(pw.bytes, safeContentsDer, safePbe, _err, "pkcs12");
|
|
31213
31674
|
} finally {
|
|
31214
31675
|
_wipePw(pw);
|
|
31215
31676
|
}
|
|
@@ -31258,11 +31719,18 @@ var require_pkcs12_build = __commonJS({
|
|
|
31258
31719
|
}
|
|
31259
31720
|
throw _err("pkcs12/bad-input", "opts.mac.algorithm must be 'hmac' or 'pbmac1', got " + JSON.stringify(algorithm));
|
|
31260
31721
|
}
|
|
31261
|
-
function
|
|
31262
|
-
|
|
31722
|
+
function _specForm(spec) {
|
|
31723
|
+
var isObject = !!spec && typeof spec === "object" && !Buffer.isBuffer(spec);
|
|
31724
|
+
var safeContents = isObject ? spec.safeContents : null;
|
|
31725
|
+
var full = intrinsic.isArray(safeContents);
|
|
31726
|
+
return { isObject, full, safeContents: full ? safeContents : null };
|
|
31727
|
+
}
|
|
31728
|
+
function _normalizeSpec(spec, opts, form) {
|
|
31729
|
+
if (form.full) return form.safeContents;
|
|
31263
31730
|
if (spec && (spec.key != null || spec.cert != null)) {
|
|
31264
|
-
var
|
|
31265
|
-
|
|
31731
|
+
var recipientCerts = opts.recipientCerts;
|
|
31732
|
+
var enveloped = recipientCerts != null;
|
|
31733
|
+
if (enveloped && (!intrinsic.isArray(recipientCerts) || !recipientCerts.length)) throw _err("pkcs12/bad-input", "opts.recipientCerts must be a non-empty array of recipient certificates");
|
|
31266
31734
|
var certBags = [];
|
|
31267
31735
|
if (spec.cert != null) certBags.push({ type: "cert", cert: spec.cert, friendlyName: spec.friendlyName, localKeyId: spec.localKeyId });
|
|
31268
31736
|
if (spec.ca != null && !Array.isArray(spec.ca)) throw _err("pkcs12/bad-input", "spec.ca must be an array of certificates");
|
|
@@ -31273,7 +31741,7 @@ var require_pkcs12_build = __commonJS({
|
|
|
31273
31741
|
if (enveloped) {
|
|
31274
31742
|
var bags = certBags.slice();
|
|
31275
31743
|
if (spec.key != null) bags.push({ type: "key", key: spec.key, friendlyName: spec.friendlyName, localKeyId: spec.localKeyId });
|
|
31276
|
-
sc.push({ recipients:
|
|
31744
|
+
sc.push({ recipients: recipientCerts.map(function(c) {
|
|
31277
31745
|
return { cert: c };
|
|
31278
31746
|
}), bags });
|
|
31279
31747
|
return sc;
|
|
@@ -31292,6 +31760,27 @@ var require_pkcs12_build = __commonJS({
|
|
|
31292
31760
|
}
|
|
31293
31761
|
async function _build(spec, opts) {
|
|
31294
31762
|
opts = opts || {};
|
|
31763
|
+
var form = _specForm(spec);
|
|
31764
|
+
if (form.isObject) {
|
|
31765
|
+
guard.identifier.assertKnownKeys(
|
|
31766
|
+
spec,
|
|
31767
|
+
form.full ? _BUILD_SPEC_FULL_KEYS : _BUILD_SPEC_SHORTHAND_KEYS,
|
|
31768
|
+
_err,
|
|
31769
|
+
"pkcs12/bad-input",
|
|
31770
|
+
function(k) {
|
|
31771
|
+
return "unknown PKCS#12 spec field " + JSON.stringify(k) + " for the " + (form.full ? "safeContents form; the shorthand fields belong to { key, cert, ca } and are not read here" : "shorthand form; pass safeContents instead to build the safes yourself");
|
|
31772
|
+
}
|
|
31773
|
+
);
|
|
31774
|
+
}
|
|
31775
|
+
guard.identifier.assertKnownKeys(
|
|
31776
|
+
opts,
|
|
31777
|
+
form.full ? _BUILD_OPTS_FULL : _BUILD_OPTS_SHORTHAND,
|
|
31778
|
+
_err,
|
|
31779
|
+
"pkcs12/bad-input",
|
|
31780
|
+
function(k) {
|
|
31781
|
+
return "pki.pkcs12.build has an unknown option " + JSON.stringify(k) + (form.full && k === "recipientCerts" ? " for the safeContents form; the full form carries privacy per entry, as safeContents[i].recipients" : "");
|
|
31782
|
+
}
|
|
31783
|
+
);
|
|
31295
31784
|
if (opts.integrity != null) {
|
|
31296
31785
|
if (typeof opts.integrity !== "object" || Array.isArray(opts.integrity)) throw _err("pkcs12/bad-input", "opts.integrity must be an object { mode, signer|signers, ... }");
|
|
31297
31786
|
guard.identifier.assertKnownKeys(opts.integrity, _INTEGRITY_OPTS, _err, "pkcs12/bad-input", "opts.integrity has an unknown option ");
|
|
@@ -31301,7 +31790,7 @@ var require_pkcs12_build = __commonJS({
|
|
|
31301
31790
|
}
|
|
31302
31791
|
var pubKey = opts.integrity != null;
|
|
31303
31792
|
if (pubKey && opts.mac != null && opts.mac !== false) throw _err("pkcs12/bad-integrity-mode", "public-key integrity has no MacData -- do not combine opts.mac with opts.integrity.mode 'public-key' (RFC 7292 sec. 4)");
|
|
31304
|
-
var safeContentsSpecs = _normalizeSpec(spec, opts);
|
|
31793
|
+
var safeContentsSpecs = _normalizeSpec(spec, opts, form);
|
|
31305
31794
|
if (!Array.isArray(safeContentsSpecs) || !safeContentsSpecs.length) throw _err("pkcs12/bad-input", "the store has no safe contents");
|
|
31306
31795
|
var elements = [];
|
|
31307
31796
|
for (var i = 0; i < safeContentsSpecs.length; i++) elements.push(await _buildAuthSafeElement(safeContentsSpecs[i], opts));
|
|
@@ -31309,13 +31798,35 @@ var require_pkcs12_build = __commonJS({
|
|
|
31309
31798
|
var pfx;
|
|
31310
31799
|
if (pubKey) {
|
|
31311
31800
|
var ig = opts.integrity;
|
|
31801
|
+
if (ig.signers != null && ig.signer != null) throw _err("pkcs12/bad-input", "supply exactly one of opts.integrity.signer or opts.integrity.signers, not both");
|
|
31312
31802
|
var signers = ig.signers != null ? ig.signers : ig.signer != null ? [ig.signer] : null;
|
|
31313
31803
|
if (!Array.isArray(signers) || !signers.length) throw _err("pkcs12/bad-input", "public-key integrity requires opts.integrity.signer or opts.integrity.signers (a cms.sign signer descriptor)");
|
|
31804
|
+
for (var sx = 0; sx < signers.length; sx++) {
|
|
31805
|
+
var sd = signers[sx];
|
|
31806
|
+
if (sd == null || typeof sd !== "object" || Buffer.isBuffer(sd)) throw _err("pkcs12/bad-input", "each opts.integrity signer must be a descriptor object");
|
|
31807
|
+
var keyOnly = sd.cert == null && sd.spki != null;
|
|
31808
|
+
guard.identifier.assertKnownKeys(
|
|
31809
|
+
sd,
|
|
31810
|
+
keyOnly ? cmsSign.KNOWN_SIGNER_KEY_ONLY_KEYS : cmsSign.KNOWN_SIGNER_CERT_KEYS,
|
|
31811
|
+
_err,
|
|
31812
|
+
"pkcs12/bad-input",
|
|
31813
|
+
function(k) {
|
|
31814
|
+
return "unknown opts.integrity signer field " + JSON.stringify(k) + " for the " + (keyOnly ? "key-only form; it takes { key, spki, keyIdentifier } plus the signature parameters" : "certificate form; it takes { key, cert } plus the signature parameters");
|
|
31815
|
+
}
|
|
31816
|
+
);
|
|
31817
|
+
}
|
|
31314
31818
|
var authSafeCi = await cms.sign(authSafeDer, signers, { eContentType: "data", detached: false, certificates: ig.certificates !== false, sid: ig.sid, signingTime: ig.signingTime });
|
|
31315
31819
|
pfx = b.sequence([b.integer(3n), b.raw(authSafeCi)]);
|
|
31316
31820
|
} else {
|
|
31317
31821
|
var pfxChildren = [b.integer(3n), b.sequence([b.oid(O("data")), b.explicit(0, b.octetString(authSafeDer))])];
|
|
31318
|
-
if (opts.mac != null && opts.mac !== false && typeof opts.mac !== "object") throw _err("pkcs12/bad-input", "opts.mac must be false or a { algorithm, hash, salt, iterations, keyLength } object");
|
|
31822
|
+
if (opts.mac != null && opts.mac !== false && (typeof opts.mac !== "object" || intrinsic.isArray(opts.mac))) throw _err("pkcs12/bad-input", "opts.mac must be false or a { algorithm, hash, salt, iterations, keyLength } object");
|
|
31823
|
+
if (opts.mac != null && opts.mac !== false) {
|
|
31824
|
+
var macAlg = opts.mac.algorithm == null ? "hmac" : opts.mac.algorithm;
|
|
31825
|
+
var macKeys = macAlg === "hmac" ? _MAC_KEYS_HMAC : macAlg === "pbmac1" ? _MAC_KEYS_PBMAC1 : _MAC_KEYS;
|
|
31826
|
+
guard.identifier.assertKnownKeys(opts.mac, macKeys, _err, "pkcs12/bad-input", function(k) {
|
|
31827
|
+
return "opts.mac has an unknown option " + JSON.stringify(k) + (macAlg === "hmac" && k === "keyLength" ? " for the classic HMAC algorithm; its key is derived at the hash's own output length, and only pbmac1 takes a keyLength" : "");
|
|
31828
|
+
});
|
|
31829
|
+
}
|
|
31319
31830
|
if (opts.mac !== false) pfxChildren.push(await _buildMacData(opts.mac || {}, opts.password, authSafeDer));
|
|
31320
31831
|
pfx = b.sequence(pfxChildren);
|
|
31321
31832
|
}
|
|
@@ -31327,6 +31838,9 @@ var require_pkcs12_build = __commonJS({
|
|
|
31327
31838
|
return opts.pem ? schemaPkcs12.pemEncode(pfx, "PKCS12") : pfx;
|
|
31328
31839
|
}
|
|
31329
31840
|
async function verifyMac(pfx, password, opts) {
|
|
31841
|
+
if (opts != null && typeof opts === "object" && !Buffer.isBuffer(opts)) {
|
|
31842
|
+
guard.identifier.assertKnownKeys(opts, _VERIFY_MAC_OPTS, _err, "pkcs12/bad-input", "pki.pkcs12.verifyMac has an unknown option ");
|
|
31843
|
+
}
|
|
31330
31844
|
return _verifyMacOfStore(_storeFromBytes(pfx), password, opts);
|
|
31331
31845
|
}
|
|
31332
31846
|
async function _verifyMacOfStore(m, password, opts) {
|
|
@@ -31375,6 +31889,7 @@ var require_pkcs12_build = __commonJS({
|
|
|
31375
31889
|
}
|
|
31376
31890
|
async function open(pfx, password, opts) {
|
|
31377
31891
|
opts = opts || {};
|
|
31892
|
+
guard.identifier.assertKnownKeys(opts, _OPEN_OPTS, _err, "pkcs12/bad-input", "pki.pkcs12.open has an unknown option ");
|
|
31378
31893
|
if (opts.maxIterations != null && (typeof opts.maxIterations !== "number" || !isFinite(opts.maxIterations) || opts.maxIterations < 1 || Math.floor(opts.maxIterations) !== opts.maxIterations)) {
|
|
31379
31894
|
throw _err("pkcs12/bad-input", "maxIterations must be a positive integer");
|
|
31380
31895
|
}
|
|
@@ -31939,6 +32454,8 @@ var require_hpke = __commonJS({
|
|
|
31939
32454
|
var nodeCrypto = require("crypto");
|
|
31940
32455
|
var frameworkError = require_framework_error();
|
|
31941
32456
|
var guard = require_guard_all();
|
|
32457
|
+
var intrinsic = require_guard_intrinsic();
|
|
32458
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
31942
32459
|
var HpkeError = frameworkError.HpkeError;
|
|
31943
32460
|
function _err(code, message, cause) {
|
|
31944
32461
|
return new HpkeError(code, message, cause);
|
|
@@ -32296,7 +32813,7 @@ var require_hpke = __commonJS({
|
|
|
32296
32813
|
function _mode(opts, keys, who) {
|
|
32297
32814
|
guard.identifier.assertKnownKeys(opts, keys, _err, "hpke/bad-input", function(k) {
|
|
32298
32815
|
var other = keys === _SETUP_S_KEYS ? _SETUP_R_KEYS : _SETUP_S_KEYS;
|
|
32299
|
-
return "unknown HPKE " + who + " option " + JSON.stringify(k) + (
|
|
32816
|
+
return "unknown HPKE " + who + " option " + JSON.stringify(k) + (_hasOwn(other, k) ? " -- that option belongs to the other end of the exchange, where it would authenticate or seed; here it would do nothing" : "") + " -- accepted: " + Object.keys(keys).sort().join(", ");
|
|
32300
32817
|
});
|
|
32301
32818
|
var mode = opts.mode == null ? MODE_BASE : opts.mode;
|
|
32302
32819
|
if (mode !== MODE_BASE && mode !== MODE_PSK && mode !== MODE_AUTH && mode !== MODE_AUTH_PSK) {
|
|
@@ -32868,14 +33385,16 @@ var require_http_digest = __commonJS({
|
|
|
32868
33385
|
"use strict";
|
|
32869
33386
|
var crypto = require("crypto");
|
|
32870
33387
|
var constants = require_constants();
|
|
32871
|
-
var
|
|
33388
|
+
var intrinsic = require_guard_intrinsic();
|
|
33389
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
33390
|
+
var ALGS = intrinsic.assign(intrinsic.create(null), {
|
|
32872
33391
|
"SHA-512-256": { hash: "sha512-256", rank: 3, sess: false },
|
|
32873
33392
|
"SHA-512-256-SESS": { hash: "sha512-256", rank: 3, sess: true },
|
|
32874
33393
|
"SHA-256": { hash: "sha256", rank: 2, sess: false },
|
|
32875
33394
|
"SHA-256-SESS": { hash: "sha256", rank: 2, sess: true },
|
|
32876
33395
|
"MD5": { hash: "md5", rank: 1, sess: false },
|
|
32877
33396
|
"MD5-SESS": { hash: "md5", rank: 1, sess: true }
|
|
32878
|
-
};
|
|
33397
|
+
});
|
|
32879
33398
|
var DEFAULT_CODES = {
|
|
32880
33399
|
unsupportedAlgorithm: "digest/unsupported-algorithm",
|
|
32881
33400
|
weakAlgorithm: "digest/weak-algorithm",
|
|
@@ -32999,7 +33518,7 @@ var require_http_digest = __commonJS({
|
|
|
32999
33518
|
var rawVal = seg.slice(eq + 1).replace(/^\s+|\s+$/g, "");
|
|
33000
33519
|
var quoted = rawVal.charAt(0) === '"';
|
|
33001
33520
|
if (quoted && !_closedQuote(rawVal)) throw E(code, "an unterminated or trailing-garbage Digest quoted-string (RFC 7230 sec. 3.2.6)");
|
|
33002
|
-
if (
|
|
33521
|
+
if (_hasOwn(map, key)) throw E(code, "repeated Digest auth-param " + JSON.stringify(key));
|
|
33003
33522
|
var value = quoted ? _unq(rawVal) : rawVal;
|
|
33004
33523
|
if (_hasCtl(value)) throw E(code, "a Digest auth-param value contains a control character (RFC 7230 sec. 3.2.6)");
|
|
33005
33524
|
map[key] = { value, quoted };
|
|
@@ -33208,6 +33727,8 @@ var require_est = __commonJS({
|
|
|
33208
33727
|
var crmfFmt = require_schema_crmf();
|
|
33209
33728
|
var frameworkError = require_framework_error();
|
|
33210
33729
|
var guard = require_guard_all();
|
|
33730
|
+
var intrinsic = require_guard_intrinsic();
|
|
33731
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
33211
33732
|
var httpTransport = require_http_transport();
|
|
33212
33733
|
var httpDigest = require_http_digest();
|
|
33213
33734
|
var retryAfter = require_http_retry_after();
|
|
@@ -34111,19 +34632,19 @@ var require_est = __commonJS({
|
|
|
34111
34632
|
if (!r || typeof r !== "object") return r;
|
|
34112
34633
|
var out = {}, k;
|
|
34113
34634
|
for (k in r) {
|
|
34114
|
-
if (
|
|
34635
|
+
if (_hasOwn(r, k)) out[k] = _copyBytes(r[k]);
|
|
34115
34636
|
}
|
|
34116
34637
|
return out;
|
|
34117
34638
|
}
|
|
34118
34639
|
function _shallowCopy(o) {
|
|
34119
34640
|
var out = {}, k;
|
|
34120
34641
|
for (k in o) {
|
|
34121
|
-
if (
|
|
34642
|
+
if (_hasOwn(o, k)) out[k] = o[k];
|
|
34122
34643
|
}
|
|
34123
34644
|
if (out.auth && typeof out.auth === "object") {
|
|
34124
34645
|
var a = {}, ak;
|
|
34125
34646
|
for (ak in out.auth) {
|
|
34126
|
-
if (
|
|
34647
|
+
if (_hasOwn(out.auth, ak)) a[ak] = out.auth[ak];
|
|
34127
34648
|
}
|
|
34128
34649
|
out.auth = a;
|
|
34129
34650
|
}
|
|
@@ -34433,15 +34954,27 @@ var require_jose = __commonJS({
|
|
|
34433
34954
|
var frameworkError = require_framework_error();
|
|
34434
34955
|
var guard = require_guard_all();
|
|
34435
34956
|
var edwardsPoint = require_edwards_point();
|
|
34957
|
+
var intrinsic = require_guard_intrinsic();
|
|
34958
|
+
var _isArray = intrinsic.isArray;
|
|
34959
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
34960
|
+
var _keys = intrinsic.keys;
|
|
34961
|
+
var _isBuffer = intrinsic.isBuffer;
|
|
34962
|
+
var _bufferFrom = intrinsic.bufferFrom;
|
|
34963
|
+
var _stringify = intrinsic.stringify;
|
|
34964
|
+
var _ObjectProto = intrinsic.ObjectProto;
|
|
34965
|
+
var _push = intrinsic.uncurry(Array.prototype.push);
|
|
34966
|
+
var _join = intrinsic.join;
|
|
34967
|
+
var _map = intrinsic.map;
|
|
34968
|
+
var _bufToString = intrinsic.uncurry(Buffer.prototype.toString);
|
|
34436
34969
|
var JoseError = frameworkError.JoseError;
|
|
34437
34970
|
function E(code, message, cause) {
|
|
34438
34971
|
return new JoseError(code, message, cause);
|
|
34439
34972
|
}
|
|
34440
34973
|
var LIMITS = constants.LIMITS;
|
|
34441
34974
|
function b64uEncode(bytes) {
|
|
34442
|
-
if (!
|
|
34975
|
+
if (!_isBuffer(bytes)) throw E("jose/bad-input", "base64url.encode requires a Buffer");
|
|
34443
34976
|
bytes = guard.bytes.view(bytes, JoseError, "jose/bad-input", "base64url.encode input");
|
|
34444
|
-
return bytes
|
|
34977
|
+
return _bufToString(bytes, "base64url");
|
|
34445
34978
|
}
|
|
34446
34979
|
function b64uDecode(text) {
|
|
34447
34980
|
return guard.encoding.base64url(text, null, E, "jose/bad-base64url", "base64url value");
|
|
@@ -34486,16 +35019,16 @@ var require_jose = __commonJS({
|
|
|
34486
35019
|
};
|
|
34487
35020
|
function _checkHeader(header, profileName) {
|
|
34488
35021
|
var profile = PROFILES[profileName];
|
|
34489
|
-
if (!profile) throw E("jose/bad-input", "unknown JWS profile " +
|
|
34490
|
-
if (!header || typeof header !== "object" ||
|
|
35022
|
+
if (!profile) throw E("jose/bad-input", "unknown JWS profile " + _stringify(profileName));
|
|
35023
|
+
if (!header || typeof header !== "object" || _isArray(header)) throw E("jose/bad-header", "the protected header must be a JSON object");
|
|
34491
35024
|
var own = function(k) {
|
|
34492
|
-
return
|
|
35025
|
+
return _hasOwn(header, k);
|
|
34493
35026
|
};
|
|
34494
35027
|
if (own("b64")) throw E("jose/bad-jws", "the RFC 7797 b64 header parameter is forbidden");
|
|
34495
35028
|
var alg = header.alg;
|
|
34496
35029
|
if (!own("alg") || typeof alg !== "string") throw E("jose/bad-header", "the protected header must carry a string alg");
|
|
34497
35030
|
var algRow = profile.algs[alg];
|
|
34498
|
-
if (!algRow) throw E("jose/bad-alg", "unsupported or forbidden algorithm " +
|
|
35031
|
+
if (!algRow) throw E("jose/bad-alg", "unsupported or forbidden algorithm " + _stringify(alg) + " for this JWS profile");
|
|
34499
35032
|
if (profile.requireUrl && (!own("url") || typeof header.url !== "string" || header.url.length === 0)) throw E("jose/bad-header", "the protected header must carry a non-empty string url");
|
|
34500
35033
|
var hasNonce = own("nonce");
|
|
34501
35034
|
if (profile.nonce === "required") {
|
|
@@ -34518,18 +35051,18 @@ var require_jose = __commonJS({
|
|
|
34518
35051
|
} else if (profile.keyId === "jwk") {
|
|
34519
35052
|
if (!hasJwk || hasKid) throw E("jose/bad-header", "this JWS must carry an embedded jwk, not kid");
|
|
34520
35053
|
}
|
|
34521
|
-
if (hasJwk && (!header.jwk || typeof header.jwk !== "object" ||
|
|
34522
|
-
if (
|
|
35054
|
+
if (hasJwk && (!header.jwk || typeof header.jwk !== "object" || _isArray(header.jwk))) throw E("jose/bad-header", "jwk must be a JSON object");
|
|
35055
|
+
if (_hasOwn(header, "crit")) {
|
|
34523
35056
|
var crit = header.crit;
|
|
34524
|
-
if (!
|
|
35057
|
+
if (!_isArray(crit) || crit.length === 0) throw E("jose/bad-crit", "crit must be a non-empty array");
|
|
34525
35058
|
var seen = {};
|
|
34526
35059
|
for (var c = 0; c < crit.length; c++) {
|
|
34527
35060
|
var name = crit[c];
|
|
34528
35061
|
if (typeof name !== "string") throw E("jose/bad-crit", "crit entries must be strings");
|
|
34529
|
-
if (
|
|
35062
|
+
if (_hasOwn(seen, name)) throw E("jose/bad-crit", "duplicate crit entry " + _stringify(name));
|
|
34530
35063
|
seen[name] = 1;
|
|
34531
|
-
if (UNDERSTOOD_HEADER[name]) throw E("jose/bad-crit", "crit must not name a standard header parameter " +
|
|
34532
|
-
throw E("jose/bad-crit", "unprocessed critical header parameter " +
|
|
35064
|
+
if (UNDERSTOOD_HEADER[name]) throw E("jose/bad-crit", "crit must not name a standard header parameter " + _stringify(name));
|
|
35065
|
+
throw E("jose/bad-crit", "unprocessed critical header parameter " + _stringify(name));
|
|
34533
35066
|
}
|
|
34534
35067
|
}
|
|
34535
35068
|
return { alg, algRow, header };
|
|
@@ -34552,13 +35085,13 @@ var require_jose = __commonJS({
|
|
|
34552
35085
|
}
|
|
34553
35086
|
function _assertKeyType(algRow, jwk) {
|
|
34554
35087
|
if (!jwk || typeof jwk !== "object" || typeof jwk.kty !== "string") throw E("jose/bad-key", "a JWK object with a kty is required");
|
|
34555
|
-
if (jwk.kty !== algRow.kty) throw E("jose/bad-alg", "the key type " +
|
|
35088
|
+
if (jwk.kty !== algRow.kty) throw E("jose/bad-alg", "the key type " + _stringify(jwk.kty) + " does not match the algorithm");
|
|
34556
35089
|
if (algRow.kty === "EC" && jwk.crv !== algRow.crv) throw E("jose/bad-alg", "the EC curve does not match the algorithm");
|
|
34557
|
-
if (algRow.kty === "OKP" && jwk.crv !== "Ed25519" && jwk.crv !== "Ed448") throw E("jose/bad-alg", "unsupported OKP curve " +
|
|
35090
|
+
if (algRow.kty === "OKP" && jwk.crv !== "Ed25519" && jwk.crv !== "Ed448") throw E("jose/bad-alg", "unsupported OKP curve " + _stringify(jwk.crv));
|
|
34558
35091
|
if (algRow.kty === "OKP" && typeof jwk.x === "string" && !edwardsPoint.validate(b64uDecode(jwk.x), jwk.crv === "Ed25519" ? 6 : 7)) {
|
|
34559
35092
|
throw E("jose/bad-key", "the OKP public key is not a valid, full-order Edwards point");
|
|
34560
35093
|
}
|
|
34561
|
-
if (algRow.kty === "AKP" && jwk.alg !== algRow.subtle) throw E("jose/bad-alg", "the AKP parameter set " +
|
|
35094
|
+
if (algRow.kty === "AKP" && jwk.alg !== algRow.subtle) throw E("jose/bad-alg", "the AKP parameter set " + _stringify(jwk.alg) + " does not match the algorithm " + algRow.subtle);
|
|
34562
35095
|
}
|
|
34563
35096
|
function _expectedSigBytes(algRow, jwk, key) {
|
|
34564
35097
|
if (algRow.sigBytes != null) return algRow.sigBytes;
|
|
@@ -34572,10 +35105,10 @@ var require_jose = __commonJS({
|
|
|
34572
35105
|
}
|
|
34573
35106
|
var PRIVATE_JWK_MEMBERS = ["d", "p", "q", "dp", "dq", "qi", "k", "priv"];
|
|
34574
35107
|
function assertPublicJwk(jwk) {
|
|
34575
|
-
if (!jwk || typeof jwk !== "object" ||
|
|
35108
|
+
if (!jwk || typeof jwk !== "object" || _isArray(jwk)) throw E("jose/bad-key", "a JWK object is required");
|
|
34576
35109
|
for (var i = 0; i < PRIVATE_JWK_MEMBERS.length; i++) {
|
|
34577
|
-
if (
|
|
34578
|
-
throw E("jose/private-key-material", "a published JWK must be public-only; it carries the private member " +
|
|
35110
|
+
if (_hasOwn(jwk, PRIVATE_JWK_MEMBERS[i])) {
|
|
35111
|
+
throw E("jose/private-key-material", "a published JWK must be public-only; it carries the private member " + _stringify(PRIVATE_JWK_MEMBERS[i]));
|
|
34579
35112
|
}
|
|
34580
35113
|
}
|
|
34581
35114
|
return jwk;
|
|
@@ -34584,15 +35117,15 @@ var require_jose = __commonJS({
|
|
|
34584
35117
|
async function verify(jws, opts) {
|
|
34585
35118
|
opts = opts || {};
|
|
34586
35119
|
guard.identifier.assertKnownKeys(opts, _VERIFY_KEYS, E, "jose/bad-input", "unknown pki.jose.verify option ");
|
|
34587
|
-
if (!jws || typeof jws !== "object" ||
|
|
34588
|
-
if (
|
|
34589
|
-
if (
|
|
35120
|
+
if (!jws || typeof jws !== "object" || _isArray(jws)) throw E("jose/bad-jws", "a flattened JWS object is required");
|
|
35121
|
+
if (_hasOwn(jws, "signatures")) throw E("jose/bad-jws", "the multi-signature signatures member is forbidden");
|
|
35122
|
+
if (_hasOwn(jws, "header")) throw E("jose/bad-jws", "the unprotected header member is forbidden");
|
|
34590
35123
|
if (typeof jws.protected !== "string" || typeof jws.signature !== "string") throw E("jose/bad-jws", "protected and signature must be base64url strings");
|
|
34591
35124
|
if (typeof jws.payload !== "string") throw E("jose/bad-jws", "payload must be a base64url string (never detached)");
|
|
34592
35125
|
var header = parseJson(b64uDecode(jws.protected));
|
|
34593
35126
|
var profileName = opts.profile || "acme-outer";
|
|
34594
35127
|
var checked = _checkHeader(header, profileName);
|
|
34595
|
-
if (opts.key !== void 0 && (typeof opts.key !== "object" || opts.key === null ||
|
|
35128
|
+
if (opts.key !== void 0 && (typeof opts.key !== "object" || opts.key === null || _isArray(opts.key))) {
|
|
34596
35129
|
throw E("jose/bad-key", "opts.key was supplied but is not a JWK object, so the key this message must be signed under cannot be established");
|
|
34597
35130
|
}
|
|
34598
35131
|
var jwk = header.jwk || opts.key;
|
|
@@ -34621,7 +35154,7 @@ var require_jose = __commonJS({
|
|
|
34621
35154
|
var sig = b64uDecode(jws.signature);
|
|
34622
35155
|
var want = _expectedSigBytes(checked.algRow, jwk);
|
|
34623
35156
|
if (want != null && sig.length !== want) throw E("jose/bad-signature", "the signature length " + sig.length + " is not the " + want + " bytes " + checked.alg + " requires");
|
|
34624
|
-
var signingInput =
|
|
35157
|
+
var signingInput = _bufferFrom(jws.protected + "." + jws.payload, "ascii");
|
|
34625
35158
|
var key;
|
|
34626
35159
|
try {
|
|
34627
35160
|
key = await webcrypto.subtle.importKey("jwk", jwk, _importParams(checked.algRow, jwk), false, ["verify"]);
|
|
@@ -34633,12 +35166,26 @@ var require_jose = __commonJS({
|
|
|
34633
35166
|
return { header, payload: b64uDecode(jws.payload), keySource };
|
|
34634
35167
|
}
|
|
34635
35168
|
var _SIGN_KEYS = { protected: 1, payload: 1, key: 1, jwk: 1, profile: 1 };
|
|
35169
|
+
var _SIGN_KEYS_EMBEDDED_JWK = { protected: 1, payload: 1, key: 1, profile: 1 };
|
|
34636
35170
|
async function sign(opts) {
|
|
34637
35171
|
opts = opts || {};
|
|
34638
35172
|
guard.identifier.assertKnownKeys(opts, _SIGN_KEYS, E, "jose/bad-input", "unknown pki.jose.sign option ");
|
|
34639
|
-
var
|
|
35173
|
+
var headerJson;
|
|
35174
|
+
try {
|
|
35175
|
+
headerJson = _stringify(opts.protected);
|
|
35176
|
+
} catch (e) {
|
|
35177
|
+
throw E("jose/bad-header", "the protected header must be JSON-serializable", e);
|
|
35178
|
+
}
|
|
35179
|
+
var headerBytes = headerJson === void 0 ? null : _bufferFrom(headerJson, "utf8");
|
|
35180
|
+
var header = headerBytes === null ? opts.protected : parseJson(headerBytes);
|
|
35181
|
+
var embedsJwk = !!(header && typeof header === "object" && header.jwk);
|
|
35182
|
+
if (embedsJwk) {
|
|
35183
|
+
guard.identifier.assertKnownKeys(opts, _SIGN_KEYS_EMBEDDED_JWK, E, "jose/bad-input", function(k) {
|
|
35184
|
+
return "unknown pki.jose.sign option " + _stringify(k) + (k === "jwk" ? "; the protected header already embeds the public JWK" : "");
|
|
35185
|
+
});
|
|
35186
|
+
}
|
|
34640
35187
|
var payload = opts.payload;
|
|
34641
|
-
if (!
|
|
35188
|
+
if (!_isBuffer(payload)) throw E("jose/bad-input", "payload must be a Buffer (empty Buffer for POST-as-GET)");
|
|
34642
35189
|
payload = guard.bytes.view(payload, JoseError, "jose/bad-input", "payload");
|
|
34643
35190
|
if (!wcEngine.isCryptoKeyLike(opts.key)) throw E("jose/bad-input", "a private or secret CryptoKey (opts.key) is required");
|
|
34644
35191
|
var checked = _checkHeader(header, opts.profile || "acme-outer");
|
|
@@ -34649,12 +35196,12 @@ var require_jose = __commonJS({
|
|
|
34649
35196
|
_assertKeyType(checked.algRow, header.jwk);
|
|
34650
35197
|
assertPublicJwk(header.jwk);
|
|
34651
35198
|
}
|
|
34652
|
-
var protectedB64 = b64uEncode(
|
|
35199
|
+
var protectedB64 = b64uEncode(headerBytes);
|
|
34653
35200
|
var payloadB64 = payload.length === 0 ? "" : b64uEncode(payload);
|
|
34654
|
-
var signingInput =
|
|
35201
|
+
var signingInput = _bufferFrom(protectedB64 + "." + payloadB64, "ascii");
|
|
34655
35202
|
var jwk = header.jwk || opts.jwk || {};
|
|
34656
35203
|
var signKey = await wcEngine.adoptKey(opts.key, null, ["sign"], E, "jose/bad-input");
|
|
34657
|
-
var sigBuf =
|
|
35204
|
+
var sigBuf = _bufferFrom(await webcrypto.subtle.sign(_cryptoAlg(checked.algRow, jwk, signKey), signKey, signingInput));
|
|
34658
35205
|
var want = _expectedSigBytes(checked.algRow, jwk, opts.key);
|
|
34659
35206
|
if (want != null && sigBuf.length !== want) throw E("jose/bad-key", "the signing key produced a " + sigBuf.length + "-byte signature but " + checked.alg + " requires " + want + " (the key does not match the algorithm)");
|
|
34660
35207
|
if (header.jwk) {
|
|
@@ -34681,19 +35228,19 @@ var require_jose = __commonJS({
|
|
|
34681
35228
|
async function thumbprint(jwk) {
|
|
34682
35229
|
if (!jwk || typeof jwk !== "object" || typeof jwk.kty !== "string") throw E("jose/bad-key", "a JWK object with a kty is required");
|
|
34683
35230
|
var members = THUMBPRINT_MEMBERS[jwk.kty];
|
|
34684
|
-
if (!members) throw E("jose/bad-key", "unsupported JWK key type " +
|
|
35231
|
+
if (!members) throw E("jose/bad-key", "unsupported JWK key type " + _stringify(jwk.kty));
|
|
34685
35232
|
var parts = [];
|
|
34686
35233
|
for (var i = 0; i < members.length; i++) {
|
|
34687
35234
|
var m = members[i];
|
|
34688
|
-
if (typeof jwk[m] !== "string") throw E("jose/bad-key", "the JWK is missing the required member " +
|
|
34689
|
-
parts
|
|
35235
|
+
if (typeof jwk[m] !== "string") throw E("jose/bad-key", "the JWK is missing the required member " + _stringify(m));
|
|
35236
|
+
_push(parts, _stringify(m) + ":" + _stringify(jwk[m]));
|
|
34690
35237
|
}
|
|
34691
|
-
var canonical = "{" + parts
|
|
34692
|
-
var digest =
|
|
35238
|
+
var canonical = "{" + _join(parts, ",") + "}";
|
|
35239
|
+
var digest = _bufferFrom(await webcrypto.subtle.digest("SHA-256", _bufferFrom(canonical, "utf8")));
|
|
34693
35240
|
return b64uEncode(digest);
|
|
34694
35241
|
}
|
|
34695
35242
|
function sigAlgs() {
|
|
34696
|
-
return
|
|
35243
|
+
return _map(_keys(SIG_ALGS), function(alg) {
|
|
34697
35244
|
var row = SIG_ALGS[alg];
|
|
34698
35245
|
var out = { alg, kty: row.kty };
|
|
34699
35246
|
if (row.crv) out.crv = row.crv;
|
|
@@ -34732,6 +35279,8 @@ var require_acme = __commonJS({
|
|
|
34732
35279
|
var httpTransport = require_http_transport();
|
|
34733
35280
|
var retryAfter = require_http_retry_after();
|
|
34734
35281
|
var guard = require_guard_all();
|
|
35282
|
+
var intrinsic = require_guard_intrinsic();
|
|
35283
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
34735
35284
|
var pkgVersion = require_package().version;
|
|
34736
35285
|
var AcmeError = frameworkError.AcmeError;
|
|
34737
35286
|
function E(code, message, cause) {
|
|
@@ -34888,7 +35437,7 @@ var require_acme = __commonJS({
|
|
|
34888
35437
|
var spec = SPECS[kind];
|
|
34889
35438
|
for (var f = 0; f < spec.length; f++) {
|
|
34890
35439
|
var field = spec[f];
|
|
34891
|
-
var present =
|
|
35440
|
+
var present = _hasOwn(obj, field.name);
|
|
34892
35441
|
var required = field.required || field.requiredWhen && field.requiredWhen(obj);
|
|
34893
35442
|
if (!present) {
|
|
34894
35443
|
if (required) throw E("acme/missing-field", "an ACME " + kind + " is missing the required field " + JSON.stringify(field.name));
|
|
@@ -34998,14 +35547,14 @@ var require_acme = __commonJS({
|
|
|
34998
35547
|
var ERROR_NAMESPACE = "urn:ietf:params:acme:error:";
|
|
34999
35548
|
function validateProblem(obj) {
|
|
35000
35549
|
if (!_isObject(obj)) throw E("acme/bad-problem", "a problem document must be a JSON object");
|
|
35001
|
-
if (
|
|
35550
|
+
if (_hasOwn(obj, "identifier")) throw E("acme/bad-problem", "a top-level problem document must not carry an identifier (RFC 8555 sec. 6.7.1)");
|
|
35002
35551
|
if (!_isString(obj.type) || obj.type.indexOf(ERROR_NAMESPACE) !== 0) throw E("acme/bad-problem", "an ACME problem type must be in the " + ERROR_NAMESPACE + " namespace (RFC 8555 sec. 6.7)");
|
|
35003
|
-
if (
|
|
35552
|
+
if (_hasOwn(obj, "subproblems")) {
|
|
35004
35553
|
if (!Array.isArray(obj.subproblems)) throw E("acme/bad-problem", "subproblems must be an array");
|
|
35005
35554
|
for (var i = 0; i < obj.subproblems.length; i++) {
|
|
35006
35555
|
var sub = obj.subproblems[i];
|
|
35007
35556
|
if (!_isObject(sub) || !_isString(sub.type) || sub.type.indexOf(ERROR_NAMESPACE) !== 0) throw E("acme/bad-problem", "each subproblem must be an ACME problem document in the error namespace");
|
|
35008
|
-
if (
|
|
35557
|
+
if (_hasOwn(sub, "identifier")) _validateOrderIdentifier(sub.identifier);
|
|
35009
35558
|
}
|
|
35010
35559
|
}
|
|
35011
35560
|
return obj;
|
|
@@ -35019,7 +35568,7 @@ var require_acme = __commonJS({
|
|
|
35019
35568
|
function identify(obj) {
|
|
35020
35569
|
if (!_isObject(obj)) return "unknown";
|
|
35021
35570
|
var has = function(k) {
|
|
35022
|
-
return
|
|
35571
|
+
return _hasOwn(obj, k);
|
|
35023
35572
|
};
|
|
35024
35573
|
if (has("protected") && has("signature") && _isString(obj.protected) && _isString(obj.signature)) return "jws";
|
|
35025
35574
|
if (_isString(obj.type) && obj.type.indexOf(ERROR_NAMESPACE) === 0) return "problem";
|
|
@@ -35115,8 +35664,8 @@ var require_acme = __commonJS({
|
|
|
35115
35664
|
}
|
|
35116
35665
|
function _outerHeader(o) {
|
|
35117
35666
|
var h = { alg: o.alg, nonce: o.nonce, url: o.url };
|
|
35118
|
-
if (
|
|
35119
|
-
if (
|
|
35667
|
+
if (_hasOwn(o, "kid")) h.kid = o.kid;
|
|
35668
|
+
if (_hasOwn(o, "jwk")) h.jwk = o.jwk;
|
|
35120
35669
|
return h;
|
|
35121
35670
|
}
|
|
35122
35671
|
function _payloadBuf(obj) {
|
|
@@ -35127,7 +35676,7 @@ var require_acme = __commonJS({
|
|
|
35127
35676
|
function _signOuter(o, payloadObj) {
|
|
35128
35677
|
if (!_isObject(o)) throw E("acme/bad-input", "a request options object is required");
|
|
35129
35678
|
if (!o.key) throw E("acme/bad-input", "a signing key (opts.key) is required");
|
|
35130
|
-
return jose.sign({ protected: _outerHeader(o), payload: _payloadBuf(payloadObj), key: o.key,
|
|
35679
|
+
return jose.sign({ protected: _outerHeader(o), payload: _payloadBuf(payloadObj), key: o.key, profile: "acme-outer" });
|
|
35131
35680
|
}
|
|
35132
35681
|
function postAsGet(o) {
|
|
35133
35682
|
return _promised(function() {
|
|
@@ -35167,7 +35716,7 @@ var require_acme = __commonJS({
|
|
|
35167
35716
|
if (!_isObject(o.externalAccountBinding)) throw E("acme/bad-input", "externalAccountBinding must be an EAB inner JWS object");
|
|
35168
35717
|
payload.externalAccountBinding = o.externalAccountBinding;
|
|
35169
35718
|
}
|
|
35170
|
-
return jose.sign({ protected: { alg: o.alg, nonce: o.nonce, url: o.url, jwk: o.jwk }, payload: _payloadBuf(payload), key: o.key,
|
|
35719
|
+
return jose.sign({ protected: { alg: o.alg, nonce: o.nonce, url: o.url, jwk: o.jwk }, payload: _payloadBuf(payload), key: o.key, profile: "acme-outer" });
|
|
35171
35720
|
});
|
|
35172
35721
|
}
|
|
35173
35722
|
var _HMAC_HASH = { HS256: "SHA-256", HS384: "SHA-384", HS512: "SHA-512" };
|
|
@@ -35343,8 +35892,8 @@ var require_acme = __commonJS({
|
|
|
35343
35892
|
return _promised(function() {
|
|
35344
35893
|
if (!_isObject(o) || !Buffer.isBuffer(o.certificate)) throw E("acme/bad-input", "revokeCert requires a DER certificate Buffer (opts.certificate)");
|
|
35345
35894
|
x509.parse(o.certificate);
|
|
35346
|
-
var hasKid =
|
|
35347
|
-
var hasJwk =
|
|
35895
|
+
var hasKid = _hasOwn(o, "kid");
|
|
35896
|
+
var hasJwk = _hasOwn(o, "jwk");
|
|
35348
35897
|
if (hasKid === hasJwk) throw E("acme/bad-input", "revokeCert must be signed with EXACTLY ONE of the account kid or the certificate jwk (RFC 8555 sec. 7.6)");
|
|
35349
35898
|
var payload = { certificate: jose.base64url.encode(o.certificate) };
|
|
35350
35899
|
if (o.reason !== void 0) {
|
|
@@ -35356,7 +35905,7 @@ var require_acme = __commonJS({
|
|
|
35356
35905
|
var header = { alg: o.alg, nonce: o.nonce, url: o.url };
|
|
35357
35906
|
if (hasKid) header.kid = o.kid;
|
|
35358
35907
|
else header.jwk = o.jwk;
|
|
35359
|
-
return jose.sign({ protected: header, payload: _payloadBuf(payload), key: o.key,
|
|
35908
|
+
return jose.sign({ protected: header, payload: _payloadBuf(payload), key: o.key, profile: "acme-outer" });
|
|
35360
35909
|
});
|
|
35361
35910
|
}
|
|
35362
35911
|
async function keyChange(o) {
|
|
@@ -35370,7 +35919,6 @@ var require_acme = __commonJS({
|
|
|
35370
35919
|
protected: { alg: o.newAlg, url: o.url, jwk: o.newJwk },
|
|
35371
35920
|
payload: _payloadBuf({ account: o.account, oldKey: o.oldKey }),
|
|
35372
35921
|
key: o.newKey,
|
|
35373
|
-
jwk: o.newJwk,
|
|
35374
35922
|
profile: "keychange-inner"
|
|
35375
35923
|
});
|
|
35376
35924
|
return jose.sign({ protected: { alg: o.alg, nonce: o.nonce, url: o.url, kid: o.kid }, payload: _payloadBuf(inner), key: o.key, profile: "acme-outer" });
|
|
@@ -35676,7 +36224,7 @@ var require_acme = __commonJS({
|
|
|
35676
36224
|
function _parseLinkAlternates(headers, base) {
|
|
35677
36225
|
var raw = null;
|
|
35678
36226
|
for (var k in headers) {
|
|
35679
|
-
if (
|
|
36227
|
+
if (_hasOwn(headers, k) && k.toLowerCase() === "link") {
|
|
35680
36228
|
raw = headers[k];
|
|
35681
36229
|
break;
|
|
35682
36230
|
}
|
|
@@ -36288,6 +36836,8 @@ var require_trust = __commonJS({
|
|
|
36288
36836
|
var errors = require_framework_error();
|
|
36289
36837
|
var asn1 = require_asn1_der();
|
|
36290
36838
|
var guard = require_guard_all();
|
|
36839
|
+
var intrinsic = require_guard_intrinsic();
|
|
36840
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
36291
36841
|
var x509 = require_schema_x509();
|
|
36292
36842
|
var TrustError = errors.TrustError;
|
|
36293
36843
|
var LIMITS = constants.LIMITS;
|
|
@@ -36737,7 +37287,7 @@ var require_trust = __commonJS({
|
|
|
36737
37287
|
var t = tok.trim();
|
|
36738
37288
|
if (t === "") return;
|
|
36739
37289
|
var l = t.toLowerCase();
|
|
36740
|
-
if (!
|
|
37290
|
+
if (!_hasOwn(_TRUST_BIT_TOKENS, l)) {
|
|
36741
37291
|
throw E("trust/bad-csv", "unrecognized Trust Bits token " + JSON.stringify(t));
|
|
36742
37292
|
}
|
|
36743
37293
|
var p = _TRUST_BIT_TOKENS[l];
|
|
@@ -38417,6 +38967,8 @@ var require_webauthn_mds = __commonJS({
|
|
|
38417
38967
|
var frameworkError = require_framework_error();
|
|
38418
38968
|
var x509 = require_schema_x509();
|
|
38419
38969
|
var guard = require_guard_all();
|
|
38970
|
+
var intrinsic = require_guard_intrinsic();
|
|
38971
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
38420
38972
|
var jose = require_jose();
|
|
38421
38973
|
var rfc3339 = require_rfc3339();
|
|
38422
38974
|
var constants = require_constants();
|
|
@@ -38634,7 +39186,7 @@ var require_webauthn_mds = __commonJS({
|
|
|
38634
39186
|
if (header.x5u !== void 0) {
|
|
38635
39187
|
throw _err("webauthn/bad-metadata-blob", "the metadata BLOB header carries x5u, which names a chain to fetch; supply a BLOB with an inline x5c instead");
|
|
38636
39188
|
}
|
|
38637
|
-
if (
|
|
39189
|
+
if (_hasOwn(header, "crit")) {
|
|
38638
39190
|
var crit = header.crit;
|
|
38639
39191
|
if (!Array.isArray(crit) || crit.length === 0) {
|
|
38640
39192
|
throw _err("webauthn/bad-metadata-blob", "the metadata BLOB header crit must be a non-empty array (RFC 7515 sec. 4.1.11)");
|
|
@@ -39072,6 +39624,8 @@ var require_webauthn = __commonJS({
|
|
|
39072
39624
|
var validator = require_validator_all();
|
|
39073
39625
|
var edwardsPoint = require_edwards_point();
|
|
39074
39626
|
var guard = require_guard_all();
|
|
39627
|
+
var intrinsic = require_guard_intrinsic();
|
|
39628
|
+
var _hasOwn = intrinsic.hasOwn;
|
|
39075
39629
|
var jose = require_jose();
|
|
39076
39630
|
var mds = require_webauthn_mds();
|
|
39077
39631
|
var nodeCrypto = require("crypto");
|
|
@@ -40284,7 +40838,7 @@ var require_webauthn = __commonJS({
|
|
|
40284
40838
|
guard.identifier.assertKnownKeys(input, _ASSERT_OPTS, _err, "webauthn/bad-input", "verifyAssertion input has an unknown key ");
|
|
40285
40839
|
var out = {}, k;
|
|
40286
40840
|
for (k in input) {
|
|
40287
|
-
if (
|
|
40841
|
+
if (_hasOwn(input, k)) out[k] = input[k];
|
|
40288
40842
|
}
|
|
40289
40843
|
["authenticatorData", "clientDataJSON", "clientDataHash", "signature", "expectedChallenge"].forEach(function(f) {
|
|
40290
40844
|
if (_isBufferSource(out[f])) out[f] = guard.bytes.snapshotSource(out[f], WebauthnError, "webauthn/bad-input", f);
|
|
@@ -40299,7 +40853,7 @@ var require_webauthn = __commonJS({
|
|
|
40299
40853
|
} else if (_isPlainObject(out.credentialPublicKey)) {
|
|
40300
40854
|
var key = {}, kk;
|
|
40301
40855
|
for (kk in out.credentialPublicKey) {
|
|
40302
|
-
if (!
|
|
40856
|
+
if (!_hasOwn(out.credentialPublicKey, kk)) continue;
|
|
40303
40857
|
var v;
|
|
40304
40858
|
try {
|
|
40305
40859
|
v = out.credentialPublicKey[kk];
|