@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.
Files changed (86) hide show
  1. package/README.md +156 -50
  2. package/SPEC.md +2 -2
  3. package/dist/attestation.d.ts +8 -49
  4. package/dist/attestation.d.ts.map +1 -1
  5. package/dist/attestation.js +15 -46
  6. package/dist/attestation.js.map +1 -1
  7. package/dist/capability.d.ts +59 -0
  8. package/dist/capability.d.ts.map +1 -0
  9. package/dist/capability.js +44 -0
  10. package/dist/capability.js.map +1 -0
  11. package/dist/index.d.ts +13 -13
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +26 -18
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/attestation-core.d.ts +85 -0
  16. package/dist/internal/attestation-core.d.ts.map +1 -0
  17. package/dist/internal/attestation-core.js +78 -0
  18. package/dist/internal/attestation-core.js.map +1 -0
  19. package/dist/internal/base64-browser.d.ts +31 -0
  20. package/dist/internal/base64-browser.d.ts.map +1 -0
  21. package/dist/internal/base64-browser.js +39 -0
  22. package/dist/internal/base64-browser.js.map +1 -0
  23. package/dist/internal/base64-validate.d.ts +19 -0
  24. package/dist/internal/base64-validate.d.ts.map +1 -0
  25. package/dist/internal/base64-validate.js +33 -0
  26. package/dist/internal/base64-validate.js.map +1 -0
  27. package/dist/internal/base64.d.ts +7 -5
  28. package/dist/internal/base64.d.ts.map +1 -1
  29. package/dist/internal/base64.js +7 -19
  30. package/dist/internal/base64.js.map +1 -1
  31. package/dist/internal/content-core.d.ts +68 -0
  32. package/dist/internal/content-core.d.ts.map +1 -0
  33. package/dist/internal/content-core.js +87 -0
  34. package/dist/internal/content-core.js.map +1 -0
  35. package/dist/internal/ed25519-browser.d.ts +33 -0
  36. package/dist/internal/ed25519-browser.d.ts.map +1 -0
  37. package/dist/internal/ed25519-browser.js +79 -0
  38. package/dist/internal/ed25519-browser.js.map +1 -0
  39. package/dist/internal/mldsa-browser.d.ts +27 -0
  40. package/dist/internal/mldsa-browser.d.ts.map +1 -0
  41. package/dist/internal/mldsa-browser.js +35 -0
  42. package/dist/internal/mldsa-browser.js.map +1 -0
  43. package/dist/internal/sha256-browser.d.ts +17 -0
  44. package/dist/internal/sha256-browser.d.ts.map +1 -0
  45. package/dist/internal/sha256-browser.js +27 -0
  46. package/dist/internal/sha256-browser.js.map +1 -0
  47. package/dist/lineage.js +0 -0
  48. package/dist/lineage.js.map +1 -1
  49. package/dist/oid.d.ts +2 -52
  50. package/dist/oid.d.ts.map +1 -1
  51. package/dist/oid.js +9 -71
  52. package/dist/oid.js.map +1 -1
  53. package/dist/types.d.ts +4 -30
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/types.js +19 -0
  56. package/dist/types.js.map +1 -1
  57. package/dist/validate.d.ts +2 -17
  58. package/dist/validate.d.ts.map +1 -1
  59. package/dist/validate.js +0 -57
  60. package/dist/validate.js.map +1 -1
  61. package/dist/verify-browser.d.ts +80 -0
  62. package/dist/verify-browser.d.ts.map +1 -0
  63. package/dist/verify-browser.js +157 -0
  64. package/dist/verify-browser.js.map +1 -0
  65. package/package.json +22 -3
  66. package/src/attestation.ts +29 -88
  67. package/src/capability.ts +69 -0
  68. package/src/index.ts +27 -36
  69. package/src/internal/attestation-core.ts +122 -0
  70. package/src/internal/base64-browser.ts +39 -0
  71. package/src/internal/base64-validate.ts +31 -0
  72. package/src/internal/base64.ts +7 -16
  73. package/src/internal/content-core.ts +88 -0
  74. package/src/internal/ed25519-browser.ts +85 -0
  75. package/src/internal/mldsa-browser.ts +39 -0
  76. package/src/internal/sha256-browser.ts +28 -0
  77. package/src/lineage.ts +0 -0
  78. package/src/oid.ts +10 -73
  79. package/src/types.ts +23 -31
  80. package/src/validate.ts +1 -64
  81. package/src/verify-browser.ts +185 -0
  82. package/dist/authority.d.ts +0 -351
  83. package/dist/authority.d.ts.map +0 -1
  84. package/dist/authority.js +0 -563
  85. package/dist/authority.js.map +0 -1
  86. 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
@@ -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":"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"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@synoi/sraid",
3
- "version": "0.2.0",
4
- "description": "Reference TypeScript library for the SynOI SRAID (Self-Routing Addressable Identity Data) protocol - types, canonical object serializer, OID computation, signature verification, and validators for L0 of the SRAID Stack.",
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
  },
@@ -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 type { AttestationEnvelope, AttestationSignature } from './types.js'
39
-
40
- /** The single supported algorithm identifiers for the JSON profile. */
41
- export const ALG_ED25519 = 'ed25519'
42
- export const ALG_ML_DSA_65 = 'ml-dsa-65'
43
-
44
- /**
45
- * The DSSE Pre-Authentication Encoding (PAE).
46
- *
47
- * Per the DSSE spec:
48
- *
49
- * PAE(type, body) = "DSSEv1" SP LEN(type) SP type SP LEN(body) SP body
50
- *
51
- * where:
52
- * - SP is a single ASCII space (0x20),
53
- * - LEN(x) is the ASCII-decimal byte length of x's UTF-8 encoding,
54
- * - type and body are the raw UTF-8 bytes (NOT base64).
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
- // Both call sites wrap this in try/catch and map the throw to a *-malformed
201
- // reason, so verifyAttestation never throws.
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
+ }