ftown 0.20.8 → 0.21.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/dist/centrifugo-client.d.ts +15 -11
- package/dist/centrifugo-client.js +63 -70
- package/dist/centrifugo-client.js.map +1 -1
- package/dist/cli-client.d.ts +11 -1
- package/dist/cli-client.js +23 -3
- package/dist/cli-client.js.map +1 -1
- package/dist/command-rpc.js +4 -8
- package/dist/command-rpc.js.map +1 -1
- package/dist/identity-reset.d.ts +11 -0
- package/dist/identity-reset.js +192 -0
- package/dist/identity-reset.js.map +1 -0
- package/dist/index.js +276 -279
- package/dist/index.js.map +1 -1
- package/dist/ledger-pairing-client.d.ts +28 -0
- package/dist/ledger-pairing-client.js +152 -0
- package/dist/ledger-pairing-client.js.map +1 -0
- package/dist/ledger-relay.d.ts +124 -0
- package/dist/ledger-relay.js +453 -0
- package/dist/ledger-relay.js.map +1 -0
- package/dist/ledger-startup.d.ts +151 -0
- package/dist/ledger-startup.js +203 -0
- package/dist/ledger-startup.js.map +1 -0
- package/dist/relay-token.d.ts +39 -0
- package/dist/relay-token.js +130 -0
- package/dist/relay-token.js.map +1 -0
- package/dist/revocation-gating.d.ts +15 -0
- package/dist/revocation-gating.js +16 -0
- package/dist/revocation-gating.js.map +1 -0
- package/dist/revoked-restart.d.ts +21 -0
- package/dist/revoked-restart.js +55 -0
- package/dist/revoked-restart.js.map +1 -0
- package/dist/security/bridge/identity.d.ts +2 -47
- package/dist/security/bridge/identity.js +3 -3
- package/dist/security/bridge/identity.js.map +1 -1
- package/dist/security/bridge/ledger-identity.d.ts +48 -0
- package/dist/security/bridge/ledger-identity.js +342 -0
- package/dist/security/bridge/ledger-identity.js.map +1 -0
- package/dist/security/bridge/ledger-store.d.ts +84 -0
- package/dist/security/bridge/ledger-store.js +485 -0
- package/dist/security/bridge/ledger-store.js.map +1 -0
- package/dist/security/bridge/metadata.d.ts +2 -2
- package/dist/security/bridge/permissions.js +2 -2
- package/dist/security/bridge/permissions.js.map +1 -1
- package/dist/security/bridge/policy.d.ts +42 -21
- package/dist/security/bridge/policy.js +217 -135
- package/dist/security/bridge/policy.js.map +1 -1
- package/dist/security/bridge/security.d.ts +91 -28
- package/dist/security/bridge/security.js +274 -117
- package/dist/security/bridge/security.js.map +1 -1
- package/dist/security/crypto.js +1 -1
- package/dist/security/crypto.js.map +1 -1
- package/dist/security/ledger/channels.d.ts +5 -0
- package/dist/security/ledger/channels.js +21 -0
- package/dist/security/ledger/channels.js.map +1 -0
- package/dist/security/ledger/ledger.d.ts +61 -0
- package/dist/security/ledger/ledger.js +597 -0
- package/dist/security/ledger/ledger.js.map +1 -0
- package/dist/security/ledger/pairing.d.ts +81 -0
- package/dist/security/ledger/pairing.js +414 -0
- package/dist/security/ledger/pairing.js.map +1 -0
- package/dist/security/ledger/proof.d.ts +24 -0
- package/dist/security/ledger/proof.js +161 -0
- package/dist/security/ledger/proof.js.map +1 -0
- package/dist/security/ledger/protocol.d.ts +100 -0
- package/dist/security/ledger/protocol.js +16 -0
- package/dist/security/ledger/protocol.js.map +1 -0
- package/dist/security/ledger/testing.d.ts +27 -0
- package/dist/security/ledger/testing.js +70 -0
- package/dist/security/ledger/testing.js.map +1 -0
- package/dist/security/ledger/webauthn.d.ts +12 -0
- package/dist/security/ledger/webauthn.js +147 -0
- package/dist/security/ledger/webauthn.js.map +1 -0
- package/dist/security/protocol.d.ts +5 -10
- package/dist/security-cli.d.ts +5 -0
- package/dist/security-cli.js +28 -16
- package/dist/security-cli.js.map +1 -1
- package/dist/token-provider.d.ts +39 -0
- package/dist/token-provider.js +101 -0
- package/dist/token-provider.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/package.json +2 -2
- package/skills/ftown/references/sessions.md +4 -0
- package/dist/bridge-auth.d.ts +0 -25
- package/dist/bridge-auth.js +0 -56
- package/dist/bridge-auth.js.map +0 -1
- package/dist/pairing-client.d.ts +0 -60
- package/dist/pairing-client.js +0 -460
- package/dist/pairing-client.js.map +0 -1
- package/dist/rotating-token-refresher.d.ts +0 -42
- package/dist/rotating-token-refresher.js +0 -91
- package/dist/rotating-token-refresher.js.map +0 -1
- package/dist/security/account-crypto.d.ts +0 -33
- package/dist/security/account-crypto.js +0 -649
- package/dist/security/account-crypto.js.map +0 -1
- package/dist/security/account-protocol.d.ts +0 -228
- package/dist/security/account-protocol.js +0 -2
- package/dist/security/account-protocol.js.map +0 -1
- package/dist/security/bridge/account-client.d.ts +0 -7
- package/dist/security/bridge/account-client.js +0 -87
- package/dist/security/bridge/account-client.js.map +0 -1
- package/dist/security/bridge/account-state.d.ts +0 -105
- package/dist/security/bridge/account-state.js +0 -79
- package/dist/security/bridge/account-state.js.map +0 -1
- package/dist/security/bridge/pending-approval.d.ts +0 -21
- package/dist/security/bridge/pending-approval.js +0 -80
- package/dist/security/bridge/pending-approval.js.map +0 -1
- package/dist/security/bridge/pending-enrollment.d.ts +0 -33
- package/dist/security/bridge/pending-enrollment.js +0 -177
- package/dist/security/bridge/pending-enrollment.js.map +0 -1
- package/dist/security/pending-approval-crypto.d.ts +0 -29
- package/dist/security/pending-approval-crypto.js +0 -716
- package/dist/security/pending-approval-crypto.js.map +0 -1
- package/dist/security/pending-approval-protocol.d.ts +0 -329
- package/dist/security/pending-approval-protocol.js +0 -2
- package/dist/security/pending-approval-protocol.js.map +0 -1
- package/dist/security/security-nudge.d.ts +0 -31
- package/dist/security/security-nudge.js +0 -98
- package/dist/security/security-nudge.js.map +0 -1
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
import { AUTHORITY_CONSENT_DOMAIN, LEDGER_DOMAIN, LEDGER_LIMITS, SIGNIN_DOMAIN } from './protocol.js';
|
|
2
|
+
import { verifyPasskeyAssertion } from './webauthn.js';
|
|
3
|
+
const messages = {
|
|
4
|
+
invalid_ledger: 'Account ledger could not be verified.',
|
|
5
|
+
ledger_other_account: 'Account ledger entry belongs to a different account.',
|
|
6
|
+
ledger_revoked: 'Account ledger entry refers to a revoked key.',
|
|
7
|
+
ledger_limit: 'Account ledger reached its supported capacity.',
|
|
8
|
+
};
|
|
9
|
+
/** No untrusted text, key material or underlying crypto error enters this error. */
|
|
10
|
+
export class LedgerError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code) {
|
|
13
|
+
super(messages[code]);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = 'LedgerError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const encoder = new TextEncoder();
|
|
19
|
+
const MAX_TIME = 253402300799999;
|
|
20
|
+
const MAX_ORIGINS = 16;
|
|
21
|
+
const MAX_ORIGIN_LENGTH = 512;
|
|
22
|
+
const MAX_CREDENTIAL_ID_BYTES = 1023;
|
|
23
|
+
const MAX_AUTHENTICATOR_DATA_BYTES = 4096;
|
|
24
|
+
const MAX_CLIENT_DATA_BYTES = 4096;
|
|
25
|
+
const MAX_DER_SIGNATURE_BYTES = 72;
|
|
26
|
+
const MAX_STICKY_IDS = 8 * LEDGER_LIMITS.maxTransitions;
|
|
27
|
+
function fail(code = 'invalid_ledger') {
|
|
28
|
+
throw new LedgerError(code);
|
|
29
|
+
}
|
|
30
|
+
function isPlain(value) {
|
|
31
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
32
|
+
return false;
|
|
33
|
+
const prototype = Object.getPrototypeOf(value);
|
|
34
|
+
// Any realm's Object.prototype or null; class instances and exotic prototypes are refused.
|
|
35
|
+
return prototype === null || Object.getPrototypeOf(prototype) === null;
|
|
36
|
+
}
|
|
37
|
+
function object(value) {
|
|
38
|
+
return isPlain(value) ? value : fail();
|
|
39
|
+
}
|
|
40
|
+
function exact(value, keys) {
|
|
41
|
+
const record = object(value);
|
|
42
|
+
const own = Object.keys(record);
|
|
43
|
+
if (own.length !== keys.length || own.some(key => keys.indexOf(key) === -1))
|
|
44
|
+
return fail();
|
|
45
|
+
return record;
|
|
46
|
+
}
|
|
47
|
+
function each(value, max, parse, code = 'invalid_ledger') {
|
|
48
|
+
if (!Array.isArray(value))
|
|
49
|
+
return fail();
|
|
50
|
+
const items = value;
|
|
51
|
+
if (items.length > max)
|
|
52
|
+
return fail(code);
|
|
53
|
+
const result = [];
|
|
54
|
+
for (let index = 0; index < items.length; index += 1)
|
|
55
|
+
result.push(parse(items[index]));
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
function string(value, max) {
|
|
59
|
+
return typeof value === 'string' && value.length <= max ? value : fail();
|
|
60
|
+
}
|
|
61
|
+
function b64url(data) {
|
|
62
|
+
let binary = '';
|
|
63
|
+
for (let index = 0; index < data.length; index += 1)
|
|
64
|
+
binary += String.fromCharCode(data[index]);
|
|
65
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
66
|
+
}
|
|
67
|
+
/** Canonical unpadded base64url only; the length bound is checked before decoding. */
|
|
68
|
+
function decode(value, min, max) {
|
|
69
|
+
const text = string(value, Math.ceil(max * 4 / 3));
|
|
70
|
+
if (!/^[A-Za-z0-9_-]+$/.test(text))
|
|
71
|
+
return fail();
|
|
72
|
+
let binary;
|
|
73
|
+
try {
|
|
74
|
+
binary = atob(text.replace(/-/g, '+').replace(/_/g, '/'));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return fail();
|
|
78
|
+
}
|
|
79
|
+
if (binary.length < min || binary.length > max)
|
|
80
|
+
return fail();
|
|
81
|
+
const result = new Uint8Array(binary.length);
|
|
82
|
+
for (let index = 0; index < binary.length; index += 1)
|
|
83
|
+
result[index] = binary.charCodeAt(index);
|
|
84
|
+
if (b64url(result) !== text)
|
|
85
|
+
return fail();
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
const fingerprint = (value) => b64url(decode(value, 32, 32));
|
|
89
|
+
const credential = (value) => b64url(decode(value, 1, MAX_CREDENTIAL_ID_BYTES));
|
|
90
|
+
function point(value) {
|
|
91
|
+
const raw = decode(value, 65, 65);
|
|
92
|
+
return raw[0] === 4 ? b64url(raw) : fail();
|
|
93
|
+
}
|
|
94
|
+
function token(value) {
|
|
95
|
+
const text = string(value, 200);
|
|
96
|
+
return /^[A-Za-z0-9_-]{1,200}$/.test(text) ? text : fail();
|
|
97
|
+
}
|
|
98
|
+
function label(value) {
|
|
99
|
+
const text = string(value, LEDGER_LIMITS.maxLabelLength);
|
|
100
|
+
// C0/C1 controls, zero-width and bidi controls, BOM, unpaired surrogates: refused, never silently rewritten in a signed label.
|
|
101
|
+
return /[\u0000-\u001f\u007f-\u009f\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ud800-\udfff]/u.test(text) ? fail() : text;
|
|
102
|
+
}
|
|
103
|
+
function time(value) {
|
|
104
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && value <= MAX_TIME ? value : fail();
|
|
105
|
+
}
|
|
106
|
+
function count(value, min) {
|
|
107
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= min && value <= LEDGER_LIMITS.maxTransitions ? value : fail();
|
|
108
|
+
}
|
|
109
|
+
function relyingParty(value) {
|
|
110
|
+
const text = string(value, 253);
|
|
111
|
+
return /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/.test(text) ? text : fail();
|
|
112
|
+
}
|
|
113
|
+
/** A serialized origin exactly as URL.origin prints it: https, or http only for localhost. */
|
|
114
|
+
function origin(value) {
|
|
115
|
+
const text = string(value, MAX_ORIGIN_LENGTH);
|
|
116
|
+
let url;
|
|
117
|
+
try {
|
|
118
|
+
url = new URL(text);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return fail();
|
|
122
|
+
}
|
|
123
|
+
if (url.origin !== text)
|
|
124
|
+
return fail();
|
|
125
|
+
return url.protocol === 'https:' || (url.protocol === 'http:' && url.hostname === 'localhost') ? text : fail();
|
|
126
|
+
}
|
|
127
|
+
function parseSignature(value) {
|
|
128
|
+
const record = exact(value, ['authenticatorData', 'clientDataJSON', 'signature']);
|
|
129
|
+
return {
|
|
130
|
+
authenticatorData: b64url(decode(record.authenticatorData, 37, MAX_AUTHENTICATOR_DATA_BYTES)),
|
|
131
|
+
clientDataJSON: b64url(decode(record.clientDataJSON, 1, MAX_CLIENT_DATA_BYTES)),
|
|
132
|
+
signature: b64url(decode(record.signature, 8, MAX_DER_SIGNATURE_BYTES)),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function parseEndpoint(value, kind) {
|
|
136
|
+
const record = exact(value, ['version', 'id', 'ownerId', 'kind', 'publicKey']);
|
|
137
|
+
if (record.version !== 1 || record.kind !== kind)
|
|
138
|
+
return fail();
|
|
139
|
+
return { version: 1, id: fingerprint(record.id), ownerId: fingerprint(record.ownerId), kind, publicKey: point(record.publicKey) };
|
|
140
|
+
}
|
|
141
|
+
function parseAuthority(value) {
|
|
142
|
+
const record = exact(value, ['credentialId', 'publicKey', 'label', 'addedAt']);
|
|
143
|
+
return { credentialId: credential(record.credentialId), publicKey: point(record.publicKey), label: label(record.label), addedAt: time(record.addedAt) };
|
|
144
|
+
}
|
|
145
|
+
function parseDevice(value) {
|
|
146
|
+
const record = exact(value, ['endpoint', 'authPublicKey', 'label', 'approvedAt']);
|
|
147
|
+
const parsed = { endpoint: parseEndpoint(record.endpoint, 'browser'), authPublicKey: point(record.authPublicKey), label: label(record.label), approvedAt: time(record.approvedAt) };
|
|
148
|
+
return parsed.authPublicKey === parsed.endpoint.publicKey ? fail() : parsed;
|
|
149
|
+
}
|
|
150
|
+
function parseBridge(value) {
|
|
151
|
+
const record = exact(value, ['bridgeId', 'endpoint', 'authPublicKey', 'label', 'approvedAt']);
|
|
152
|
+
const parsed = {
|
|
153
|
+
bridgeId: token(record.bridgeId), endpoint: parseEndpoint(record.endpoint, 'bridge'),
|
|
154
|
+
authPublicKey: point(record.authPublicKey), label: label(record.label), approvedAt: time(record.approvedAt),
|
|
155
|
+
};
|
|
156
|
+
return parsed.authPublicKey === parsed.endpoint.publicKey ? fail() : parsed;
|
|
157
|
+
}
|
|
158
|
+
function parseOperation(value) {
|
|
159
|
+
const record = object(value);
|
|
160
|
+
switch (record.type) {
|
|
161
|
+
case 'add_device': return { type: 'add_device', device: parseDevice(exact(record, ['type', 'device']).device) };
|
|
162
|
+
case 'revoke_device': return { type: 'revoke_device', endpointId: fingerprint(exact(record, ['type', 'endpointId']).endpointId) };
|
|
163
|
+
case 'add_bridge': return { type: 'add_bridge', bridge: parseBridge(exact(record, ['type', 'bridge']).bridge) };
|
|
164
|
+
case 'revoke_bridge': return { type: 'revoke_bridge', bridgeId: token(exact(record, ['type', 'bridgeId']).bridgeId) };
|
|
165
|
+
case 'add_authority': {
|
|
166
|
+
const fields = exact(record, ['type', 'authority', 'consent']);
|
|
167
|
+
return { type: 'add_authority', authority: parseAuthority(fields.authority), consent: parseSignature(fields.consent) };
|
|
168
|
+
}
|
|
169
|
+
default: return fail();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function parseGenesis(value) {
|
|
173
|
+
const record = exact(value, ['type', 'version', 'rpId', 'origins', 'handle', 'createdAt', 'authority']);
|
|
174
|
+
if (record.type !== 'ftown_account_genesis' || record.version !== 2)
|
|
175
|
+
return fail();
|
|
176
|
+
const origins = each(record.origins, MAX_ORIGINS, origin);
|
|
177
|
+
if (!origins.length || origins.some((item, index) => origins.indexOf(item) !== index))
|
|
178
|
+
return fail();
|
|
179
|
+
return {
|
|
180
|
+
type: 'ftown_account_genesis', version: 2, rpId: relyingParty(record.rpId), origins,
|
|
181
|
+
handle: fingerprint(record.handle), createdAt: time(record.createdAt), authority: parseAuthority(record.authority),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function parseTransition(value) {
|
|
185
|
+
const record = exact(value, ['type', 'version', 'accountId', 'revision', 'previousHead', 'issuedAt', 'credentialId', 'operation']);
|
|
186
|
+
if (record.type !== 'ftown_account_transition' || record.version !== 2)
|
|
187
|
+
return fail();
|
|
188
|
+
return {
|
|
189
|
+
type: 'ftown_account_transition', version: 2, accountId: fingerprint(record.accountId), revision: count(record.revision, 1),
|
|
190
|
+
previousHead: fingerprint(record.previousHead), issuedAt: time(record.issuedAt), credentialId: credential(record.credentialId),
|
|
191
|
+
operation: parseOperation(record.operation),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function parseSigned(value, parse) {
|
|
195
|
+
const record = exact(value, ['payload', 'signature']);
|
|
196
|
+
return { payload: parse(record.payload), signature: parseSignature(record.signature) };
|
|
197
|
+
}
|
|
198
|
+
function parseCheckpoint(value) {
|
|
199
|
+
const record = exact(value, ['version', 'accountId', 'revision', 'head', 'authorities', 'devices', 'bridges', 'revokedDeviceIds', 'revokedBridgeIds']);
|
|
200
|
+
if (record.version !== 2)
|
|
201
|
+
return fail();
|
|
202
|
+
const authorities = each(record.authorities, LEDGER_LIMITS.maxAuthorities, parseAuthority, 'ledger_limit');
|
|
203
|
+
if (!authorities.length)
|
|
204
|
+
return fail();
|
|
205
|
+
return {
|
|
206
|
+
version: 2, accountId: fingerprint(record.accountId), revision: count(record.revision, 0), head: fingerprint(record.head), authorities,
|
|
207
|
+
devices: each(record.devices, LEDGER_LIMITS.maxDevices, parseDevice, 'ledger_limit'),
|
|
208
|
+
bridges: each(record.bridges, LEDGER_LIMITS.maxBridges, parseBridge, 'ledger_limit'),
|
|
209
|
+
revokedDeviceIds: each(record.revokedDeviceIds, LEDGER_LIMITS.maxTransitions, fingerprint, 'ledger_limit'),
|
|
210
|
+
revokedBridgeIds: each(record.revokedBridgeIds, LEDGER_LIMITS.maxTransitions, token, 'ledger_limit'),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function canonical(value) {
|
|
214
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'string')
|
|
215
|
+
return JSON.stringify(value);
|
|
216
|
+
if (typeof value === 'number')
|
|
217
|
+
return Number.isFinite(value) ? JSON.stringify(value) : fail();
|
|
218
|
+
if (Array.isArray(value)) {
|
|
219
|
+
const items = value;
|
|
220
|
+
return `[${items.map(canonical).join(',')}]`;
|
|
221
|
+
}
|
|
222
|
+
const record = object(value);
|
|
223
|
+
return `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${canonical(record[key])}`).join(',')}}`;
|
|
224
|
+
}
|
|
225
|
+
async function sha256(data) {
|
|
226
|
+
return new Uint8Array(await crypto.subtle.digest('SHA-256', data));
|
|
227
|
+
}
|
|
228
|
+
async function importable(raw, name) {
|
|
229
|
+
try {
|
|
230
|
+
await crypto.subtle.importKey('raw', decode(raw, 65, 65), { name, namedCurve: 'P-256' }, false, name === 'ECDSA' ? ['verify'] : []);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
fail();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/** The asynchronous checks of new key material: endpoint id = SHA-256(point), every point on P-256. */
|
|
237
|
+
async function keyMaterial(operation) {
|
|
238
|
+
if (operation.type === 'add_authority')
|
|
239
|
+
return importable(operation.authority.publicKey, 'ECDSA');
|
|
240
|
+
if (operation.type !== 'add_device' && operation.type !== 'add_bridge')
|
|
241
|
+
return;
|
|
242
|
+
const member = operation.type === 'add_device' ? operation.device : operation.bridge;
|
|
243
|
+
if (b64url(await sha256(decode(member.endpoint.publicKey, 65, 65))) !== member.endpoint.id)
|
|
244
|
+
fail();
|
|
245
|
+
await importable(member.endpoint.publicKey, 'ECDH');
|
|
246
|
+
await importable(member.authPublicKey, 'ECDSA');
|
|
247
|
+
}
|
|
248
|
+
function signerOf(state, credentialId) {
|
|
249
|
+
for (const item of state.authorities)
|
|
250
|
+
if (item.credentialId === credentialId)
|
|
251
|
+
return item;
|
|
252
|
+
return fail();
|
|
253
|
+
}
|
|
254
|
+
/** Shared rules of add_device and add_bridge; keys are never shared between roster members or between a member's two keys. */
|
|
255
|
+
function admit(state, endpoint, authPublicKey, approvedAt, issuedAt) {
|
|
256
|
+
if (endpoint.ownerId !== state.accountId)
|
|
257
|
+
fail('ledger_other_account');
|
|
258
|
+
if (approvedAt > issuedAt)
|
|
259
|
+
fail();
|
|
260
|
+
if (state.revokedDeviceIds.indexOf(endpoint.id) !== -1)
|
|
261
|
+
fail('ledger_revoked');
|
|
262
|
+
const members = [...state.devices, ...state.bridges];
|
|
263
|
+
const keys = [endpoint.publicKey, authPublicKey];
|
|
264
|
+
if (members.some(item => item.endpoint.id === endpoint.id
|
|
265
|
+
|| keys.indexOf(item.endpoint.publicKey) !== -1 || keys.indexOf(item.authPublicKey) !== -1))
|
|
266
|
+
fail();
|
|
267
|
+
}
|
|
268
|
+
function apply(current, operation, issuedAt) {
|
|
269
|
+
const next = {
|
|
270
|
+
...current, authorities: current.authorities.slice(), devices: current.devices.slice(), bridges: current.bridges.slice(),
|
|
271
|
+
revokedDeviceIds: current.revokedDeviceIds.slice(), revokedBridgeIds: current.revokedBridgeIds.slice(),
|
|
272
|
+
};
|
|
273
|
+
switch (operation.type) {
|
|
274
|
+
case 'add_device': {
|
|
275
|
+
const added = operation.device;
|
|
276
|
+
admit(next, added.endpoint, added.authPublicKey, added.approvedAt, issuedAt);
|
|
277
|
+
if (next.devices.length >= LEDGER_LIMITS.maxDevices)
|
|
278
|
+
fail('ledger_limit');
|
|
279
|
+
next.devices.push(added);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
case 'add_bridge': {
|
|
283
|
+
const added = operation.bridge;
|
|
284
|
+
admit(next, added.endpoint, added.authPublicKey, added.approvedAt, issuedAt);
|
|
285
|
+
if (next.revokedBridgeIds.indexOf(added.bridgeId) !== -1)
|
|
286
|
+
fail('ledger_revoked');
|
|
287
|
+
if (next.bridges.some(item => item.bridgeId === added.bridgeId))
|
|
288
|
+
fail();
|
|
289
|
+
if (next.bridges.length >= LEDGER_LIMITS.maxBridges)
|
|
290
|
+
fail('ledger_limit');
|
|
291
|
+
next.bridges.push(added);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 'revoke_device': {
|
|
295
|
+
const index = next.devices.findIndex(item => item.endpoint.id === operation.endpointId);
|
|
296
|
+
if (index === -1)
|
|
297
|
+
fail(next.revokedDeviceIds.indexOf(operation.endpointId) !== -1 ? 'ledger_revoked' : 'invalid_ledger');
|
|
298
|
+
next.devices.splice(index, 1);
|
|
299
|
+
next.revokedDeviceIds.push(operation.endpointId);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case 'revoke_bridge': {
|
|
303
|
+
const index = next.bridges.findIndex(item => item.bridgeId === operation.bridgeId);
|
|
304
|
+
if (index === -1)
|
|
305
|
+
fail(next.revokedBridgeIds.indexOf(operation.bridgeId) !== -1 ? 'ledger_revoked' : 'invalid_ledger');
|
|
306
|
+
next.bridges.splice(index, 1);
|
|
307
|
+
next.revokedBridgeIds.push(operation.bridgeId);
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
case 'add_authority': {
|
|
311
|
+
const added = operation.authority;
|
|
312
|
+
if (added.addedAt > issuedAt)
|
|
313
|
+
fail();
|
|
314
|
+
if (next.authorities.some(item => item.credentialId === added.credentialId || item.publicKey === added.publicKey))
|
|
315
|
+
fail();
|
|
316
|
+
if (next.authorities.length >= LEDGER_LIMITS.maxAuthorities)
|
|
317
|
+
fail('ledger_limit');
|
|
318
|
+
next.authorities.push(added);
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
default: return fail();
|
|
322
|
+
}
|
|
323
|
+
return next;
|
|
324
|
+
}
|
|
325
|
+
function copyOf(state) {
|
|
326
|
+
return {
|
|
327
|
+
version: 2, accountId: state.accountId, revision: state.revision, head: state.head,
|
|
328
|
+
authorities: state.authorities.slice(), devices: state.devices.slice(), bridges: state.bridges.slice(),
|
|
329
|
+
revokedDeviceIds: state.revokedDeviceIds.slice(), revokedBridgeIds: state.revokedBridgeIds.slice(),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/** The added passkey's own assertion that it joins THIS account; every path that applies add_authority goes through extend and here. */
|
|
333
|
+
async function consented(operation, accountId, root) {
|
|
334
|
+
const challenge = await authorityConsentChallenge(accountId, operation.authority);
|
|
335
|
+
if (!await verifyPasskeyAssertion({ rpId: root.rpId, origins: root.origins, publicKey: operation.authority.publicKey, challenge, signature: operation.consent }))
|
|
336
|
+
fail();
|
|
337
|
+
}
|
|
338
|
+
/** Verifies `records` in order on top of a verified `state` whose last record was issued at `previousTime`. */
|
|
339
|
+
async function extend(state, root, previousTime, records, at) {
|
|
340
|
+
let current = state;
|
|
341
|
+
let lastTime = previousTime;
|
|
342
|
+
for (const record of records) {
|
|
343
|
+
const payload = record.payload;
|
|
344
|
+
if (payload.accountId !== current.accountId)
|
|
345
|
+
fail('ledger_other_account');
|
|
346
|
+
if (payload.revision !== current.revision + 1)
|
|
347
|
+
fail();
|
|
348
|
+
if (payload.previousHead !== current.head)
|
|
349
|
+
fail();
|
|
350
|
+
if (payload.issuedAt < lastTime || payload.issuedAt > at + LEDGER_LIMITS.maxFutureSkewMs)
|
|
351
|
+
fail();
|
|
352
|
+
const signer = signerOf(current, payload.credentialId);
|
|
353
|
+
const challenge = await ledgerChallenge(payload);
|
|
354
|
+
if (!await verifyPasskeyAssertion({ rpId: root.rpId, origins: root.origins, publicKey: signer.publicKey, challenge, signature: record.signature }))
|
|
355
|
+
fail();
|
|
356
|
+
await keyMaterial(payload.operation);
|
|
357
|
+
if (payload.operation.type === 'add_authority')
|
|
358
|
+
await consented(payload.operation, current.accountId, root);
|
|
359
|
+
current = { ...apply(current, payload.operation, payload.issuedAt), revision: payload.revision, head: b64url(challenge) };
|
|
360
|
+
lastTime = payload.issuedAt;
|
|
361
|
+
}
|
|
362
|
+
return current;
|
|
363
|
+
}
|
|
364
|
+
async function verifyAll(ledger, at) {
|
|
365
|
+
const root = ledger.genesis.payload;
|
|
366
|
+
if (root.createdAt > at + LEDGER_LIMITS.maxFutureSkewMs || root.authority.addedAt > root.createdAt)
|
|
367
|
+
fail();
|
|
368
|
+
await importable(root.authority.publicKey, 'ECDSA');
|
|
369
|
+
const challenge = await ledgerChallenge(root);
|
|
370
|
+
if (!await verifyPasskeyAssertion({ rpId: root.rpId, origins: root.origins, publicKey: root.authority.publicKey, challenge, signature: ledger.genesis.signature }))
|
|
371
|
+
fail();
|
|
372
|
+
const accountId = b64url(challenge);
|
|
373
|
+
const initial = {
|
|
374
|
+
version: 2, accountId, revision: 0, head: accountId, authorities: [root.authority], devices: [], bridges: [], revokedDeviceIds: [], revokedBridgeIds: [],
|
|
375
|
+
};
|
|
376
|
+
return extend(initial, root, root.createdAt, ledger.transitions, at);
|
|
377
|
+
}
|
|
378
|
+
/** Unexpected (non-ledger) failures become invalid_ledger. */
|
|
379
|
+
async function guarded(run) {
|
|
380
|
+
try {
|
|
381
|
+
return await run();
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
if (error instanceof LedgerError)
|
|
385
|
+
throw error;
|
|
386
|
+
return fail();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
async function indexed(value) {
|
|
390
|
+
const ledger = parseLedger(value);
|
|
391
|
+
const accountId = await ledgerHead(ledger.genesis.payload);
|
|
392
|
+
const heads = [];
|
|
393
|
+
for (const record of ledger.transitions)
|
|
394
|
+
heads.push(await ledgerHead(record.payload));
|
|
395
|
+
return { ledger, accountId, heads, head: heads.length ? heads[heads.length - 1] : accountId };
|
|
396
|
+
}
|
|
397
|
+
/** The cache vouches for `chain` only if it names the chain's last head and the chain is hash-linked up to it. */
|
|
398
|
+
function vouched(chain, cache) {
|
|
399
|
+
if (cache === undefined)
|
|
400
|
+
return null;
|
|
401
|
+
try {
|
|
402
|
+
const record = object(cache);
|
|
403
|
+
const checkpoint = parseCheckpoint(record.checkpoint);
|
|
404
|
+
if (record.head !== chain.head || checkpoint.head !== chain.head || checkpoint.accountId !== chain.accountId
|
|
405
|
+
|| checkpoint.revision !== chain.heads.length)
|
|
406
|
+
return null;
|
|
407
|
+
for (let index = 0; index < chain.heads.length; index += 1) {
|
|
408
|
+
const payload = chain.ledger.transitions[index].payload;
|
|
409
|
+
if (payload.revision !== index + 1 || payload.previousHead !== (index === 0 ? chain.accountId : chain.heads[index - 1]))
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
return checkpoint;
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function sameSignature(left, right) {
|
|
419
|
+
return left.authenticatorData === right.authenticatorData && left.clientDataJSON === right.clientDataJSON && left.signature === right.signature;
|
|
420
|
+
}
|
|
421
|
+
/** True iff the genesis and the first `length` records carry byte-identical signatures, so the candidate's prefix is the verified local one. */
|
|
422
|
+
function sameRecords(local, candidate, length) {
|
|
423
|
+
if (!sameSignature(local.genesis.signature, candidate.genesis.signature))
|
|
424
|
+
return false;
|
|
425
|
+
for (let index = 0; index < length; index += 1) {
|
|
426
|
+
if (!sameSignature(local.transitions[index].signature, candidate.transitions[index].signature))
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
function revocationCount(ledger) {
|
|
432
|
+
let total = 0;
|
|
433
|
+
for (const record of ledger.transitions) {
|
|
434
|
+
const type = record.payload.operation.type;
|
|
435
|
+
if (type === 'revoke_device' || type === 'revoke_bridge')
|
|
436
|
+
total += 1;
|
|
437
|
+
}
|
|
438
|
+
return total;
|
|
439
|
+
}
|
|
440
|
+
/** The fork order, strict and total on distinct chains of one account: longer, then more revocations in the whole chain, then the smaller head. */
|
|
441
|
+
function outranks(candidate, local) {
|
|
442
|
+
if (candidate.heads.length !== local.heads.length)
|
|
443
|
+
return candidate.heads.length > local.heads.length;
|
|
444
|
+
const revocations = revocationCount(candidate.ledger) - revocationCount(local.ledger);
|
|
445
|
+
if (revocations !== 0)
|
|
446
|
+
return revocations > 0;
|
|
447
|
+
return candidate.head < local.head;
|
|
448
|
+
}
|
|
449
|
+
function choice(decision, checkpoint, discarded) {
|
|
450
|
+
return { decision, checkpoint: copyOf(checkpoint), discarded };
|
|
451
|
+
}
|
|
452
|
+
/** SHA-256(UTF-8(LEDGER_DOMAIN + canonical(payload))): the WebAuthn challenge, and the record's head. */
|
|
453
|
+
export async function ledgerChallenge(payload) {
|
|
454
|
+
return sha256(encoder.encode(LEDGER_DOMAIN + canonical(payload)));
|
|
455
|
+
}
|
|
456
|
+
export async function ledgerHead(payload) {
|
|
457
|
+
return b64url(await ledgerChallenge(payload));
|
|
458
|
+
}
|
|
459
|
+
export function accountIdOf(genesis) {
|
|
460
|
+
return ledgerHead(genesis);
|
|
461
|
+
}
|
|
462
|
+
/** SHA-256(UTF-8(SIGNIN_DOMAIN + nonce)): the only sign-in challenge. The domain differs from LEDGER_DOMAIN, so a sign-in assertion
|
|
463
|
+
* can never double as a ledger record signature. The nonce is a base64url token (22-128 chars); anything else throws invalid_ledger. */
|
|
464
|
+
export async function signInChallenge(nonce) {
|
|
465
|
+
if (typeof nonce !== 'string' || !/^[A-Za-z0-9_-]{22,128}$/.test(nonce))
|
|
466
|
+
fail();
|
|
467
|
+
return sha256(encoder.encode(SIGNIN_DOMAIN + nonce));
|
|
468
|
+
}
|
|
469
|
+
/** SHA-256(UTF-8(AUTHORITY_CONSENT_DOMAIN + canonical({accountId, credentialId, publicKey}))): what a passkey signs to consent to
|
|
470
|
+
* becoming an authority of exactly that account. Throws invalid_ledger on a malformed accountId, credentialId or key. */
|
|
471
|
+
export async function authorityConsentChallenge(accountId, authority) {
|
|
472
|
+
const bound = { accountId: fingerprint(accountId), credentialId: credential(authority.credentialId), publicKey: point(authority.publicKey) };
|
|
473
|
+
return sha256(encoder.encode(AUTHORITY_CONSENT_DOMAIN + canonical(bound)));
|
|
474
|
+
}
|
|
475
|
+
/** The issuedAt of the last transition, or the genesis createdAt: the `lastIssuedAt` argument of nextTransition. */
|
|
476
|
+
export function ledgerLastIssuedAt(ledger) {
|
|
477
|
+
const last = ledger.transitions[ledger.transitions.length - 1];
|
|
478
|
+
return time(last === undefined ? ledger.genesis.payload.createdAt : last.payload.issuedAt);
|
|
479
|
+
}
|
|
480
|
+
/** Every device endpoint id and bridgeId revoked anywhere in the chain, in chain order. Only for chains that verified (or that
|
|
481
|
+
* chooseLedger did not reject): replicas keep the union over all of them and never trust those ids again. Throws on a malformed shape. */
|
|
482
|
+
export function ledgerRevocations(ledger) {
|
|
483
|
+
const deviceIds = [];
|
|
484
|
+
const bridgeIds = [];
|
|
485
|
+
for (const record of parseLedger(ledger).transitions) {
|
|
486
|
+
const operation = record.payload.operation;
|
|
487
|
+
if (operation.type === 'revoke_device' && deviceIds.indexOf(operation.endpointId) === -1)
|
|
488
|
+
deviceIds.push(operation.endpointId);
|
|
489
|
+
if (operation.type === 'revoke_bridge' && bridgeIds.indexOf(operation.bridgeId) === -1)
|
|
490
|
+
bridgeIds.push(operation.bridgeId);
|
|
491
|
+
}
|
|
492
|
+
return { deviceIds, bridgeIds };
|
|
493
|
+
}
|
|
494
|
+
/** Pure: `checkpoint` with every sticky id removed from devices/bridges and added, de-duplicated, to the revoked lists. Inputs are never
|
|
495
|
+
* mutated. Every trust decision uses this output. NEVER pass it as the chooseLedger cache: it no longer describes the chain itself. */
|
|
496
|
+
export function applyRevocations(checkpoint, sticky) {
|
|
497
|
+
const current = parseCheckpoint(checkpoint);
|
|
498
|
+
const record = exact(sticky, ['deviceIds', 'bridgeIds']);
|
|
499
|
+
const deviceIds = new Set(each(record.deviceIds, MAX_STICKY_IDS, fingerprint, 'ledger_limit'));
|
|
500
|
+
const bridgeIds = new Set(each(record.bridgeIds, MAX_STICKY_IDS, token, 'ledger_limit'));
|
|
501
|
+
const revokedDeviceIds = current.revokedDeviceIds.slice();
|
|
502
|
+
deviceIds.forEach(id => { if (revokedDeviceIds.indexOf(id) === -1)
|
|
503
|
+
revokedDeviceIds.push(id); });
|
|
504
|
+
const revokedBridgeIds = current.revokedBridgeIds.slice();
|
|
505
|
+
bridgeIds.forEach(id => { if (revokedBridgeIds.indexOf(id) === -1)
|
|
506
|
+
revokedBridgeIds.push(id); });
|
|
507
|
+
return {
|
|
508
|
+
...current, devices: current.devices.filter(item => !deviceIds.has(item.endpoint.id)), bridges: current.bridges.filter(item => !bridgeIds.has(item.bridgeId)),
|
|
509
|
+
revokedDeviceIds, revokedBridgeIds,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
/** Strict shape: exact keys, canonical base64url, key lengths, canonical origins, labels and limits.
|
|
513
|
+
* Returns a rebuilt copy that shares nothing with the input. Throws invalid_ledger, or ledger_limit for size and count. */
|
|
514
|
+
export function parseLedger(value) {
|
|
515
|
+
const record = exact(value, ['genesis', 'transitions']);
|
|
516
|
+
const ledger = {
|
|
517
|
+
genesis: parseSigned(record.genesis, parseGenesis),
|
|
518
|
+
transitions: each(record.transitions, LEDGER_LIMITS.maxTransitions, item => parseSigned(item, parseTransition), 'ledger_limit'),
|
|
519
|
+
};
|
|
520
|
+
if (encoder.encode(JSON.stringify(ledger)).byteLength > LEDGER_LIMITS.maxBytes)
|
|
521
|
+
return fail('ledger_limit');
|
|
522
|
+
return ledger;
|
|
523
|
+
}
|
|
524
|
+
/** Verifies ONE chain from genesis and returns its last checkpoint. Every record's passkey signature is checked against an authority of the
|
|
525
|
+
* PREVIOUS state (genesis: its own authority) with genesis.rpId/origins. Throws LedgerError: invalid_ledger, or a more specific code. */
|
|
526
|
+
export async function verifyLedger(ledger, now = Date.now()) {
|
|
527
|
+
const at = time(now);
|
|
528
|
+
return copyOf(await guarded(() => verifyAll(parseLedger(ledger), at)));
|
|
529
|
+
}
|
|
530
|
+
/** Fork choice, a pure total order on valid chains of one account: longer wins, then more revoke_device/revoke_bridge records in the
|
|
531
|
+
* whole chain, then the lexicographically smaller head.
|
|
532
|
+
* - different genesis or invalid candidate -> 'reject'; equal chain or a prefix of local -> 'keep' (decided from record heads alone)
|
|
533
|
+
* - otherwise the order decides; when a fork wins, `discarded` lists the local records after the common prefix.
|
|
534
|
+
* `cache` is the checkpoint of the already-verified local chain; when it vouches for `local`, local signatures and timestamps are not
|
|
535
|
+
* re-checked, and an extension only has its new records verified. Throws only when `local` is invalid (and not vouched for), or when
|
|
536
|
+
* `local` is null and the candidate is invalid. */
|
|
537
|
+
export async function chooseLedger(local, candidate, now = Date.now(), cache) {
|
|
538
|
+
const at = time(now);
|
|
539
|
+
if (local === null)
|
|
540
|
+
return choice('adopt', await guarded(() => verifyAll(parseLedger(candidate), at)), []);
|
|
541
|
+
const mine = await guarded(() => indexed(local));
|
|
542
|
+
const base = vouched(mine, cache) ?? await guarded(() => verifyAll(mine.ledger, at));
|
|
543
|
+
let theirs;
|
|
544
|
+
try {
|
|
545
|
+
theirs = await indexed(candidate);
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
return choice('reject', base, []);
|
|
549
|
+
}
|
|
550
|
+
if (theirs.accountId !== mine.accountId)
|
|
551
|
+
return choice('reject', base, []);
|
|
552
|
+
const localLength = mine.heads.length;
|
|
553
|
+
const candidateLength = theirs.heads.length;
|
|
554
|
+
let common = 0;
|
|
555
|
+
while (common < localLength && common < candidateLength && mine.heads[common] === theirs.heads[common])
|
|
556
|
+
common += 1;
|
|
557
|
+
if (common === candidateLength)
|
|
558
|
+
return choice('keep', base, []);
|
|
559
|
+
if (common === localLength && sameRecords(mine.ledger, theirs.ledger, localLength)) {
|
|
560
|
+
try {
|
|
561
|
+
const fresh = theirs.ledger.transitions.slice(localLength);
|
|
562
|
+
return choice('adopt', await extend(base, mine.ledger.genesis.payload, ledgerLastIssuedAt(mine.ledger), fresh, at), []);
|
|
563
|
+
}
|
|
564
|
+
catch {
|
|
565
|
+
return choice('reject', base, []);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
let winner;
|
|
569
|
+
try {
|
|
570
|
+
winner = await verifyAll(theirs.ledger, at);
|
|
571
|
+
}
|
|
572
|
+
catch {
|
|
573
|
+
return choice('reject', base, []);
|
|
574
|
+
}
|
|
575
|
+
return outranks(theirs, mine) ? choice('adopt', winner, mine.ledger.transitions.slice(common)) : choice('keep', base, []);
|
|
576
|
+
}
|
|
577
|
+
/** Pure next-payload builder for the signer. Applies the operation to a copy of the checkpoint with the verifier's rules and throws the
|
|
578
|
+
* same errors. Not checked here (they need async crypto): endpoint id = SHA-256(point), points on the curve, and the add_authority
|
|
579
|
+
* consent signature (only its shape is checked); verifyLedger enforces all three.
|
|
580
|
+
* `lastIssuedAt` is the issuedAt of the ledger's last record (see ledgerLastIssuedAt); the result's issuedAt is max(now, lastIssuedAt). */
|
|
581
|
+
export function nextTransition(checkpoint, credentialId, operation, now = Date.now(), lastIssuedAt) {
|
|
582
|
+
const current = parseCheckpoint(checkpoint);
|
|
583
|
+
const signer = signerOf(current, credential(credentialId));
|
|
584
|
+
if (current.revision >= LEDGER_LIMITS.maxTransitions)
|
|
585
|
+
fail('ledger_limit');
|
|
586
|
+
const at = time(now);
|
|
587
|
+
const issuedAt = lastIssuedAt === undefined ? at : Math.max(at, time(lastIssuedAt));
|
|
588
|
+
if (issuedAt > at + LEDGER_LIMITS.maxFutureSkewMs)
|
|
589
|
+
fail();
|
|
590
|
+
const parsed = parseOperation(operation);
|
|
591
|
+
apply(current, parsed, issuedAt);
|
|
592
|
+
return {
|
|
593
|
+
type: 'ftown_account_transition', version: 2, accountId: current.accountId, revision: current.revision + 1,
|
|
594
|
+
previousHead: current.head, issuedAt, credentialId: signer.credentialId, operation: parsed,
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../src/security/ledger/ledger.ts"],"names":[],"mappings":"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"}
|