@peerbit/trusted-network 6.0.101 → 6.0.103

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.
@@ -0,0 +1,87 @@
1
+ import { PublicSignKey } from "@peerbit/crypto";
2
+ import { Program, type ProgramClient, type ProgramInitializationOptions } from "@peerbit/program";
3
+ /**
4
+ * Decode-only TrustedNetwork v2 codec scaffold.
5
+ *
6
+ * This module is intentionally absent from the package entry point. It pins
7
+ * the policy wire contract needed by the next slice without exposing a usable
8
+ * controller, policy engine, resource fence, or encryption path.
9
+ */
10
+ export declare const TRUSTED_NETWORK_V2_PROTOCOL_VERSION = 2;
11
+ export declare const TRUSTED_NETWORK_V2_POLICY_HASH_SHA256 = 1;
12
+ /**
13
+ * Profile 1 accepts only an EntryV0 whose normal toSignable() bytes (including
14
+ * causal metadata) have exactly one successfully verified signature. The
15
+ * signer's canonical public-key bytes must equal the descriptor authority.
16
+ */
17
+ export declare const TRUSTED_NETWORK_V2_ENTRY_V0_AUTHORITY_ONLY_SIGNATURE_PROFILE = 1;
18
+ export declare const TRUSTED_NETWORK_V2_NETWORK_ID_DOMAIN = "peerbit/trusted-network/v2/network-id/v1";
19
+ export declare const TRUSTED_NETWORK_V2_POLICY_DIGEST_DOMAIN = "peerbit/trusted-network/v2/policy-body/v1";
20
+ export declare const TrustedNetworkRole: Readonly<{
21
+ readonly ADMIN: 1;
22
+ readonly WRITER: 2;
23
+ readonly READER: 4;
24
+ readonly REPLICATOR: 8;
25
+ }>;
26
+ export declare const TRUSTED_NETWORK_V2_KNOWN_ROLE_BITS: number;
27
+ export declare class NetworkDescriptorV2 {
28
+ protocolVersion: number;
29
+ networkNonce: Uint8Array;
30
+ policyAuthority: PublicSignKey;
31
+ genesisPolicyDigest: Uint8Array;
32
+ policyHashProfile: number;
33
+ entrySignatureProfile: number;
34
+ constructor(properties?: {
35
+ protocolVersion: number;
36
+ networkNonce: Uint8Array;
37
+ policyAuthority: PublicSignKey;
38
+ genesisPolicyDigest: Uint8Array;
39
+ policyHashProfile: number;
40
+ entrySignatureProfile: number;
41
+ });
42
+ }
43
+ export declare class EncryptionKeyCommitmentV2 {
44
+ profile: number;
45
+ digest: Uint8Array;
46
+ constructor(properties?: {
47
+ profile: number;
48
+ digest: Uint8Array;
49
+ });
50
+ }
51
+ export declare class PolicySubjectBindingV2 {
52
+ signingKey: PublicSignKey;
53
+ roles: number;
54
+ encryptionKeyCommitment?: EncryptionKeyCommitmentV2;
55
+ constructor(properties?: {
56
+ signingKey: PublicSignKey;
57
+ roles: number;
58
+ encryptionKeyCommitment?: EncryptionKeyCommitmentV2;
59
+ });
60
+ }
61
+ export declare class PolicySnapshotBodyV2 {
62
+ networkId: Uint8Array;
63
+ sequence: bigint;
64
+ previousPolicyDigest: Uint8Array;
65
+ bindings: PolicySubjectBindingV2[];
66
+ constructor(properties?: {
67
+ networkId: Uint8Array;
68
+ sequence: bigint;
69
+ previousPolicyDigest: Uint8Array;
70
+ bindings: PolicySubjectBindingV2[];
71
+ });
72
+ }
73
+ export declare class TrustedNetworkV2 extends Program<never> {
74
+ descriptor: NetworkDescriptorV2;
75
+ constructor(properties?: {
76
+ descriptor: NetworkDescriptorV2;
77
+ });
78
+ beforeOpen(_node: ProgramClient, _options?: ProgramInitializationOptions<never, this>): Promise<never>;
79
+ open(_args?: never): Promise<never>;
80
+ }
81
+ export declare const assertNetworkDescriptorV2: (descriptor: NetworkDescriptorV2) => void;
82
+ export declare const deriveNetworkIdV2: (descriptor: NetworkDescriptorV2) => Uint8Array;
83
+ export declare const digestPolicySnapshotBodyV2: (body: PolicySnapshotBodyV2) => Uint8Array;
84
+ export declare const assertPolicySnapshotBodyV2: (body: PolicySnapshotBodyV2, descriptor: NetworkDescriptorV2) => void;
85
+ export declare const decodeTrustedNetworkV2: (bytes: Uint8Array) => TrustedNetworkV2;
86
+ export declare const decodePolicySnapshotBodyV2: (bytes: Uint8Array, descriptor: NetworkDescriptorV2) => PolicySnapshotBodyV2;
87
+ //# sourceMappingURL=v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2.d.ts","sourceRoot":"","sources":["../../src/v2.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACN,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,4BAA4B,EACjC,MAAM,kBAAkB,CAAC;AAG1B;;;;;;GAMG;AAEH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AACrD,eAAO,MAAM,qCAAqC,IAAI,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,4DAA4D,IAAI,CAAC;AAE9E,eAAO,MAAM,oCAAoC,6CACN,CAAC;AAC5C,eAAO,MAAM,uCAAuC,8CACR,CAAC;AAE7C,eAAO,MAAM,kBAAkB;;;;;EAKpB,CAAC;AAEZ,eAAO,MAAM,kCAAkC,QAIjB,CAAC;AA+C/B,qBACa,mBAAmB;IAE/B,eAAe,EAAE,MAAM,CAAC;IAGxB,YAAY,EAAE,UAAU,CAAC;IAGzB,eAAe,EAAE,aAAa,CAAC;IAG/B,mBAAmB,EAAE,UAAU,CAAC;IAGhC,iBAAiB,EAAE,MAAM,CAAC;IAG1B,qBAAqB,EAAE,MAAM,CAAC;gBAElB,UAAU,CAAC,EAAE;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,UAAU,CAAC;QACzB,eAAe,EAAE,aAAa,CAAC;QAC/B,mBAAmB,EAAE,UAAU,CAAC;QAChC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,qBAAqB,EAAE,MAAM,CAAC;KAC9B;CAGD;AAED,qBAAa,yBAAyB;IAErC,OAAO,EAAE,MAAM,CAAC;IAGhB,MAAM,EAAE,UAAU,CAAC;gBAEP,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE;CAGhE;AAED,qBAAa,sBAAsB;IAElC,UAAU,EAAE,aAAa,CAAC;IAG1B,KAAK,EAAE,MAAM,CAAC;IAGd,uBAAuB,CAAC,EAAE,yBAAyB,CAAC;gBAExC,UAAU,CAAC,EAAE;QACxB,UAAU,EAAE,aAAa,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,uBAAuB,CAAC,EAAE,yBAAyB,CAAC;KACpD;CAGD;AAED,qBACa,oBAAoB;IAEhC,SAAS,EAAE,UAAU,CAAC;IAGtB,QAAQ,EAAE,MAAM,CAAC;IAGjB,oBAAoB,EAAE,UAAU,CAAC;IAGjC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;gBAEvB,UAAU,CAAC,EAAE;QACxB,SAAS,EAAE,UAAU,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,oBAAoB,EAAE,UAAU,CAAC;QACjC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;KACnC;CAGD;AAED,qBACa,gBAAiB,SAAQ,OAAO,CAAC,KAAK,CAAC;IAEnD,UAAU,EAAE,mBAAmB,CAAC;gBAEpB,UAAU,CAAC,EAAE;QAAE,UAAU,EAAE,mBAAmB,CAAA;KAAE;IAK7C,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,4BAA4B,CAAC,KAAK,EAAE,IAAI,CAAC,GAClD,OAAO,CAAC,KAAK,CAAC;IAMX,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;CAKzC;AAED,eAAO,MAAM,yBAAyB,GACrC,YAAY,mBAAmB,KAC7B,IAqBF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC7B,YAAY,mBAAmB,KAC7B,UAUF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACtC,MAAM,oBAAoB,KACxB,UAQF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACtC,MAAM,oBAAoB,EAC1B,YAAY,mBAAmB,KAC7B,IAiEF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO,UAAU,KAAG,gBAK1D,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACtC,OAAO,UAAU,EACjB,YAAY,mBAAmB,KAC7B,oBAKF,CAAC"}
package/dist/src/v2.js ADDED
@@ -0,0 +1,409 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { deserialize, field, fixedArray, option, serialize, variant, vec, } from "@dao-xyz/borsh";
36
+ import { PublicSignKey, sha256Sync } from "@peerbit/crypto";
37
+ import { Program, } from "@peerbit/program";
38
+ import { compare, concat, equals } from "uint8arrays";
39
+ /**
40
+ * Decode-only TrustedNetwork v2 codec scaffold.
41
+ *
42
+ * This module is intentionally absent from the package entry point. It pins
43
+ * the policy wire contract needed by the next slice without exposing a usable
44
+ * controller, policy engine, resource fence, or encryption path.
45
+ */
46
+ export const TRUSTED_NETWORK_V2_PROTOCOL_VERSION = 2;
47
+ export const TRUSTED_NETWORK_V2_POLICY_HASH_SHA256 = 1;
48
+ /**
49
+ * Profile 1 accepts only an EntryV0 whose normal toSignable() bytes (including
50
+ * causal metadata) have exactly one successfully verified signature. The
51
+ * signer's canonical public-key bytes must equal the descriptor authority.
52
+ */
53
+ export const TRUSTED_NETWORK_V2_ENTRY_V0_AUTHORITY_ONLY_SIGNATURE_PROFILE = 1;
54
+ export const TRUSTED_NETWORK_V2_NETWORK_ID_DOMAIN = "peerbit/trusted-network/v2/network-id/v1";
55
+ export const TRUSTED_NETWORK_V2_POLICY_DIGEST_DOMAIN = "peerbit/trusted-network/v2/policy-body/v1";
56
+ export const TrustedNetworkRole = Object.freeze({
57
+ ADMIN: 0x01,
58
+ WRITER: 0x02,
59
+ READER: 0x04,
60
+ REPLICATOR: 0x08,
61
+ });
62
+ export const TRUSTED_NETWORK_V2_KNOWN_ROLE_BITS = TrustedNetworkRole.ADMIN |
63
+ TrustedNetworkRole.WRITER |
64
+ TrustedNetworkRole.READER |
65
+ TrustedNetworkRole.REPLICATOR;
66
+ const ZERO_DIGEST = new Uint8Array(32);
67
+ const textEncoder = new TextEncoder();
68
+ const assertByte = (value, label) => {
69
+ if (!Number.isInteger(value) || value < 0 || value > 0xff) {
70
+ throw new Error(`${label} must be a u8`);
71
+ }
72
+ };
73
+ const assertU16 = (value, label) => {
74
+ if (!Number.isInteger(value) || value < 0 || value > 0xffff) {
75
+ throw new Error(`${label} must be a u16`);
76
+ }
77
+ };
78
+ const assertU64 = (value, label) => {
79
+ if (typeof value !== "bigint" || value < 0n || value > 0xffffffffffffffffn) {
80
+ throw new Error(`${label} must be a u64`);
81
+ }
82
+ };
83
+ const assertBytes32 = (value, label) => {
84
+ if (!(value instanceof Uint8Array) || value.byteLength !== 32) {
85
+ throw new Error(`${label} must contain exactly 32 bytes`);
86
+ }
87
+ };
88
+ const lengthPrefix = (value) => {
89
+ const length = new Uint8Array(4);
90
+ new DataView(length.buffer).setUint32(0, value.byteLength, true);
91
+ return concat([length, value]);
92
+ };
93
+ const encodeU16 = (value) => {
94
+ const bytes = new Uint8Array(2);
95
+ new DataView(bytes.buffer).setUint16(0, value, true);
96
+ return bytes;
97
+ };
98
+ const assertCanonicalEncoding = (bytes, value) => {
99
+ if (!equals(bytes, serialize(value))) {
100
+ throw new Error("TrustedNetwork v2 encoding is not canonical");
101
+ }
102
+ };
103
+ let NetworkDescriptorV2 = (() => {
104
+ let _classDecorators = [variant([2, 0])];
105
+ let _classDescriptor;
106
+ let _classExtraInitializers = [];
107
+ let _classThis;
108
+ let _protocolVersion_decorators;
109
+ let _protocolVersion_initializers = [];
110
+ let _protocolVersion_extraInitializers = [];
111
+ let _networkNonce_decorators;
112
+ let _networkNonce_initializers = [];
113
+ let _networkNonce_extraInitializers = [];
114
+ let _policyAuthority_decorators;
115
+ let _policyAuthority_initializers = [];
116
+ let _policyAuthority_extraInitializers = [];
117
+ let _genesisPolicyDigest_decorators;
118
+ let _genesisPolicyDigest_initializers = [];
119
+ let _genesisPolicyDigest_extraInitializers = [];
120
+ let _policyHashProfile_decorators;
121
+ let _policyHashProfile_initializers = [];
122
+ let _policyHashProfile_extraInitializers = [];
123
+ let _entrySignatureProfile_decorators;
124
+ let _entrySignatureProfile_initializers = [];
125
+ let _entrySignatureProfile_extraInitializers = [];
126
+ var NetworkDescriptorV2 = class {
127
+ static { _classThis = this; }
128
+ static {
129
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
130
+ _protocolVersion_decorators = [field({ type: "u16" })];
131
+ _networkNonce_decorators = [field({ type: fixedArray("u8", 32) })];
132
+ _policyAuthority_decorators = [field({ type: PublicSignKey })];
133
+ _genesisPolicyDigest_decorators = [field({ type: fixedArray("u8", 32) })];
134
+ _policyHashProfile_decorators = [field({ type: "u8" })];
135
+ _entrySignatureProfile_decorators = [field({ type: "u8" })];
136
+ __esDecorate(null, null, _protocolVersion_decorators, { kind: "field", name: "protocolVersion", static: false, private: false, access: { has: obj => "protocolVersion" in obj, get: obj => obj.protocolVersion, set: (obj, value) => { obj.protocolVersion = value; } }, metadata: _metadata }, _protocolVersion_initializers, _protocolVersion_extraInitializers);
137
+ __esDecorate(null, null, _networkNonce_decorators, { kind: "field", name: "networkNonce", static: false, private: false, access: { has: obj => "networkNonce" in obj, get: obj => obj.networkNonce, set: (obj, value) => { obj.networkNonce = value; } }, metadata: _metadata }, _networkNonce_initializers, _networkNonce_extraInitializers);
138
+ __esDecorate(null, null, _policyAuthority_decorators, { kind: "field", name: "policyAuthority", static: false, private: false, access: { has: obj => "policyAuthority" in obj, get: obj => obj.policyAuthority, set: (obj, value) => { obj.policyAuthority = value; } }, metadata: _metadata }, _policyAuthority_initializers, _policyAuthority_extraInitializers);
139
+ __esDecorate(null, null, _genesisPolicyDigest_decorators, { kind: "field", name: "genesisPolicyDigest", static: false, private: false, access: { has: obj => "genesisPolicyDigest" in obj, get: obj => obj.genesisPolicyDigest, set: (obj, value) => { obj.genesisPolicyDigest = value; } }, metadata: _metadata }, _genesisPolicyDigest_initializers, _genesisPolicyDigest_extraInitializers);
140
+ __esDecorate(null, null, _policyHashProfile_decorators, { kind: "field", name: "policyHashProfile", static: false, private: false, access: { has: obj => "policyHashProfile" in obj, get: obj => obj.policyHashProfile, set: (obj, value) => { obj.policyHashProfile = value; } }, metadata: _metadata }, _policyHashProfile_initializers, _policyHashProfile_extraInitializers);
141
+ __esDecorate(null, null, _entrySignatureProfile_decorators, { kind: "field", name: "entrySignatureProfile", static: false, private: false, access: { has: obj => "entrySignatureProfile" in obj, get: obj => obj.entrySignatureProfile, set: (obj, value) => { obj.entrySignatureProfile = value; } }, metadata: _metadata }, _entrySignatureProfile_initializers, _entrySignatureProfile_extraInitializers);
142
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
143
+ NetworkDescriptorV2 = _classThis = _classDescriptor.value;
144
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
145
+ __runInitializers(_classThis, _classExtraInitializers);
146
+ }
147
+ protocolVersion = __runInitializers(this, _protocolVersion_initializers, void 0);
148
+ networkNonce = (__runInitializers(this, _protocolVersion_extraInitializers), __runInitializers(this, _networkNonce_initializers, void 0));
149
+ policyAuthority = (__runInitializers(this, _networkNonce_extraInitializers), __runInitializers(this, _policyAuthority_initializers, void 0));
150
+ genesisPolicyDigest = (__runInitializers(this, _policyAuthority_extraInitializers), __runInitializers(this, _genesisPolicyDigest_initializers, void 0));
151
+ policyHashProfile = (__runInitializers(this, _genesisPolicyDigest_extraInitializers), __runInitializers(this, _policyHashProfile_initializers, void 0));
152
+ entrySignatureProfile = (__runInitializers(this, _policyHashProfile_extraInitializers), __runInitializers(this, _entrySignatureProfile_initializers, void 0));
153
+ constructor(properties) {
154
+ __runInitializers(this, _entrySignatureProfile_extraInitializers);
155
+ if (properties)
156
+ Object.assign(this, properties);
157
+ }
158
+ };
159
+ return NetworkDescriptorV2 = _classThis;
160
+ })();
161
+ export { NetworkDescriptorV2 };
162
+ let EncryptionKeyCommitmentV2 = (() => {
163
+ let _profile_decorators;
164
+ let _profile_initializers = [];
165
+ let _profile_extraInitializers = [];
166
+ let _digest_decorators;
167
+ let _digest_initializers = [];
168
+ let _digest_extraInitializers = [];
169
+ return class EncryptionKeyCommitmentV2 {
170
+ static {
171
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
172
+ _profile_decorators = [field({ type: "u8" })];
173
+ _digest_decorators = [field({ type: fixedArray("u8", 32) })];
174
+ __esDecorate(null, null, _profile_decorators, { kind: "field", name: "profile", static: false, private: false, access: { has: obj => "profile" in obj, get: obj => obj.profile, set: (obj, value) => { obj.profile = value; } }, metadata: _metadata }, _profile_initializers, _profile_extraInitializers);
175
+ __esDecorate(null, null, _digest_decorators, { kind: "field", name: "digest", static: false, private: false, access: { has: obj => "digest" in obj, get: obj => obj.digest, set: (obj, value) => { obj.digest = value; } }, metadata: _metadata }, _digest_initializers, _digest_extraInitializers);
176
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
177
+ }
178
+ profile = __runInitializers(this, _profile_initializers, void 0);
179
+ digest = (__runInitializers(this, _profile_extraInitializers), __runInitializers(this, _digest_initializers, void 0));
180
+ constructor(properties) {
181
+ __runInitializers(this, _digest_extraInitializers);
182
+ if (properties)
183
+ Object.assign(this, properties);
184
+ }
185
+ };
186
+ })();
187
+ export { EncryptionKeyCommitmentV2 };
188
+ let PolicySubjectBindingV2 = (() => {
189
+ let _signingKey_decorators;
190
+ let _signingKey_initializers = [];
191
+ let _signingKey_extraInitializers = [];
192
+ let _roles_decorators;
193
+ let _roles_initializers = [];
194
+ let _roles_extraInitializers = [];
195
+ let _encryptionKeyCommitment_decorators;
196
+ let _encryptionKeyCommitment_initializers = [];
197
+ let _encryptionKeyCommitment_extraInitializers = [];
198
+ return class PolicySubjectBindingV2 {
199
+ static {
200
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
201
+ _signingKey_decorators = [field({ type: PublicSignKey })];
202
+ _roles_decorators = [field({ type: "u8" })];
203
+ _encryptionKeyCommitment_decorators = [field({ type: option(EncryptionKeyCommitmentV2) })];
204
+ __esDecorate(null, null, _signingKey_decorators, { kind: "field", name: "signingKey", static: false, private: false, access: { has: obj => "signingKey" in obj, get: obj => obj.signingKey, set: (obj, value) => { obj.signingKey = value; } }, metadata: _metadata }, _signingKey_initializers, _signingKey_extraInitializers);
205
+ __esDecorate(null, null, _roles_decorators, { kind: "field", name: "roles", static: false, private: false, access: { has: obj => "roles" in obj, get: obj => obj.roles, set: (obj, value) => { obj.roles = value; } }, metadata: _metadata }, _roles_initializers, _roles_extraInitializers);
206
+ __esDecorate(null, null, _encryptionKeyCommitment_decorators, { kind: "field", name: "encryptionKeyCommitment", static: false, private: false, access: { has: obj => "encryptionKeyCommitment" in obj, get: obj => obj.encryptionKeyCommitment, set: (obj, value) => { obj.encryptionKeyCommitment = value; } }, metadata: _metadata }, _encryptionKeyCommitment_initializers, _encryptionKeyCommitment_extraInitializers);
207
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
208
+ }
209
+ signingKey = __runInitializers(this, _signingKey_initializers, void 0);
210
+ roles = (__runInitializers(this, _signingKey_extraInitializers), __runInitializers(this, _roles_initializers, void 0));
211
+ encryptionKeyCommitment = (__runInitializers(this, _roles_extraInitializers), __runInitializers(this, _encryptionKeyCommitment_initializers, void 0));
212
+ constructor(properties) {
213
+ __runInitializers(this, _encryptionKeyCommitment_extraInitializers);
214
+ if (properties)
215
+ Object.assign(this, properties);
216
+ }
217
+ };
218
+ })();
219
+ export { PolicySubjectBindingV2 };
220
+ let PolicySnapshotBodyV2 = (() => {
221
+ let _classDecorators = [variant([2, 1])];
222
+ let _classDescriptor;
223
+ let _classExtraInitializers = [];
224
+ let _classThis;
225
+ let _networkId_decorators;
226
+ let _networkId_initializers = [];
227
+ let _networkId_extraInitializers = [];
228
+ let _sequence_decorators;
229
+ let _sequence_initializers = [];
230
+ let _sequence_extraInitializers = [];
231
+ let _previousPolicyDigest_decorators;
232
+ let _previousPolicyDigest_initializers = [];
233
+ let _previousPolicyDigest_extraInitializers = [];
234
+ let _bindings_decorators;
235
+ let _bindings_initializers = [];
236
+ let _bindings_extraInitializers = [];
237
+ var PolicySnapshotBodyV2 = class {
238
+ static { _classThis = this; }
239
+ static {
240
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
241
+ _networkId_decorators = [field({ type: fixedArray("u8", 32) })];
242
+ _sequence_decorators = [field({ type: "u64" })];
243
+ _previousPolicyDigest_decorators = [field({ type: fixedArray("u8", 32) })];
244
+ _bindings_decorators = [field({ type: vec(PolicySubjectBindingV2) })];
245
+ __esDecorate(null, null, _networkId_decorators, { kind: "field", name: "networkId", static: false, private: false, access: { has: obj => "networkId" in obj, get: obj => obj.networkId, set: (obj, value) => { obj.networkId = value; } }, metadata: _metadata }, _networkId_initializers, _networkId_extraInitializers);
246
+ __esDecorate(null, null, _sequence_decorators, { kind: "field", name: "sequence", static: false, private: false, access: { has: obj => "sequence" in obj, get: obj => obj.sequence, set: (obj, value) => { obj.sequence = value; } }, metadata: _metadata }, _sequence_initializers, _sequence_extraInitializers);
247
+ __esDecorate(null, null, _previousPolicyDigest_decorators, { kind: "field", name: "previousPolicyDigest", static: false, private: false, access: { has: obj => "previousPolicyDigest" in obj, get: obj => obj.previousPolicyDigest, set: (obj, value) => { obj.previousPolicyDigest = value; } }, metadata: _metadata }, _previousPolicyDigest_initializers, _previousPolicyDigest_extraInitializers);
248
+ __esDecorate(null, null, _bindings_decorators, { kind: "field", name: "bindings", static: false, private: false, access: { has: obj => "bindings" in obj, get: obj => obj.bindings, set: (obj, value) => { obj.bindings = value; } }, metadata: _metadata }, _bindings_initializers, _bindings_extraInitializers);
249
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
250
+ PolicySnapshotBodyV2 = _classThis = _classDescriptor.value;
251
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
252
+ __runInitializers(_classThis, _classExtraInitializers);
253
+ }
254
+ networkId = __runInitializers(this, _networkId_initializers, void 0);
255
+ sequence = (__runInitializers(this, _networkId_extraInitializers), __runInitializers(this, _sequence_initializers, void 0));
256
+ previousPolicyDigest = (__runInitializers(this, _sequence_extraInitializers), __runInitializers(this, _previousPolicyDigest_initializers, void 0));
257
+ bindings = (__runInitializers(this, _previousPolicyDigest_extraInitializers), __runInitializers(this, _bindings_initializers, void 0));
258
+ constructor(properties) {
259
+ __runInitializers(this, _bindings_extraInitializers);
260
+ if (properties)
261
+ Object.assign(this, properties);
262
+ }
263
+ };
264
+ return PolicySnapshotBodyV2 = _classThis;
265
+ })();
266
+ export { PolicySnapshotBodyV2 };
267
+ let TrustedNetworkV2 = (() => {
268
+ let _classDecorators = [variant("trusted_network_v2")];
269
+ let _classDescriptor;
270
+ let _classExtraInitializers = [];
271
+ let _classThis;
272
+ let _classSuper = Program;
273
+ let _descriptor_decorators;
274
+ let _descriptor_initializers = [];
275
+ let _descriptor_extraInitializers = [];
276
+ var TrustedNetworkV2 = class extends _classSuper {
277
+ static { _classThis = this; }
278
+ static {
279
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
280
+ _descriptor_decorators = [field({ type: NetworkDescriptorV2 })];
281
+ __esDecorate(null, null, _descriptor_decorators, { kind: "field", name: "descriptor", static: false, private: false, access: { has: obj => "descriptor" in obj, get: obj => obj.descriptor, set: (obj, value) => { obj.descriptor = value; } }, metadata: _metadata }, _descriptor_initializers, _descriptor_extraInitializers);
282
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
283
+ TrustedNetworkV2 = _classThis = _classDescriptor.value;
284
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
285
+ __runInitializers(_classThis, _classExtraInitializers);
286
+ }
287
+ descriptor = __runInitializers(this, _descriptor_initializers, void 0);
288
+ constructor(properties) {
289
+ super();
290
+ __runInitializers(this, _descriptor_extraInitializers);
291
+ if (properties)
292
+ this.descriptor = properties.descriptor;
293
+ }
294
+ async beforeOpen(_node, _options) {
295
+ throw new Error("TrustedNetwork v2 is a decode-only codec and cannot be activated");
296
+ }
297
+ async open(_args) {
298
+ throw new Error("TrustedNetwork v2 is a decode-only codec and cannot be activated");
299
+ }
300
+ };
301
+ return TrustedNetworkV2 = _classThis;
302
+ })();
303
+ export { TrustedNetworkV2 };
304
+ export const assertNetworkDescriptorV2 = (descriptor) => {
305
+ assertU16(descriptor.protocolVersion, "protocolVersion");
306
+ if (descriptor.protocolVersion !== TRUSTED_NETWORK_V2_PROTOCOL_VERSION) {
307
+ throw new Error("Unsupported TrustedNetwork protocol version");
308
+ }
309
+ assertBytes32(descriptor.networkNonce, "networkNonce");
310
+ if (!(descriptor.policyAuthority instanceof PublicSignKey)) {
311
+ throw new Error("policyAuthority must be a public signing key");
312
+ }
313
+ assertBytes32(descriptor.genesisPolicyDigest, "genesisPolicyDigest");
314
+ assertByte(descriptor.policyHashProfile, "policyHashProfile");
315
+ if (descriptor.policyHashProfile !== TRUSTED_NETWORK_V2_POLICY_HASH_SHA256) {
316
+ throw new Error("Unsupported TrustedNetwork policy hash profile");
317
+ }
318
+ assertByte(descriptor.entrySignatureProfile, "entrySignatureProfile");
319
+ if (descriptor.entrySignatureProfile !==
320
+ TRUSTED_NETWORK_V2_ENTRY_V0_AUTHORITY_ONLY_SIGNATURE_PROFILE) {
321
+ throw new Error("Unsupported TrustedNetwork entry signature profile");
322
+ }
323
+ };
324
+ export const deriveNetworkIdV2 = (descriptor) => {
325
+ assertNetworkDescriptorV2(descriptor);
326
+ return sha256Sync(concat([
327
+ lengthPrefix(textEncoder.encode(TRUSTED_NETWORK_V2_NETWORK_ID_DOMAIN)),
328
+ encodeU16(descriptor.protocolVersion),
329
+ descriptor.networkNonce,
330
+ lengthPrefix(serialize(descriptor.policyAuthority)),
331
+ ]));
332
+ };
333
+ export const digestPolicySnapshotBodyV2 = (body) => {
334
+ const bytes = serialize(body);
335
+ return sha256Sync(concat([
336
+ lengthPrefix(textEncoder.encode(TRUSTED_NETWORK_V2_POLICY_DIGEST_DOMAIN)),
337
+ lengthPrefix(bytes),
338
+ ]));
339
+ };
340
+ export const assertPolicySnapshotBodyV2 = (body, descriptor) => {
341
+ assertNetworkDescriptorV2(descriptor);
342
+ assertBytes32(body.networkId, "networkId");
343
+ if (!equals(body.networkId, deriveNetworkIdV2(descriptor))) {
344
+ throw new Error("Policy snapshot belongs to another network");
345
+ }
346
+ assertU64(body.sequence, "sequence");
347
+ assertBytes32(body.previousPolicyDigest, "previousPolicyDigest");
348
+ if (body.sequence === 0n) {
349
+ if (!equals(body.previousPolicyDigest, ZERO_DIGEST)) {
350
+ throw new Error("Genesis policy must use the zero previous digest");
351
+ }
352
+ }
353
+ else if (equals(body.previousPolicyDigest, ZERO_DIGEST)) {
354
+ throw new Error("A non-genesis policy must name its previous digest");
355
+ }
356
+ if (!Array.isArray(body.bindings) || body.bindings.length === 0) {
357
+ throw new Error("Policy snapshot must contain bindings");
358
+ }
359
+ let previousKeyBytes;
360
+ let authorityBinding;
361
+ for (const binding of body.bindings) {
362
+ if (!(binding.signingKey instanceof PublicSignKey)) {
363
+ throw new Error("Policy subject must be a public signing key");
364
+ }
365
+ const keyBytes = serialize(binding.signingKey);
366
+ if (previousKeyBytes !== undefined &&
367
+ compare(previousKeyBytes, keyBytes) >= 0) {
368
+ throw new Error("Policy bindings must be sorted and unique");
369
+ }
370
+ previousKeyBytes = keyBytes;
371
+ assertByte(binding.roles, "roles");
372
+ if (binding.roles === 0) {
373
+ throw new Error("Policy bindings with no roles are not canonical");
374
+ }
375
+ if ((binding.roles & ~TRUSTED_NETWORK_V2_KNOWN_ROLE_BITS) !== 0) {
376
+ throw new Error("Policy binding contains unknown role bits");
377
+ }
378
+ if (binding.encryptionKeyCommitment !== undefined) {
379
+ throw new Error("TrustedNetwork v2 encryption commitments are not supported yet");
380
+ }
381
+ if (binding.signingKey.equals(descriptor.policyAuthority)) {
382
+ authorityBinding = binding;
383
+ }
384
+ else if ((binding.roles & TrustedNetworkRole.ADMIN) !== 0) {
385
+ throw new Error("Only the policy authority may hold ADMIN");
386
+ }
387
+ }
388
+ if (authorityBinding === undefined ||
389
+ (authorityBinding.roles & TrustedNetworkRole.ADMIN) === 0) {
390
+ throw new Error("Policy authority must hold ADMIN");
391
+ }
392
+ if (body.sequence === 0n &&
393
+ !equals(digestPolicySnapshotBodyV2(body), descriptor.genesisPolicyDigest)) {
394
+ throw new Error("Genesis policy digest does not match the descriptor");
395
+ }
396
+ };
397
+ export const decodeTrustedNetworkV2 = (bytes) => {
398
+ const network = deserialize(bytes, TrustedNetworkV2);
399
+ assertCanonicalEncoding(bytes, network);
400
+ assertNetworkDescriptorV2(network.descriptor);
401
+ return network;
402
+ };
403
+ export const decodePolicySnapshotBodyV2 = (bytes, descriptor) => {
404
+ const body = deserialize(bytes, PolicySnapshotBodyV2);
405
+ assertCanonicalEncoding(bytes, body);
406
+ assertPolicySnapshotBodyV2(body, descriptor);
407
+ return body;
408
+ };
409
+ //# sourceMappingURL=v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2.js","sourceRoot":"","sources":["../../src/v2.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/trusted-network",
3
- "version": "6.0.101",
3
+ "version": "6.0.103",
4
4
  "description": "Access controller that operates on a DB",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -56,15 +56,15 @@
