@synoi/sraid 0.2.0 → 0.4.0
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/README.md +156 -50
- package/SPEC.md +2 -2
- package/dist/attestation.d.ts +8 -49
- package/dist/attestation.d.ts.map +1 -1
- package/dist/attestation.js +15 -46
- package/dist/attestation.js.map +1 -1
- package/dist/capability.d.ts +59 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +44 -0
- package/dist/capability.js.map +1 -0
- package/dist/index.d.ts +13 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -18
- package/dist/index.js.map +1 -1
- package/dist/internal/attestation-core.d.ts +85 -0
- package/dist/internal/attestation-core.d.ts.map +1 -0
- package/dist/internal/attestation-core.js +78 -0
- package/dist/internal/attestation-core.js.map +1 -0
- package/dist/internal/base64-browser.d.ts +31 -0
- package/dist/internal/base64-browser.d.ts.map +1 -0
- package/dist/internal/base64-browser.js +39 -0
- package/dist/internal/base64-browser.js.map +1 -0
- package/dist/internal/base64-validate.d.ts +19 -0
- package/dist/internal/base64-validate.d.ts.map +1 -0
- package/dist/internal/base64-validate.js +33 -0
- package/dist/internal/base64-validate.js.map +1 -0
- package/dist/internal/base64.d.ts +7 -5
- package/dist/internal/base64.d.ts.map +1 -1
- package/dist/internal/base64.js +7 -19
- package/dist/internal/base64.js.map +1 -1
- package/dist/internal/content-core.d.ts +68 -0
- package/dist/internal/content-core.d.ts.map +1 -0
- package/dist/internal/content-core.js +87 -0
- package/dist/internal/content-core.js.map +1 -0
- package/dist/internal/ed25519-browser.d.ts +33 -0
- package/dist/internal/ed25519-browser.d.ts.map +1 -0
- package/dist/internal/ed25519-browser.js +79 -0
- package/dist/internal/ed25519-browser.js.map +1 -0
- package/dist/internal/mldsa-browser.d.ts +27 -0
- package/dist/internal/mldsa-browser.d.ts.map +1 -0
- package/dist/internal/mldsa-browser.js +35 -0
- package/dist/internal/mldsa-browser.js.map +1 -0
- package/dist/internal/sha256-browser.d.ts +17 -0
- package/dist/internal/sha256-browser.d.ts.map +1 -0
- package/dist/internal/sha256-browser.js +27 -0
- package/dist/internal/sha256-browser.js.map +1 -0
- package/dist/lineage.js +0 -0
- package/dist/lineage.js.map +1 -1
- package/dist/oid.d.ts +2 -52
- package/dist/oid.d.ts.map +1 -1
- package/dist/oid.js +9 -71
- package/dist/oid.js.map +1 -1
- package/dist/types.d.ts +4 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts +2 -17
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +0 -57
- package/dist/validate.js.map +1 -1
- package/dist/verify-browser.d.ts +80 -0
- package/dist/verify-browser.d.ts.map +1 -0
- package/dist/verify-browser.js +157 -0
- package/dist/verify-browser.js.map +1 -0
- package/package.json +22 -3
- package/src/attestation.ts +29 -88
- package/src/capability.ts +69 -0
- package/src/index.ts +27 -36
- package/src/internal/attestation-core.ts +122 -0
- package/src/internal/base64-browser.ts +39 -0
- package/src/internal/base64-validate.ts +31 -0
- package/src/internal/base64.ts +7 -16
- package/src/internal/content-core.ts +88 -0
- package/src/internal/ed25519-browser.ts +85 -0
- package/src/internal/mldsa-browser.ts +39 -0
- package/src/internal/sha256-browser.ts +28 -0
- package/src/lineage.ts +0 -0
- package/src/oid.ts +10 -73
- package/src/types.ts +23 -31
- package/src/validate.ts +1 -64
- package/src/verify-browser.ts +185 -0
- package/dist/authority.d.ts +0 -351
- package/dist/authority.d.ts.map +0 -1
- package/dist/authority.js +0 -563
- package/dist/authority.js.map +0 -1
- package/src/authority.ts +0 -849
package/dist/validate.js
CHANGED
|
@@ -279,61 +279,4 @@ function validateAttestationEnvelopeShape(x) {
|
|
|
279
279
|
}
|
|
280
280
|
return errors;
|
|
281
281
|
}
|
|
282
|
-
// ── SRO validation ───────────────────────────────────────────────────────────
|
|
283
|
-
/**
|
|
284
|
-
* Validate that `x` matches the SRO shape — a CDRO whose `type` is
|
|
285
|
-
* "sraid:sro" and whose `body` carries predecessor/successor pointers and
|
|
286
|
-
* an authorizer. Reuses validateCdro and layers SRO-specific checks on
|
|
287
|
-
* top.
|
|
288
|
-
*
|
|
289
|
-
* [S01] envelope is not a valid CDRO
|
|
290
|
-
* [S02] type is not "sraid:sro"
|
|
291
|
-
* [S03] body.predecessor_oid not a canonical OID (sha256:<64 hex>)
|
|
292
|
-
* [S04] body.successor_oid not a canonical OID (sha256:<64 hex>)
|
|
293
|
-
* [S05] body.reason not a non-empty string
|
|
294
|
-
* [S06] body.authorized_by not a non-empty string
|
|
295
|
-
* [S07] body.evidence_oids, if present, not an array of non-empty strings
|
|
296
|
-
*/
|
|
297
|
-
export function validateSro(x) {
|
|
298
|
-
const cdroResult = validateCdro(x);
|
|
299
|
-
if (!cdroResult.ok) {
|
|
300
|
-
return { ok: false, errors: cdroResult.errors.map((e) => '[S01] ' + e) };
|
|
301
|
-
}
|
|
302
|
-
const errors = [];
|
|
303
|
-
const o = x;
|
|
304
|
-
if (o.type !== 'sraid:sro') {
|
|
305
|
-
errors.push('[S02] type must be "sraid:sro" for an SRO');
|
|
306
|
-
}
|
|
307
|
-
if (o.body === null || typeof o.body !== 'object' || Array.isArray(o.body)) {
|
|
308
|
-
errors.push('[S01] body must be an object');
|
|
309
|
-
return { ok: false, errors };
|
|
310
|
-
}
|
|
311
|
-
const b = o.body;
|
|
312
|
-
if (!isCanonicalOid(b['predecessor_oid'])) {
|
|
313
|
-
errors.push('[S03] body.predecessor_oid must be a canonical OID (sha256:<64 hex>)');
|
|
314
|
-
}
|
|
315
|
-
if (!isCanonicalOid(b['successor_oid'])) {
|
|
316
|
-
errors.push('[S04] body.successor_oid must be a canonical OID (sha256:<64 hex>)');
|
|
317
|
-
}
|
|
318
|
-
if (typeof b['reason'] !== 'string' || b['reason'].length === 0) {
|
|
319
|
-
errors.push('[S05] body.reason must be a non-empty string');
|
|
320
|
-
}
|
|
321
|
-
if (typeof b['authorized_by'] !== 'string' || b['authorized_by'].length === 0) {
|
|
322
|
-
errors.push('[S06] body.authorized_by must be a non-empty string');
|
|
323
|
-
}
|
|
324
|
-
if (b['evidence_oids'] !== undefined) {
|
|
325
|
-
if (!Array.isArray(b['evidence_oids'])) {
|
|
326
|
-
errors.push('[S07] body.evidence_oids, if present, must be an array');
|
|
327
|
-
}
|
|
328
|
-
else {
|
|
329
|
-
const arr = b['evidence_oids'];
|
|
330
|
-
for (let i = 0; i < arr.length; i++) {
|
|
331
|
-
if (typeof arr[i] !== 'string' || arr[i].length === 0) {
|
|
332
|
-
errors.push(`[S07] body.evidence_oids[${i}] must be a non-empty string`);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return { ok: errors.length === 0, errors };
|
|
338
|
-
}
|
|
339
282
|
//# sourceMappingURL=validate.js.map
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEvE,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC;IAC7D,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,UAAU;IACV,QAAQ;CACT,CAAC,CAAA;AAEF,uFAAuF;AACvF,MAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAChD,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAC1D,CAAC;AAOD,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,mCAAmC,CAAC,EAAE,CAAA;IACrE,CAAC;IACD,MAAM,CAAC,GAAG,CAA4B,CAAA;IAEtC,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,KAAK,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACrD,CAAC;SAAM,IAAI,CAAE,CAAC,CAAC,KAAK,CAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,MAAM,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,WAAW,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,CAAC,eAAe,CAAC,CAAA;IACpC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACzE,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,YAAY,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,MAAM,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;QACnE,CAAC;aAAM,IAAI,CAAE,CAAC,CAAC,MAAM,CAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QACjD,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,8BAA8B,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;QAChE,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,2BAA2B,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;QAC9D,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,gCAAgC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;QACpE,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CACT,iDAAiD,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBAC7E,sEAAsE,CACzE,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC5C,CAAC;AAED,iFAAiF;AAEjF;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,CAAU;IAC/C,MAAM,MAAM,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAAA;IAC7C,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC5C,CAAC;AAED,SAAS,2BAA2B,CAAC,CAAU;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,kCAAkC,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,CAAC,GAAG,CAA4B,CAAA;IAEtC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,WAAW,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;QAC5E,CAAC;aAAM,IAAI,CAAE,CAAC,CAAC,WAAW,CAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,IACE,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;YACjC,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAW,CAAC,EACvD,CAAC;YACD,MAAM,CAAC,IAAI,CACT,sFAAsF,CACvF,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,YAAY,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;QAC7E,CAAC;aAAM,IAAI,CAAE,CAAC,CAAC,YAAY,CAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAU;IAC5C,MAAM,MAAM,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAA;IAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC5C,CAAC;AAED,SAAS,wBAAwB,CAAC,CAAU;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,0CAA0C,CAAC,CAAA;IACrD,CAAC;IACD,MAAM,CAAC,GAAG,CAA4B,CAAA;IACtC,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,KAAK,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,KAAK,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACpD,CAAC;SAAM,IAAI,CAAE,CAAC,CAAC,KAAK,CAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAU;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,qCAAqC,CAAC,CAAA;IACrE,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACjD,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,CAAU;IAClD,MAAM,MAAM,GAAG,8BAA8B,CAAC,CAAC,CAAC,CAAA;IAChD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC5C,CAAC;AAED,SAAS,8BAA8B,CAAC,CAAU;IAChD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,2CAA2C,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,CAA4B,CAAA;IACtC,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,SAAS,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,WAAW,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,YAAY,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CAAC,CAAU;IACpD,MAAM,MAAM,GAAG,gCAAgC,CAAC,CAAC,CAAC,CAAA;IAClD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC5C,CAAC;AAED,SAAS,gCAAgC,CAAC,CAAU;IAClD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,oCAAoC,CAAC,CAAA;IAC/C,CAAC;IACD,MAAM,CAAC,GAAG,CAA4B,CAAA;IACtC,IAAI,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,aAAa,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IACrD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAc,CAAA;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,uCAAuC,CAAC,CAAA;gBAC/E,SAAQ;YACV,CAAC;YACD,MAAM,EAAE,GAAG,CAA4B,CAAA;YACvC,IAAI,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,EAAE,CAAC,KAAK,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,kCAAkC,CAAC,CAAA;YAC5E,CAAC;YACD,IAAI,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,EAAE,CAAC,KAAK,CAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,yCAAyC,CAAC,CAAA;YACnF,CAAC;YACD,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,uCAAuC,CAAC,CAAA;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @synoi/sraid/verify-browser — browser / Chrome-extension / service-worker
|
|
3
|
+
* verify surface.
|
|
4
|
+
*
|
|
5
|
+
* The default (`.`) entry statically imports `node:crypto` in three places:
|
|
6
|
+
* ed25519.ts (node-only Ed25519 verify), mldsa.ts (native ML-DSA + polyfill),
|
|
7
|
+
* and oid.ts (createHash). `node:crypto` does not exist in a browser or
|
|
8
|
+
* service-worker context, so `import '@synoi/sraid'` breaks any browser bundle.
|
|
9
|
+
* This entry is the browser-safe alternative: it carries exactly what a v2
|
|
10
|
+
* hybrid DSSE receipt verifier needs, implemented WITHOUT any static
|
|
11
|
+
* node:crypto import.
|
|
12
|
+
*
|
|
13
|
+
* WHAT THIS EXPOSES (all browser-safe):
|
|
14
|
+
* - canonicalize — pure RFC 8785 JCS serializer (shared, unchanged).
|
|
15
|
+
* - cdroContentCore, — the CDRO OID content-core projection and its
|
|
16
|
+
* CDRO_ENVELOPE_FIELDS normative strip-set (pure; shared byte-for-byte
|
|
17
|
+
* with the node entry via internal/content-core).
|
|
18
|
+
* - verifyAttestation — hybrid DSSE verify (Ed25519 AND ML-DSA-65, both
|
|
19
|
+
* required over the PAE). ASYNC here: WebCrypto
|
|
20
|
+
* Ed25519 verify is Promise-based.
|
|
21
|
+
* - pae, ALG_ED25519, — the DSSE PAE encoder and algorithm ids (pure,
|
|
22
|
+
* ALG_ML_DSA_65 shared with the node entry).
|
|
23
|
+
* - cdroOid, oidOf, — OID helpers over WebCrypto SHA-256. ASYNC here
|
|
24
|
+
* oidOfCanonical (subtle.digest is Promise-based).
|
|
25
|
+
*
|
|
26
|
+
* CRYPTO BACKENDS (browsers have no native ML-DSA and no node:crypto):
|
|
27
|
+
* - Ed25519 verify → WebCrypto (RFC 8032 cofactored, matching the node path),
|
|
28
|
+
* with a @noble/curves fallback below the WebCrypto-Ed25519
|
|
29
|
+
* support floor. See internal/ed25519-browser.ts.
|
|
30
|
+
* - ML-DSA-65 verify → @noble/post-quantum (pure JS). See internal/mldsa-browser.ts.
|
|
31
|
+
* - SHA-256 → WebCrypto subtle.digest. See internal/sha256-browser.ts.
|
|
32
|
+
*
|
|
33
|
+
* NODE PARITY: the node default entry (`@synoi/sraid`) is unchanged and stays
|
|
34
|
+
* synchronous with its node:crypto fast paths. This entry is purely additive.
|
|
35
|
+
* The only surface difference is async: verifyAttestation, cdroOid, oidOf, and
|
|
36
|
+
* oidOfCanonical return Promises here because WebCrypto is Promise-based.
|
|
37
|
+
*
|
|
38
|
+
* Downstream: @synoi/verify's browser build imports this subpath to bring v2
|
|
39
|
+
* hybrid DSSE verification (verifyReceiptV2) to the browser, replacing the
|
|
40
|
+
* fail-closed `v2-not-supported-in-browser-build` stub.
|
|
41
|
+
*/
|
|
42
|
+
import { ALG_ED25519, ALG_ML_DSA_65, pae, type VerifyAttestationInput, type VerifyAttestationResult } from './internal/attestation-core.js';
|
|
43
|
+
export { canonicalize } from './canonicalize.js';
|
|
44
|
+
export { CDRO_ENVELOPE_FIELDS, cdroContentCore } from './internal/content-core.js';
|
|
45
|
+
export { pae, ALG_ED25519, ALG_ML_DSA_65, type VerifyAttestationInput, type VerifyAttestationResult, };
|
|
46
|
+
/**
|
|
47
|
+
* Verify a hybrid DSSE attestation envelope in a browser context. Returns
|
|
48
|
+
* `valid: true` only when the envelope carries BOTH an `ed25519` and an
|
|
49
|
+
* `ml-dsa-65` signature and BOTH verify against the supplied public keys over
|
|
50
|
+
* `PAE(payloadType, payload)`. The payloadType is bound into the signed bytes,
|
|
51
|
+
* so a signature minted for a different payloadType will not verify.
|
|
52
|
+
*
|
|
53
|
+
* ASYNC counterpart of the node `verifyAttestation`: identical envelope shape,
|
|
54
|
+
* AND policy, PAE bytes, and reason strings — only the return is a Promise,
|
|
55
|
+
* because Ed25519 verify runs on WebCrypto. Never rejects: any malformed input
|
|
56
|
+
* or verification failure resolves to `{ valid: false, reasons: [...] }`.
|
|
57
|
+
*/
|
|
58
|
+
export declare function verifyAttestation(input: VerifyAttestationInput): Promise<VerifyAttestationResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Compute an OID over an arbitrary canonical-compatible value using WebCrypto
|
|
61
|
+
* SHA-256. Returns `sha256:` followed by 64 lowercase hex characters.
|
|
62
|
+
*
|
|
63
|
+
* ASYNC counterpart of the node `oidOf`: same canonical bytes and same
|
|
64
|
+
* `sha256:`-prefixed output, but returns a Promise because subtle.digest is
|
|
65
|
+
* Promise-based. Byte-identical result to the node entry for the same input.
|
|
66
|
+
*/
|
|
67
|
+
export declare function oidOf(canonical: unknown): Promise<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Compute an OID directly from already-canonicalized bytes using WebCrypto
|
|
70
|
+
* SHA-256. ASYNC counterpart of the node `oidOfCanonical`.
|
|
71
|
+
*/
|
|
72
|
+
export declare function oidOfCanonical(canonical: string | Uint8Array): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Compute the OID of a full CDRO over its content core (see `cdroContentCore`),
|
|
75
|
+
* using WebCrypto SHA-256. ASYNC counterpart of the node `cdroOid`; yields the
|
|
76
|
+
* SAME OID whether the object is pre- or post-attestation, and the SAME value
|
|
77
|
+
* the node entry produces for the same object.
|
|
78
|
+
*/
|
|
79
|
+
export declare function cdroOid(cdro: unknown): Promise<string>;
|
|
80
|
+
//# sourceMappingURL=verify-browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-browser.d.ts","sourceRoot":"","sources":["../src/verify-browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAQH,OAAO,EACL,WAAW,EACX,aAAa,EAGb,GAAG,EACH,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,gCAAgC,CAAA;AAIvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EACL,GAAG,EACH,WAAW,EACX,aAAa,EACb,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,CAAA;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CA+DlC;AAID;;;;;;;GAOG;AACH,wBAAsB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpF;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5D"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @synoi/sraid/verify-browser — browser / Chrome-extension / service-worker
|
|
3
|
+
* verify surface.
|
|
4
|
+
*
|
|
5
|
+
* The default (`.`) entry statically imports `node:crypto` in three places:
|
|
6
|
+
* ed25519.ts (node-only Ed25519 verify), mldsa.ts (native ML-DSA + polyfill),
|
|
7
|
+
* and oid.ts (createHash). `node:crypto` does not exist in a browser or
|
|
8
|
+
* service-worker context, so `import '@synoi/sraid'` breaks any browser bundle.
|
|
9
|
+
* This entry is the browser-safe alternative: it carries exactly what a v2
|
|
10
|
+
* hybrid DSSE receipt verifier needs, implemented WITHOUT any static
|
|
11
|
+
* node:crypto import.
|
|
12
|
+
*
|
|
13
|
+
* WHAT THIS EXPOSES (all browser-safe):
|
|
14
|
+
* - canonicalize — pure RFC 8785 JCS serializer (shared, unchanged).
|
|
15
|
+
* - cdroContentCore, — the CDRO OID content-core projection and its
|
|
16
|
+
* CDRO_ENVELOPE_FIELDS normative strip-set (pure; shared byte-for-byte
|
|
17
|
+
* with the node entry via internal/content-core).
|
|
18
|
+
* - verifyAttestation — hybrid DSSE verify (Ed25519 AND ML-DSA-65, both
|
|
19
|
+
* required over the PAE). ASYNC here: WebCrypto
|
|
20
|
+
* Ed25519 verify is Promise-based.
|
|
21
|
+
* - pae, ALG_ED25519, — the DSSE PAE encoder and algorithm ids (pure,
|
|
22
|
+
* ALG_ML_DSA_65 shared with the node entry).
|
|
23
|
+
* - cdroOid, oidOf, — OID helpers over WebCrypto SHA-256. ASYNC here
|
|
24
|
+
* oidOfCanonical (subtle.digest is Promise-based).
|
|
25
|
+
*
|
|
26
|
+
* CRYPTO BACKENDS (browsers have no native ML-DSA and no node:crypto):
|
|
27
|
+
* - Ed25519 verify → WebCrypto (RFC 8032 cofactored, matching the node path),
|
|
28
|
+
* with a @noble/curves fallback below the WebCrypto-Ed25519
|
|
29
|
+
* support floor. See internal/ed25519-browser.ts.
|
|
30
|
+
* - ML-DSA-65 verify → @noble/post-quantum (pure JS). See internal/mldsa-browser.ts.
|
|
31
|
+
* - SHA-256 → WebCrypto subtle.digest. See internal/sha256-browser.ts.
|
|
32
|
+
*
|
|
33
|
+
* NODE PARITY: the node default entry (`@synoi/sraid`) is unchanged and stays
|
|
34
|
+
* synchronous with its node:crypto fast paths. This entry is purely additive.
|
|
35
|
+
* The only surface difference is async: verifyAttestation, cdroOid, oidOf, and
|
|
36
|
+
* oidOfCanonical return Promises here because WebCrypto is Promise-based.
|
|
37
|
+
*
|
|
38
|
+
* Downstream: @synoi/verify's browser build imports this subpath to bring v2
|
|
39
|
+
* hybrid DSSE verification (verifyReceiptV2) to the browser, replacing the
|
|
40
|
+
* fail-closed `v2-not-supported-in-browser-build` stub.
|
|
41
|
+
*/
|
|
42
|
+
import { canonicalize } from './canonicalize.js';
|
|
43
|
+
import { cdroContentCore } from './internal/content-core.js';
|
|
44
|
+
import { decodeBase64StrictBrowser } from './internal/base64-browser.js';
|
|
45
|
+
import { verifyEd25519Browser } from './internal/ed25519-browser.js';
|
|
46
|
+
import { verifyMlDsa65Browser } from './internal/mldsa-browser.js';
|
|
47
|
+
import { sha256HexPrefixed } from './internal/sha256-browser.js';
|
|
48
|
+
import { ALG_ED25519, ALG_ML_DSA_65, findSig, isWellFormedEnvelope, pae, } from './internal/attestation-core.js';
|
|
49
|
+
// ── Pure / shared re-exports (byte-for-byte identical to the node entry) ──────
|
|
50
|
+
export { canonicalize } from './canonicalize.js';
|
|
51
|
+
export { CDRO_ENVELOPE_FIELDS, cdroContentCore } from './internal/content-core.js';
|
|
52
|
+
export { pae, ALG_ED25519, ALG_ML_DSA_65, };
|
|
53
|
+
// ── Hybrid DSSE attestation verify (browser, ASYNC) ───────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Verify a hybrid DSSE attestation envelope in a browser context. Returns
|
|
56
|
+
* `valid: true` only when the envelope carries BOTH an `ed25519` and an
|
|
57
|
+
* `ml-dsa-65` signature and BOTH verify against the supplied public keys over
|
|
58
|
+
* `PAE(payloadType, payload)`. The payloadType is bound into the signed bytes,
|
|
59
|
+
* so a signature minted for a different payloadType will not verify.
|
|
60
|
+
*
|
|
61
|
+
* ASYNC counterpart of the node `verifyAttestation`: identical envelope shape,
|
|
62
|
+
* AND policy, PAE bytes, and reason strings — only the return is a Promise,
|
|
63
|
+
* because Ed25519 verify runs on WebCrypto. Never rejects: any malformed input
|
|
64
|
+
* or verification failure resolves to `{ valid: false, reasons: [...] }`.
|
|
65
|
+
*/
|
|
66
|
+
export async function verifyAttestation(input) {
|
|
67
|
+
const reasons = [];
|
|
68
|
+
const env = input.envelope;
|
|
69
|
+
if (!isWellFormedEnvelope(env)) {
|
|
70
|
+
return { valid: false, reasons: ['envelope-malformed'] };
|
|
71
|
+
}
|
|
72
|
+
if (input.expectedPayloadType !== undefined &&
|
|
73
|
+
env.payloadType !== input.expectedPayloadType) {
|
|
74
|
+
return { valid: false, reasons: ['payload-type-mismatch'] };
|
|
75
|
+
}
|
|
76
|
+
// The signed bytes: PAE binds payloadType + payload together.
|
|
77
|
+
const message = pae(env.payloadType, env.payload);
|
|
78
|
+
// Find the required hybrid pair. The AND policy: both must be present.
|
|
79
|
+
const edEntry = findSig(env.signatures, ALG_ED25519);
|
|
80
|
+
const mlEntry = findSig(env.signatures, ALG_ML_DSA_65);
|
|
81
|
+
if (!edEntry)
|
|
82
|
+
reasons.push('missing-ed25519');
|
|
83
|
+
if (!mlEntry)
|
|
84
|
+
reasons.push('missing-ml-dsa-65');
|
|
85
|
+
let edOk = false;
|
|
86
|
+
let mlOk = false;
|
|
87
|
+
if (edEntry) {
|
|
88
|
+
let edSig = null;
|
|
89
|
+
try {
|
|
90
|
+
edSig = decodeBase64StrictBrowser(edEntry.sig);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
reasons.push('ed25519-malformed');
|
|
94
|
+
}
|
|
95
|
+
if (edSig) {
|
|
96
|
+
try {
|
|
97
|
+
edOk = await verifyEd25519Browser(edSig, message, input.ed25519_pub);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
edOk = false;
|
|
101
|
+
}
|
|
102
|
+
if (!edOk)
|
|
103
|
+
reasons.push('ed25519-invalid');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (mlEntry) {
|
|
107
|
+
let mlSig = null;
|
|
108
|
+
try {
|
|
109
|
+
mlSig = decodeBase64StrictBrowser(mlEntry.sig);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
reasons.push('ml-dsa-malformed');
|
|
113
|
+
}
|
|
114
|
+
if (mlSig) {
|
|
115
|
+
try {
|
|
116
|
+
mlOk = verifyMlDsa65Browser(mlSig, message, input.ml_dsa_pub);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
mlOk = false;
|
|
120
|
+
}
|
|
121
|
+
if (!mlOk)
|
|
122
|
+
reasons.push('ml-dsa-invalid');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { valid: edOk && mlOk && !!edEntry && !!mlEntry, reasons };
|
|
126
|
+
}
|
|
127
|
+
// ── OID helpers (browser, ASYNC via WebCrypto SHA-256) ────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Compute an OID over an arbitrary canonical-compatible value using WebCrypto
|
|
130
|
+
* SHA-256. Returns `sha256:` followed by 64 lowercase hex characters.
|
|
131
|
+
*
|
|
132
|
+
* ASYNC counterpart of the node `oidOf`: same canonical bytes and same
|
|
133
|
+
* `sha256:`-prefixed output, but returns a Promise because subtle.digest is
|
|
134
|
+
* Promise-based. Byte-identical result to the node entry for the same input.
|
|
135
|
+
*/
|
|
136
|
+
export async function oidOf(canonical) {
|
|
137
|
+
const bytes = new TextEncoder().encode(canonicalize(canonical));
|
|
138
|
+
return sha256HexPrefixed(bytes);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Compute an OID directly from already-canonicalized bytes using WebCrypto
|
|
142
|
+
* SHA-256. ASYNC counterpart of the node `oidOfCanonical`.
|
|
143
|
+
*/
|
|
144
|
+
export async function oidOfCanonical(canonical) {
|
|
145
|
+
const bytes = typeof canonical === 'string' ? new TextEncoder().encode(canonical) : canonical;
|
|
146
|
+
return sha256HexPrefixed(bytes);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Compute the OID of a full CDRO over its content core (see `cdroContentCore`),
|
|
150
|
+
* using WebCrypto SHA-256. ASYNC counterpart of the node `cdroOid`; yields the
|
|
151
|
+
* SAME OID whether the object is pre- or post-attestation, and the SAME value
|
|
152
|
+
* the node entry produces for the same object.
|
|
153
|
+
*/
|
|
154
|
+
export async function cdroOid(cdro) {
|
|
155
|
+
return oidOf(cdroContentCore(cdro));
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=verify-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-browser.js","sourceRoot":"","sources":["../src/verify-browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAwB,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EACL,WAAW,EACX,aAAa,EACb,OAAO,EACP,oBAAoB,EACpB,GAAG,GAGJ,MAAM,gCAAgC,CAAA;AAEvC,iFAAiF;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EACL,GAAG,EACH,WAAW,EACX,aAAa,GAGd,CAAA;AAED,iFAAiF;AAEjF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA6B;IAE7B,MAAM,OAAO,GAAa,EAAE,CAAA;IAE5B,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAA;IAC1B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAA;IAC1D,CAAC;IAED,IACE,KAAK,CAAC,mBAAmB,KAAK,SAAS;QACvC,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,mBAAmB,EAC7C,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAA;IAC7D,CAAC;IAED,8DAA8D;IAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAEjD,uEAAuE;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAEtD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAE/C,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,IAAI,IAAI,GAAG,KAAK,CAAA;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,KAAK,GAAsB,IAAI,CAAA;QACnC,IAAI,CAAC;YACH,KAAK,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QACnC,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,KAAK,CAAA;YACd,CAAC;YACD,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,KAAK,GAAsB,IAAI,CAAA;QACnC,IAAI,CAAC;YACH,KAAK,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAClC,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,IAAI,GAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,KAAK,CAAA;YACd,CAAC;YACD,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;AACnE,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,SAAkB;IAC5C,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;IAC/D,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAA8B;IACjE,MAAM,KAAK,GACT,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACjF,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa;IACzC,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;AACrC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synoi/sraid",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "SRAID reference implementation: canonical JSON serializer, content-addressed OIDs, hybrid Ed25519 + ML-DSA-65 signature verification, lineage, and shape validators. No storage, no transport, no policy.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://synoi.systems",
|
|
7
7
|
"repository": {
|
|
@@ -27,6 +27,23 @@
|
|
|
27
27
|
"./canonicalize": {
|
|
28
28
|
"types": "./dist/canonicalize.d.ts",
|
|
29
29
|
"default": "./dist/canonicalize.js"
|
|
30
|
+
},
|
|
31
|
+
"./verify-browser": {
|
|
32
|
+
"types": "./dist/verify-browser.d.ts",
|
|
33
|
+
"browser": "./dist/verify-browser.js",
|
|
34
|
+
"import": "./dist/verify-browser.js",
|
|
35
|
+
"require": "./dist/verify-browser.js",
|
|
36
|
+
"default": "./dist/verify-browser.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"typesVersions": {
|
|
40
|
+
"*": {
|
|
41
|
+
"canonicalize": [
|
|
42
|
+
"dist/canonicalize.d.ts"
|
|
43
|
+
],
|
|
44
|
+
"verify-browser": [
|
|
45
|
+
"dist/verify-browser.d.ts"
|
|
46
|
+
]
|
|
30
47
|
}
|
|
31
48
|
},
|
|
32
49
|
"files": [
|
|
@@ -40,7 +57,8 @@
|
|
|
40
57
|
"scripts": {
|
|
41
58
|
"build": "tsc",
|
|
42
59
|
"typecheck": "tsc --noEmit",
|
|
43
|
-
"test": "npx tsx test/run-all.ts"
|
|
60
|
+
"test": "npx tsx test/run-all.ts",
|
|
61
|
+
"prepublishOnly": "npm run build && npm test"
|
|
44
62
|
},
|
|
45
63
|
"dependencies": {
|
|
46
64
|
"@noble/curves": "^1.9.7",
|
|
@@ -49,6 +67,7 @@
|
|
|
49
67
|
},
|
|
50
68
|
"devDependencies": {
|
|
51
69
|
"@types/node": "^20.12.0",
|
|
70
|
+
"esbuild": "^0.28.0",
|
|
52
71
|
"tsx": "^4.22.2",
|
|
53
72
|
"typescript": "^5.4.5"
|
|
54
73
|
},
|
package/src/attestation.ts
CHANGED
|
@@ -30,76 +30,36 @@
|
|
|
30
30
|
* Identity stability: signatures live in a detached `signatures[]` array and
|
|
31
31
|
* are NEVER part of the OID hash input (see `cdroContentCore` in oid.ts), so
|
|
32
32
|
* adding, rotating, or replacing a signature never changes the object's OID.
|
|
33
|
+
*
|
|
34
|
+
* NODE ENTRY: this module verifies via node:crypto (Ed25519 native, ML-DSA-65
|
|
35
|
+
* native-with-@noble-fallback) and is SYNCHRONOUS. The PAE, algorithm ids,
|
|
36
|
+
* types, AND-policy lookup, and envelope-shape predicate are shared with the
|
|
37
|
+
* browser verify surface via ./internal/attestation-core.ts (pure, no
|
|
38
|
+
* node:crypto); only the verify orchestration below is node-specific. The
|
|
39
|
+
* browser-safe async equivalent lives in ./verify-browser.ts.
|
|
33
40
|
*/
|
|
34
41
|
|
|
35
42
|
import { verifyEd25519 } from './ed25519.js'
|
|
36
43
|
import { decodeBase64Strict } from './internal/base64.js'
|
|
37
44
|
import { verifyMlDsa65 } from './mldsa.js'
|
|
38
|
-
import
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
* Binding the payloadType (and both lengths) into the signed bytes is what
|
|
57
|
-
* makes a signature non-transferable across object types. Returns the raw
|
|
58
|
-
* bytes to be signed/verified.
|
|
59
|
-
*/
|
|
60
|
-
export function pae(payloadType: string, payload: string | Uint8Array): Uint8Array {
|
|
61
|
-
const enc = new TextEncoder()
|
|
62
|
-
const typeBytes = enc.encode(payloadType)
|
|
63
|
-
const bodyBytes = typeof payload === 'string' ? enc.encode(payload) : payload
|
|
64
|
-
|
|
65
|
-
const prefix = enc.encode(
|
|
66
|
-
`DSSEv1 ${typeBytes.length} ${payloadType} ${bodyBytes.length} `,
|
|
67
|
-
)
|
|
68
|
-
const out = new Uint8Array(prefix.length + bodyBytes.length)
|
|
69
|
-
out.set(prefix, 0)
|
|
70
|
-
out.set(bodyBytes, prefix.length)
|
|
71
|
-
return out
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export interface VerifyAttestationInput {
|
|
75
|
-
/**
|
|
76
|
-
* The DSSE attestation envelope to verify. Its `payloadType` is bound into
|
|
77
|
-
* the PAE; its `payload` is the canonical UTF-8 string that was signed.
|
|
78
|
-
*/
|
|
79
|
-
envelope: AttestationEnvelope
|
|
80
|
-
/** Raw 32-byte Ed25519 public key. */
|
|
81
|
-
ed25519_pub: Uint8Array
|
|
82
|
-
/** Raw ML-DSA-65 public key bytes. */
|
|
83
|
-
ml_dsa_pub: Uint8Array
|
|
84
|
-
/**
|
|
85
|
-
* Optional. If supplied, the verifier asserts the envelope's `payloadType`
|
|
86
|
-
* equals this value before verifying signatures — an explicit type-pinning
|
|
87
|
-
* check on top of the structural PAE binding. A mismatch fails with
|
|
88
|
-
* `payload-type-mismatch`.
|
|
89
|
-
*/
|
|
90
|
-
expectedPayloadType?: string
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export interface VerifyAttestationResult {
|
|
94
|
-
/** True only when BOTH required signatures verified over the same PAE. */
|
|
95
|
-
valid: boolean
|
|
96
|
-
/**
|
|
97
|
-
* Human-readable failure reasons. Empty when valid. Possible values:
|
|
98
|
-
* 'envelope-malformed', 'payload-type-mismatch', 'missing-ed25519',
|
|
99
|
-
* 'missing-ml-dsa-65', 'ed25519-malformed', 'ml-dsa-malformed',
|
|
100
|
-
* 'ed25519-invalid', 'ml-dsa-invalid'.
|
|
101
|
-
*/
|
|
102
|
-
reasons: string[]
|
|
45
|
+
import {
|
|
46
|
+
ALG_ED25519,
|
|
47
|
+
ALG_ML_DSA_65,
|
|
48
|
+
findSig,
|
|
49
|
+
isWellFormedEnvelope,
|
|
50
|
+
pae,
|
|
51
|
+
type VerifyAttestationInput,
|
|
52
|
+
type VerifyAttestationResult,
|
|
53
|
+
} from './internal/attestation-core.js'
|
|
54
|
+
|
|
55
|
+
// Re-export the crypto-agnostic core so the public surface is unchanged:
|
|
56
|
+
// `import { pae, ALG_ED25519, ALG_ML_DSA_65 } from '@synoi/sraid'` still works.
|
|
57
|
+
export {
|
|
58
|
+
ALG_ED25519,
|
|
59
|
+
ALG_ML_DSA_65,
|
|
60
|
+
pae,
|
|
61
|
+
type VerifyAttestationInput,
|
|
62
|
+
type VerifyAttestationResult,
|
|
103
63
|
}
|
|
104
64
|
|
|
105
65
|
/**
|
|
@@ -113,14 +73,7 @@ export function verifyAttestation(input: VerifyAttestationInput): VerifyAttestat
|
|
|
113
73
|
const reasons: string[] = []
|
|
114
74
|
|
|
115
75
|
const env = input.envelope
|
|
116
|
-
if (
|
|
117
|
-
env === null ||
|
|
118
|
-
typeof env !== 'object' ||
|
|
119
|
-
typeof env.payloadType !== 'string' ||
|
|
120
|
-
env.payloadType.length === 0 ||
|
|
121
|
-
typeof env.payload !== 'string' ||
|
|
122
|
-
!Array.isArray(env.signatures)
|
|
123
|
-
) {
|
|
76
|
+
if (!isWellFormedEnvelope(env)) {
|
|
124
77
|
return { valid: false, reasons: ['envelope-malformed'] }
|
|
125
78
|
}
|
|
126
79
|
|
|
@@ -183,22 +136,10 @@ export function verifyAttestation(input: VerifyAttestationInput): VerifyAttestat
|
|
|
183
136
|
|
|
184
137
|
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
185
138
|
|
|
186
|
-
function findSig(
|
|
187
|
-
sigs: readonly AttestationSignature[],
|
|
188
|
-
alg: string,
|
|
189
|
-
): AttestationSignature | undefined {
|
|
190
|
-
for (const s of sigs) {
|
|
191
|
-
if (s && typeof s === 'object' && s.alg === alg && typeof s.sig === 'string') {
|
|
192
|
-
return s
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return undefined
|
|
196
|
-
}
|
|
197
|
-
|
|
198
139
|
// Strict standard base64. Throws Error('base64-malformed') on any deviation
|
|
199
|
-
// (illegal char, bad length, bad padding) rather than silently truncating.
|
|
200
|
-
//
|
|
201
|
-
//
|
|
140
|
+
// (illegal char, bad length, bad padding) rather than silently truncating. The
|
|
141
|
+
// call sites wrap this in try/catch and map the throw to a *-malformed reason,
|
|
142
|
+
// so verifyAttestation never throws.
|
|
202
143
|
function fromBase64(s: string): Uint8Array {
|
|
203
144
|
return decodeBase64Strict(s)
|
|
204
145
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @synoi/sraid — capability.ts
|
|
3
|
+
*
|
|
4
|
+
* Capability-pattern matching and the live-status contract.
|
|
5
|
+
*
|
|
6
|
+
* These stay in the core entry, while the grant/delegation VERIFIERS moved to
|
|
7
|
+
* `@synoi/sraid/authority` in 0.4.0, because they are different things:
|
|
8
|
+
*
|
|
9
|
+
* - `capabilityCovers` is a pure, total string predicate with no crypto, no
|
|
10
|
+
* I/O and no policy. It decides whether one dotted-taxonomy pattern covers
|
|
11
|
+
* another, and it is the leaf primitive that grant stores build on
|
|
12
|
+
* (synoi-app's `in-memory-engine.ts` and `app-store/store.ts` both call it
|
|
13
|
+
* directly rather than going through a verifier).
|
|
14
|
+
* - `GrantStatus` / `AuthorityResolver` are the CONTRACT for live grant
|
|
15
|
+
* state. The contract is a type; satisfying it is somebody else's job.
|
|
16
|
+
* Keeping it here lets a store, a resolver and a verifier agree on shape
|
|
17
|
+
* without any of them depending on the verifier.
|
|
18
|
+
*
|
|
19
|
+
* Nothing in this module makes, or can make, a live claim.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Match a capability `target` against a grant `pattern`. Pure string logic,
|
|
24
|
+
* re-stated here so the core stays dependency-free (the same rule lives in
|
|
25
|
+
* `@synoi/gap-types` `capabilityMatches`; the object layer must not depend on
|
|
26
|
+
* the protocol layer).
|
|
27
|
+
*
|
|
28
|
+
* - exact match → true
|
|
29
|
+
* - '*' → match-all
|
|
30
|
+
* - 'skill.*' matches 'skill.create' and deeper (segment-boundary only).
|
|
31
|
+
* A non-boundary 'admin.us*' must NOT match 'admin.users.delete'
|
|
32
|
+
* (privilege-escalation footgun) — only a '.'-anchored '*' is a wildcard.
|
|
33
|
+
*/
|
|
34
|
+
export function capabilityCovers(pattern: string, target: string): boolean {
|
|
35
|
+
if (pattern === target) return true
|
|
36
|
+
if (pattern === '*') return true
|
|
37
|
+
if (pattern.endsWith('.*')) {
|
|
38
|
+
const prefix = pattern.slice(0, -1) // keep trailing '.', e.g. 'skill.'
|
|
39
|
+
return target.startsWith(prefix)
|
|
40
|
+
}
|
|
41
|
+
return false
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The live-state interface that the OID Resolver implements. It is the ONLY
|
|
46
|
+
* source of truth for the two properties that cannot be checked offline:
|
|
47
|
+
* whether a grant currently exists (resolves) and whether it has been revoked.
|
|
48
|
+
*
|
|
49
|
+
* RESOLVER-DEPENDENT: undeployed today (SRAID_FOUNDATION_PUNCHLIST C). Defined
|
|
50
|
+
* here so callers, a future resolver, and the out-of-core verifier all agree
|
|
51
|
+
* on one contract.
|
|
52
|
+
*/
|
|
53
|
+
export interface AuthorityResolver {
|
|
54
|
+
/**
|
|
55
|
+
* Resolve a grant OID to its current status. Implementations should return
|
|
56
|
+
* `{ exists: false }` for an unknown OID and `{ exists: true, revoked: true,
|
|
57
|
+
* revoked_at_ms }` for a revoked one.
|
|
58
|
+
*/
|
|
59
|
+
resolveGrantStatus(grantOid: string): Promise<GrantStatus> | GrantStatus
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface GrantStatus {
|
|
63
|
+
/** Whether the grant OID resolves to a known, published grant. */
|
|
64
|
+
exists: boolean
|
|
65
|
+
/** Whether the grant has been revoked. Only meaningful when `exists`. */
|
|
66
|
+
revoked?: boolean
|
|
67
|
+
/** When the revocation took effect, if revoked. */
|
|
68
|
+
revoked_at_ms?: number
|
|
69
|
+
}
|