@drm3/sdk 0.1.2
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/LICENSE +75 -0
- package/README.md +426 -0
- package/bin/drm3.js +255 -0
- package/dist/alerts-bell.d.ts +7 -0
- package/dist/alerts-bell.d.ts.map +1 -0
- package/dist/alerts-bell.js +118 -0
- package/dist/alerts-bell.js.map +1 -0
- package/dist/alerts-fetch.d.ts +41 -0
- package/dist/alerts-fetch.d.ts.map +1 -0
- package/dist/alerts-fetch.js +60 -0
- package/dist/alerts-fetch.js.map +1 -0
- package/dist/alerts-styles.d.ts +4 -0
- package/dist/alerts-styles.d.ts.map +1 -0
- package/dist/alerts-styles.js +49 -0
- package/dist/alerts-styles.js.map +1 -0
- package/dist/alerts.d.ts +3 -0
- package/dist/alerts.d.ts.map +1 -0
- package/dist/alerts.global.js +206 -0
- package/dist/alerts.global.text.js +2 -0
- package/dist/alerts.js +21 -0
- package/dist/alerts.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/keys-canonical.d.ts +7 -0
- package/dist/keys-canonical.d.ts.map +1 -0
- package/dist/keys-canonical.js +57 -0
- package/dist/keys-canonical.js.map +1 -0
- package/dist/keys-generate.d.ts +39 -0
- package/dist/keys-generate.d.ts.map +1 -0
- package/dist/keys-generate.js +39 -0
- package/dist/keys-generate.js.map +1 -0
- package/dist/keys-verify.d.ts +62 -0
- package/dist/keys-verify.d.ts.map +1 -0
- package/dist/keys-verify.js +68 -0
- package/dist/keys-verify.js.map +1 -0
- package/dist/keys.d.ts +4 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +22 -0
- package/dist/keys.js.map +1 -0
- package/dist/meter/adapter.d.ts +35 -0
- package/dist/meter/adapter.d.ts.map +1 -0
- package/dist/meter/adapter.js +0 -0
- package/dist/meter/adapter.js.map +1 -0
- package/dist/meter/cascade.d.ts +56 -0
- package/dist/meter/cascade.d.ts.map +1 -0
- package/dist/meter/cascade.js +64 -0
- package/dist/meter/cascade.js.map +1 -0
- package/dist/meter/client.d.ts +78 -0
- package/dist/meter/client.d.ts.map +1 -0
- package/dist/meter/client.js +84 -0
- package/dist/meter/client.js.map +1 -0
- package/dist/meter/core.d.ts +37 -0
- package/dist/meter/core.d.ts.map +1 -0
- package/dist/meter/core.js +49 -0
- package/dist/meter/core.js.map +1 -0
- package/dist/meter/gate-client.d.ts +94 -0
- package/dist/meter/gate-client.d.ts.map +1 -0
- package/dist/meter/gate-client.js +77 -0
- package/dist/meter/gate-client.js.map +1 -0
- package/dist/meter/gate-decide.d.ts +61 -0
- package/dist/meter/gate-decide.d.ts.map +1 -0
- package/dist/meter/gate-decide.js +54 -0
- package/dist/meter/gate-decide.js.map +1 -0
- package/dist/meter/gate.d.ts +10 -0
- package/dist/meter/gate.d.ts.map +1 -0
- package/dist/meter/gate.js +10 -0
- package/dist/meter/gate.js.map +1 -0
- package/dist/meter/index.d.ts +28 -0
- package/dist/meter/index.d.ts.map +1 -0
- package/dist/meter/index.js +28 -0
- package/dist/meter/index.js.map +1 -0
- package/dist/meter/meters-buckets.d.ts +56 -0
- package/dist/meter/meters-buckets.d.ts.map +1 -0
- package/dist/meter/meters-buckets.js +111 -0
- package/dist/meter/meters-buckets.js.map +1 -0
- package/dist/meter/meters-charge.d.ts +13 -0
- package/dist/meter/meters-charge.d.ts.map +1 -0
- package/dist/meter/meters-charge.js +76 -0
- package/dist/meter/meters-charge.js.map +1 -0
- package/dist/meter/meters.d.ts +63 -0
- package/dist/meter/meters.d.ts.map +1 -0
- package/dist/meter/meters.js +44 -0
- package/dist/meter/meters.js.map +1 -0
- package/dist/meter/plans.d.ts +63 -0
- package/dist/meter/plans.d.ts.map +1 -0
- package/dist/meter/plans.js +114 -0
- package/dist/meter/plans.js.map +1 -0
- package/dist/meter/pricebook.d.ts +32 -0
- package/dist/meter/pricebook.d.ts.map +1 -0
- package/dist/meter/pricebook.js +38 -0
- package/dist/meter/pricebook.js.map +1 -0
- package/dist/meter/resolve.d.ts +103 -0
- package/dist/meter/resolve.d.ts.map +1 -0
- package/dist/meter/resolve.js +100 -0
- package/dist/meter/resolve.js.map +1 -0
- package/dist/meter/sink.d.ts +26 -0
- package/dist/meter/sink.d.ts.map +1 -0
- package/dist/meter/sink.js +9 -0
- package/dist/meter/sink.js.map +1 -0
- package/dist/meter/sql/d1.d.ts +32 -0
- package/dist/meter/sql/d1.d.ts.map +1 -0
- package/dist/meter/sql/d1.js +41 -0
- package/dist/meter/sql/d1.js.map +1 -0
- package/dist/meter/sql/driver.d.ts +34 -0
- package/dist/meter/sql/driver.d.ts.map +1 -0
- package/dist/meter/sql/driver.js +17 -0
- package/dist/meter/sql/driver.js.map +1 -0
- package/dist/meter/sql/postgres.d.ts +23 -0
- package/dist/meter/sql/postgres.d.ts.map +1 -0
- package/dist/meter/sql/postgres.js +36 -0
- package/dist/meter/sql/postgres.js.map +1 -0
- package/dist/meter/sql/schema.d.ts +13 -0
- package/dist/meter/sql/schema.d.ts.map +1 -0
- package/dist/meter/sql/schema.js +32 -0
- package/dist/meter/sql/schema.js.map +1 -0
- package/dist/meter/sql/sql-adapter.d.ts +36 -0
- package/dist/meter/sql/sql-adapter.d.ts.map +1 -0
- package/dist/meter/sql/sql-adapter.js +124 -0
- package/dist/meter/sql/sql-adapter.js.map +1 -0
- package/dist/meter/sql/statements.d.ts +30 -0
- package/dist/meter/sql/statements.d.ts.map +1 -0
- package/dist/meter/sql/statements.js +24 -0
- package/dist/meter/sql/statements.js.map +1 -0
- package/dist/meter/types.d.ts +48 -0
- package/dist/meter/types.d.ts.map +1 -0
- package/dist/meter/types.js +8 -0
- package/dist/meter/types.js.map +1 -0
- package/dist/meter/units.d.ts +33 -0
- package/dist/meter/units.d.ts.map +1 -0
- package/dist/meter/units.js +45 -0
- package/dist/meter/units.js.map +1 -0
- package/dist/meter/wallet-buckets.d.ts +63 -0
- package/dist/meter/wallet-buckets.d.ts.map +1 -0
- package/dist/meter/wallet-buckets.js +131 -0
- package/dist/meter/wallet-buckets.js.map +1 -0
- package/dist/meter/wallet-charge.d.ts +15 -0
- package/dist/meter/wallet-charge.d.ts.map +1 -0
- package/dist/meter/wallet-charge.js +64 -0
- package/dist/meter/wallet-charge.js.map +1 -0
- package/dist/meter/wallet.d.ts +68 -0
- package/dist/meter/wallet.d.ts.map +1 -0
- package/dist/meter/wallet.js +47 -0
- package/dist/meter/wallet.js.map +1 -0
- package/dist/receipts-api.d.ts +5 -0
- package/dist/receipts-api.d.ts.map +1 -0
- package/dist/receipts-api.js +117 -0
- package/dist/receipts-api.js.map +1 -0
- package/dist/receipts-chain.d.ts +3 -0
- package/dist/receipts-chain.d.ts.map +1 -0
- package/dist/receipts-chain.js +121 -0
- package/dist/receipts-chain.js.map +1 -0
- package/dist/receipts-modal.d.ts +14 -0
- package/dist/receipts-modal.d.ts.map +1 -0
- package/dist/receipts-modal.js +100 -0
- package/dist/receipts-modal.js.map +1 -0
- package/dist/receipts-registry.d.ts +4 -0
- package/dist/receipts-registry.d.ts.map +1 -0
- package/dist/receipts-registry.js +54 -0
- package/dist/receipts-registry.js.map +1 -0
- package/dist/receipts-render.d.ts +9 -0
- package/dist/receipts-render.d.ts.map +1 -0
- package/dist/receipts-render.js +83 -0
- package/dist/receipts-render.js.map +1 -0
- package/dist/receipts-types.d.ts +61 -0
- package/dist/receipts-types.d.ts.map +1 -0
- package/dist/receipts-types.js +12 -0
- package/dist/receipts-types.js.map +1 -0
- package/dist/receipts-ui.d.ts +10 -0
- package/dist/receipts-ui.d.ts.map +1 -0
- package/dist/receipts-ui.js +103 -0
- package/dist/receipts-ui.js.map +1 -0
- package/dist/receipts-verify.d.ts +8 -0
- package/dist/receipts-verify.d.ts.map +1 -0
- package/dist/receipts-verify.js +113 -0
- package/dist/receipts-verify.js.map +1 -0
- package/dist/receipts.d.ts +9 -0
- package/dist/receipts.d.ts.map +1 -0
- package/dist/receipts.global.js +587 -0
- package/dist/receipts.global.text.js +2 -0
- package/dist/receipts.js +28 -0
- package/dist/receipts.js.map +1 -0
- package/dist/sso/index.d.ts +4 -0
- package/dist/sso/index.d.ts.map +1 -0
- package/dist/sso/index.js +10 -0
- package/dist/sso/index.js.map +1 -0
- package/dist/sso/jwt.d.ts +29 -0
- package/dist/sso/jwt.d.ts.map +1 -0
- package/dist/sso/jwt.js +73 -0
- package/dist/sso/jwt.js.map +1 -0
- package/dist/sso/launch.d.ts +70 -0
- package/dist/sso/launch.d.ts.map +1 -0
- package/dist/sso/launch.js +75 -0
- package/dist/sso/launch.js.map +1 -0
- package/dist/sso/revocation.d.ts +23 -0
- package/dist/sso/revocation.d.ts.map +1 -0
- package/dist/sso/revocation.js +53 -0
- package/dist/sso/revocation.js.map +1 -0
- package/dist/switcher.d.ts +22 -0
- package/dist/switcher.d.ts.map +1 -0
- package/dist/switcher.js +174 -0
- package/dist/switcher.js.map +1 -0
- package/dist/x402/chain.d.ts +49 -0
- package/dist/x402/chain.d.ts.map +1 -0
- package/dist/x402/chain.js +33 -0
- package/dist/x402/chain.js.map +1 -0
- package/dist/x402/crypto.d.ts +25 -0
- package/dist/x402/crypto.d.ts.map +1 -0
- package/dist/x402/crypto.js +74 -0
- package/dist/x402/crypto.js.map +1 -0
- package/dist/x402/eip712.d.ts +20 -0
- package/dist/x402/eip712.d.ts.map +1 -0
- package/dist/x402/eip712.js +49 -0
- package/dist/x402/eip712.js.map +1 -0
- package/dist/x402/envelope.d.ts +45 -0
- package/dist/x402/envelope.d.ts.map +1 -0
- package/dist/x402/envelope.js +50 -0
- package/dist/x402/envelope.js.map +1 -0
- package/dist/x402/index.d.ts +41 -0
- package/dist/x402/index.d.ts.map +1 -0
- package/dist/x402/index.js +41 -0
- package/dist/x402/index.js.map +1 -0
- package/dist/x402/verify.d.ts +51 -0
- package/dist/x402/verify.d.ts.map +1 -0
- package/dist/x402/verify.js +110 -0
- package/dist/x402/verify.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface Receipt {
|
|
2
|
+
id?: string;
|
|
3
|
+
action?: string;
|
|
4
|
+
receipt_type?: string;
|
|
5
|
+
receipt_json?: unknown;
|
|
6
|
+
signature?: string;
|
|
7
|
+
public_key?: string;
|
|
8
|
+
signer_path?: string;
|
|
9
|
+
output_hash?: string;
|
|
10
|
+
parent_receipt_id?: string | null;
|
|
11
|
+
created_at?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedReceipt {
|
|
14
|
+
ok?: boolean;
|
|
15
|
+
receipt?: unknown;
|
|
16
|
+
signer?: string;
|
|
17
|
+
role?: string;
|
|
18
|
+
registry_anchored?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ContentRef {
|
|
21
|
+
id?: string;
|
|
22
|
+
ourUrl?: string;
|
|
23
|
+
origUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface Counts {
|
|
26
|
+
verified: number;
|
|
27
|
+
gated: number;
|
|
28
|
+
failed: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ViewerConfig {
|
|
31
|
+
/** Aggregate key registry to check signers against. Default status.drm3.network. */
|
|
32
|
+
registryUrl?: string;
|
|
33
|
+
/** Base origin for the DRM3 resolver convention (GET {base}/receipts/:id). Default same-origin. */
|
|
34
|
+
resolverBase?: string;
|
|
35
|
+
/** Extra headers (e.g. an app API key) sent with resolver fetches. */
|
|
36
|
+
headers?: Record<string, string>;
|
|
37
|
+
/** Modal title / subtitle overrides. */
|
|
38
|
+
title?: string;
|
|
39
|
+
subtitle?: string;
|
|
40
|
+
/** Content links to hang off the chain's primary leg. */
|
|
41
|
+
contentRef?: ContentRef;
|
|
42
|
+
}
|
|
43
|
+
export declare const VERIFIED = "verified";
|
|
44
|
+
export declare const UNVERIFIABLE_NO_ACCESS = "unverifiable_no_access";
|
|
45
|
+
export declare const FAILED = "failed";
|
|
46
|
+
export type Verdict = typeof VERIFIED | typeof UNVERIFIABLE_NO_ACCESS | typeof FAILED;
|
|
47
|
+
export type AddStep = (act: string, meta: string, detail?: string) => HTMLElement;
|
|
48
|
+
export type Settle = (el: HTMLElement, verdict: Verdict) => void;
|
|
49
|
+
export type Wait = (ms: number) => Promise<unknown>;
|
|
50
|
+
export type RegKey = {
|
|
51
|
+
status: string;
|
|
52
|
+
valid_from?: string;
|
|
53
|
+
valid_until?: string;
|
|
54
|
+
};
|
|
55
|
+
export type RegKeyRaw = {
|
|
56
|
+
key?: string;
|
|
57
|
+
status?: string;
|
|
58
|
+
valid_from?: string;
|
|
59
|
+
valid_until?: string;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=receipts-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts-types.d.ts","sourceRoot":"","sources":["../src/receipts-types.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAMD,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,MAAM,MAAM,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,sBAAsB,GAAG,OAAO,MAAM,CAAC;AAEtF,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;AAClF,MAAM,MAAM,MAAM,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AACjE,MAAM,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AASpD,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACnF,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @drm3/sdk/receipts - shared types + the tri-state verdict model.
|
|
2
|
+
//
|
|
3
|
+
// Split out of receipts.ts so the crypto, registry, render, DOM, and public-API
|
|
4
|
+
// concerns can each import just the shapes they need. No runtime logic lives here.
|
|
5
|
+
// ── tri-state verdict model (mirrors drm3-verifier/js/chain.mjs) ──────────────
|
|
6
|
+
// A leg resolves to exactly one of three verdicts. `unverifiable_no_access` is a
|
|
7
|
+
// STATE, not a failure: the leg is referenced by the chain but its receipt isn't
|
|
8
|
+
// retrievable to this caller. Only `failed` is an alarm.
|
|
9
|
+
export const VERIFIED = "verified";
|
|
10
|
+
export const UNVERIFIABLE_NO_ACCESS = "unverifiable_no_access";
|
|
11
|
+
export const FAILED = "failed";
|
|
12
|
+
//# sourceMappingURL=receipts-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts-types.js","sourceRoot":"","sources":["../src/receipts-types.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,gFAAgF;AAChF,mFAAmF;AAgDnF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,yDAAyD;AACzD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC/D,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const CHECK = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>";
|
|
2
|
+
export declare const LOCK = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"9\" rx=\"2\"/><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"/></svg>";
|
|
3
|
+
export declare const HEX = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2.5 20.5 7.2v9.6L12 21.5 3.5 16.8V7.2z\"/><path d=\"m8.7 12 2.2 2.2 4.4-4.4\"/></svg>";
|
|
4
|
+
export declare const STAMP = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"12\" r=\"5.4\" stroke-dasharray=\"1.4 2.3\"/><path d=\"m9.5 12 1.8 1.8 3.6-3.7\"/></svg>";
|
|
5
|
+
export declare const ALERT = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"/></svg>";
|
|
6
|
+
export declare const RECEIPT = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 3v18l2-1.2L9 21l2-1.2L13 21l2-1.2L17 21l2-1.2V3l-2 1.2L15 3l-2 1.2L11 3 9 4.2 7 3z\"/><path d=\"M8 8.5h8M8 12h8M8 15.5h5\" stroke-width=\"1.4\"/></svg>";
|
|
7
|
+
export declare const SPIN = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"><path d=\"M12 3a9 9 0 1 0 9 9\" opacity=\".95\"/></svg>";
|
|
8
|
+
export declare const DOWNLOAD = "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3v12m0 0 4-4m-4 4-4-4M5 21h14\"/></svg>";
|
|
9
|
+
export declare function injectStyles(): void;
|
|
10
|
+
//# sourceMappingURL=receipts-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts-ui.d.ts","sourceRoot":"","sources":["../src/receipts-ui.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK,iLACgJ,CAAC;AACnK,eAAO,MAAM,IAAI,oPAC0M,CAAC;AAC5N,eAAO,MAAM,GAAG,iPACgN,CAAC;AACjO,eAAO,MAAM,KAAK,kSACmP,CAAC;AACtQ,eAAO,MAAM,KAAK,4PAC2N,CAAC;AAC9O,eAAO,MAAM,OAAO,kTAC2Q,CAAC;AAChS,eAAO,MAAM,IAAI,yKACyI,CAAC;AAC3J,eAAO,MAAM,QAAQ,iMAC6J,CAAC;AAGnL,wBAAgB,YAAY,IAAI,IAAI,CAsFnC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// @drm3/sdk/receipts - the injected SVG icon set + scoped stylesheet.
|
|
2
|
+
//
|
|
3
|
+
// Self-contained visuals: inline SVGs (no sprite fetch) and a single scoped
|
|
4
|
+
// <style id="drm3v-css"> injected once. Zero external assets.
|
|
5
|
+
// ── icons ─────────────────────────────────────────────────────────────────────
|
|
6
|
+
export const CHECK = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>';
|
|
7
|
+
export const LOCK = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V7a4 4 0 0 1 8 0v4"/></svg>';
|
|
8
|
+
export const HEX = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2.5 20.5 7.2v9.6L12 21.5 3.5 16.8V7.2z"/><path d="m8.7 12 2.2 2.2 4.4-4.4"/></svg>';
|
|
9
|
+
export const STAMP = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="5.4" stroke-dasharray="1.4 2.3"/><path d="m9.5 12 1.8 1.8 3.6-3.7"/></svg>';
|
|
10
|
+
export const ALERT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/></svg>';
|
|
11
|
+
export const RECEIPT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 3v18l2-1.2L9 21l2-1.2L13 21l2-1.2L17 21l2-1.2V3l-2 1.2L15 3l-2 1.2L11 3 9 4.2 7 3z"/><path d="M8 8.5h8M8 12h8M8 15.5h5" stroke-width="1.4"/></svg>';
|
|
12
|
+
export const SPIN = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M12 3a9 9 0 1 0 9 9" opacity=".95"/></svg>';
|
|
13
|
+
export const DOWNLOAD = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v12m0 0 4-4m-4 4-4-4M5 21h14"/></svg>';
|
|
14
|
+
// ── styles (injected once) ────────────────────────────────────────────────────
|
|
15
|
+
export function injectStyles() {
|
|
16
|
+
if (typeof document === "undefined" || document.getElementById("drm3v-css"))
|
|
17
|
+
return;
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "drm3v-css";
|
|
20
|
+
s.textContent = `
|
|
21
|
+
.drm3v-trigger{display:inline-flex;align-items:center;gap:7px;margin:12px 0;padding:9px 15px;font:inherit;font-size:.82rem;font-weight:600;
|
|
22
|
+
color:#0a0a10;background:linear-gradient(180deg,#7fe3b0,#46c98a);border:none;border-radius:999px;cursor:pointer;transition:transform .12s,filter .15s}
|
|
23
|
+
.drm3v-trigger:hover{transform:translateY(-1px);filter:brightness(1.05)}
|
|
24
|
+
.drm3v-trigger svg{width:15px;height:15px}
|
|
25
|
+
.drm3v-ov{position:fixed;inset:0;z-index:99990;display:flex;align-items:center;justify-content:center;padding:20px;
|
|
26
|
+
background:rgba(4,4,9,.78);backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);animation:drm3v-fade .18s ease}
|
|
27
|
+
@keyframes drm3v-fade{from{opacity:0}to{opacity:1}}
|
|
28
|
+
.drm3v-modal{width:min(600px,100%);max-height:90vh;overflow:auto;background:linear-gradient(180deg,#13131f,#0d0d16);
|
|
29
|
+
border:1px solid #2a2a3f;border-radius:20px;box-shadow:0 30px 90px rgba(0,0,0,.66);padding:22px 22px 18px;font-family:ui-sans-serif,system-ui,sans-serif;color:#e8e8f2}
|
|
30
|
+
.drm3v-modal::-webkit-scrollbar{width:10px}
|
|
31
|
+
.drm3v-modal::-webkit-scrollbar-thumb{background:#2a2a3f;border-radius:8px;border:3px solid transparent;background-clip:padding-box}
|
|
32
|
+
.drm3v-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}
|
|
33
|
+
.drm3v-h h3{font-size:1.02rem;margin:0;color:#fff;display:flex;align-items:center;gap:9px}
|
|
34
|
+
.drm3v-h h3 svg{width:18px;height:18px;color:#7fe3b0}
|
|
35
|
+
.drm3v-x{background:none;border:none;color:#a8a8be;font-size:1.4rem;line-height:1;cursor:pointer}
|
|
36
|
+
.drm3v-x:hover{color:#e8e8f2}
|
|
37
|
+
.drm3v-sub{font-size:.79rem;color:#b6b6c8;margin-bottom:14px;line-height:1.5}
|
|
38
|
+
.drm3v-rcpt{position:relative;overflow:hidden;border:1px solid #2c2c42;border-radius:16px;padding:15px 17px 14px;margin:4px 0 2px;
|
|
39
|
+
background:radial-gradient(135% 150% at 0 0,rgba(70,201,138,.13),transparent 56%),#15151f}
|
|
40
|
+
.drm3v-rcpt::after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(180deg,#7fe3b0,#46c98a)}
|
|
41
|
+
.drm3v-rcpt.part::after{background:linear-gradient(180deg,#f3d09a,#e3a24b)}
|
|
42
|
+
.drm3v-rcpt.bad::after{background:linear-gradient(180deg,#ffb3c0,#e0556b)}
|
|
43
|
+
.drm3v-rcpt.wait::after{background:linear-gradient(180deg,#3a3a52,#2a2a3d)}
|
|
44
|
+
.drm3v-rtop{display:flex;align-items:center;gap:7px;font-size:.69rem;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:#9ff0c4}
|
|
45
|
+
.drm3v-rtop .svc{color:#fff}
|
|
46
|
+
.drm3v-rtop .dep{color:#a8a8be;font-weight:600}
|
|
47
|
+
.drm3v-raction{margin-left:auto;font-family:ui-monospace,Menlo,monospace;font-size:.69rem;font-weight:600;color:#cfcfe0;
|
|
48
|
+
background:rgba(141,141,163,.14);border:1px solid #2c2c42;padding:2px 9px;border-radius:999px;letter-spacing:0;text-transform:none}
|
|
49
|
+
.drm3v-rsigner{display:flex;align-items:center;gap:9px;margin-top:12px}
|
|
50
|
+
.drm3v-rsigner>svg{flex:none;width:20px;height:20px;color:#7fe3b0}
|
|
51
|
+
.drm3v-rname{font-weight:700;font-size:.95rem;color:#fff;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
52
|
+
.drm3v-rstate{margin-left:auto;display:inline-flex;align-items:center;gap:5px;font-size:.71rem;font-weight:700;
|
|
53
|
+
padding:4px 10px;border-radius:999px;border:1px solid;white-space:nowrap;flex:none}
|
|
54
|
+
.drm3v-rstate svg{width:13px;height:13px}
|
|
55
|
+
.drm3v-rstate.ok{color:#9ff0c4;background:rgba(70,201,138,.15);border-color:rgba(70,201,138,.45)}
|
|
56
|
+
.drm3v-rstate.wait{color:#c2c2d4;background:rgba(141,141,163,.14);border-color:#34344a}
|
|
57
|
+
.drm3v-rstate.part{color:#f3d09a;background:rgba(227,162,75,.15);border-color:rgba(227,162,75,.45)}
|
|
58
|
+
.drm3v-rstate.bad{color:#ffb3c0;background:rgba(224,85,107,.15);border-color:rgba(224,85,107,.45)}
|
|
59
|
+
.drm3v-rstate.spin svg{animation:drm3v-spin .7s linear infinite}
|
|
60
|
+
.drm3v-rkey{font-family:ui-monospace,Menlo,monospace;font-size:.71rem;color:#a8a8be;margin-top:9px;word-break:break-all}
|
|
61
|
+
.drm3v-rnote{font-size:.77rem;color:#bdbdd0;margin-top:8px;line-height:1.45}
|
|
62
|
+
.drm3v-rnote b{color:#fff}
|
|
63
|
+
.drm3v-rseal{position:absolute;right:-12px;bottom:-18px;width:94px;height:94px;color:#46c98a;opacity:.09;transform:rotate(-11deg);pointer-events:none}
|
|
64
|
+
.drm3v-rcpt.part .drm3v-rseal{color:#e3a24b}
|
|
65
|
+
.drm3v-rcpt.bad .drm3v-rseal{color:#e0556b}
|
|
66
|
+
.drm3v-railhead{display:flex;align-items:center;gap:8px;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;color:#a8a8be;margin:17px 0 4px}
|
|
67
|
+
.drm3v-railhead .ct{color:#cfcfe0;font-family:ui-monospace,Menlo,monospace;letter-spacing:0;background:rgba(141,141,163,.14);border-radius:999px;padding:1px 8px}
|
|
68
|
+
.drm3v-step{display:flex;gap:12px;padding:11px 0;border-top:1px solid #1d1d2c;opacity:.35;transform:translateY(4px);transition:opacity .4s,transform .4s}
|
|
69
|
+
.drm3v-step.on{opacity:1;transform:none}
|
|
70
|
+
.drm3v-dot{flex:none;width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.7rem;
|
|
71
|
+
background:#1d1d2c;color:#a8a8be;border:1px solid #2a2a3d}
|
|
72
|
+
.drm3v-dot svg{width:13px;height:13px}
|
|
73
|
+
.drm3v-dot.ok{background:#46c98a;color:#0a0a10;border-color:#46c98a}
|
|
74
|
+
.drm3v-dot.warn{background:rgba(227,162,75,.18);color:#f3d09a;border-color:rgba(227,162,75,.5)}
|
|
75
|
+
.drm3v-dot.bad{background:#e0556b;color:#fff;border-color:#e0556b}
|
|
76
|
+
.drm3v-dot.spin{border-top-color:#7fe3b0;animation:drm3v-spin .7s linear infinite}
|
|
77
|
+
@keyframes drm3v-spin{to{transform:rotate(360deg)}}
|
|
78
|
+
.drm3v-body{flex:1;min-width:0}
|
|
79
|
+
.drm3v-act{font-weight:600;font-size:.88rem;color:#fff}
|
|
80
|
+
.drm3v-meta{font-size:.71rem;color:#a8a8be;margin-top:3px;word-break:break-all;font-family:ui-monospace,Menlo,monospace}
|
|
81
|
+
.drm3v-detail{margin:8px 0 2px;padding:9px 11px;background:#0e0e16;border:1px solid #1d1d2c;border-radius:9px}
|
|
82
|
+
.drm3v-kv{display:flex;gap:9px;font-size:.71rem;line-height:1.5;margin:2px 0}
|
|
83
|
+
.drm3v-kv>span{flex:none;width:56px;color:#a8a8be;text-transform:uppercase;letter-spacing:.05em;font-size:.64rem;font-weight:700;padding-top:2px}
|
|
84
|
+
.drm3v-kv>b{color:#e8e8f2;font-weight:600;min-width:0;word-break:break-word}
|
|
85
|
+
.drm3v-kv>code{font-family:ui-monospace,Menlo,monospace;color:#9ff0c4;word-break:break-all;font-size:.7rem}
|
|
86
|
+
.drm3v-att{margin-top:8px;font-size:.72rem;line-height:1.55;color:#a6a6bd;border-left:2px solid #2a2a3d;padding:1px 0 1px 9px}
|
|
87
|
+
.drm3v-clinks{display:flex;flex-wrap:wrap;gap:8px;margin-top:9px}
|
|
88
|
+
.drm3v-clink{font-size:.72rem;font-weight:600;color:#7fe3b0;text-decoration:none;border:1px solid rgba(70,201,138,.32);border-radius:999px;padding:3px 11px;transition:background .14s,border-color .14s;cursor:pointer}
|
|
89
|
+
.drm3v-clink:hover{background:rgba(70,201,138,.13);border-color:rgba(70,201,138,.5)}
|
|
90
|
+
.drm3v-dlbtn{display:inline-flex;align-items:center;gap:7px;margin-top:13px;padding:8px 14px;font:inherit;font-size:.78rem;font-weight:600;
|
|
91
|
+
color:#cfcfe0;background:rgba(141,141,163,.12);border:1px solid #34344a;border-radius:9px;cursor:pointer;transition:border-color .14s,background .14s}
|
|
92
|
+
.drm3v-dlbtn:hover{border-color:#7fe3b0;color:#9ff0c4;background:rgba(70,201,138,.1)}
|
|
93
|
+
.drm3v-dlbtn svg{width:14px;height:14px}
|
|
94
|
+
.drm3v-final{margin-top:16px;padding:16px;border-radius:14px;font-size:.86rem;line-height:1.5}
|
|
95
|
+
.drm3v-final.ok{background:rgba(70,201,138,.10);border:1px solid rgba(70,201,138,.4);color:#cdeede}
|
|
96
|
+
.drm3v-final.part{background:rgba(227,162,75,.10);border:1px solid rgba(227,162,75,.4);color:#ecd6ad}
|
|
97
|
+
.drm3v-final.bad{background:rgba(224,85,107,.10);border:1px solid rgba(224,85,107,.4);color:#f3c0c9}
|
|
98
|
+
.drm3v-final b{color:#fff}
|
|
99
|
+
.drm3v-final svg{width:16px;height:16px;vertical-align:-3px;margin-right:4px}
|
|
100
|
+
.drm3v-counts{display:block;margin-top:8px;font-size:.78rem;font-family:ui-monospace,Menlo,monospace;color:inherit;opacity:.92}`;
|
|
101
|
+
document.head.appendChild(s);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=receipts-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts-ui.js","sourceRoot":"","sources":["../src/receipts-ui.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,8DAA8D;AAE9D,iFAAiF;AACjF,MAAM,CAAC,MAAM,KAAK,GAChB,gKAAgK,CAAC;AACnK,MAAM,CAAC,MAAM,IAAI,GACf,yNAAyN,CAAC;AAC5N,MAAM,CAAC,MAAM,GAAG,GACd,8NAA8N,CAAC;AACjO,MAAM,CAAC,MAAM,KAAK,GAChB,mQAAmQ,CAAC;AACtQ,MAAM,CAAC,MAAM,KAAK,GAChB,2OAA2O,CAAC;AAC9O,MAAM,CAAC,MAAM,OAAO,GAClB,6RAA6R,CAAC;AAChS,MAAM,CAAC,MAAM,IAAI,GACf,wJAAwJ,CAAC;AAC3J,MAAM,CAAC,MAAM,QAAQ,GACnB,gLAAgL,CAAC;AAEnL,iFAAiF;AACjF,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC;QAAE,OAAO;IACpF,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC;IACnB,CAAC,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kIAgFgH,CAAC;IACjI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Receipt } from "./receipts-types.js";
|
|
2
|
+
export declare function canonicalize(obj: unknown): string;
|
|
3
|
+
export declare function verifyReceipt(r: Receipt): Promise<boolean>;
|
|
4
|
+
export declare function verifyContentSig(contentSig: string, publicKey: string, body: string): Promise<boolean | null>;
|
|
5
|
+
export declare function hashHex(algo: AlgorithmIdentifier, s: string): Promise<string>;
|
|
6
|
+
export declare const sha256Hex: (s: string) => Promise<string>;
|
|
7
|
+
export declare function isEd25519Supported(): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=receipts-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts-verify.d.ts","sourceRoot":"","sources":["../src/receipts-verify.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAOnD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAWjD;AAmBD,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAiChE;AAKD,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAUnH;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnF;AACD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,OAAO,CAAC,MAAM,CAA0B,CAAC;AAC/E,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO3D"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// @drm3/sdk/receipts - the in-browser Ed25519 verifier + DRM3-CJ canonicalization.
|
|
2
|
+
//
|
|
3
|
+
// Verifier logic is a faithful port of drm3-provenance/bindings/browser/
|
|
4
|
+
// provenance-verify.js (canonical JSON: recursively sorted keys, compact). The
|
|
5
|
+
// signature covers a SPECIFIC field subset of the receipt, NOT the whole
|
|
6
|
+
// receipt_json - canonicalizing the full object instead silently fails every check.
|
|
7
|
+
// ── canonical verifier (ported, byte-for-byte canonicalization) ──────────────
|
|
8
|
+
// DRM3-CJ: keys sorted at every level, compact, and every string (keys AND
|
|
9
|
+
// values) NFC-normalized per spec/CANONICALIZATION.md - data crosses OS text
|
|
10
|
+
// stacks that decompose Unicode, and without NFC the same content hashes two
|
|
11
|
+
// ways. Numbers ride JSON.stringify, which is already the required RFC 8785 form.
|
|
12
|
+
export function canonicalize(obj) {
|
|
13
|
+
if (obj === null || obj === undefined)
|
|
14
|
+
return JSON.stringify(obj);
|
|
15
|
+
if (Array.isArray(obj))
|
|
16
|
+
return `[${obj.map(canonicalize).join(",")}]`;
|
|
17
|
+
if (typeof obj === "object") {
|
|
18
|
+
const keys = Object.keys(obj)
|
|
19
|
+
.map((k) => k.normalize("NFC"))
|
|
20
|
+
.sort();
|
|
21
|
+
return `{${keys.map((k) => `${JSON.stringify(k)}:${canonicalize(obj[k])}`).join(",")}}`;
|
|
22
|
+
}
|
|
23
|
+
if (typeof obj === "string")
|
|
24
|
+
return JSON.stringify(obj.normalize("NFC"));
|
|
25
|
+
return JSON.stringify(obj);
|
|
26
|
+
}
|
|
27
|
+
function hexToBytes(hex) {
|
|
28
|
+
const out = new Uint8Array(hex.length / 2);
|
|
29
|
+
for (let i = 0; i < hex.length; i += 2)
|
|
30
|
+
out[i / 2] = Number.parseInt(hex.substr(i, 2), 16);
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
// The spec-1.1 fields. build_signing_payload() inserts each ONLY when set, so an
|
|
34
|
+
// all-absent 1.1 receipt canonicalizes byte-identically to a 1.0 one. Omitting
|
|
35
|
+
// them here made this verifier REJECT genuine 1.1 receipts (measured 2026-07-11
|
|
36
|
+
// against the SDK's own two-leg-chain vector, which carries purpose + caller +
|
|
37
|
+
// outputs + content_sig): a false negative, i.e. calling a real receipt a forgery.
|
|
38
|
+
const SPEC11_FIELDS = ["purpose", "caller", "inputs", "outputs", "content_sig"];
|
|
39
|
+
// Verify a receipt's Ed25519 signature in the browser. The signature covers a
|
|
40
|
+
// SPECIFIC field subset (NOT the whole receipt_json, which also carries
|
|
41
|
+
// signature/created_at) - this mirrors the canonical reference verifier
|
|
42
|
+
// (crates/provenance/src/receipt.rs build_signing_payload) exactly: the ten base
|
|
43
|
+
// fields, with absent optionals signed as null, plus any spec-1.1 fields present.
|
|
44
|
+
export async function verifyReceipt(r) {
|
|
45
|
+
const p = (typeof r.receipt_json === "string" ? JSON.parse(r.receipt_json) : r.receipt_json);
|
|
46
|
+
if (!p)
|
|
47
|
+
return false;
|
|
48
|
+
const sig = (r.signature || p.signature || "").replace(/^ed25519:/, "");
|
|
49
|
+
const pub = (r.public_key || p.public_key || "").replace(/^ed25519:/, "");
|
|
50
|
+
if (!sig || !pub)
|
|
51
|
+
return false;
|
|
52
|
+
const key = await crypto.subtle.importKey("raw", hexToBytes(pub), { name: "Ed25519" }, false, ["verify"]);
|
|
53
|
+
const sigBytes = hexToBytes(sig);
|
|
54
|
+
const payloadFor = (ts) => {
|
|
55
|
+
const base = {
|
|
56
|
+
id: p.id,
|
|
57
|
+
action: p.action,
|
|
58
|
+
timestamp: ts,
|
|
59
|
+
input_hash: p.input_hash,
|
|
60
|
+
output_hash: p.output_hash,
|
|
61
|
+
cost: p.cost ?? null,
|
|
62
|
+
duration_ms: p.duration_ms ?? null,
|
|
63
|
+
parent_id: p.parent_id ?? null,
|
|
64
|
+
metadata: p.metadata ?? null,
|
|
65
|
+
public_key: p.public_key,
|
|
66
|
+
};
|
|
67
|
+
for (const k of SPEC11_FIELDS) {
|
|
68
|
+
if (p[k] !== undefined && p[k] !== null)
|
|
69
|
+
base[k] = p[k];
|
|
70
|
+
}
|
|
71
|
+
return base;
|
|
72
|
+
};
|
|
73
|
+
const tryVerify = (ts) => crypto.subtle.verify("Ed25519", key, sigBytes, new TextEncoder().encode(canonicalize(payloadFor(ts))));
|
|
74
|
+
// as-signed first; then the historical Z → +00:00 timestamp normalization
|
|
75
|
+
if (await tryVerify(p.timestamp))
|
|
76
|
+
return true;
|
|
77
|
+
if (typeof p.timestamp === "string" && p.timestamp.endsWith("Z")) {
|
|
78
|
+
if (await tryVerify(`${p.timestamp.slice(0, -1)}+00:00`))
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Verify a `content_sig` - an Ed25519 signature OVER A BODY's exact bytes (e.g. a
|
|
84
|
+
// brief's text) with the signer key. Real tamper-evidence AND authorship, not a
|
|
85
|
+
// content-hash compare. null = couldn't run the check (no Ed25519, missing pieces).
|
|
86
|
+
export async function verifyContentSig(contentSig, publicKey, body) {
|
|
87
|
+
const sig = String(contentSig || "").replace(/^ed25519:/, "");
|
|
88
|
+
const pub = String(publicKey || "").replace(/^ed25519:/, "");
|
|
89
|
+
if (!sig || !pub || !body || !crypto?.subtle)
|
|
90
|
+
return null;
|
|
91
|
+
try {
|
|
92
|
+
const key = await crypto.subtle.importKey("raw", hexToBytes(pub), { name: "Ed25519" }, false, ["verify"]);
|
|
93
|
+
return await crypto.subtle.verify("Ed25519", key, hexToBytes(sig), new TextEncoder().encode(body));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export async function hashHex(algo, s) {
|
|
100
|
+
const buf = await crypto.subtle.digest(algo, new TextEncoder().encode(s));
|
|
101
|
+
return [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
102
|
+
}
|
|
103
|
+
export const sha256Hex = (s) => hashHex("SHA-256", s);
|
|
104
|
+
export async function isEd25519Supported() {
|
|
105
|
+
try {
|
|
106
|
+
await crypto.subtle.generateKey({ name: "Ed25519" }, false, ["sign", "verify"]);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=receipts-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts-verify.js","sourceRoot":"","sources":["../src/receipts-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./receipts-api.js";
|
|
2
|
+
export * from "./receipts-chain.js";
|
|
3
|
+
export * from "./receipts-modal.js";
|
|
4
|
+
export * from "./receipts-registry.js";
|
|
5
|
+
export * from "./receipts-render.js";
|
|
6
|
+
export * from "./receipts-types.js";
|
|
7
|
+
export * from "./receipts-ui.js";
|
|
8
|
+
export * from "./receipts-verify.js";
|
|
9
|
+
//# sourceMappingURL=receipts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../src/receipts.ts"],"names":[],"mappings":"AAoBA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|