56
56
  "@libp2p/interface": "^3.2.5",
57
57
  "uint8arrays": "^5.1.0",
58
58
  "@peerbit/crypto": "3.1.6",
59
- "@peerbit/log": "6.2.24",
60
- "@peerbit/document": "15.0.15",
61
- "@peerbit/program": "6.0.55",
62
- "@peerbit/shared-log": "16.0.14"
59
+ "@peerbit/document": "15.0.16",
60
+ "@peerbit/log": "6.2.25",
61
+ "@peerbit/program": "6.0.56",
62
+ "@peerbit/shared-log": "16.0.15"
63
63
  },
64
64
  "devDependencies": {
65
65
  "ethers": "^6.17.0",
66
- "@peerbit/test-utils": "3.1.34",
67
- "@peerbit/time": "3.0.1"
66
+ "@peerbit/time": "3.0.1",
67
+ "@peerbit/test-utils": "3.1.35"
68
68
  },
69
69
  "repository": {
70
70
  "type": "git",
package/src/v2.ts ADDED
@@ -0,0 +1,348 @@
1
+ import {
2
+ deserialize,
3
+ field,
4
+ fixedArray,
5
+ option,
6
+ serialize,
7
+ variant,
8
+ vec,
9
+ } from "@dao-xyz/borsh";
10
+ import { PublicSignKey, sha256Sync } from "@peerbit/crypto";
11
+ import {
12
+ Program,
13
+ type ProgramClient,
14
+ type ProgramInitializationOptions,
15
+ } from "@peerbit/program";
16
+ import { compare, concat, equals } from "uint8arrays";
17
+
18
+ /**
19
+ * Decode-only TrustedNetwork v2 codec scaffold.
20
+ *
21
+ * This module is intentionally absent from the package entry point. It pins
22
+ * the policy wire contract needed by the next slice without exposing a usable
23
+ * controller, policy engine, resource fence, or encryption path.
24
+ */
25
+
26
+ export const TRUSTED_NETWORK_V2_PROTOCOL_VERSION = 2;
27
+ export const TRUSTED_NETWORK_V2_POLICY_HASH_SHA256 = 1;
28
+
29
+ /**
30
+ * Profile 1 accepts only an EntryV0 whose normal toSignable() bytes (including
31
+ * causal metadata) have exactly one successfully verified signature. The
32
+ * signer's canonical public-key bytes must equal the descriptor authority.
33
+ */
34
+ export const TRUSTED_NETWORK_V2_ENTRY_V0_AUTHORITY_ONLY_SIGNATURE_PROFILE = 1;
35
+
36
+ export const TRUSTED_NETWORK_V2_NETWORK_ID_DOMAIN =
37
+ "peerbit/trusted-network/v2/network-id/v1";
38
+ export const TRUSTED_NETWORK_V2_POLICY_DIGEST_DOMAIN =
39
+ "peerbit/trusted-network/v2/policy-body/v1";
40
+
41
+ export const TrustedNetworkRole = Object.freeze({
42
+ ADMIN: 0x01,
43
+ WRITER: 0x02,
44
+ READER: 0x04,
45
+ REPLICATOR: 0x08,
46
+ } as const);
47
+
48
+ export const TRUSTED_NETWORK_V2_KNOWN_ROLE_BITS =
49
+ TrustedNetworkRole.ADMIN |
50
+ TrustedNetworkRole.WRITER |
51
+ TrustedNetworkRole.READER |
52
+ TrustedNetworkRole.REPLICATOR;
53
+
54
+ const ZERO_DIGEST = new Uint8Array(32);
55
+ const textEncoder = new TextEncoder();
56
+
57
+ const assertByte = (value: number, label: string): void => {
58
+ if (!Number.isInteger(value) || value < 0 || value > 0xff) {
59
+ throw new Error(`${label} must be a u8`);
60
+ }
61
+ };
62
+
63
+ const assertU16 = (value: number, label: string): void => {
64
+ if (!Number.isInteger(value) || value < 0 || value > 0xffff) {
65
+ throw new Error(`${label} must be a u16`);
66
+ }
67
+ };
68
+
69
+ const assertU64 = (value: bigint, label: string): void => {
70
+ if (typeof value !== "bigint" || value < 0n || value > 0xffffffffffffffffn) {
71
+ throw new Error(`${label} must be a u64`);
72
+ }
73
+ };
74
+
75
+ const assertBytes32 = (value: Uint8Array, label: string): void => {
76
+ if (!(value instanceof Uint8Array) || value.byteLength !== 32) {
77
+ throw new Error(`${label} must contain exactly 32 bytes`);
78
+ }
79
+ };
80
+
81
+ const lengthPrefix = (value: Uint8Array): Uint8Array => {
82
+ const length = new Uint8Array(4);
83
+ new DataView(length.buffer).setUint32(0, value.byteLength, true);
84
+ return concat([length, value]);
85
+ };
86
+
87
+ const encodeU16 = (value: number): Uint8Array => {
88
+ const bytes = new Uint8Array(2);
89
+ new DataView(bytes.buffer).setUint16(0, value, true);
90
+ return bytes;
91
+ };
92
+
93
+ const assertCanonicalEncoding = (bytes: Uint8Array, value: unknown): void => {
94
+ if (!equals(bytes, serialize(value))) {
95
+ throw new Error("TrustedNetwork v2 encoding is not canonical");
96
+ }
97
+ };
98
+
99
+ @variant([2, 0])
100
+ export class NetworkDescriptorV2 {
101
+ @field({ type: "u16" })
102
+ protocolVersion: number;
103
+
104
+ @field({ type: fixedArray("u8", 32) })
105
+ networkNonce: Uint8Array;
106
+
107
+ @field({ type: PublicSignKey })
108
+ policyAuthority: PublicSignKey;
109
+
110
+ @field({ type: fixedArray("u8", 32) })
111
+ genesisPolicyDigest: Uint8Array;
112
+
113
+ @field({ type: "u8" })
114
+ policyHashProfile: number;
115
+
116
+ @field({ type: "u8" })
117
+ entrySignatureProfile: number;
118
+
119
+ constructor(properties?: {
120
+ protocolVersion: number;
121
+ networkNonce: Uint8Array;
122
+ policyAuthority: PublicSignKey;
123
+ genesisPolicyDigest: Uint8Array;
124
+ policyHashProfile: number;
125
+ entrySignatureProfile: number;
126
+ }) {
127
+ if (properties) Object.assign(this, properties);
128
+ }
129
+ }
130
+
131
+ export class EncryptionKeyCommitmentV2 {
132
+ @field({ type: "u8" })
133
+ profile: number;
134
+
135
+ @field({ type: fixedArray("u8", 32) })
136
+ digest: Uint8Array;
137
+
138
+ constructor(properties?: { profile: number; digest: Uint8Array }) {
139
+ if (properties) Object.assign(this, properties);
140
+ }
141
+ }
142
+
143
+ export class PolicySubjectBindingV2 {
144
+ @field({ type: PublicSignKey })
145
+ signingKey: PublicSignKey;
146
+
147
+ @field({ type: "u8" })
148
+ roles: number;
149
+
150
+ @field({ type: option(EncryptionKeyCommitmentV2) })
151
+ encryptionKeyCommitment?: EncryptionKeyCommitmentV2;
152
+
153
+ constructor(properties?: {
154
+ signingKey: PublicSignKey;
155
+ roles: number;
156
+ encryptionKeyCommitment?: EncryptionKeyCommitmentV2;
157
+ }) {
158
+ if (properties) Object.assign(this, properties);
159
+ }
160
+ }
161
+
162
+ @variant([2, 1])
163
+ export class PolicySnapshotBodyV2 {
164
+ @field({ type: fixedArray("u8", 32) })
165
+ networkId: Uint8Array;
166
+
167
+ @field({ type: "u64" })
168
+ sequence: bigint;
169
+
170
+ @field({ type: fixedArray("u8", 32) })
171
+ previousPolicyDigest: Uint8Array;
172
+
173
+ @field({ type: vec(PolicySubjectBindingV2) })
174
+ bindings: PolicySubjectBindingV2[];
175
+
176
+ constructor(properties?: {
177
+ networkId: Uint8Array;
178
+ sequence: bigint;
179
+ previousPolicyDigest: Uint8Array;
180
+ bindings: PolicySubjectBindingV2[];
181
+ }) {
182
+ if (properties) Object.assign(this, properties);
183
+ }
184
+ }
185
+
186
+ @variant("trusted_network_v2")
187
+ export class TrustedNetworkV2 extends Program<never> {
188
+ @field({ type: NetworkDescriptorV2 })
189
+ descriptor: NetworkDescriptorV2;
190
+
191
+ constructor(properties?: { descriptor: NetworkDescriptorV2 }) {
192
+ super();
193
+ if (properties) this.descriptor = properties.descriptor;
194
+ }
195
+
196
+ override async beforeOpen(
197
+ _node: ProgramClient,
198
+ _options?: ProgramInitializationOptions<never, this>,
199
+ ): Promise<never> {
200
+ throw new Error(
201
+ "TrustedNetwork v2 is a decode-only codec and cannot be activated",
202
+ );
203
+ }
204
+
205
+ async open(_args?: never): Promise<never> {
206
+ throw new Error(
207
+ "TrustedNetwork v2 is a decode-only codec and cannot be activated",
208
+ );
209
+ }
210
+ }
211
+
212
+ export const assertNetworkDescriptorV2 = (
213
+ descriptor: NetworkDescriptorV2,
214
+ ): void => {
215
+ assertU16(descriptor.protocolVersion, "protocolVersion");
216
+ if (descriptor.protocolVersion !== TRUSTED_NETWORK_V2_PROTOCOL_VERSION) {
217
+ throw new Error("Unsupported TrustedNetwork protocol version");
218
+ }
219
+ assertBytes32(descriptor.networkNonce, "networkNonce");
220
+ if (!(descriptor.policyAuthority instanceof PublicSignKey)) {
221
+ throw new Error("policyAuthority must be a public signing key");
222
+ }
223
+ assertBytes32(descriptor.genesisPolicyDigest, "genesisPolicyDigest");
224
+ assertByte(descriptor.policyHashProfile, "policyHashProfile");
225
+ if (descriptor.policyHashProfile !== TRUSTED_NETWORK_V2_POLICY_HASH_SHA256) {
226
+ throw new Error("Unsupported TrustedNetwork policy hash profile");
227
+ }
228
+ assertByte(descriptor.entrySignatureProfile, "entrySignatureProfile");
229
+ if (
230
+ descriptor.entrySignatureProfile !==
231
+ TRUSTED_NETWORK_V2_ENTRY_V0_AUTHORITY_ONLY_SIGNATURE_PROFILE
232
+ ) {
233
+ throw new Error("Unsupported TrustedNetwork entry signature profile");
234
+ }
235
+ };
236
+
237
+ export const deriveNetworkIdV2 = (
238
+ descriptor: NetworkDescriptorV2,
239
+ ): Uint8Array => {
240
+ assertNetworkDescriptorV2(descriptor);
241
+ return sha256Sync(
242
+ concat([
243
+ lengthPrefix(textEncoder.encode(TRUSTED_NETWORK_V2_NETWORK_ID_DOMAIN)),
244
+ encodeU16(descriptor.protocolVersion),
245
+ descriptor.networkNonce,
246
+ lengthPrefix(serialize(descriptor.policyAuthority)),
247
+ ]),
248
+ );
249
+ };
250
+
251
+ export const digestPolicySnapshotBodyV2 = (
252
+ body: PolicySnapshotBodyV2,
253
+ ): Uint8Array => {
254
+ const bytes = serialize(body);
255
+ return sha256Sync(
256
+ concat([
257
+ lengthPrefix(textEncoder.encode(TRUSTED_NETWORK_V2_POLICY_DIGEST_DOMAIN)),
258
+ lengthPrefix(bytes),
259
+ ]),
260
+ );
261
+ };
262
+
263
+ export const assertPolicySnapshotBodyV2 = (
264
+ body: PolicySnapshotBodyV2,
265
+ descriptor: NetworkDescriptorV2,
266
+ ): void => {
267
+ assertNetworkDescriptorV2(descriptor);
268
+ assertBytes32(body.networkId, "networkId");
269
+ if (!equals(body.networkId, deriveNetworkIdV2(descriptor))) {
270
+ throw new Error("Policy snapshot belongs to another network");
271
+ }
272
+ assertU64(body.sequence, "sequence");
273
+ assertBytes32(body.previousPolicyDigest, "previousPolicyDigest");
274
+ if (body.sequence === 0n) {
275
+ if (!equals(body.previousPolicyDigest, ZERO_DIGEST)) {
276
+ throw new Error("Genesis policy must use the zero previous digest");
277
+ }
278
+ } else if (equals(body.previousPolicyDigest, ZERO_DIGEST)) {
279
+ throw new Error("A non-genesis policy must name its previous digest");
280
+ }
281
+ if (!Array.isArray(body.bindings) || body.bindings.length === 0) {
282
+ throw new Error("Policy snapshot must contain bindings");
283
+ }
284
+
285
+ let previousKeyBytes: Uint8Array | undefined;
286
+ let authorityBinding: PolicySubjectBindingV2 | undefined;
287
+ for (const binding of body.bindings) {
288
+ if (!(binding.signingKey instanceof PublicSignKey)) {
289
+ throw new Error("Policy subject must be a public signing key");
290
+ }
291
+ const keyBytes = serialize(binding.signingKey);
292
+ if (
293
+ previousKeyBytes !== undefined &&
294
+ compare(previousKeyBytes, keyBytes) >= 0
295
+ ) {
296
+ throw new Error("Policy bindings must be sorted and unique");
297
+ }
298
+ previousKeyBytes = keyBytes;
299
+
300
+ assertByte(binding.roles, "roles");
301
+ if (binding.roles === 0) {
302
+ throw new Error("Policy bindings with no roles are not canonical");
303
+ }
304
+ if ((binding.roles & ~TRUSTED_NETWORK_V2_KNOWN_ROLE_BITS) !== 0) {
305
+ throw new Error("Policy binding contains unknown role bits");
306
+ }
307
+ if (binding.encryptionKeyCommitment !== undefined) {
308
+ throw new Error(
309
+ "TrustedNetwork v2 encryption commitments are not supported yet",
310
+ );
311
+ }
312
+
313
+ if (binding.signingKey.equals(descriptor.policyAuthority)) {
314
+ authorityBinding = binding;
315
+ } else if ((binding.roles & TrustedNetworkRole.ADMIN) !== 0) {
316
+ throw new Error("Only the policy authority may hold ADMIN");
317
+ }
318
+ }
319
+ if (
320
+ authorityBinding === undefined ||
321
+ (authorityBinding.roles & TrustedNetworkRole.ADMIN) === 0
322
+ ) {
323
+ throw new Error("Policy authority must hold ADMIN");
324
+ }
325
+ if (
326
+ body.sequence === 0n &&
327
+ !equals(digestPolicySnapshotBodyV2(body), descriptor.genesisPolicyDigest)
328
+ ) {
329
+ throw new Error("Genesis policy digest does not match the descriptor");
330
+ }
331
+ };
332
+
333
+ export const decodeTrustedNetworkV2 = (bytes: Uint8Array): TrustedNetworkV2 => {
334
+ const network = deserialize(bytes, TrustedNetworkV2);
335
+ assertCanonicalEncoding(bytes, network);
336
+ assertNetworkDescriptorV2(network.descriptor);
337
+ return network;
338
+ };
339
+
340
+ export const decodePolicySnapshotBodyV2 = (
341
+ bytes: Uint8Array,
342
+ descriptor: NetworkDescriptorV2,
343
+ ): PolicySnapshotBodyV2 => {
344
+ const body = deserialize(bytes, PolicySnapshotBodyV2);
345
+ assertCanonicalEncoding(bytes, body);
346
+ assertPolicySnapshotBodyV2(body, descriptor);
347
+ return body;
348
+ };