@meshline/sdk 0.0.0-stage → 0.1.0-alpha.1
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 +21 -0
- package/README.md +43 -2
- package/dist/channels/repository.d.ts +73 -0
- package/dist/channels/repository.d.ts.map +1 -0
- package/dist/channels/repository.js +367 -0
- package/dist/channels/repository.js.map +1 -0
- package/dist/client/account-operations.d.ts +41 -0
- package/dist/client/account-operations.d.ts.map +1 -0
- package/dist/client/account-operations.js +304 -0
- package/dist/client/account-operations.js.map +1 -0
- package/dist/client/conversations.d.ts +36 -0
- package/dist/client/conversations.d.ts.map +1 -0
- package/dist/client/conversations.js +144 -0
- package/dist/client/conversations.js.map +1 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +162 -0
- package/dist/client.js.map +1 -0
- package/dist/components/account.d.ts +38 -0
- package/dist/components/account.d.ts.map +1 -0
- package/dist/components/account.js +243 -0
- package/dist/components/account.js.map +1 -0
- package/dist/components/channel.d.ts +78 -0
- package/dist/components/channel.d.ts.map +1 -0
- package/dist/components/channel.js +475 -0
- package/dist/components/channel.js.map +1 -0
- package/dist/components/component.d.ts +49 -0
- package/dist/components/component.d.ts.map +1 -0
- package/dist/components/component.js +194 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/device.d.ts +60 -0
- package/dist/components/device.d.ts.map +1 -0
- package/dist/components/device.js +648 -0
- package/dist/components/device.js.map +1 -0
- package/dist/components/group.d.ts +141 -0
- package/dist/components/group.d.ts.map +1 -0
- package/dist/components/group.js +933 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/message.d.ts +63 -0
- package/dist/components/message.d.ts.map +1 -0
- package/dist/components/message.js +439 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/profile.d.ts +37 -0
- package/dist/components/profile.d.ts.map +1 -0
- package/dist/components/profile.js +232 -0
- package/dist/components/profile.js.map +1 -0
- package/dist/crypto/groups.d.ts +56 -0
- package/dist/crypto/groups.d.ts.map +1 -0
- package/dist/crypto/groups.js +163 -0
- package/dist/crypto/groups.js.map +1 -0
- package/dist/crypto/messages.d.ts +52 -0
- package/dist/crypto/messages.d.ts.map +1 -0
- package/dist/crypto/messages.js +180 -0
- package/dist/crypto/messages.js.map +1 -0
- package/dist/crypto/primitives.d.ts +30 -0
- package/dist/crypto/primitives.d.ts.map +1 -0
- package/dist/crypto/primitives.js +102 -0
- package/dist/crypto/primitives.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/groups/account-sync.d.ts +28 -0
- package/dist/groups/account-sync.d.ts.map +1 -0
- package/dist/groups/account-sync.js +235 -0
- package/dist/groups/account-sync.js.map +1 -0
- package/dist/groups/messages.d.ts +39 -0
- package/dist/groups/messages.d.ts.map +1 -0
- package/dist/groups/messages.js +141 -0
- package/dist/groups/messages.js.map +1 -0
- package/dist/groups/operations.d.ts +57 -0
- package/dist/groups/operations.d.ts.map +1 -0
- package/dist/groups/operations.js +225 -0
- package/dist/groups/operations.js.map +1 -0
- package/dist/groups/repository.d.ts +56 -0
- package/dist/groups/repository.d.ts.map +1 -0
- package/dist/groups/repository.js +254 -0
- package/dist/groups/repository.js.map +1 -0
- package/dist/groups/secrets.d.ts +67 -0
- package/dist/groups/secrets.d.ts.map +1 -0
- package/dist/groups/secrets.js +452 -0
- package/dist/groups/secrets.js.map +1 -0
- package/dist/groups/state.d.ts +39 -0
- package/dist/groups/state.d.ts.map +1 -0
- package/dist/groups/state.js +201 -0
- package/dist/groups/state.js.map +1 -0
- package/dist/identity/identifiers.d.ts +9 -0
- package/dist/identity/identifiers.d.ts.map +1 -0
- package/dist/identity/identifiers.js +37 -0
- package/dist/identity/identifiers.js.map +1 -0
- package/dist/identity/neo.d.ts +11 -0
- package/dist/identity/neo.d.ts.map +1 -0
- package/dist/identity/neo.js +77 -0
- package/dist/identity/neo.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions.d.ts +31 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +2 -0
- package/dist/interactions.js.map +1 -0
- package/dist/messages/account-sender.d.ts +9 -0
- package/dist/messages/account-sender.d.ts.map +1 -0
- package/dist/messages/account-sender.js +46 -0
- package/dist/messages/account-sender.js.map +1 -0
- package/dist/messages/contacts.d.ts +103 -0
- package/dist/messages/contacts.d.ts.map +1 -0
- package/dist/messages/contacts.js +525 -0
- package/dist/messages/contacts.js.map +1 -0
- package/dist/messages/outbox.d.ts +66 -0
- package/dist/messages/outbox.d.ts.map +1 -0
- package/dist/messages/outbox.js +167 -0
- package/dist/messages/outbox.js.map +1 -0
- package/dist/messages/receiver.d.ts +35 -0
- package/dist/messages/receiver.d.ts.map +1 -0
- package/dist/messages/receiver.js +113 -0
- package/dist/messages/receiver.js.map +1 -0
- package/dist/messages/repository.d.ts +89 -0
- package/dist/messages/repository.d.ts.map +1 -0
- package/dist/messages/repository.js +295 -0
- package/dist/messages/repository.js.map +1 -0
- package/dist/models/authentication.d.ts +37 -0
- package/dist/models/authentication.d.ts.map +1 -0
- package/dist/models/authentication.js +53 -0
- package/dist/models/authentication.js.map +1 -0
- package/dist/models/channels.d.ts +141 -0
- package/dist/models/channels.d.ts.map +1 -0
- package/dist/models/channels.js +258 -0
- package/dist/models/channels.js.map +1 -0
- package/dist/models/contacts.d.ts +68 -0
- package/dist/models/contacts.d.ts.map +1 -0
- package/dist/models/contacts.js +186 -0
- package/dist/models/contacts.js.map +1 -0
- package/dist/models/content.d.ts +37 -0
- package/dist/models/content.d.ts.map +1 -0
- package/dist/models/content.js +137 -0
- package/dist/models/content.js.map +1 -0
- package/dist/models/device-state.d.ts +8 -0
- package/dist/models/device-state.d.ts.map +1 -0
- package/dist/models/device-state.js +22 -0
- package/dist/models/device-state.js.map +1 -0
- package/dist/models/group-admission.d.ts +111 -0
- package/dist/models/group-admission.d.ts.map +1 -0
- package/dist/models/group-admission.js +153 -0
- package/dist/models/group-admission.js.map +1 -0
- package/dist/models/group-keys.d.ts +30 -0
- package/dist/models/group-keys.d.ts.map +1 -0
- package/dist/models/group-keys.js +52 -0
- package/dist/models/group-keys.js.map +1 -0
- package/dist/models/group-management.d.ts +190 -0
- package/dist/models/group-management.d.ts.map +1 -0
- package/dist/models/group-management.js +263 -0
- package/dist/models/group-management.js.map +1 -0
- package/dist/models/groups.d.ts +81 -0
- package/dist/models/groups.d.ts.map +1 -0
- package/dist/models/groups.js +127 -0
- package/dist/models/groups.js.map +1 -0
- package/dist/models/identity.d.ts +47 -0
- package/dist/models/identity.d.ts.map +1 -0
- package/dist/models/identity.js +136 -0
- package/dist/models/identity.js.map +1 -0
- package/dist/models/messages.d.ts +104 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/messages.js +168 -0
- package/dist/models/messages.js.map +1 -0
- package/dist/models/profile.d.ts +24 -0
- package/dist/models/profile.d.ts.map +1 -0
- package/dist/models/profile.js +47 -0
- package/dist/models/profile.js.map +1 -0
- package/dist/models/relay.d.ts +39 -0
- package/dist/models/relay.d.ts.map +1 -0
- package/dist/models/relay.js +160 -0
- package/dist/models/relay.js.map +1 -0
- package/dist/protocol/codec.d.ts +36 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/codec.js +144 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/context.d.ts +14 -0
- package/dist/protocol/context.d.ts.map +1 -0
- package/dist/protocol/context.js +43 -0
- package/dist/protocol/context.js.map +1 -0
- package/dist/protocol/encoding.d.ts +15 -0
- package/dist/protocol/encoding.d.ts.map +1 -0
- package/dist/protocol/encoding.js +133 -0
- package/dist/protocol/encoding.js.map +1 -0
- package/dist/protocol/json.d.ts +16 -0
- package/dist/protocol/json.d.ts.map +1 -0
- package/dist/protocol/json.js +172 -0
- package/dist/protocol/json.js.map +1 -0
- package/dist/protocol/validation.d.ts +4 -0
- package/dist/protocol/validation.d.ts.map +1 -0
- package/dist/protocol/validation.js +18 -0
- package/dist/protocol/validation.js.map +1 -0
- package/dist/runtime/abort.d.ts +6 -0
- package/dist/runtime/abort.d.ts.map +1 -0
- package/dist/runtime/abort.js +32 -0
- package/dist/runtime/abort.js.map +1 -0
- package/dist/runtime/async-gate.d.ts +6 -0
- package/dist/runtime/async-gate.d.ts.map +1 -0
- package/dist/runtime/async-gate.js +15 -0
- package/dist/runtime/async-gate.js.map +1 -0
- package/dist/runtime/async-pulse.d.ts +7 -0
- package/dist/runtime/async-pulse.d.ts.map +1 -0
- package/dist/runtime/async-pulse.js +23 -0
- package/dist/runtime/async-pulse.js.map +1 -0
- package/dist/runtime/clock.d.ts +16 -0
- package/dist/runtime/clock.d.ts.map +1 -0
- package/dist/runtime/clock.js +62 -0
- package/dist/runtime/clock.js.map +1 -0
- package/dist/runtime/events.d.ts +11 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +45 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/url.d.ts +3 -0
- package/dist/runtime/url.d.ts.map +1 -0
- package/dist/runtime/url.js +23 -0
- package/dist/runtime/url.js.map +1 -0
- package/dist/storage/signed-request.d.ts +14 -0
- package/dist/storage/signed-request.d.ts.map +1 -0
- package/dist/storage/signed-request.js +26 -0
- package/dist/storage/signed-request.js.map +1 -0
- package/dist/storage/store.d.ts +58 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +52 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/transaction.d.ts +7 -0
- package/dist/storage/transaction.d.ts.map +1 -0
- package/dist/storage/transaction.js +22 -0
- package/dist/storage/transaction.js.map +1 -0
- package/dist/transport/client.d.ts +61 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +392 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/discovery.d.ts +19 -0
- package/dist/transport/discovery.d.ts.map +1 -0
- package/dist/transport/discovery.js +75 -0
- package/dist/transport/discovery.js.map +1 -0
- package/dist/transport/endpoint.d.ts +6 -0
- package/dist/transport/endpoint.d.ts.map +1 -0
- package/dist/transport/endpoint.js +35 -0
- package/dist/transport/endpoint.js.map +1 -0
- package/dist/transport/http.d.ts +52 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +128 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/pool.d.ts +31 -0
- package/dist/transport/pool.d.ts.map +1 -0
- package/dist/transport/pool.js +137 -0
- package/dist/transport/pool.js.map +1 -0
- package/dist/transport/relay-error.d.ts +23 -0
- package/dist/transport/relay-error.d.ts.map +1 -0
- package/dist/transport/relay-error.js +47 -0
- package/dist/transport/relay-error.js.map +1 -0
- package/dist/transport/rpc.d.ts +31 -0
- package/dist/transport/rpc.d.ts.map +1 -0
- package/dist/transport/rpc.js +56 -0
- package/dist/transport/rpc.js.map +1 -0
- package/dist/transport/session.d.ts +49 -0
- package/dist/transport/session.d.ts.map +1 -0
- package/dist/transport/session.js +169 -0
- package/dist/transport/session.js.map +1 -0
- package/dist/transport/socket.d.ts +55 -0
- package/dist/transport/socket.d.ts.map +1 -0
- package/dist/transport/socket.js +266 -0
- package/dist/transport/socket.js.map +1 -0
- package/dist/transport/subscription.d.ts +36 -0
- package/dist/transport/subscription.d.ts.map +1 -0
- package/dist/transport/subscription.js +169 -0
- package/dist/transport/subscription.js.map +1 -0
- package/package.json +35 -4
- package/src/channels/repository.ts +244 -0
- package/src/client/account-operations.ts +183 -0
- package/src/client/conversations.ts +95 -0
- package/src/client.ts +108 -0
- package/src/components/account.ts +206 -0
- package/src/components/channel.ts +253 -0
- package/src/components/component.ts +151 -0
- package/src/components/device.ts +455 -0
- package/src/components/group.ts +546 -0
- package/src/components/message.ts +253 -0
- package/src/components/profile.ts +179 -0
- package/src/crypto/groups.ts +107 -0
- package/src/crypto/messages.ts +129 -0
- package/src/crypto/primitives.ts +103 -0
- package/src/errors.ts +13 -0
- package/src/groups/account-sync.ts +144 -0
- package/src/groups/messages.ts +89 -0
- package/src/groups/operations.ts +145 -0
- package/src/groups/repository.ts +161 -0
- package/src/groups/secrets.ts +256 -0
- package/src/groups/state.ts +138 -0
- package/src/identity/identifiers.ts +41 -0
- package/src/identity/neo.ts +72 -0
- package/src/index.ts +52 -0
- package/src/interactions.ts +35 -0
- package/src/messages/account-sender.ts +33 -0
- package/src/messages/contacts.ts +379 -0
- package/src/messages/outbox.ts +152 -0
- package/src/messages/receiver.ts +86 -0
- package/src/messages/repository.ts +230 -0
- package/src/models/authentication.ts +63 -0
- package/src/models/channels.ts +155 -0
- package/src/models/contacts.ts +141 -0
- package/src/models/content.ts +105 -0
- package/src/models/device-state.ts +18 -0
- package/src/models/group-admission.ts +110 -0
- package/src/models/group-keys.ts +34 -0
- package/src/models/group-management.ts +182 -0
- package/src/models/groups.ts +100 -0
- package/src/models/identity.ts +164 -0
- package/src/models/messages.ts +139 -0
- package/src/models/profile.ts +46 -0
- package/src/models/relay.ts +151 -0
- package/src/protocol/codec.ts +144 -0
- package/src/protocol/context.ts +39 -0
- package/src/protocol/encoding.ts +106 -0
- package/src/protocol/json.ts +140 -0
- package/src/protocol/validation.ts +13 -0
- package/src/runtime/abort.ts +27 -0
- package/src/runtime/async-gate.ts +16 -0
- package/src/runtime/async-pulse.ts +20 -0
- package/src/runtime/clock.ts +63 -0
- package/src/runtime/events.ts +31 -0
- package/src/runtime/url.ts +17 -0
- package/src/storage/signed-request.ts +26 -0
- package/src/storage/store.ts +90 -0
- package/src/storage/transaction.ts +17 -0
- package/src/transport/client.ts +328 -0
- package/src/transport/discovery.ts +64 -0
- package/src/transport/endpoint.ts +32 -0
- package/src/transport/http.ts +129 -0
- package/src/transport/pool.ts +115 -0
- package/src/transport/relay-error.ts +46 -0
- package/src/transport/rpc.ts +56 -0
- package/src/transport/session.ts +154 -0
- package/src/transport/socket.ts +248 -0
- package/src/transport/subscription.ts +117 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { MessageDecryptor } from '../crypto/messages.js';
|
|
2
|
+
import { ProtocolError } from '../errors.js';
|
|
3
|
+
import type { SecretProtector } from '../interactions.js';
|
|
4
|
+
import { type GroupHistorySecret, type GroupMemberPrivateState, type GroupRef } from '../models/groups.js';
|
|
5
|
+
import type { NetworkContext } from '../protocol/context.js';
|
|
6
|
+
import type { MeshlineStore, RecordKey, RecordQuery, StoreMutation, StoreSnapshot } from '../storage/store.js';
|
|
7
|
+
import type { GroupApplicationSecrets } from './messages.js';
|
|
8
|
+
export declare const groupMemberSecretKey: (groupId: string, publicKey: Uint8Array) => RecordKey;
|
|
9
|
+
export declare const groupApplicationSecretKey: (groupId: string, epoch: number) => RecordKey;
|
|
10
|
+
export declare const groupRotationKey: (group: GroupRef) => RecordKey;
|
|
11
|
+
export interface PreparedGroupMemberKey {
|
|
12
|
+
readonly group: GroupRef;
|
|
13
|
+
readonly publicKey: Uint8Array;
|
|
14
|
+
readonly protectedKey: string;
|
|
15
|
+
readonly deviceId: string;
|
|
16
|
+
}
|
|
17
|
+
export interface GroupSecretEffect {
|
|
18
|
+
readonly queries: readonly RecordQuery[];
|
|
19
|
+
plan(snapshot: StoreSnapshot): readonly StoreMutation[];
|
|
20
|
+
}
|
|
21
|
+
export interface GroupSecretsOptions {
|
|
22
|
+
readonly store: MeshlineStore;
|
|
23
|
+
readonly context: NetworkContext;
|
|
24
|
+
readonly accountId: string;
|
|
25
|
+
readonly deviceId: () => string;
|
|
26
|
+
readonly protector: SecretProtector;
|
|
27
|
+
}
|
|
28
|
+
export interface GroupKeyRecoveryResult {
|
|
29
|
+
readonly derived: readonly number[];
|
|
30
|
+
readonly missing: readonly number[];
|
|
31
|
+
readonly rejected: readonly {
|
|
32
|
+
readonly epoch: number;
|
|
33
|
+
readonly error: ProtocolError;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
export interface GroupRotation {
|
|
37
|
+
readonly group: GroupRef;
|
|
38
|
+
readonly baseCommitment: string;
|
|
39
|
+
readonly commitment: string;
|
|
40
|
+
readonly ownerSequence: number;
|
|
41
|
+
readonly deviceId: string;
|
|
42
|
+
readonly ownerPublicKey?: Uint8Array;
|
|
43
|
+
readonly expiresAt?: number;
|
|
44
|
+
}
|
|
45
|
+
/** Account-message authentication is the caller's responsibility; arriving keys never select current membership or advance verified history. */
|
|
46
|
+
export declare class GroupSecrets implements GroupApplicationSecrets {
|
|
47
|
+
#private;
|
|
48
|
+
readonly options: GroupSecretsOptions;
|
|
49
|
+
constructor(options: GroupSecretsOptions);
|
|
50
|
+
prepareMemberState(source: GroupMemberPrivateState, signal?: AbortSignal): Promise<PreparedGroupMemberKey>;
|
|
51
|
+
/** Current and historical private keys coexist by derived public key; arrival order has no authority. */
|
|
52
|
+
saveMemberState(source: GroupMemberPrivateState, signal?: AbortSignal): Promise<void>;
|
|
53
|
+
/** Prepared mutations can join an account-message consumer cursor in one atomic commit. */
|
|
54
|
+
prepareMemberStates(sources: readonly GroupMemberPrivateState[], signal?: AbortSignal): Promise<GroupSecretEffect>;
|
|
55
|
+
readMemberKey(groupId: string, publicKey: Uint8Array, signal?: AbortSignal): Promise<Uint8Array | undefined>;
|
|
56
|
+
stageHistorySecret(source: GroupHistorySecret, signal?: AbortSignal): Promise<void>;
|
|
57
|
+
prepareHistorySecrets(sources: readonly GroupHistorySecret[], signal?: AbortSignal): Promise<GroupSecretEffect>;
|
|
58
|
+
readApplicationSecret(group: GroupRef, epoch: number, signal?: AbortSignal): Promise<Uint8Array | undefined>;
|
|
59
|
+
readClientSecret(group: GroupRef, commitment: string, signal?: AbortSignal): Promise<Uint8Array | undefined>;
|
|
60
|
+
rotation(group: GroupRef, signal?: AbortSignal): Promise<GroupRotation | undefined>;
|
|
61
|
+
beginRotation(group: GroupRef, baseCommitment: string, source: Uint8Array, member: PreparedGroupMemberKey | undefined, signal?: AbortSignal): Promise<GroupRotation>;
|
|
62
|
+
readRotationSecret(rotation: GroupRotation, signal?: AbortSignal): Promise<Uint8Array>;
|
|
63
|
+
acknowledgeRotation(rotation: GroupRotation, expiresAt: number): Promise<GroupRotation>;
|
|
64
|
+
discardRotation(rotation: GroupRotation, signal?: AbortSignal): Promise<void>;
|
|
65
|
+
derivePending(group: GroupRef, device: MessageDecryptor, signal?: AbortSignal): Promise<GroupKeyRecoveryResult>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/groups/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { deriveGroupApplicationSecret, groupClientSecretBoxAad, groupClientSecretCommitment, groupRelaySecretBoxAad, GroupKeyAccessError, openGroupSecret } from '../crypto/groups.js';
|
|
2
|
+
import { agreeKey, encryptionPublicKey, requireLength } from '../crypto/primitives.js';
|
|
3
|
+
import { ProtocolError, StateConflictError } from '../errors.js';
|
|
4
|
+
import { validateIdentifier } from '../identity/identifiers.js';
|
|
5
|
+
import { validateAccountId } from '../identity/neo.js';
|
|
6
|
+
import { contentHashBytes } from '../models/content.js';
|
|
7
|
+
import { groupKeyEntryCodec, validateGroupKeyEntry } from '../models/group-keys.js';
|
|
8
|
+
import { groupHistorySecretCodec, groupMemberPrivateStateCodec, validateAccountGroupHistorySecretSync, validateAccountGroupPrivateStateSync, validateGroupMemberPrivateState, validateGroupRef } from '../models/groups.js';
|
|
9
|
+
import { certificateId, deviceCertificateCodec, validateCertificate } from '../models/identity.js';
|
|
10
|
+
import { decodeBase64Url, encodeBase64Url, equalBytes } from '../protocol/encoding.js';
|
|
11
|
+
import { canonicalJson, requireObject, requireSafeInteger } from '../protocol/json.js';
|
|
12
|
+
import { throwIfAborted } from '../runtime/clock.js';
|
|
13
|
+
import { updateStore } from '../storage/transaction.js';
|
|
14
|
+
import { decodeGroupProjection, groupEpochKey, groupKey, GroupRepository } from './repository.js';
|
|
15
|
+
const fingerprint = (value) => canonicalJson(value ?? null);
|
|
16
|
+
const put = (key, value) => ({ ...key, kind: 'put', value });
|
|
17
|
+
export const groupMemberSecretKey = (groupId, publicKey) => ({ collection: 'group_member_keys', key: `${groupId}|${encodeBase64Url(publicKey)}` });
|
|
18
|
+
export const groupApplicationSecretKey = (groupId, epoch) => ({ collection: 'group_application_secrets', key: `${groupId}|${String(epoch).padStart(16, '0')}` });
|
|
19
|
+
export const groupRotationKey = (group) => ({ collection: 'group_rotations', key: group.groupId });
|
|
20
|
+
const clientSecretKey = (groupId, commitment) => ({ collection: 'group_client_secrets', key: `${groupId}|${commitment}` });
|
|
21
|
+
function rotationRecord(value, group) {
|
|
22
|
+
validateGroupRef(group);
|
|
23
|
+
if (value.relayId !== group.relayId || typeof value.baseCommitment !== 'string' || typeof value.commitment !== 'string' || typeof value.deviceId !== 'string' || typeof value.protectedSecret !== 'string')
|
|
24
|
+
throw new ProtocolError('invalid_storage', 'Stored rotation has inconsistent group, commitment or secret metadata.');
|
|
25
|
+
contentHashBytes(value.baseCommitment);
|
|
26
|
+
contentHashBytes(value.commitment);
|
|
27
|
+
validateIdentifier('device', value.deviceId);
|
|
28
|
+
requireSafeInteger(value.ownerSequence, 0);
|
|
29
|
+
if (value.baseCommitment === value.commitment)
|
|
30
|
+
throw new ProtocolError('invalid_storage', 'Stored rotation did not select a new secret.');
|
|
31
|
+
if (value.expiresAt !== undefined)
|
|
32
|
+
requireSafeInteger(value.expiresAt, 1);
|
|
33
|
+
const ownerPublicKey = value.ownerPublicKey === undefined ? undefined : decodeBase64Url(String(value.ownerPublicKey));
|
|
34
|
+
if (ownerPublicKey)
|
|
35
|
+
requireLength(ownerPublicKey, 32, 'Candidate owner public key');
|
|
36
|
+
return { group, baseCommitment: value.baseCommitment, commitment: value.commitment, ownerSequence: value.ownerSequence, deviceId: value.deviceId, ...(ownerPublicKey ? { ownerPublicKey } : {}), ...(value.expiresAt === undefined ? {} : { expiresAt: value.expiresAt }) };
|
|
37
|
+
}
|
|
38
|
+
/** Account-message authentication is the caller's responsibility; arriving keys never select current membership or advance verified history. */
|
|
39
|
+
export class GroupSecrets {
|
|
40
|
+
options;
|
|
41
|
+
constructor(options) {
|
|
42
|
+
this.options = options;
|
|
43
|
+
validateAccountId(options.accountId);
|
|
44
|
+
}
|
|
45
|
+
#purpose(groupId, kind, key) {
|
|
46
|
+
validateIdentifier('group', groupId);
|
|
47
|
+
const deviceId = this.options.deviceId();
|
|
48
|
+
validateIdentifier('device', deviceId);
|
|
49
|
+
return `Meshline/${this.options.context}/${this.options.accountId}/${deviceId}/group/${groupId}/${kind}/${key}`;
|
|
50
|
+
}
|
|
51
|
+
async #protect(secret, purpose, signal) {
|
|
52
|
+
try {
|
|
53
|
+
const protectedData = await this.options.protector.protect(secret, purpose, signal);
|
|
54
|
+
throwIfAborted(signal);
|
|
55
|
+
if (!(protectedData instanceof Uint8Array) || !protectedData.length)
|
|
56
|
+
throw new Error('Secret protector returned empty data.');
|
|
57
|
+
return encodeBase64Url(protectedData);
|
|
58
|
+
}
|
|
59
|
+
catch (cause) {
|
|
60
|
+
throwIfAborted(signal);
|
|
61
|
+
throw new GroupKeyAccessError('Local group secret protection failed.', { cause });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async #unprotect(value, field, purpose, signal) {
|
|
65
|
+
let result;
|
|
66
|
+
try {
|
|
67
|
+
if (typeof value[field] !== 'string')
|
|
68
|
+
throw new Error('Protected group secret is missing.');
|
|
69
|
+
result = await this.options.protector.unprotect(decodeBase64Url(value[field]), purpose, signal);
|
|
70
|
+
throwIfAborted(signal);
|
|
71
|
+
requireLength(result, 32, 'Protected group secret');
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
catch (cause) {
|
|
75
|
+
if (result instanceof Uint8Array)
|
|
76
|
+
result.fill(0);
|
|
77
|
+
throwIfAborted(signal);
|
|
78
|
+
throw new GroupKeyAccessError('Local group secret could not be restored.', { cause });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async prepareMemberState(source, signal) {
|
|
82
|
+
const value = groupMemberPrivateStateCodec.decode(groupMemberPrivateStateCodec.encode(source));
|
|
83
|
+
try {
|
|
84
|
+
validateGroupMemberPrivateState(value);
|
|
85
|
+
const deviceId = this.options.deviceId();
|
|
86
|
+
const group = { groupId: value.groupId, relayId: value.relayId };
|
|
87
|
+
const publicKey = encryptionPublicKey(value.memberEncryptionPrivateKey);
|
|
88
|
+
const purpose = this.#purpose(group.groupId, 'member', encodeBase64Url(publicKey));
|
|
89
|
+
const protectedKey = await this.#protect(value.memberEncryptionPrivateKey, purpose, signal);
|
|
90
|
+
if (purpose !== this.#purpose(group.groupId, 'member', encodeBase64Url(publicKey)))
|
|
91
|
+
throw new GroupKeyAccessError('Local device changed during group key protection.');
|
|
92
|
+
return { group, publicKey, protectedKey, deviceId };
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
value.memberEncryptionPrivateKey.fill(0);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Current and historical private keys coexist by derived public key; arrival order has no authority. */
|
|
99
|
+
async saveMemberState(source, signal) {
|
|
100
|
+
const effect = await this.prepareMemberStates([source], signal);
|
|
101
|
+
await updateStore(this.options.store, effect.queries, snapshot => ({ mutations: effect.plan(snapshot), result: undefined }), signal);
|
|
102
|
+
}
|
|
103
|
+
/** Prepared mutations can join an account-message consumer cursor in one atomic commit. */
|
|
104
|
+
async prepareMemberStates(sources, signal) {
|
|
105
|
+
const states = sources.map(source => groupMemberPrivateStateCodec.decode(groupMemberPrivateStateCodec.encode(source)));
|
|
106
|
+
try {
|
|
107
|
+
validateAccountGroupPrivateStateSync({ states });
|
|
108
|
+
const prepared = [];
|
|
109
|
+
for (const state of states)
|
|
110
|
+
prepared.push(await this.prepareMemberState(state, signal));
|
|
111
|
+
const queries = prepared.flatMap(value => [groupKey(value.group), groupMemberSecretKey(value.group.groupId, value.publicKey)]);
|
|
112
|
+
return { queries, plan: snapshot => {
|
|
113
|
+
const mutations = [];
|
|
114
|
+
for (const [index, value] of prepared.entries()) {
|
|
115
|
+
if (this.options.deviceId() !== value.deviceId)
|
|
116
|
+
throw new GroupKeyAccessError('Local device changed before member key persistence.');
|
|
117
|
+
const record = snapshot.sets[index * 2][0]?.value;
|
|
118
|
+
const existing = snapshot.sets[index * 2 + 1][0]?.value;
|
|
119
|
+
const publicKey = encodeBase64Url(value.publicKey);
|
|
120
|
+
if (record && record.relayId !== value.group.relayId)
|
|
121
|
+
throw new ProtocolError('invalid_binding', 'Private group state names another hosting relay.');
|
|
122
|
+
if (existing && existing.publicKey !== publicKey)
|
|
123
|
+
throw new ProtocolError('invalid_storage', 'Stored group member key does not match its identity.');
|
|
124
|
+
if (!record)
|
|
125
|
+
mutations.push(put(groupKey(value.group), { relayId: value.group.relayId }));
|
|
126
|
+
if (!existing)
|
|
127
|
+
mutations.push(put(groupMemberSecretKey(value.group.groupId, value.publicKey), { publicKey, protectedKey: value.protectedKey, shared: false }));
|
|
128
|
+
}
|
|
129
|
+
return mutations;
|
|
130
|
+
} };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
for (const state of states)
|
|
134
|
+
state.memberEncryptionPrivateKey.fill(0);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async readMemberKey(groupId, publicKey, signal) {
|
|
138
|
+
validateIdentifier('group', groupId);
|
|
139
|
+
requireLength(publicKey, 32, 'Member public key');
|
|
140
|
+
const key = publicKey.slice();
|
|
141
|
+
const row = (await this.options.store.read([groupMemberSecretKey(groupId, key)], signal)).sets[0][0]?.value;
|
|
142
|
+
if (!row)
|
|
143
|
+
return undefined;
|
|
144
|
+
const purpose = this.#purpose(groupId, 'member', encodeBase64Url(key));
|
|
145
|
+
const privateKey = await this.#unprotect(row, 'protectedKey', purpose, signal);
|
|
146
|
+
try {
|
|
147
|
+
if (row.publicKey !== encodeBase64Url(key) || !equalBytes(encryptionPublicKey(privateKey), key) || purpose !== this.#purpose(groupId, 'member', encodeBase64Url(key)))
|
|
148
|
+
throw new GroupKeyAccessError('Restored group member key differs from its public identity.');
|
|
149
|
+
return privateKey;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
privateKey.fill(0);
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async stageHistorySecret(source, signal) {
|
|
157
|
+
const effect = await this.prepareHistorySecrets([source], signal);
|
|
158
|
+
await updateStore(this.options.store, effect.queries, snapshot => ({ mutations: effect.plan(snapshot), result: undefined }), signal);
|
|
159
|
+
}
|
|
160
|
+
async prepareHistorySecrets(sources, signal) {
|
|
161
|
+
const secrets = sources.map(source => groupHistorySecretCodec.decode(groupHistorySecretCodec.encode(source)));
|
|
162
|
+
try {
|
|
163
|
+
validateAccountGroupHistorySecretSync({ secrets });
|
|
164
|
+
const deviceId = this.options.deviceId();
|
|
165
|
+
const queries = secrets.map(value => groupApplicationSecretKey(value.groupId, value.epoch));
|
|
166
|
+
const initial = await this.options.store.read(queries, signal);
|
|
167
|
+
const mutations = [];
|
|
168
|
+
for (const [index, value] of secrets.entries()) {
|
|
169
|
+
const row = initial.sets[index][0]?.value;
|
|
170
|
+
const purpose = this.#purpose(value.groupId, 'epoch', String(value.epoch));
|
|
171
|
+
if (row) {
|
|
172
|
+
if (row.epoch !== value.epoch)
|
|
173
|
+
throw new ProtocolError('invalid_storage', 'Stored group secret belongs to another epoch.');
|
|
174
|
+
const existing = await this.#unprotect(row, 'protectedSecret', purpose, signal);
|
|
175
|
+
try {
|
|
176
|
+
if (!equalBytes(existing, value.applicationSecret))
|
|
177
|
+
throw new ProtocolError('conflicting_epoch_secret', 'Account synchronization conflicts with a previously stored epoch secret.');
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
existing.fill(0);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
const protectedSecret = await this.#protect(value.applicationSecret, purpose, signal);
|
|
185
|
+
mutations.push(put(queries[index], { epoch: value.epoch, protectedSecret, source: 'account', shared: false }));
|
|
186
|
+
}
|
|
187
|
+
if (deviceId !== this.options.deviceId())
|
|
188
|
+
throw new GroupKeyAccessError('Local device changed during epoch secret preparation.');
|
|
189
|
+
}
|
|
190
|
+
return { queries, plan: snapshot => {
|
|
191
|
+
if (deviceId !== this.options.deviceId())
|
|
192
|
+
throw new GroupKeyAccessError('Local device changed before epoch secret persistence.');
|
|
193
|
+
if (snapshot.sets.some((rows, index) => fingerprint(rows[0]?.value) !== fingerprint(initial.sets[index][0]?.value)))
|
|
194
|
+
throw new StateConflictError('Group epoch secret changed while synchronization was being prepared.');
|
|
195
|
+
return mutations;
|
|
196
|
+
} };
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
for (const value of secrets)
|
|
200
|
+
value.applicationSecret.fill(0);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async readApplicationSecret(group, epoch, signal) {
|
|
204
|
+
validateGroupRef(group);
|
|
205
|
+
requireSafeInteger(epoch, 0);
|
|
206
|
+
const snapshot = await this.options.store.read([groupKey(group), groupEpochKey(group, epoch), groupApplicationSecretKey(group.groupId, epoch)], signal);
|
|
207
|
+
const association = snapshot.sets[0][0]?.value;
|
|
208
|
+
if (association && association.relayId !== group.relayId)
|
|
209
|
+
throw new ProtocolError('invalid_binding', 'Group secret belongs to another hosting relay.');
|
|
210
|
+
if (!association?.projection || !snapshot.sets[1][0]?.value.commitment)
|
|
211
|
+
return undefined;
|
|
212
|
+
const projection = decodeGroupProjection(requireObject(association.projection), group);
|
|
213
|
+
if (epoch > projection.epoch)
|
|
214
|
+
return undefined;
|
|
215
|
+
const row = snapshot.sets[2][0]?.value;
|
|
216
|
+
if (!row)
|
|
217
|
+
return undefined;
|
|
218
|
+
if (row.epoch !== epoch)
|
|
219
|
+
throw new ProtocolError('invalid_storage', 'Stored group secret belongs to another epoch.');
|
|
220
|
+
const purpose = this.#purpose(group.groupId, 'epoch', String(epoch));
|
|
221
|
+
const secret = await this.#unprotect(row, 'protectedSecret', purpose, signal);
|
|
222
|
+
if (purpose !== this.#purpose(group.groupId, 'epoch', String(epoch))) {
|
|
223
|
+
secret.fill(0);
|
|
224
|
+
throw new GroupKeyAccessError('Local device changed during group secret restoration.');
|
|
225
|
+
}
|
|
226
|
+
return secret;
|
|
227
|
+
}
|
|
228
|
+
async readClientSecret(group, commitment, signal) {
|
|
229
|
+
validateGroupRef(group);
|
|
230
|
+
contentHashBytes(commitment);
|
|
231
|
+
const epochs = await new GroupRepository(this.options.store, this.options.context, this.options.accountId).epochs(group, signal);
|
|
232
|
+
if (!epochs.some(epoch => epoch.commitment === commitment))
|
|
233
|
+
return undefined;
|
|
234
|
+
const row = (await this.options.store.read([clientSecretKey(group.groupId, commitment)], signal)).sets[0][0]?.value;
|
|
235
|
+
if (!row)
|
|
236
|
+
return undefined;
|
|
237
|
+
const purpose = this.#purpose(group.groupId, 'client', commitment);
|
|
238
|
+
const secret = await this.#unprotect(row, 'protectedSecret', purpose, signal);
|
|
239
|
+
if (groupClientSecretCommitment(group.groupId, secret, this.options.context) !== commitment || purpose !== this.#purpose(group.groupId, 'client', commitment)) {
|
|
240
|
+
secret.fill(0);
|
|
241
|
+
throw new GroupKeyAccessError('Stored client secret does not match its verified commitment or local device.');
|
|
242
|
+
}
|
|
243
|
+
return secret;
|
|
244
|
+
}
|
|
245
|
+
async rotation(group, signal) {
|
|
246
|
+
group = { ...group };
|
|
247
|
+
validateGroupRef(group);
|
|
248
|
+
const snapshot = await this.options.store.read([groupKey(group), groupRotationKey(group)], signal);
|
|
249
|
+
if (snapshot.sets[0][0]?.value.relayId !== group.relayId)
|
|
250
|
+
throw new ProtocolError('invalid_binding', 'Rotation group has no matching hosting association.');
|
|
251
|
+
const row = snapshot.sets[1][0]?.value;
|
|
252
|
+
return row && rotationRecord(row, group);
|
|
253
|
+
}
|
|
254
|
+
async beginRotation(group, baseCommitment, source, member, signal) {
|
|
255
|
+
group = { ...group };
|
|
256
|
+
validateGroupRef(group);
|
|
257
|
+
contentHashBytes(baseCommitment);
|
|
258
|
+
const secret = source.slice();
|
|
259
|
+
try {
|
|
260
|
+
const commitment = groupClientSecretCommitment(group.groupId, secret, this.options.context);
|
|
261
|
+
if (commitment === baseCommitment)
|
|
262
|
+
throw new ProtocolError('unchanged_secret', 'Rotation requires a fresh client group secret.');
|
|
263
|
+
const deviceId = this.options.deviceId();
|
|
264
|
+
const purpose = this.#purpose(group.groupId, 'rotation', commitment);
|
|
265
|
+
const protectedSecret = await this.#protect(secret, purpose, signal);
|
|
266
|
+
if (member && (member.group.groupId !== group.groupId || member.group.relayId !== group.relayId || member.deviceId !== deviceId))
|
|
267
|
+
throw new ProtocolError('invalid_binding', 'Rotation member key belongs to another group or local device.');
|
|
268
|
+
const queries = [groupKey(group), groupRotationKey(group), ...(member ? [groupMemberSecretKey(group.groupId, member.publicKey)] : [])];
|
|
269
|
+
return await updateStore(this.options.store, queries, snapshot => {
|
|
270
|
+
if (purpose !== this.#purpose(group.groupId, 'rotation', commitment))
|
|
271
|
+
throw new GroupKeyAccessError('Local rotation protection identity changed.');
|
|
272
|
+
const row = snapshot.sets[0][0]?.value;
|
|
273
|
+
if (row?.relayId !== group.relayId || !row.projection)
|
|
274
|
+
throw new ProtocolError('unverified_group', 'Rotation requires verified group history.');
|
|
275
|
+
const state = decodeGroupProjection(requireObject(row.projection), group);
|
|
276
|
+
if (state.clientSecretCommitment !== baseCommitment || state.state.owner !== this.options.accountId || state.state.status !== 'active')
|
|
277
|
+
throw new StateConflictError('Verified group secret or owner changed before rotation staging.');
|
|
278
|
+
if (snapshot.sets[1].length)
|
|
279
|
+
throw new StateConflictError('A group secret rotation is already staged.');
|
|
280
|
+
const value = { relayId: group.relayId, baseCommitment, commitment, protectedSecret, deviceId, ownerSequence: row.ownerSequence ?? 0, ...(member ? { ownerPublicKey: encodeBase64Url(member.publicKey) } : {}) };
|
|
281
|
+
const result = rotationRecord(value, group);
|
|
282
|
+
const mutations = [put(groupRotationKey(group), value)];
|
|
283
|
+
if (member) {
|
|
284
|
+
if (snapshot.sets[2].length)
|
|
285
|
+
throw new StateConflictError('Candidate owner key already exists.');
|
|
286
|
+
mutations.push(put(queries[2], { publicKey: encodeBase64Url(member.publicKey), protectedKey: member.protectedKey, shared: false }));
|
|
287
|
+
}
|
|
288
|
+
return { mutations, result };
|
|
289
|
+
}, signal);
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
secret.fill(0);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async readRotationSecret(rotation, signal) {
|
|
296
|
+
const row = (await this.options.store.read([groupRotationKey(rotation.group)], signal)).sets[0][0]?.value;
|
|
297
|
+
if (!row || row.commitment !== rotation.commitment || row.baseCommitment !== rotation.baseCommitment)
|
|
298
|
+
throw new StateConflictError('Candidate group secret changed before restoration.');
|
|
299
|
+
const current = rotationRecord(row, rotation.group);
|
|
300
|
+
if (current.deviceId !== this.options.deviceId())
|
|
301
|
+
throw new GroupKeyAccessError('Rotation belongs to another local device.');
|
|
302
|
+
const purpose = this.#purpose(rotation.group.groupId, 'rotation', rotation.commitment);
|
|
303
|
+
const secret = await this.#unprotect(row, 'protectedSecret', purpose, signal);
|
|
304
|
+
if (purpose !== this.#purpose(rotation.group.groupId, 'rotation', rotation.commitment) || groupClientSecretCommitment(rotation.group.groupId, secret, this.options.context) !== rotation.commitment) {
|
|
305
|
+
secret.fill(0);
|
|
306
|
+
throw new GroupKeyAccessError('Restored candidate secret differs from its commitment or local identity.');
|
|
307
|
+
}
|
|
308
|
+
return secret;
|
|
309
|
+
}
|
|
310
|
+
async acknowledgeRotation(rotation, expiresAt) {
|
|
311
|
+
requireSafeInteger(expiresAt, 1);
|
|
312
|
+
return updateStore(this.options.store, [groupRotationKey(rotation.group)], snapshot => {
|
|
313
|
+
const value = snapshot.sets[0][0]?.value;
|
|
314
|
+
if (!value || value.commitment !== rotation.commitment)
|
|
315
|
+
throw new StateConflictError('Candidate rotation changed before preparation was acknowledged.');
|
|
316
|
+
const current = rotationRecord(value, rotation.group);
|
|
317
|
+
if (current.expiresAt !== undefined && current.expiresAt !== expiresAt)
|
|
318
|
+
throw new ProtocolError('conflicting_expiry', 'Relay changed the original rotation preparation expiry.');
|
|
319
|
+
const next = { ...value, expiresAt };
|
|
320
|
+
return { mutations: [put(groupRotationKey(rotation.group), next)], result: rotationRecord(next, rotation.group) };
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
async discardRotation(rotation, signal) {
|
|
324
|
+
await updateStore(this.options.store, [groupRotationKey(rotation.group)], snapshot => {
|
|
325
|
+
const row = snapshot.sets[0][0]?.value;
|
|
326
|
+
if (row && row.commitment !== rotation.commitment)
|
|
327
|
+
throw new StateConflictError('Another rotation replaced the obsolete candidate.');
|
|
328
|
+
return { mutations: row ? [{ kind: 'delete', ...groupRotationKey(rotation.group) }] : [], result: undefined };
|
|
329
|
+
}, signal);
|
|
330
|
+
}
|
|
331
|
+
async derivePending(group, device, signal) {
|
|
332
|
+
const epochs = await new GroupRepository(this.options.store, this.options.context, this.options.accountId).epochs(group, signal);
|
|
333
|
+
const derived = [];
|
|
334
|
+
const missing = [];
|
|
335
|
+
const rejected = [];
|
|
336
|
+
for (const epoch of epochs) {
|
|
337
|
+
if (!epoch.keyEntry || !epoch.memberPublicKey)
|
|
338
|
+
continue;
|
|
339
|
+
try {
|
|
340
|
+
const result = await this.#deriveEpoch(group, epoch.epoch, device, signal);
|
|
341
|
+
if (result === 'derived')
|
|
342
|
+
derived.push(epoch.epoch);
|
|
343
|
+
if (result === 'missing')
|
|
344
|
+
missing.push(epoch.epoch);
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
throwIfAborted(signal);
|
|
348
|
+
if (!(error instanceof ProtocolError) || !['invalid_ciphertext', 'invalid_key', 'invalid_commitment', 'conflicting_epoch_secret'].includes(error.code))
|
|
349
|
+
throw error;
|
|
350
|
+
rejected.push({ epoch: epoch.epoch, error });
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return { derived, missing, rejected };
|
|
354
|
+
}
|
|
355
|
+
async #deriveEpoch(group, epoch, device, signal) {
|
|
356
|
+
const { store, context, accountId } = this.options;
|
|
357
|
+
const first = (await store.read([groupEpochKey(group, epoch)], signal)).sets[0][0]?.value;
|
|
358
|
+
if (!first || typeof first.commitment !== 'string' || typeof first.memberPublicKey !== 'string')
|
|
359
|
+
throw new ProtocolError('invalid_storage', 'Group epoch has no verified secret authority.');
|
|
360
|
+
const commitment = first.commitment;
|
|
361
|
+
contentHashBytes(commitment);
|
|
362
|
+
const publicKey = decodeBase64Url(first.memberPublicKey);
|
|
363
|
+
requireLength(publicKey, 32, 'Verified member public key');
|
|
364
|
+
const queries = [groupKey(group), groupEpochKey(group, epoch), groupMemberSecretKey(group.groupId, publicKey), groupApplicationSecretKey(group.groupId, epoch), clientSecretKey(group.groupId, commitment)];
|
|
365
|
+
const snapshot = await store.read(queries, signal);
|
|
366
|
+
const [association, epochRow, member, application, client] = snapshot.sets.map(rows => rows[0]?.value);
|
|
367
|
+
if (association?.relayId !== group.relayId || !association.projection || !epochRow || fingerprint(epochRow) !== fingerprint(first))
|
|
368
|
+
throw new StateConflictError('Group key authority changed during recovery.');
|
|
369
|
+
if (decodeGroupProjection(requireObject(association.projection), group).epoch < epoch)
|
|
370
|
+
throw new ProtocolError('invalid_storage', 'Group epoch has not been reached by verified history.');
|
|
371
|
+
const certificate = deviceCertificateCodec.decode(deviceCertificateCodec.encode(device.certificate));
|
|
372
|
+
validateCertificate(certificate, context);
|
|
373
|
+
const deviceId = certificateId(certificate, context);
|
|
374
|
+
if (certificate.account !== accountId || deviceId !== this.options.deviceId())
|
|
375
|
+
throw new GroupKeyAccessError('Group key receiver belongs to another local account or device.');
|
|
376
|
+
if (epochRow.materialVerified === true && application && client)
|
|
377
|
+
return 'ready';
|
|
378
|
+
if (!member)
|
|
379
|
+
return 'missing';
|
|
380
|
+
const entry = groupKeyEntryCodec.decode(epochRow.keyEntry);
|
|
381
|
+
validateGroupKeyEntry(entry);
|
|
382
|
+
if (entry.epoch !== epoch || !entry.clientSecretBox || member.publicKey !== encodeBase64Url(publicKey))
|
|
383
|
+
throw new ProtocolError('invalid_storage', 'Stored group key entry or member key has inconsistent metadata.');
|
|
384
|
+
const memberPurpose = this.#purpose(group.groupId, 'member', encodeBase64Url(publicKey));
|
|
385
|
+
const clientPurpose = this.#purpose(group.groupId, 'client', commitment);
|
|
386
|
+
const epochPurpose = this.#purpose(group.groupId, 'epoch', String(epoch));
|
|
387
|
+
const privateKey = await this.#unprotect(member, 'protectedKey', memberPurpose, signal);
|
|
388
|
+
let shared;
|
|
389
|
+
let clientSecret;
|
|
390
|
+
let relaySecret;
|
|
391
|
+
let secret;
|
|
392
|
+
let oldApplication;
|
|
393
|
+
let oldClient;
|
|
394
|
+
try {
|
|
395
|
+
if (!equalBytes(encryptionPublicKey(privateKey), publicKey))
|
|
396
|
+
throw new GroupKeyAccessError('Restored member key differs from its verified public key.');
|
|
397
|
+
shared = agreeKey(privateKey, entry.clientSecretBox.enc);
|
|
398
|
+
clientSecret = openGroupSecret(entry.clientSecretBox, shared, groupClientSecretBoxAad({ groupId: group.groupId, account: accountId, memberEncryptionPublicKey: publicKey, clientSecretCommitment: commitment }, context));
|
|
399
|
+
if (groupClientSecretCommitment(group.groupId, clientSecret, context) !== commitment)
|
|
400
|
+
throw new ProtocolError('invalid_commitment', 'Unwrapped client secret differs from the verified commitment.');
|
|
401
|
+
shared.fill(0);
|
|
402
|
+
shared = undefined;
|
|
403
|
+
const probe = agreeKey(new Uint8Array(32).fill(1), entry.relaySecretBox.enc);
|
|
404
|
+
probe.fill(0);
|
|
405
|
+
try {
|
|
406
|
+
shared = await device.deriveSharedSecret(entry.relaySecretBox.enc.slice(), signal);
|
|
407
|
+
throwIfAborted(signal);
|
|
408
|
+
requireLength(shared, 32, 'Device shared secret');
|
|
409
|
+
if (shared.every(byte => byte === 0) || certificateId(device.certificate, context) !== deviceId)
|
|
410
|
+
throw new Error('Device key agreement returned invalid identity or key material.');
|
|
411
|
+
}
|
|
412
|
+
catch (cause) {
|
|
413
|
+
throwIfAborted(signal);
|
|
414
|
+
throw new GroupKeyAccessError('Local device could not open the group relay-secret box.', { cause });
|
|
415
|
+
}
|
|
416
|
+
relaySecret = openGroupSecret(entry.relaySecretBox, shared, groupRelaySecretBoxAad({ groupId: group.groupId, account: accountId, deviceId, epoch }, context));
|
|
417
|
+
secret = deriveGroupApplicationSecret(group.groupId, epoch, commitment, clientSecret, relaySecret, context);
|
|
418
|
+
if (application) {
|
|
419
|
+
oldApplication = await this.#unprotect(application, 'protectedSecret', epochPurpose, signal);
|
|
420
|
+
if (!equalBytes(oldApplication, secret))
|
|
421
|
+
throw new ProtocolError('conflicting_epoch_secret', 'Derived group secret conflicts with a previously synchronized epoch secret.');
|
|
422
|
+
}
|
|
423
|
+
if (client) {
|
|
424
|
+
oldClient = await this.#unprotect(client, 'protectedSecret', clientPurpose, signal);
|
|
425
|
+
if (!equalBytes(oldClient, clientSecret))
|
|
426
|
+
throw new GroupKeyAccessError('Stored client secret conflicts with its verified commitment.');
|
|
427
|
+
}
|
|
428
|
+
const protectedSecret = application?.protectedSecret ?? await this.#protect(secret, epochPurpose, signal);
|
|
429
|
+
const protectedClient = client?.protectedSecret ?? await this.#protect(clientSecret, clientPurpose, signal);
|
|
430
|
+
await updateStore(store, queries, current => {
|
|
431
|
+
if (this.options.deviceId() !== deviceId)
|
|
432
|
+
throw new GroupKeyAccessError('Local device changed before epoch secret persistence.');
|
|
433
|
+
if (current.sets.some((rows, i) => fingerprint(rows[0]?.value) !== fingerprint(snapshot.sets[i][0]?.value)))
|
|
434
|
+
throw new StateConflictError('Group key material changed while recovery was being prepared.');
|
|
435
|
+
return { mutations: [put(queries[1], { ...epochRow, materialVerified: true }), put(queries[3], { ...application, epoch, protectedSecret, source: 'derived' }),
|
|
436
|
+
put(queries[4], { commitment, protectedSecret: protectedClient })], result: undefined };
|
|
437
|
+
}, signal);
|
|
438
|
+
return 'derived';
|
|
439
|
+
}
|
|
440
|
+
finally {
|
|
441
|
+
privateKey.fill(0);
|
|
442
|
+
if (shared instanceof Uint8Array)
|
|
443
|
+
shared.fill(0);
|
|
444
|
+
clientSecret?.fill(0);
|
|
445
|
+
relaySecret?.fill(0);
|
|
446
|
+
secret?.fill(0);
|
|
447
|
+
oldApplication?.fill(0);
|
|
448
|
+
oldClient?.fill(0);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/groups/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ProtocolError } from '../errors.js';
|
|
2
|
+
import { type GroupEvent, type GroupMember, type GroupState } from '../models/group-management.js';
|
|
3
|
+
import { type GroupMessageEnvelope, type GroupRef } from '../models/groups.js';
|
|
4
|
+
import { type DeviceCertificate } from '../models/identity.js';
|
|
5
|
+
import type { NetworkContext } from '../protocol/context.js';
|
|
6
|
+
export interface GroupProjectedMember extends GroupMember {
|
|
7
|
+
readonly joinedAtSequence: number;
|
|
8
|
+
readonly nickname?: string;
|
|
9
|
+
readonly nicknameSequence?: number;
|
|
10
|
+
}
|
|
11
|
+
export type GroupDeparture = 'left' | 'removed' | 'banned' | 'not_member';
|
|
12
|
+
/** Local verified state. Relay previews must never be deserialized into this type. */
|
|
13
|
+
export interface GroupProjection extends GroupRef {
|
|
14
|
+
readonly sequence: number;
|
|
15
|
+
readonly epoch: number;
|
|
16
|
+
readonly managementHash: string;
|
|
17
|
+
readonly clientSecretCommitment: string;
|
|
18
|
+
readonly state: GroupState;
|
|
19
|
+
readonly members: readonly GroupProjectedMember[];
|
|
20
|
+
readonly bans: readonly string[];
|
|
21
|
+
readonly departures: Readonly<Record<string, GroupDeparture>>;
|
|
22
|
+
}
|
|
23
|
+
export interface VerifiedGroupMessage {
|
|
24
|
+
readonly envelope: GroupMessageEnvelope;
|
|
25
|
+
readonly sender: DeviceCertificate;
|
|
26
|
+
readonly signerDeviceId: string;
|
|
27
|
+
readonly joinedAtSequence: number;
|
|
28
|
+
}
|
|
29
|
+
export type GroupChangeKind = 'properties' | 'members' | 'roles' | 'bans' | 'nickname' | 'status';
|
|
30
|
+
export declare const groupChangeKinds: readonly GroupChangeKind[];
|
|
31
|
+
export interface GroupEventResult {
|
|
32
|
+
readonly projection: GroupProjection;
|
|
33
|
+
readonly message?: VerifiedGroupMessage;
|
|
34
|
+
readonly rejection?: ProtocolError;
|
|
35
|
+
readonly changeKinds?: readonly GroupChangeKind[];
|
|
36
|
+
}
|
|
37
|
+
/** Applies one timeline event without mutating the preceding projection. Invalid administration stops the chain; invalid ordinary messages retain an explicit rejection. */
|
|
38
|
+
export declare function applyGroupEvent(previous: GroupProjection | undefined, source: GroupEvent, certificate: DeviceCertificate | undefined, group: GroupRef, context: NetworkContext): GroupEventResult;
|
|
39
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/groups/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EACH,KAAK,UAAU,EAA+B,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3H,OAAO,EAAgG,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7K,OAAO,EAAsC,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACnG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IAAG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE;AAC/J,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAC1E,sFAAsF;AACtF,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IAC5H,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;CAClL;AACD,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE;AACzL,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;AAClG,eAAO,MAAM,gBAAgB,EAAE,SAAS,eAAe,EAAqE,CAAC;AAK7H,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE;AAE1M,4KAA4K;AAC5K,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,GAAG,gBAAgB,CA6GjM"}
|