@blamejs/core 0.12.35 → 0.12.36
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 +2 -0
- package/README.md +1 -1
- package/lib/cose.js +182 -0
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,8 @@ upgrading across more than a few patches at a time.
|
|
|
8
8
|
|
|
9
9
|
## v0.12.x
|
|
10
10
|
|
|
11
|
+
- v0.12.36 (2026-05-24) — **`b.cose.encrypt0` / `b.cose.decrypt0` — COSE_Encrypt0 single-recipient AEAD (RFC 9052 §5.2).** Completes the COSE family with encryption alongside the v0.12.33 signing: COSE_Encrypt0 is the single-recipient AEAD container where the recipient already holds the symmetric key (direct mode). The default algorithm is ChaCha20/Poly1305 (COSE alg 24) — AES-GCM stays opt-in, since hard-rule #2 forbids AES-GCM as a default. The Enc_structure (`["Encrypt0", protected, external_aad]`) is bound as the AEAD associated data so the algorithm + any external context are authenticated, and the authentication tag is appended to the ciphertext per COSE. Composes the in-tree `b.cbor` codec and `node:crypto` AEAD. **Added:** *`b.cose.encrypt0(plaintext, opts)` / `b.cose.decrypt0(coseEncrypt0, opts)`* — `encrypt0` produces a tagged COSE_Encrypt0 with `alg` in the protected header and a random 12-byte IV in the unprotected header (label 5); `alg` is `"ChaCha20-Poly1305"` (default), `"A256GCM"`, or `"A128GCM"`, with the key length enforced (32 / 16 bytes). `decrypt0` reads the algorithm from the protected header (must be in the required `opts.algorithms` allowlist), reconstructs the Enc_structure as the AEAD AAD, and returns `{ plaintext, alg, protectedHeaders, unprotectedHeaders }`; a wrong key, tampered ciphertext, or `external_aad` mismatch fails AEAD authentication and is refused with `cose/decrypt-failed`. `external_aad` binds request context into the tag.
|
|
12
|
+
|
|
11
13
|
- v0.12.35 (2026-05-24) — **`b.eat` — Entity Attestation Token (RFC 9711) over `b.cwt`.** An EAT is the token a Relying Party asks a device or software entity to produce to prove what it is and what state it is in — a freshness nonce, a Universal Entity ID, OEM / hardware identifiers, debug status, software measurements, and nested submodule attestations. `b.eat` is the RFC 9711 profile over the v0.12.34 `b.cwt`: it maps the EAT claim names to their IANA CWT claim-key integer labels and adds the attestation-specific verification on top of the CWT signature + time checks. The central control is the verifier-nonce binding: when the Relying Party supplies a fresh `expectedNonce`, the token's `eat_nonce` (claim 10) must match it (constant-time compare) — without it a captured attestation replays forever. `verify` also enforces a debug-status policy (`requireDebugDisabled` refuses an `enabled` or absent `dbgstat`) and pins the `eat_profile`. RFC 9711 is a finalized standard; signing follows `b.cwt` / `b.cose` (ES256/384/512 + EdDSA interoperable today, ML-DSA-87 PQC-forward). **Added:** *`b.eat.sign(claims, opts)` / `b.eat.verify(eat, opts)`* — `sign` maps EAT claim names (`nonce`, `ueid`, `oemid`, `hwmodel`, `dbgstat`, `eat_profile`, `swname`/`swversion`, `measurements`, `submods`, …) to their RFC 9711 integer labels and accepts the `dbgstat` enum by name (`disabled-since-boot` → 2); standard CWT claims (`iss` / `exp` / …) pass through. `verify` returns `{ claims, raw, alg, protectedHeaders }` with the labels mapped back to friendly names and `dbgstat` decoded to its enum name. Attestation enforcement: `expectedNonce` requires a matching `eat_nonce` (refused `eat/nonce-mismatch`, missing `eat/nonce-missing` — `eat_nonce` may be a single byte string or an array for multiple verifiers), `requireDebugDisabled` refuses a non-disabled `dbgstat` (`eat/debug-not-disabled`), and `expectedProfile` pins `eat_profile`. The signature, algorithm allowlist, and `exp`/`nbf` checks delegate to `b.cwt` / `b.cose`. · *`b.cwt.sign` accepts a `Map`* — `b.cwt.sign` now takes either a plain object (string keys, standard claims mapped by name) or a `Map`, which preserves integer claim keys verbatim — profiles like `b.eat` resolve their claim names to integer labels and pass them through without the keys being stringified. The plain-object path is unchanged.
|
|
12
14
|
|
|
13
15
|
- v0.12.34 (2026-05-24) — **`b.cwt` — CBOR Web Token (RFC 8392) sign / verify over `b.cose`.** A CWT is the CBOR-native counterpart to JWT — a signed claims set for constrained / IoT, FIDO attestation, and verifiable-credential contexts. `b.cwt` composes the v0.12.33 `b.cose` (COSE_Sign1 signature + mandatory algorithm allowlist) and v0.12.32 `b.cbor` (deterministic claims encoding) and layers the standard-claim handling on top: `sign` takes a friendly claims object, maps the standard claims to their RFC 8392 §3.1.1 integer labels (iss=1, sub=2, aud=3, exp=4, nbf=5, iat=6, cti=7), and signs; `verify` checks the COSE signature, decodes the claims, and enforces the time + identity claims — a passed `exp` (with clock-skew tolerance), a future `nbf`, and an `iss` / `aud` mismatch against the expected values are each refused. Signing algorithms follow `b.cose`: classical ES256/384/512 + EdDSA (final COSE ids, interoperable today) and ML-DSA-87 (PQC-forward). RFC 8392 is a finalized standard, so CWTs produced here interoperate with other COSE/CWT implementations. **Added:** *`b.cwt.sign(claims, opts)` / `b.cwt.verify(cwt, opts)`* — `sign` maps standard claim names to integer labels and keeps custom claims verbatim; `exp` / `nbf` / `iat` must be non-negative integer NumericDates. `opts.tagged` wraps the COSE_Sign1 in the CWT CBOR tag 61 (RFC 8392 §6); `verify` accepts tagged or bare input. `verify` returns `{ claims, raw, alg, protectedHeaders }` — `claims` is the friendly object (labels mapped back to names), `raw` the integer-keyed Map. Standard-claim enforcement: `exp` past `now + clockSkewSec` (default 60s) is refused with `cwt/expired`, `nbf` beyond `now - skew` with `cwt/not-yet-valid`, and `expectedIssuer` / `expectedAudience` mismatches with `cwt/issuer-mismatch` / `cwt/audience-mismatch` (aud may be a single value or an array). `opts.now` overrides the clock for testing. The signature itself is verified by `b.cose.verify`, so a tampered token fails there.
|
package/README.md
CHANGED
|
@@ -126,7 +126,7 @@ The framework bundles the surface a typical Node app reaches for. Every primitiv
|
|
|
126
126
|
- **JSON / SQL / schema** — `b.safeJson` (with `maxKeys` cap defending CVE-2026-21717 V8 HashDoS), `b.safeBuffer`, `b.safeSql`, `b.safeSchema`
|
|
127
127
|
- **URL + path** — `b.safeUrl` (IDN mixed-script / homograph refuse); `b.safeJsonPath` (refuses filter `?(...)`, deep-scan `$..`, script-shape `(@.x)` for safe Postgres JSONB ops)
|
|
128
128
|
- **Binary codec** — `b.cbor` bounded deterministic CBOR (RFC 8949 §4.2): depth/size caps, indefinite-length + reserved-info + tag + duplicate-key refusal, `requireDeterministic` canonical-form check; the in-tree substrate under COSE / CWT / SCITT / WebAuthn attestation
|
|
129
|
-
- **COSE signing** — `b.cose` COSE_Sign1 sign/verify (RFC 9052) over `b.cbor`: classical ES256/384/512 + EdDSA (final COSE ids, interoperable today) plus ML-DSA-87 (PQC-forward, draft id); bounded + alg-allowlisted + crit-bypass-checked verification; the signed-statement substrate under SCITT / CWT / C2PA
|
|
129
|
+
- **COSE signing + encryption** — `b.cose` COSE_Sign1 sign/verify + COSE_Encrypt0 (RFC 9052) over `b.cbor`: classical ES256/384/512 + EdDSA (final COSE ids, interoperable today) plus ML-DSA-87 (PQC-forward, draft id); bounded + alg-allowlisted + crit-bypass-checked verification; single-recipient AEAD (ChaCha20/Poly1305 default, AES-GCM opt-in) with Enc_structure-bound AAD; the signed-statement substrate under SCITT / CWT / C2PA
|
|
130
130
|
- **CBOR Web Token** — `b.cwt` CWT sign/verify (RFC 8392) over `b.cose`: standard-claim mapping (iss/sub/aud/exp/nbf/iat/cti) + `exp`/`nbf` clock-skew enforcement + `iss`/`aud` matching; the CBOR-native JWT for constrained / IoT / FIDO / verifiable-credential contexts
|
|
131
131
|
- **Entity Attestation Token** — `b.eat` EAT sign/verify (RFC 9711) over `b.cwt`: device + software attestation claims (ueid / oemid / hwmodel / measurements / submods) with verifier-nonce freshness binding, `dbgstat` debug-status policy, and `eat_profile` pinning
|
|
132
132
|
- **Document parsers** — `b.parsers` (XML / TOML / YAML / .env); `b.config` (schema-validated env)
|
package/lib/cose.js
CHANGED
|
@@ -330,10 +330,192 @@ async function verify(coseSign1, opts) {
|
|
|
330
330
|
};
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
+
// ---- COSE_Encrypt0 (RFC 9052 §5.2) — single-recipient AEAD ----
|
|
334
|
+
|
|
335
|
+
var COSE_ENCRYPT0_TAG = 16; // allow:raw-byte-literal — RFC 9052 COSE_Encrypt0 CBOR tag
|
|
336
|
+
var HDR_IV = 5; // RFC 9052 §3.1 unprotected header label: IV
|
|
337
|
+
var AEAD_TAG_LEN = 16; // allow:raw-byte-literal — AEAD authentication tag length (bytes)
|
|
338
|
+
|
|
339
|
+
// AEAD algorithm: COSE id → node cipher + key / IV sizes. ChaCha20/
|
|
340
|
+
// Poly1305 (24) is the default; AES-GCM is opt-in (project hard-rule
|
|
341
|
+
// #2 forbids AES-GCM as a default).
|
|
342
|
+
var AEAD_NAME_TO_ID = { "ChaCha20-Poly1305": 24, "A256GCM": 3, "A128GCM": 1 }; // allow:raw-byte-literal — COSE AEAD algorithm identifiers (RFC 9053), not sizes
|
|
343
|
+
var AEAD_ID_TO_NAME = {};
|
|
344
|
+
Object.keys(AEAD_NAME_TO_ID).forEach(function (k) { AEAD_ID_TO_NAME[AEAD_NAME_TO_ID[k]] = k; });
|
|
345
|
+
|
|
346
|
+
function _aeadParams(algId) {
|
|
347
|
+
switch (algId) {
|
|
348
|
+
case 24: return { cipher: "chacha20-poly1305", keyLen: 32, ivLen: 12 }; // allow:raw-byte-literal — ChaCha20/Poly1305 key+IV sizes
|
|
349
|
+
case 3: return { cipher: "aes-256-gcm", keyLen: 32, ivLen: 12 }; // allow:raw-byte-literal — AES-256-GCM key+IV sizes
|
|
350
|
+
case 1: return { cipher: "aes-128-gcm", keyLen: 16, ivLen: 12 }; // allow:raw-byte-literal — AES-128-GCM key+IV sizes
|
|
351
|
+
default:
|
|
352
|
+
throw new CoseError("cose/unknown-alg", "cose: unrecognized AEAD COSE alg id " + algId);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Enc_structure (§5.3) = [ "Encrypt0", body_protected (bstr), external_aad (bstr) ]
|
|
357
|
+
// — deterministically CBOR-encoded, used as the AEAD associated data.
|
|
358
|
+
function _encStructure(protectedBstr, externalAad) {
|
|
359
|
+
return cbor.encode(["Encrypt0", protectedBstr, externalAad]);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* @primitive b.cose.encrypt0
|
|
364
|
+
* @signature b.cose.encrypt0(plaintext, opts)
|
|
365
|
+
* @since 0.12.36
|
|
366
|
+
* @status stable
|
|
367
|
+
* @related b.cose.decrypt0, b.cose.sign
|
|
368
|
+
*
|
|
369
|
+
* Encrypt bytes into a tagged COSE_Encrypt0 (RFC 9052 §5.2), a
|
|
370
|
+
* single-recipient AEAD container where the recipient already holds
|
|
371
|
+
* the symmetric key (direct mode). Default algorithm is
|
|
372
|
+
* <code>ChaCha20-Poly1305</code>; <code>A256GCM</code> / <code>A128GCM</code>
|
|
373
|
+
* are opt-in. The Enc_structure is bound as the AEAD associated data,
|
|
374
|
+
* and the authentication tag is appended to the ciphertext per COSE.
|
|
375
|
+
*
|
|
376
|
+
* @opts
|
|
377
|
+
* {
|
|
378
|
+
* alg: string, // "ChaCha20-Poly1305" (default) | "A256GCM" | "A128GCM"
|
|
379
|
+
* key: Buffer, // symmetric key (32 bytes for ChaCha/A256GCM, 16 for A128GCM)
|
|
380
|
+
* iv?: Buffer, // 12-byte IV (random if omitted)
|
|
381
|
+
* externalAad?: Buffer, // bound into the AEAD tag
|
|
382
|
+
* unprotectedHeaders?: object,
|
|
383
|
+
* }
|
|
384
|
+
*
|
|
385
|
+
* @example
|
|
386
|
+
* var enc = b.cose.encrypt0(Buffer.from("secret"), { alg: "ChaCha20-Poly1305", key: k });
|
|
387
|
+
*/
|
|
388
|
+
function encrypt0(plaintext, opts) {
|
|
389
|
+
validateOpts.requireObject(opts, "cose.encrypt0", CoseError);
|
|
390
|
+
validateOpts(opts, ["alg", "key", "iv", "externalAad", "unprotectedHeaders"], "cose.encrypt0");
|
|
391
|
+
var alg = opts.alg || "ChaCha20-Poly1305";
|
|
392
|
+
if (!(alg in AEAD_NAME_TO_ID)) {
|
|
393
|
+
throw new CoseError("cose/unknown-alg", "cose.encrypt0: alg must be one of " + Object.keys(AEAD_NAME_TO_ID).join(" / "));
|
|
394
|
+
}
|
|
395
|
+
var algId = AEAD_NAME_TO_ID[alg];
|
|
396
|
+
var p = _aeadParams(algId);
|
|
397
|
+
var key = _bstr(opts.key);
|
|
398
|
+
if (key.length !== p.keyLen) throw new CoseError("cose/bad-key", "cose.encrypt0: " + alg + " requires a " + p.keyLen + "-byte key");
|
|
399
|
+
var iv = opts.iv != null ? _bstr(opts.iv) : nodeCrypto.randomBytes(p.ivLen);
|
|
400
|
+
if (iv.length !== p.ivLen) throw new CoseError("cose/bad-iv", "cose.encrypt0: " + alg + " requires a " + p.ivLen + "-byte IV");
|
|
401
|
+
|
|
402
|
+
var protMap = new Map(); protMap.set(HDR_ALG, algId);
|
|
403
|
+
var protectedBstr = cbor.encode(protMap);
|
|
404
|
+
var aad = _encStructure(protectedBstr, opts.externalAad == null ? Buffer.alloc(0) : _bstr(opts.externalAad));
|
|
405
|
+
|
|
406
|
+
var cipher = nodeCrypto.createCipheriv(p.cipher, key, iv, { authTagLength: AEAD_TAG_LEN });
|
|
407
|
+
cipher.setAAD(aad);
|
|
408
|
+
var ct = Buffer.concat([cipher.update(_bstr(plaintext)), cipher.final()]);
|
|
409
|
+
var ciphertext = Buffer.concat([ct, cipher.getAuthTag()]); // COSE appends the auth tag to the ciphertext
|
|
410
|
+
|
|
411
|
+
var unprot = new Map(); unprot.set(HDR_IV, iv);
|
|
412
|
+
if (opts.unprotectedHeaders && typeof opts.unprotectedHeaders === "object") {
|
|
413
|
+
var uk = Object.keys(opts.unprotectedHeaders);
|
|
414
|
+
for (var i = 0; i < uk.length; i++) {
|
|
415
|
+
var label = Number(uk[i]);
|
|
416
|
+
// The IV (label 5) is managed via opts.iv and must match the IV
|
|
417
|
+
// the AEAD used — refuse an override that would emit a token whose
|
|
418
|
+
// stored IV disagrees with the one it was encrypted under.
|
|
419
|
+
if (label === HDR_IV) {
|
|
420
|
+
throw new CoseError("cose/reserved-header",
|
|
421
|
+
"cose.encrypt0: unprotectedHeaders must not set label 5 (IV) — pass opts.iv instead");
|
|
422
|
+
}
|
|
423
|
+
unprot.set(label, opts.unprotectedHeaders[uk[i]]);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return cbor.encode(new cbor.Tag(COSE_ENCRYPT0_TAG, [protectedBstr, unprot, ciphertext]));
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* @primitive b.cose.decrypt0
|
|
431
|
+
* @signature b.cose.decrypt0(coseEncrypt0, opts)
|
|
432
|
+
* @since 0.12.36
|
|
433
|
+
* @status stable
|
|
434
|
+
* @related b.cose.encrypt0
|
|
435
|
+
*
|
|
436
|
+
* Decrypt a COSE_Encrypt0 and return the plaintext. The algorithm is
|
|
437
|
+
* read from the protected header and must be in
|
|
438
|
+
* <code>opts.algorithms</code>; the Enc_structure is reconstructed as
|
|
439
|
+
* the AEAD associated data and authentication failure (wrong key /
|
|
440
|
+
* tampered ciphertext or AAD) is refused.
|
|
441
|
+
*
|
|
442
|
+
* @opts
|
|
443
|
+
* {
|
|
444
|
+
* key: Buffer, // symmetric key
|
|
445
|
+
* algorithms: string[], // required — accepted AEAD algs (allowlist)
|
|
446
|
+
* externalAad?: Buffer, // must match what was encrypted
|
|
447
|
+
* maxBytes?: number,
|
|
448
|
+
* maxDepth?: number,
|
|
449
|
+
* }
|
|
450
|
+
*
|
|
451
|
+
* @example
|
|
452
|
+
* var pt = b.cose.decrypt0(enc, { key: k, algorithms: ["ChaCha20-Poly1305"] }).plaintext;
|
|
453
|
+
*/
|
|
454
|
+
function decrypt0(coseEncrypt0, opts) {
|
|
455
|
+
validateOpts.requireObject(opts, "cose.decrypt0", CoseError);
|
|
456
|
+
validateOpts(opts, ["key", "algorithms", "externalAad", "maxBytes", "maxDepth"], "cose.decrypt0");
|
|
457
|
+
if (!Array.isArray(opts.algorithms) || opts.algorithms.length === 0) {
|
|
458
|
+
throw new CoseError("cose/algorithms-required", "cose.decrypt0: opts.algorithms is required (no defaults — name the accepted algorithms)");
|
|
459
|
+
}
|
|
460
|
+
var decoded = cbor.decode(_bstr(coseEncrypt0), { allowedTags: [COSE_ENCRYPT0_TAG], maxBytes: opts.maxBytes, maxDepth: opts.maxDepth });
|
|
461
|
+
var arr = (decoded instanceof cbor.Tag && decoded.tag === COSE_ENCRYPT0_TAG) ? decoded.value : decoded;
|
|
462
|
+
if (!Array.isArray(arr) || arr.length !== 3) {
|
|
463
|
+
throw new CoseError("cose/malformed", "cose.decrypt0: not a COSE_Encrypt0 (expected a 3-element array)");
|
|
464
|
+
}
|
|
465
|
+
var protectedBstr = arr[0], unprotected = arr[1], ciphertext = arr[2];
|
|
466
|
+
if (!Buffer.isBuffer(protectedBstr) || !Buffer.isBuffer(ciphertext)) {
|
|
467
|
+
throw new CoseError("cose/malformed", "cose.decrypt0: protected header and ciphertext must be byte strings");
|
|
468
|
+
}
|
|
469
|
+
if (!(unprotected instanceof Map)) {
|
|
470
|
+
throw new CoseError("cose/malformed", "cose.decrypt0: unprotected header must be a CBOR map");
|
|
471
|
+
}
|
|
472
|
+
var protMap = protectedBstr.length === 0 ? new Map()
|
|
473
|
+
: cbor.decode(protectedBstr, { maxBytes: opts.maxBytes, maxDepth: opts.maxDepth });
|
|
474
|
+
if (!(protMap instanceof Map)) {
|
|
475
|
+
throw new CoseError("cose/malformed", "cose.decrypt0: protected header is not a CBOR map");
|
|
476
|
+
}
|
|
477
|
+
var algId = protMap.get(HDR_ALG);
|
|
478
|
+
var algName = AEAD_ID_TO_NAME[algId];
|
|
479
|
+
if (algName === undefined) {
|
|
480
|
+
throw new CoseError("cose/unknown-alg", "cose.decrypt0: unrecognized AEAD alg id " + algId);
|
|
481
|
+
}
|
|
482
|
+
if (opts.algorithms.indexOf(algName) === -1) {
|
|
483
|
+
throw new CoseError("cose/alg-not-allowed", "cose.decrypt0: alg '" + algName + "' is not in the allowlist");
|
|
484
|
+
}
|
|
485
|
+
var p = _aeadParams(algId);
|
|
486
|
+
var key = _bstr(opts.key);
|
|
487
|
+
if (key.length !== p.keyLen) throw new CoseError("cose/bad-key", "cose.decrypt0: " + algName + " requires a " + p.keyLen + "-byte key");
|
|
488
|
+
var iv = unprotected.get(HDR_IV);
|
|
489
|
+
if (!Buffer.isBuffer(iv) || iv.length !== p.ivLen) {
|
|
490
|
+
throw new CoseError("cose/bad-iv", "cose.decrypt0: missing or wrong-length IV (unprotected label 5)");
|
|
491
|
+
}
|
|
492
|
+
if (ciphertext.length < AEAD_TAG_LEN) {
|
|
493
|
+
throw new CoseError("cose/malformed", "cose.decrypt0: ciphertext shorter than the AEAD tag");
|
|
494
|
+
}
|
|
495
|
+
var tag = ciphertext.subarray(ciphertext.length - AEAD_TAG_LEN);
|
|
496
|
+
var ct = ciphertext.subarray(0, ciphertext.length - AEAD_TAG_LEN);
|
|
497
|
+
var aad = _encStructure(protectedBstr, opts.externalAad == null ? Buffer.alloc(0) : _bstr(opts.externalAad));
|
|
498
|
+
|
|
499
|
+
var decipher = nodeCrypto.createDecipheriv(p.cipher, key, iv, { authTagLength: AEAD_TAG_LEN });
|
|
500
|
+
decipher.setAAD(aad);
|
|
501
|
+
decipher.setAuthTag(tag);
|
|
502
|
+
var pt;
|
|
503
|
+
try {
|
|
504
|
+
pt = Buffer.concat([decipher.update(ct), decipher.final()]);
|
|
505
|
+
} catch (_e) {
|
|
506
|
+
throw new CoseError("cose/decrypt-failed", "cose.decrypt0: AEAD authentication failed (wrong key, tampered ciphertext, or AAD mismatch)");
|
|
507
|
+
}
|
|
508
|
+
return { plaintext: pt, alg: algName, protectedHeaders: protMap, unprotectedHeaders: unprotected };
|
|
509
|
+
}
|
|
510
|
+
|
|
333
511
|
module.exports = {
|
|
334
512
|
sign: sign,
|
|
335
513
|
verify: verify,
|
|
514
|
+
encrypt0: encrypt0,
|
|
515
|
+
decrypt0: decrypt0,
|
|
336
516
|
ALGORITHMS: ALG_NAME_TO_ID,
|
|
517
|
+
AEAD_ALGORITHMS: AEAD_NAME_TO_ID,
|
|
337
518
|
COSE_SIGN1_TAG: COSE_SIGN1_TAG,
|
|
519
|
+
COSE_ENCRYPT0_TAG: COSE_ENCRYPT0_TAG,
|
|
338
520
|
CoseError: CoseError,
|
|
339
521
|
};
|
package/package.json
CHANGED
package/sbom.cdx.json
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
|
|
3
3
|
"bomFormat": "CycloneDX",
|
|
4
4
|
"specVersion": "1.5",
|
|
5
|
-
"serialNumber": "urn:uuid:
|
|
5
|
+
"serialNumber": "urn:uuid:0d92b39a-5bed-4091-9927-a887660568ee",
|
|
6
6
|
"version": 1,
|
|
7
7
|
"metadata": {
|
|
8
|
-
"timestamp": "2026-05-
|
|
8
|
+
"timestamp": "2026-05-25T00:19:35.328Z",
|
|
9
9
|
"lifecycles": [
|
|
10
10
|
{
|
|
11
11
|
"phase": "build"
|
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
}
|
|
20
20
|
],
|
|
21
21
|
"component": {
|
|
22
|
-
"bom-ref": "@blamejs/core@0.12.
|
|
22
|
+
"bom-ref": "@blamejs/core@0.12.36",
|
|
23
23
|
"type": "application",
|
|
24
24
|
"name": "blamejs",
|
|
25
|
-
"version": "0.12.
|
|
25
|
+
"version": "0.12.36",
|
|
26
26
|
"scope": "required",
|
|
27
27
|
"author": "blamejs contributors",
|
|
28
28
|
"description": "The Node framework that owns its stack.",
|
|
29
|
-
"purl": "pkg:npm/%40blamejs/core@0.12.
|
|
29
|
+
"purl": "pkg:npm/%40blamejs/core@0.12.36",
|
|
30
30
|
"properties": [],
|
|
31
31
|
"externalReferences": [
|
|
32
32
|
{
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"components": [],
|
|
55
55
|
"dependencies": [
|
|
56
56
|
{
|
|
57
|
-
"ref": "@blamejs/core@0.12.
|
|
57
|
+
"ref": "@blamejs/core@0.12.36",
|
|
58
58
|
"dependsOn": []
|
|
59
59
|
}
|
|
60
60
|
]
|