@opensyber/tokenforge 1.0.0 → 1.1.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 +130 -11
- package/dist/adapters/astro.d.ts +9 -0
- package/dist/adapters/astro.d.ts.map +1 -1
- package/dist/adapters/astro.js +13 -0
- package/dist/adapters/astro.js.map +1 -1
- package/dist/adapters/cloud-v2-bridge.d.ts +8 -0
- package/dist/adapters/cloud-v2-bridge.d.ts.map +1 -0
- package/dist/adapters/cloud-v2-bridge.js +24 -0
- package/dist/adapters/cloud-v2-bridge.js.map +1 -0
- package/dist/adapters/express.d.ts +15 -2
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +38 -0
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.d.ts +15 -6
- package/dist/adapters/fastify.d.ts.map +1 -1
- package/dist/adapters/fastify.js +38 -0
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/hono.d.ts +12 -0
- package/dist/adapters/hono.d.ts.map +1 -1
- package/dist/adapters/hono.js +13 -0
- package/dist/adapters/hono.js.map +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/nextjs.d.ts +15 -0
- package/dist/adapters/nextjs.d.ts.map +1 -1
- package/dist/adapters/nextjs.js +57 -30
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/sveltekit.d.ts +9 -0
- package/dist/adapters/sveltekit.d.ts.map +1 -1
- package/dist/adapters/sveltekit.js +13 -0
- package/dist/adapters/sveltekit.js.map +1 -1
- package/dist/client/action-signer.d.ts.map +1 -1
- package/dist/client/action-signer.js.map +1 -1
- package/dist/client/binding.d.ts.map +1 -1
- package/dist/client/binding.js.map +1 -1
- package/dist/client/cloud-device.d.ts +54 -0
- package/dist/client/cloud-device.d.ts.map +1 -0
- package/dist/client/cloud-device.js +301 -0
- package/dist/client/cloud-device.js.map +1 -0
- package/dist/client/crypto.d.ts.map +1 -1
- package/dist/client/crypto.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/interceptor.d.ts.map +1 -1
- package/dist/client/interceptor.js +27 -3
- package/dist/client/interceptor.js.map +1 -1
- package/dist/client/signer.d.ts +23 -3
- package/dist/client/signer.d.ts.map +1 -1
- package/dist/client/signer.js +33 -5
- package/dist/client/signer.js.map +1 -1
- package/dist/client/storage.d.ts.map +1 -1
- package/dist/client/storage.js.map +1 -1
- package/dist/client/webauthn.d.ts.map +1 -1
- package/dist/client/webauthn.js.map +1 -1
- package/dist/protocol/v2.d.ts +23 -0
- package/dist/protocol/v2.d.ts.map +1 -0
- package/dist/protocol/v2.js +157 -0
- package/dist/protocol/v2.js.map +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/provider.js.map +1 -1
- package/dist/server/action-verify.d.ts.map +1 -1
- package/dist/server/action-verify.js +1 -1
- package/dist/server/action-verify.js.map +1 -1
- package/dist/server/activity-histogram.d.ts +47 -0
- package/dist/server/activity-histogram.d.ts.map +1 -0
- package/dist/server/activity-histogram.js +76 -0
- package/dist/server/activity-histogram.js.map +1 -0
- package/dist/server/aitm-heuristics.d.ts.map +1 -1
- package/dist/server/aitm-heuristics.js.map +1 -1
- package/dist/server/bind-with-id-token.d.ts +55 -0
- package/dist/server/bind-with-id-token.d.ts.map +1 -0
- package/dist/server/bind-with-id-token.js +70 -0
- package/dist/server/bind-with-id-token.js.map +1 -0
- package/dist/server/bound-cookie.d.ts.map +1 -1
- package/dist/server/bound-cookie.js.map +1 -1
- package/dist/server/cbor.d.ts.map +1 -1
- package/dist/server/cbor.js.map +1 -1
- package/dist/server/cloud-bind.d.ts +42 -0
- package/dist/server/cloud-bind.d.ts.map +1 -0
- package/dist/server/cloud-bind.js +387 -0
- package/dist/server/cloud-bind.js.map +1 -0
- package/dist/server/cloud-middleware.d.ts +46 -0
- package/dist/server/cloud-middleware.d.ts.map +1 -0
- package/dist/server/cloud-middleware.js +344 -0
- package/dist/server/cloud-middleware.js.map +1 -0
- package/dist/server/cloud-verify.d.ts +30 -0
- package/dist/server/cloud-verify.d.ts.map +1 -0
- package/dist/server/cloud-verify.js +206 -0
- package/dist/server/cloud-verify.js.map +1 -0
- package/dist/server/dbsc-challenge.d.ts.map +1 -1
- package/dist/server/dbsc-challenge.js.map +1 -1
- package/dist/server/dbsc-endpoint.d.ts +20 -0
- package/dist/server/dbsc-endpoint.d.ts.map +1 -0
- package/dist/server/dbsc-endpoint.js +85 -0
- package/dist/server/dbsc-endpoint.js.map +1 -0
- package/dist/server/dbsc-verify.d.ts +32 -0
- package/dist/server/dbsc-verify.d.ts.map +1 -0
- package/dist/server/dbsc-verify.js +65 -0
- package/dist/server/dbsc-verify.js.map +1 -0
- package/dist/server/identity-profile.d.ts +18 -0
- package/dist/server/identity-profile.d.ts.map +1 -0
- package/dist/server/identity-profile.js +113 -0
- package/dist/server/identity-profile.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/jws-verify.d.ts.map +1 -1
- package/dist/server/jws-verify.js.map +1 -1
- package/dist/server/middleware.d.ts +9 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +60 -20
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/oidc-verify.d.ts +16 -1
- package/dist/server/oidc-verify.d.ts.map +1 -1
- package/dist/server/oidc-verify.js +9 -1
- package/dist/server/oidc-verify.js.map +1 -1
- package/dist/server/policy.d.ts.map +1 -1
- package/dist/server/policy.js.map +1 -1
- package/dist/server/step-up-policy.d.ts.map +1 -1
- package/dist/server/step-up-policy.js.map +1 -1
- package/dist/server/storage/index.d.ts +3 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +2 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/interface.d.ts +73 -0
- package/dist/server/storage/interface.d.ts.map +1 -0
- package/dist/server/storage/interface.js +2 -0
- package/dist/server/storage/interface.js.map +1 -0
- package/dist/server/storage/memory.d.ts +50 -0
- package/dist/server/storage/memory.d.ts.map +1 -0
- package/dist/server/storage/memory.js +121 -0
- package/dist/server/storage/memory.js.map +1 -0
- package/dist/server/webauthn-verify.d.ts.map +1 -1
- package/dist/server/webauthn-verify.js.map +1 -1
- package/dist/server/webhooks.d.ts.map +1 -1
- package/dist/server/webhooks.js.map +1 -1
- package/dist/shared/action-hash.d.ts.map +1 -1
- package/dist/shared/action-hash.js.map +1 -1
- package/dist/shared/identity.d.ts +45 -0
- package/dist/shared/identity.d.ts.map +1 -0
- package/dist/shared/identity.js +176 -0
- package/dist/shared/identity.js.map +1 -0
- package/dist/shared/types-internal.d.ts.map +1 -1
- package/dist/shared/types-internal.js.map +1 -1
- package/dist/shared/types.d.ts +47 -2
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +1 -0
- package/dist/shared/types.js.map +1 -1
- package/package.json +9 -47
- package/dist/server/trust-score-fixtures.d.ts +0 -9
- package/dist/server/trust-score-fixtures.d.ts.map +0 -1
- package/dist/server/trust-score-fixtures.js +0 -23
- package/dist/server/trust-score-fixtures.js.map +0 -1
- package/dist/server/webauthn-verify.test-helpers.d.ts +0 -8
- package/dist/server/webauthn-verify.test-helpers.d.ts.map +0 -1
- package/dist/server/webauthn-verify.test-helpers.js +0 -39
- package/dist/server/webauthn-verify.test-helpers.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"../src/","sources":["client/crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC,CAMpE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAErB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"../src/","sources":["client/crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,aAAa,GAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAE7E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CACpC,aAAa,EACb,KAAK,EAAE,kBAAkB;IACzB,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAsB;IAEtB,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { TokenForgeConfig } from '../shared/types.js';
|
|
2
2
|
import { type ActionPayload, type SignActionResult } from './action-signer.js';
|
|
3
|
+
export { TokenForgeDevice, type TokenForgeDeviceOptions, type BrowserDeviceRecord, type BrowserDeviceStore, type BindResult, type BoundResult, type UnboundResult, } from './cloud-device.js';
|
|
3
4
|
/**
|
|
4
5
|
* TokenForge Client SDK — main entry point.
|
|
5
6
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"../src/","sources":["client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,kBAAkB,CAA6B;gBAE3C,MAAM,EAAE,gBAAgB;IAIpC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC3B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCrD,gEAAgE;IAChE,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,8EAA8E;IAC9E,OAAO,IAAI,OAAO;IAIlB,8EAA8E;IACxE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,8EAA8E;IACxE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;;;;;OAMG;IACG,UAAU,CACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACxE,OAAO,CAAC,gBAAgB,CAAC;CAgB7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAErE"}
|
package/dist/client/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { bindDevice } from './binding.js';
|
|
|
2
2
|
import { clearDeviceKeys } from './storage.js';
|
|
3
3
|
import { installFetchInterceptor } from './interceptor.js';
|
|
4
4
|
import { signAction as signActionInternal, } from './action-signer.js';
|
|
5
|
+
export { TokenForgeDevice, } from './cloud-device.js';
|
|
5
6
|
/**
|
|
6
7
|
* TokenForge Client SDK — main entry point.
|
|
7
8
|
*
|
|
@@ -71,7 +72,8 @@ export class TokenForge {
|
|
|
71
72
|
return request;
|
|
72
73
|
const nonce = generateNonce();
|
|
73
74
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
74
|
-
const
|
|
75
|
+
const result = await signChallenge(this.keyPair.privateKey, sessionId, nonce, timestamp);
|
|
76
|
+
const signature = typeof result === 'string' ? result : result.signature;
|
|
75
77
|
const headers = new Headers(request.headers);
|
|
76
78
|
headers.set(this.config.headers?.signature || 'X-TF-Signature', signature);
|
|
77
79
|
headers.set(this.config.headers?.nonce || 'X-TF-Nonce', nonce);
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../src/","sources":["client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"../src/","sources":["client/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,EACxB,kBAAkB,EAAE,MAAM,OAAO,CAAC;IAChC,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAAC,GACR,MAAM,IAAI,CAoGZ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { signChallenge, generateNonce } from './signer.js';
|
|
1
|
+
import { signChallenge, generateNonce, TF_PROTOCOL_VERSION } from './signer.js';
|
|
2
2
|
/**
|
|
3
3
|
* Install a fetch interceptor that automatically signs all requests
|
|
4
4
|
* to the protected API with TokenForge headers.
|
|
@@ -22,12 +22,19 @@ export function installFetchInterceptor(config, getSigningMaterial) {
|
|
|
22
22
|
}
|
|
23
23
|
const nonce = generateNonce();
|
|
24
24
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
25
|
-
const
|
|
25
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
26
|
+
const parsedUrl = url.startsWith('http') ? new URL(url) : new URL(url, location.origin);
|
|
27
|
+
const path = parsedUrl.pathname;
|
|
28
|
+
const body = await extractBody(input, init);
|
|
29
|
+
const result = await signChallenge(material.privateKey, material.sessionId, nonce, timestamp, method, path, body);
|
|
26
30
|
const headers = new Headers(init?.headers);
|
|
27
|
-
headers.set(config.headers?.signature || 'X-TF-Signature', signature);
|
|
31
|
+
headers.set(config.headers?.signature || 'X-TF-Signature', result.signature);
|
|
28
32
|
headers.set(config.headers?.nonce || 'X-TF-Nonce', nonce);
|
|
29
33
|
headers.set(config.headers?.timestamp || 'X-TF-Timestamp', timestamp.toString());
|
|
30
34
|
headers.set(config.headers?.deviceId || 'X-TF-Device-ID', material.deviceId);
|
|
35
|
+
headers.set(config.headers?.sessionId || 'X-TF-Session-ID', material.sessionId);
|
|
36
|
+
headers.set(config.headers?.version || 'X-TF-Version', TF_PROTOCOL_VERSION);
|
|
37
|
+
headers.set(config.headers?.bodyHash || 'X-TF-Body-Hash', result.bodyHash);
|
|
31
38
|
const response = await originalFetch(input, { ...init, headers });
|
|
32
39
|
if (response.status === 403) {
|
|
33
40
|
const body = await response
|
|
@@ -60,6 +67,23 @@ export function installFetchInterceptor(config, getSigningMaterial) {
|
|
|
60
67
|
window.fetch = originalFetch;
|
|
61
68
|
};
|
|
62
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract the body as a string from the fetch arguments.
|
|
72
|
+
* For streaming bodies or non-string types, returns null (hashed as empty).
|
|
73
|
+
*/
|
|
74
|
+
async function extractBody(input, init) {
|
|
75
|
+
const raw = init?.body ?? (input instanceof Request ? input.body : null);
|
|
76
|
+
if (raw == null)
|
|
77
|
+
return null;
|
|
78
|
+
if (typeof raw === 'string')
|
|
79
|
+
return raw;
|
|
80
|
+
if (raw instanceof ArrayBuffer)
|
|
81
|
+
return new TextDecoder().decode(raw);
|
|
82
|
+
if (raw instanceof Uint8Array)
|
|
83
|
+
return new TextDecoder().decode(raw);
|
|
84
|
+
// ReadableStream or FormData — cannot consume without side effects
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
63
87
|
function shouldIntercept(url, config) {
|
|
64
88
|
// Only intercept requests to the API base
|
|
65
89
|
if (!url.startsWith(config.apiBase) && !url.startsWith('/')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"../src/","sources":["client/interceptor.ts"],"names":[],"mappings":"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"}
|
package/dist/client/signer.d.ts
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Challenge-response signing protocol.
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* **v2** signs: `${method}:${path}:${bodyHash}:${sessionId}:${nonce}:${timestamp}`
|
|
5
|
+
* where bodyHash is the hex SHA-256 of the request body (empty string for GET/HEAD).
|
|
6
|
+
*
|
|
7
|
+
* **v1** (legacy) signs: `${sessionId}:${nonce}:${timestamp}`.
|
|
4
8
|
*
|
|
5
9
|
* Also exports `isNativeDbscAvailable()` — feature-detect for the W3C
|
|
6
10
|
* Device-Bound Session Credentials API (Chrome 146+). When present, the
|
|
7
11
|
* SDK can defer key generation + binding to the platform; otherwise it
|
|
8
12
|
* continues using the Web Crypto fallback path implemented here.
|
|
9
13
|
*/
|
|
14
|
+
/** Protocol version — determines signature input format. */
|
|
15
|
+
export declare const TF_PROTOCOL_VERSION = "2";
|
|
16
|
+
/**
|
|
17
|
+
* Compute hex-encoded SHA-256 of arbitrary text.
|
|
18
|
+
* Uses Web Crypto — works in browsers and Cloudflare Workers.
|
|
19
|
+
*/
|
|
20
|
+
export declare function sha256Hex(data: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Build the v2 signature input that covers HTTP method, path, and body.
|
|
23
|
+
* @returns The string to be signed with ECDSA P-256.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildSignatureInput(sessionId: string, nonce: string, timestamp: string, method: string, path: string, body: string | null): Promise<string>;
|
|
10
26
|
/**
|
|
11
|
-
* Sign a challenge payload with the device-bound private key.
|
|
27
|
+
* Sign a challenge payload with the device-bound private key (v2 format).
|
|
28
|
+
* Includes HTTP method, URL path, and body hash in the signed payload.
|
|
12
29
|
*/
|
|
13
|
-
export declare function signChallenge(privateKey: CryptoKey, sessionId: string, nonce: string, timestamp: number): Promise<
|
|
30
|
+
export declare function signChallenge(privateKey: CryptoKey, sessionId: string, nonce: string, timestamp: number, method?: string, path?: string, body?: string | null): Promise<{
|
|
31
|
+
signature: string;
|
|
32
|
+
bodyHash: string;
|
|
33
|
+
}>;
|
|
14
34
|
/**
|
|
15
35
|
* Generate a client-side nonce.
|
|
16
36
|
* Server will verify this hasn't been used before.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"../src/","sources":["client/signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACnD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAChD,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,SAAS,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAclD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAOlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAK/C"}
|
package/dist/client/signer.js
CHANGED
|
@@ -1,20 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Challenge-response signing protocol.
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* **v2** signs: `${method}:${path}:${bodyHash}:${sessionId}:${nonce}:${timestamp}`
|
|
5
|
+
* where bodyHash is the hex SHA-256 of the request body (empty string for GET/HEAD).
|
|
6
|
+
*
|
|
7
|
+
* **v1** (legacy) signs: `${sessionId}:${nonce}:${timestamp}`.
|
|
4
8
|
*
|
|
5
9
|
* Also exports `isNativeDbscAvailable()` — feature-detect for the W3C
|
|
6
10
|
* Device-Bound Session Credentials API (Chrome 146+). When present, the
|
|
7
11
|
* SDK can defer key generation + binding to the platform; otherwise it
|
|
8
12
|
* continues using the Web Crypto fallback path implemented here.
|
|
9
13
|
*/
|
|
14
|
+
/** Protocol version — determines signature input format. */
|
|
15
|
+
export const TF_PROTOCOL_VERSION = '2';
|
|
16
|
+
/**
|
|
17
|
+
* Compute hex-encoded SHA-256 of arbitrary text.
|
|
18
|
+
* Uses Web Crypto — works in browsers and Cloudflare Workers.
|
|
19
|
+
*/
|
|
20
|
+
export async function sha256Hex(data) {
|
|
21
|
+
const encoded = new TextEncoder().encode(data);
|
|
22
|
+
const hash = await crypto.subtle.digest('SHA-256', encoded);
|
|
23
|
+
const bytes = new Uint8Array(hash);
|
|
24
|
+
return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build the v2 signature input that covers HTTP method, path, and body.
|
|
28
|
+
* @returns The string to be signed with ECDSA P-256.
|
|
29
|
+
*/
|
|
30
|
+
export async function buildSignatureInput(sessionId, nonce, timestamp, method, path, body) {
|
|
31
|
+
const bodyHash = await sha256Hex(body ?? '');
|
|
32
|
+
return `${method}:${path}:${bodyHash}:${sessionId}:${nonce}:${timestamp}`;
|
|
33
|
+
}
|
|
10
34
|
/**
|
|
11
|
-
* Sign a challenge payload with the device-bound private key.
|
|
35
|
+
* Sign a challenge payload with the device-bound private key (v2 format).
|
|
36
|
+
* Includes HTTP method, URL path, and body hash in the signed payload.
|
|
12
37
|
*/
|
|
13
|
-
export async function signChallenge(privateKey, sessionId, nonce, timestamp) {
|
|
14
|
-
const
|
|
38
|
+
export async function signChallenge(privateKey, sessionId, nonce, timestamp, method, path, body) {
|
|
39
|
+
const bodyHash = await sha256Hex(body ?? '');
|
|
40
|
+
const payload = method && path
|
|
41
|
+
? `${method}:${path}:${bodyHash}:${sessionId}:${nonce}:${timestamp}`
|
|
42
|
+
: `${sessionId}:${nonce}:${timestamp}`;
|
|
15
43
|
const encoded = new TextEncoder().encode(payload);
|
|
16
44
|
const signature = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, privateKey, encoded);
|
|
17
|
-
return arrayBufferToBase64Url(signature);
|
|
45
|
+
return { signature: arrayBufferToBase64Url(signature), bodyHash };
|
|
18
46
|
}
|
|
19
47
|
/**
|
|
20
48
|
* Generate a client-side nonce.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"../src/","sources":["client/signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"../src/","sources":["client/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAUjE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"../src/","sources":["client/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"webauthn.d.ts","sourceRoot":"../src/","sources":["client/webauthn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,CAK1E;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAO7D;AAOD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAgD7B;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CA0B5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"../src/","sources":["client/webauthn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** TokenForge request-bound proof protocol. See @opensyber/tokenforge-protocol/v2/request-proof.md. */
|
|
2
|
+
export declare const PROTOCOL_V2: "tf-request-v2";
|
|
3
|
+
export interface RequestProofV2 {
|
|
4
|
+
protocol: typeof PROTOCOL_V2;
|
|
5
|
+
projectId: string;
|
|
6
|
+
deviceId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
method: string;
|
|
9
|
+
path: string;
|
|
10
|
+
query: string;
|
|
11
|
+
bodySha256: string;
|
|
12
|
+
origin: string;
|
|
13
|
+
nonce: string;
|
|
14
|
+
/** Unix time in milliseconds, encoded as an unsigned decimal integer. */
|
|
15
|
+
timestamp: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function canonicalizePath(input: string): string;
|
|
18
|
+
export declare function canonicalizeQuery(input: string): string;
|
|
19
|
+
export declare function canonicalizeOrigin(input: string): string;
|
|
20
|
+
export declare function encodeRequestProof(input: RequestProofV2): Uint8Array;
|
|
21
|
+
export declare function sha256Base64Url(body: BufferSource): Promise<string>;
|
|
22
|
+
export declare function base64Url(bytes: Uint8Array): string;
|
|
23
|
+
//# sourceMappingURL=v2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2.d.ts","sourceRoot":"../src/","sources":["protocol/v2.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,eAAO,MAAM,WAAW,EAAG,eAAwB,CAAC;AAMpD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,WAAW,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBvD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CA0CpE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAGzE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAInD"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/** TokenForge request-bound proof protocol. See @opensyber/tokenforge-protocol/v2/request-proof.md. */
|
|
2
|
+
export const PROTOCOL_V2 = 'tf-request-v2';
|
|
3
|
+
const MAGIC = new Uint8Array([0x54, 0x46, 0x56, 0x32, 0x00]); // TFV2\0
|
|
4
|
+
const MAX_FIELD_BYTES = 4096;
|
|
5
|
+
const UNRESERVED = /^[A-Za-z0-9._~-]$/;
|
|
6
|
+
export function canonicalizePath(input) {
|
|
7
|
+
if (!input.startsWith('/'))
|
|
8
|
+
throw new Error('TokenForge path must start with /');
|
|
9
|
+
if (/%(?:2f|5c)/i.test(input))
|
|
10
|
+
throw new Error('TokenForge path contains an encoded separator');
|
|
11
|
+
const decoded = strictPercentDecode(input);
|
|
12
|
+
if (decoded.includes('\\') || decoded.includes('\0')) {
|
|
13
|
+
throw new Error('TokenForge path contains a forbidden separator');
|
|
14
|
+
}
|
|
15
|
+
for (const segment of decoded.split('/')) {
|
|
16
|
+
if (segment === '.' || segment === '..') {
|
|
17
|
+
throw new Error('TokenForge path contains a dot segment');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const result = percentEncode(decoded, true);
|
|
21
|
+
if (new TextEncoder().encode(result).length > 2048) {
|
|
22
|
+
throw new Error('TokenForge path is too large');
|
|
23
|
+
}
|
|
24
|
+
return result || '/';
|
|
25
|
+
}
|
|
26
|
+
export function canonicalizeQuery(input) {
|
|
27
|
+
if (!input)
|
|
28
|
+
return '';
|
|
29
|
+
const pairs = input.split('&').map((part) => {
|
|
30
|
+
const split = part.indexOf('=');
|
|
31
|
+
const rawKey = split < 0 ? part : part.slice(0, split);
|
|
32
|
+
const rawValue = split < 0 ? '' : part.slice(split + 1);
|
|
33
|
+
return {
|
|
34
|
+
key: strictPercentDecode(rawKey),
|
|
35
|
+
value: strictPercentDecode(rawValue),
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
pairs.sort((a, b) => compareUtf8(a.key, b.key) || compareUtf8(a.value, b.value));
|
|
39
|
+
const result = pairs
|
|
40
|
+
.map(({ key, value }) => `${percentEncode(key, false)}=${percentEncode(value, false)}`)
|
|
41
|
+
.join('&');
|
|
42
|
+
if (new TextEncoder().encode(result).length > 4096) {
|
|
43
|
+
throw new Error('TokenForge query is too large');
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
export function canonicalizeOrigin(input) {
|
|
48
|
+
if (!input)
|
|
49
|
+
return '';
|
|
50
|
+
let url;
|
|
51
|
+
try {
|
|
52
|
+
url = new URL(input);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error('TokenForge origin is invalid');
|
|
56
|
+
}
|
|
57
|
+
const localhost = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]';
|
|
58
|
+
if (url.protocol !== 'https:' && !(localhost && url.protocol === 'http:')) {
|
|
59
|
+
throw new Error('TokenForge origin must use HTTPS');
|
|
60
|
+
}
|
|
61
|
+
if (url.username || url.password || url.search || url.hash || (url.pathname && url.pathname !== '/')) {
|
|
62
|
+
throw new Error('TokenForge origin must not contain credentials, path, query, or fragment');
|
|
63
|
+
}
|
|
64
|
+
return url.origin.toLowerCase();
|
|
65
|
+
}
|
|
66
|
+
export function encodeRequestProof(input) {
|
|
67
|
+
if (input.protocol !== PROTOCOL_V2)
|
|
68
|
+
throw new Error('Unsupported TokenForge protocol');
|
|
69
|
+
const method = input.method.toUpperCase();
|
|
70
|
+
if (!/^[A-Z][A-Z0-9!#$%&'*+.^_`|~-]{0,31}$/.test(method)) {
|
|
71
|
+
throw new Error('TokenForge method is invalid');
|
|
72
|
+
}
|
|
73
|
+
if (!/^[A-Za-z0-9_-]{8,256}$/.test(input.projectId))
|
|
74
|
+
throw new Error('TokenForge project ID is invalid');
|
|
75
|
+
if (!/^[A-Za-z0-9_.:-]{8,256}$/.test(input.deviceId))
|
|
76
|
+
throw new Error('TokenForge device ID is invalid');
|
|
77
|
+
if (!/^[A-Za-z0-9_-]{16,256}$/.test(input.sessionId))
|
|
78
|
+
throw new Error('TokenForge session ID is invalid');
|
|
79
|
+
if (!/^[A-Za-z0-9_-]{43}$/.test(input.bodySha256))
|
|
80
|
+
throw new Error('TokenForge body digest is invalid');
|
|
81
|
+
if (!/^[A-Za-z0-9_-]{22,64}$/.test(input.nonce))
|
|
82
|
+
throw new Error('TokenForge nonce is invalid');
|
|
83
|
+
if (!/^\d{13}$/.test(input.timestamp))
|
|
84
|
+
throw new Error('TokenForge timestamp is invalid');
|
|
85
|
+
const fields = [
|
|
86
|
+
input.protocol,
|
|
87
|
+
input.projectId,
|
|
88
|
+
input.deviceId,
|
|
89
|
+
input.sessionId,
|
|
90
|
+
method,
|
|
91
|
+
canonicalizePath(input.path),
|
|
92
|
+
canonicalizeQuery(input.query),
|
|
93
|
+
input.bodySha256,
|
|
94
|
+
canonicalizeOrigin(input.origin),
|
|
95
|
+
input.nonce,
|
|
96
|
+
input.timestamp,
|
|
97
|
+
];
|
|
98
|
+
const encoded = fields.map((field) => new TextEncoder().encode(field));
|
|
99
|
+
for (const field of encoded) {
|
|
100
|
+
if (field.length > MAX_FIELD_BYTES)
|
|
101
|
+
throw new Error('TokenForge proof field is too large');
|
|
102
|
+
}
|
|
103
|
+
const size = MAGIC.length + encoded.reduce((total, field) => total + 4 + field.length, 0);
|
|
104
|
+
const output = new Uint8Array(size);
|
|
105
|
+
output.set(MAGIC, 0);
|
|
106
|
+
const view = new DataView(output.buffer);
|
|
107
|
+
let offset = MAGIC.length;
|
|
108
|
+
for (const field of encoded) {
|
|
109
|
+
view.setUint32(offset, field.length, false);
|
|
110
|
+
offset += 4;
|
|
111
|
+
output.set(field, offset);
|
|
112
|
+
offset += field.length;
|
|
113
|
+
}
|
|
114
|
+
return output;
|
|
115
|
+
}
|
|
116
|
+
export async function sha256Base64Url(body) {
|
|
117
|
+
const digest = await crypto.subtle.digest('SHA-256', body);
|
|
118
|
+
return base64Url(new Uint8Array(digest));
|
|
119
|
+
}
|
|
120
|
+
export function base64Url(bytes) {
|
|
121
|
+
let binary = '';
|
|
122
|
+
for (const byte of bytes)
|
|
123
|
+
binary += String.fromCharCode(byte);
|
|
124
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
125
|
+
}
|
|
126
|
+
function strictPercentDecode(input) {
|
|
127
|
+
if (/%(?![0-9A-Fa-f]{2})/.test(input))
|
|
128
|
+
throw new Error('TokenForge percent encoding is invalid');
|
|
129
|
+
try {
|
|
130
|
+
return decodeURIComponent(input);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
throw new Error('TokenForge percent encoding is invalid UTF-8');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function percentEncode(input, preserveSlash) {
|
|
137
|
+
let result = '';
|
|
138
|
+
for (const byte of new TextEncoder().encode(input)) {
|
|
139
|
+
const char = String.fromCharCode(byte);
|
|
140
|
+
if (UNRESERVED.test(char) || (preserveSlash && char === '/'))
|
|
141
|
+
result += char;
|
|
142
|
+
else
|
|
143
|
+
result += `%${byte.toString(16).toUpperCase().padStart(2, '0')}`;
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
function compareUtf8(a, b) {
|
|
148
|
+
const aa = new TextEncoder().encode(a);
|
|
149
|
+
const bb = new TextEncoder().encode(b);
|
|
150
|
+
const length = Math.min(aa.length, bb.length);
|
|
151
|
+
for (let index = 0; index < length; index += 1) {
|
|
152
|
+
if (aa[index] !== bb[index])
|
|
153
|
+
return aa[index] - bb[index];
|
|
154
|
+
}
|
|
155
|
+
return aa.length - bb.length;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2.js","sourceRoot":"../src/","sources":["protocol/v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"../src/","sources":["react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../src/","sources":["react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"../src/","sources":["react/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AASD,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,qDAAqD;IACrD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,UAAU,EACV,OAAO,GACR,EAAE,uBAAuB,2CA8CzB;AAED;;;GAGG;AACH,wBAAgB,aAAa,2BAE5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"../src/","sources":["react/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAC;AASvE,MAAM,iBAAiB,GAAG,aAAa,CAAyB;IAC9D,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAYH;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,UAAU,EACV,OAAO,GACiB;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAyB;QACzD,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;YAAE,OAAO;QAEtC,IAAI,EAAE,GAAsB,IAAI,CAAC;QAEjC,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;YACvB,EAAE,GAAG,gBAAgB,CAAC;gBACpB,OAAO;gBACP,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;gBAC7B,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;oBAC3B,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAClD,CAAC;gBACJ,CAAC;gBACD,gBAAgB,EAAE,GAAG,EAAE;oBACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,iCAAiC,CAAC;gBAC3D,CAAC;gBACD,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE;oBAC1B,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE7B,OAAO,GAAG,EAAE;YACV,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAErC,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACrC,QAAQ,GACkB,CAC9B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-verify.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"action-verify.d.ts","sourceRoot":"../src/","sources":["server/action-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACzE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CA4B7B"}
|
|
@@ -36,7 +36,7 @@ export async function verifyAction(jws, opts) {
|
|
|
36
36
|
}
|
|
37
37
|
if (opts.expectedTlsExporter !== undefined) {
|
|
38
38
|
if (inner.claims.tlsExporter !== opts.expectedTlsExporter) {
|
|
39
|
-
return { ok: false, reason: '
|
|
39
|
+
return { ok: false, reason: 'signature_channel_mismatch' };
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
else if (opts.requireTlsExporter && !inner.claims.tlsExporter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-verify.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"action-verify.js","sourceRoot":"../src/","sources":["server/action-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAmC7D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,IAAyB;IAEzB,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE;QACxC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAE5B,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activity Histogram — 24-bucket time-of-day anomaly detector.
|
|
3
|
+
*
|
|
4
|
+
* Tracks request counts per hour-of-day and scores how unusual the
|
|
5
|
+
* current hour is relative to the user's historical pattern.
|
|
6
|
+
*
|
|
7
|
+
* Storage key pattern: `tf:activity:{userId}`
|
|
8
|
+
*/
|
|
9
|
+
/** 24-bucket histogram (index 0-23 = hour of day). */
|
|
10
|
+
export interface ActivityHistogram {
|
|
11
|
+
/** Request counts per hour (index = hour 0-23). */
|
|
12
|
+
buckets: number[];
|
|
13
|
+
/** Sum of all buckets — avoids recomputing on every call. */
|
|
14
|
+
totalRequests: number;
|
|
15
|
+
}
|
|
16
|
+
/** Storage key prefix for activity histograms. */
|
|
17
|
+
export declare const ACTIVITY_KEY_PREFIX = "tf:activity:";
|
|
18
|
+
/**
|
|
19
|
+
* Create an empty histogram with 24 zero-filled buckets.
|
|
20
|
+
* @returns A fresh ActivityHistogram with no recorded activity.
|
|
21
|
+
*/
|
|
22
|
+
export declare function emptyHistogram(): ActivityHistogram;
|
|
23
|
+
/**
|
|
24
|
+
* Record a request at the given hour, returning the updated histogram.
|
|
25
|
+
* Pure function — does not mutate the input.
|
|
26
|
+
* @param histogram - Current histogram state.
|
|
27
|
+
* @param hour - Hour of day (0-23).
|
|
28
|
+
* @returns New histogram with the incremented bucket.
|
|
29
|
+
*/
|
|
30
|
+
export declare function recordActivity(histogram: ActivityHistogram, hour: number): ActivityHistogram;
|
|
31
|
+
/**
|
|
32
|
+
* Score the current hour against the user's historical activity pattern.
|
|
33
|
+
*
|
|
34
|
+
* Returns 0-5 points:
|
|
35
|
+
* 5 — hour is within normal range (<=1 stddev from mean)
|
|
36
|
+
* 3 — hour is slightly unusual (1-2 stddev from mean)
|
|
37
|
+
* 1 — hour is very unusual (>2 stddev from mean)
|
|
38
|
+
* 0 — hour has zero historical requests AND histogram has >=30 total
|
|
39
|
+
*
|
|
40
|
+
* If totalRequests < 30, returns 5 (not enough data to penalize).
|
|
41
|
+
*
|
|
42
|
+
* @param histogram - The user's activity histogram.
|
|
43
|
+
* @param currentHour - Current hour of day (0-23).
|
|
44
|
+
* @returns Trust score contribution (0-5).
|
|
45
|
+
*/
|
|
46
|
+
export declare function scoreTimeOfDay(histogram: ActivityHistogram, currentHour: number): number;
|
|
47
|
+
//# sourceMappingURL=activity-histogram.d.ts.map
|