@plane31/blind-relay 0.0.0-stage → 0.1.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.
Files changed (135) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +26 -2
  3. package/dist/adapters/index.d.ts +18 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +22 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/audience.d.ts +77 -0
  8. package/dist/audience.d.ts.map +1 -0
  9. package/dist/audience.js +76 -0
  10. package/dist/audience.js.map +1 -0
  11. package/dist/bytes.d.ts +54 -0
  12. package/dist/bytes.d.ts.map +1 -0
  13. package/dist/bytes.js +200 -0
  14. package/dist/bytes.js.map +1 -0
  15. package/dist/circle.d.ts +59 -0
  16. package/dist/circle.d.ts.map +1 -0
  17. package/dist/circle.js +105 -0
  18. package/dist/circle.js.map +1 -0
  19. package/dist/client.d.ts +234 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +1365 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/codec.d.ts +189 -0
  24. package/dist/codec.d.ts.map +1 -0
  25. package/dist/codec.js +512 -0
  26. package/dist/codec.js.map +1 -0
  27. package/dist/crypto/backend.d.ts +39 -0
  28. package/dist/crypto/backend.d.ts.map +1 -0
  29. package/dist/crypto/backend.js +8 -0
  30. package/dist/crypto/backend.js.map +1 -0
  31. package/dist/crypto/noble.d.ts +3 -0
  32. package/dist/crypto/noble.d.ts.map +1 -0
  33. package/dist/crypto/noble.js +107 -0
  34. package/dist/crypto/noble.js.map +1 -0
  35. package/dist/crypto/sodium.d.ts +7 -0
  36. package/dist/crypto/sodium.d.ts.map +1 -0
  37. package/dist/crypto/sodium.js +39 -0
  38. package/dist/crypto/sodium.js.map +1 -0
  39. package/dist/crypto.d.ts +66 -0
  40. package/dist/crypto.d.ts.map +1 -0
  41. package/dist/crypto.js +225 -0
  42. package/dist/crypto.js.map +1 -0
  43. package/dist/epoch.d.ts +93 -0
  44. package/dist/epoch.d.ts.map +1 -0
  45. package/dist/epoch.js +121 -0
  46. package/dist/epoch.js.map +1 -0
  47. package/dist/errors.d.ts +17 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +30 -0
  50. package/dist/errors.js.map +1 -0
  51. package/dist/historyIndex.d.ts +15 -0
  52. package/dist/historyIndex.d.ts.map +1 -0
  53. package/dist/historyIndex.js +57 -0
  54. package/dist/historyIndex.js.map +1 -0
  55. package/dist/identity.d.ts +62 -0
  56. package/dist/identity.d.ts.map +1 -0
  57. package/dist/identity.js +99 -0
  58. package/dist/identity.js.map +1 -0
  59. package/dist/inbox.d.ts +153 -0
  60. package/dist/inbox.d.ts.map +1 -0
  61. package/dist/inbox.js +472 -0
  62. package/dist/inbox.js.map +1 -0
  63. package/dist/index.d.ts +19 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +22 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/outbox.d.ts +96 -0
  68. package/dist/outbox.d.ts.map +1 -0
  69. package/dist/outbox.js +339 -0
  70. package/dist/outbox.js.map +1 -0
  71. package/dist/policy.d.ts +33 -0
  72. package/dist/policy.d.ts.map +1 -0
  73. package/dist/policy.js +71 -0
  74. package/dist/policy.js.map +1 -0
  75. package/dist/record.d.ts +49 -0
  76. package/dist/record.d.ts.map +1 -0
  77. package/dist/record.js +46 -0
  78. package/dist/record.js.map +1 -0
  79. package/dist/reset.d.ts +74 -0
  80. package/dist/reset.d.ts.map +1 -0
  81. package/dist/reset.js +127 -0
  82. package/dist/reset.js.map +1 -0
  83. package/dist/rows.d.ts +16 -0
  84. package/dist/rows.d.ts.map +1 -0
  85. package/dist/rows.js +103 -0
  86. package/dist/rows.js.map +1 -0
  87. package/dist/slots.d.ts +22 -0
  88. package/dist/slots.d.ts.map +1 -0
  89. package/dist/slots.js +38 -0
  90. package/dist/slots.js.map +1 -0
  91. package/dist/store.d.ts +357 -0
  92. package/dist/store.d.ts.map +1 -0
  93. package/dist/store.js +192 -0
  94. package/dist/store.js.map +1 -0
  95. package/dist/testing/clock.d.ts +14 -0
  96. package/dist/testing/clock.d.ts.map +1 -0
  97. package/dist/testing/clock.js +27 -0
  98. package/dist/testing/clock.js.map +1 -0
  99. package/dist/testing/fakeHost.d.ts +118 -0
  100. package/dist/testing/fakeHost.d.ts.map +1 -0
  101. package/dist/testing/fakeHost.js +462 -0
  102. package/dist/testing/fakeHost.js.map +1 -0
  103. package/dist/testing/faults.d.ts +97 -0
  104. package/dist/testing/faults.d.ts.map +1 -0
  105. package/dist/testing/faults.js +264 -0
  106. package/dist/testing/faults.js.map +1 -0
  107. package/dist/testing/fixtures.d.ts +15 -0
  108. package/dist/testing/fixtures.d.ts.map +1 -0
  109. package/dist/testing/fixtures.js +22 -0
  110. package/dist/testing/fixtures.js.map +1 -0
  111. package/dist/testing/index.d.ts +7 -0
  112. package/dist/testing/index.d.ts.map +1 -0
  113. package/dist/testing/index.js +7 -0
  114. package/dist/testing/index.js.map +1 -0
  115. package/dist/testing/providers.d.ts +16 -0
  116. package/dist/testing/providers.d.ts.map +1 -0
  117. package/dist/testing/providers.js +36 -0
  118. package/dist/testing/providers.js.map +1 -0
  119. package/dist/testing/sweep.d.ts +46 -0
  120. package/dist/testing/sweep.d.ts.map +1 -0
  121. package/dist/testing/sweep.js +366 -0
  122. package/dist/testing/sweep.js.map +1 -0
  123. package/dist/transactions.d.ts +75 -0
  124. package/dist/transactions.d.ts.map +1 -0
  125. package/dist/transactions.js +212 -0
  126. package/dist/transactions.js.map +1 -0
  127. package/dist/transport.d.ts +125 -0
  128. package/dist/transport.d.ts.map +1 -0
  129. package/dist/transport.js +6 -0
  130. package/dist/transport.js.map +1 -0
  131. package/dist/vault.d.ts +59 -0
  132. package/dist/vault.d.ts.map +1 -0
  133. package/dist/vault.js +69 -0
  134. package/dist/vault.js.map +1 -0
  135. package/package.json +66 -3
package/dist/codec.js ADDED
@@ -0,0 +1,512 @@
1
+ /**
2
+ * The wire documents of Kavach v1, protocol sections 3 to 12.
3
+ *
4
+ * Parse within bounds first (sizes, ranges, sort orders, counts, nonzero rules), then verify the
5
+ * signature under the key the caller's trust state names, then anything else. Every parser here
6
+ * refuses trailing bytes and never touches a signature. Type 5 is retired and rejected.
7
+ */
8
+ import { MAX_DOCUMENT_BYTES, MAX_PAYLOAD_BYTES, Reader, Writer, compareBytes, concat, equalBytes, isAllZero, u32 } from "./bytes.js";
9
+ import { C, DEVICE_ID_BYTES, HASH_BYTES, KEY_BYTES, NONCE_BYTES, PUBLIC_KEY_BYTES, RECOVERY_CODE_PREFIX, SEED_BYTES, SIGNATURE_BYTES, TAG_BYTES, WIRE_VERSION, accountKeypair, aeadOpen, aeadSeal, assertValidBoxKey, assertValidSigningKey, bodyHash, sign, verify } from "./crypto.js";
10
+ import { KavachError } from "./errors.js";
11
+ export const MAX_MEMBERS = 100;
12
+ export const MAX_RESET_KEYS = 8;
13
+ export const MAX_RESET_KEY_LIST_LIFETIME_MS = 2592000000n; // 30 days
14
+ /** The encrypted envelope in front of every payload (revision 8): version, kind, event time. */
15
+ export const ENVELOPE_VERSION = 1;
16
+ export const ENVELOPE_BYTES = 1 + 1 + 8;
17
+ export const MIN_RECORD_CIPHERTEXT = ENVELOPE_BYTES + TAG_BYTES;
18
+ /** The size of a sealed record on the wire for a payload of this length: header, nonce, length, envelope, payload, tag, signature. */
19
+ export function recordWireBytes(payloadLength) {
20
+ return RECORD_HEADER_BYTES + NONCE_BYTES + 4 + ENVELOPE_BYTES + payloadLength + TAG_BYTES + SIGNATURE_BYTES;
21
+ }
22
+ export const MAX_RECORD_CIPHERTEXT = ENVELOPE_BYTES + MAX_PAYLOAD_BYTES + TAG_BYTES;
23
+ export const MIN_VAULT_CIPHERTEXT = 90;
24
+ export const MAX_VAULT_CIPHERTEXT = 4_990;
25
+ export const VAULT_ENTRY_BYTES = 49;
26
+ export const RECORD_HEADER_BYTES = 51;
27
+ /** Header flags: bits 1 and 2 carry the record's header class (0 to 3), the one thing about a record the relay may see; bit 0 and bits 3 to 7 are reserved. */
28
+ export const HEADER_CLASS_SHIFT = 1;
29
+ export const HEADER_CLASS_MASK = 0x06;
30
+ const RESERVED_FLAGS = ~HEADER_CLASS_MASK & 0xff;
31
+ export var DocumentType;
32
+ (function (DocumentType) {
33
+ DocumentType[DocumentType["AccountDevice"] = 1] = "AccountDevice";
34
+ DocumentType[DocumentType["CircleSnapshot"] = 2] = "CircleSnapshot";
35
+ DocumentType[DocumentType["EpochManifest"] = 3] = "EpochManifest";
36
+ DocumentType[DocumentType["EncryptedRecord"] = 4] = "EncryptedRecord";
37
+ DocumentType[DocumentType["AccountVault"] = 6] = "AccountVault";
38
+ DocumentType[DocumentType["AccountResetReceipt"] = 7] = "AccountResetReceipt";
39
+ DocumentType[DocumentType["ResetKeyList"] = 8] = "ResetKeyList";
40
+ })(DocumentType || (DocumentType = {}));
41
+ export const MAX_KIND = 255;
42
+ export const LABEL_BY_TYPE = {
43
+ [DocumentType.AccountDevice]: "account-sig",
44
+ [DocumentType.CircleSnapshot]: "snapshot-sig",
45
+ [DocumentType.EpochManifest]: "epoch-sig",
46
+ [DocumentType.EncryptedRecord]: "record-sig",
47
+ [DocumentType.AccountResetReceipt]: "reset-sig",
48
+ [DocumentType.ResetKeyList]: "reset-keys-sig"
49
+ };
50
+ // Parsing --------------------------------------------------------------------------------------
51
+ function strictlySortedUnique(items) {
52
+ for (let i = 1; i < items.length; i++) {
53
+ const a = items[i - 1];
54
+ const b = items[i];
55
+ if (!a || !b || compareBytes(a, b) >= 0)
56
+ return false;
57
+ }
58
+ return true;
59
+ }
60
+ function malformed(stage, why) {
61
+ return new KavachError("MALFORMED", stage, why);
62
+ }
63
+ /**
64
+ * Parse a signed document (types 1 to 4, 7, 8). The signature is split off but not checked;
65
+ * call `verifyDocument` for that. Type 6 is not a signed document and type 5 is retired.
66
+ */
67
+ export function parseDocument(wire) {
68
+ const stage = "parse";
69
+ if (wire.length > MAX_DOCUMENT_BYTES)
70
+ throw new KavachError("SIZE_LIMIT", stage, "document over 16,384 bytes");
71
+ const r = new Reader(wire, stage);
72
+ if (r.u8() !== WIRE_VERSION)
73
+ throw new KavachError("UNSUPPORTED_VERSION", stage);
74
+ const type = r.u8();
75
+ let fields;
76
+ switch (type) {
77
+ case DocumentType.AccountDevice: {
78
+ const accountName = r.name();
79
+ const accountKey = r.take(PUBLIC_KEY_BYTES);
80
+ const generation = r.u64();
81
+ const deviceId = r.take(DEVICE_ID_BYTES);
82
+ const signingKey = r.take(PUBLIC_KEY_BYTES);
83
+ const boxKey = r.take(PUBLIC_KEY_BYTES);
84
+ if (generation === 0n)
85
+ throw malformed(stage, "generation zero");
86
+ if (isAllZero(deviceId))
87
+ throw malformed(stage, "device id zero");
88
+ fields = { type, accountName, accountKey, generation, deviceId, signingKey, boxKey };
89
+ break;
90
+ }
91
+ case DocumentType.CircleSnapshot: {
92
+ const circleId = r.take(16);
93
+ const ownerIdentityId = r.take(HASH_BYTES);
94
+ const revision = r.u64();
95
+ const count = r.u16();
96
+ if (revision === 0n)
97
+ throw malformed(stage, "revision zero");
98
+ if (count < 1 || count > MAX_MEMBERS)
99
+ throw malformed(stage, "member count");
100
+ const members = [];
101
+ for (let i = 0; i < count; i++)
102
+ members.push(r.take(HASH_BYTES));
103
+ if (!strictlySortedUnique(members))
104
+ throw malformed(stage, "members not strictly sorted");
105
+ if (!members.some((m) => equalBytes(m, ownerIdentityId)))
106
+ throw malformed(stage, "owner missing");
107
+ fields = { type, circleId, ownerIdentityId, revision, members };
108
+ break;
109
+ }
110
+ case DocumentType.EpochManifest: {
111
+ const streamId = r.take(HASH_BYTES);
112
+ const authorIdentityId = r.take(HASH_BYTES);
113
+ const authorCertificateHash = r.take(HASH_BYTES);
114
+ const epoch = r.u32();
115
+ const createdAt = r.u64();
116
+ const keyCommitment = r.take(HASH_BYTES);
117
+ const count = r.u16();
118
+ if (epoch === 0)
119
+ throw malformed(stage, "epoch zero");
120
+ if (count < 1 || count > MAX_MEMBERS)
121
+ throw malformed(stage, "audience count");
122
+ const audience = [];
123
+ for (let i = 0; i < count; i++) {
124
+ audience.push({ identityId: r.take(HASH_BYTES), certificateHash: r.take(HASH_BYTES), wrapHash: r.take(HASH_BYTES) });
125
+ }
126
+ if (!strictlySortedUnique(audience.map((a) => a.identityId)))
127
+ throw malformed(stage, "audience not strictly sorted");
128
+ if (!audience.some((a) => equalBytes(a.identityId, authorIdentityId)))
129
+ throw malformed(stage, "author missing from audience");
130
+ fields = { type, streamId, authorIdentityId, authorCertificateHash, epoch, createdAt, keyCommitment, audience };
131
+ break;
132
+ }
133
+ case DocumentType.EncryptedRecord: {
134
+ const streamId = r.take(HASH_BYTES);
135
+ const epoch = r.u32();
136
+ const counter = r.u32();
137
+ const sentAt = r.u64();
138
+ const flags = r.u8();
139
+ if (epoch === 0)
140
+ throw malformed(stage, "epoch zero");
141
+ if ((flags & RESERVED_FLAGS) !== 0)
142
+ throw malformed(stage, "reserved flag bit set");
143
+ const header = r.consumed();
144
+ const nonce = r.take(NONCE_BYTES);
145
+ const length = r.u32();
146
+ if (length < MIN_RECORD_CIPHERTEXT || length > MAX_RECORD_CIPHERTEXT) {
147
+ throw new KavachError("SIZE_LIMIT", stage, "record ciphertext length");
148
+ }
149
+ const ciphertext = r.take(length);
150
+ fields = { type, streamId, epoch, counter, sentAt, flags, headerClass: ((flags & HEADER_CLASS_MASK) >> HEADER_CLASS_SHIFT), header, nonce, ciphertext };
151
+ break;
152
+ }
153
+ case DocumentType.AccountResetReceipt: {
154
+ const accountName = r.name();
155
+ const oldIdentityId = r.take(HASH_BYTES);
156
+ const newIdentityId = r.take(HASH_BYTES);
157
+ const resetId = r.take(16);
158
+ const issuedAt = r.u64();
159
+ const authorityKeyId = r.take(16);
160
+ if (equalBytes(oldIdentityId, newIdentityId))
161
+ throw malformed(stage, "old and new identity equal");
162
+ fields = { type, accountName, oldIdentityId, newIdentityId, resetId, issuedAt, authorityKeyId };
163
+ break;
164
+ }
165
+ case DocumentType.ResetKeyList: {
166
+ const version = r.u64();
167
+ const issuedAt = r.u64();
168
+ const expiresAt = r.u64();
169
+ const count = r.u8();
170
+ if (version === 0n)
171
+ throw malformed(stage, "version zero");
172
+ if (count > MAX_RESET_KEYS)
173
+ throw malformed(stage, "too many keys");
174
+ const lifetime = expiresAt - issuedAt;
175
+ if (lifetime <= 0n || lifetime > MAX_RESET_KEY_LIST_LIFETIME_MS)
176
+ throw malformed(stage, "key-list lifetime");
177
+ const keys = [];
178
+ for (let i = 0; i < count; i++)
179
+ keys.push({ keyId: r.take(16), publicKey: r.take(PUBLIC_KEY_BYTES) });
180
+ if (!strictlySortedUnique(keys.map((k) => k.keyId)))
181
+ throw malformed(stage, "key ids not strictly sorted");
182
+ if (keys.some((k) => isAllZero(k.keyId)))
183
+ throw malformed(stage, "zero key id");
184
+ for (let i = 0; i < keys.length; i++) {
185
+ for (let j = i + 1; j < keys.length; j++) {
186
+ const a = keys[i];
187
+ const b = keys[j];
188
+ if (a && b && equalBytes(a.publicKey, b.publicKey))
189
+ throw malformed(stage, "duplicate key");
190
+ }
191
+ }
192
+ for (const k of keys)
193
+ assertValidSigningKey(k.publicKey, stage);
194
+ fields = { type, version, issuedAt, expiresAt, keys };
195
+ break;
196
+ }
197
+ default:
198
+ // 5 is retired; 6 is not a signed document; everything else is unknown.
199
+ throw new KavachError("UNSUPPORTED_TYPE", stage, `type ${type}`);
200
+ }
201
+ const body = r.consumed();
202
+ const signature = r.take(SIGNATURE_BYTES);
203
+ r.end();
204
+ return { ...fields, body, signature, bodyHash: bodyHash(body) };
205
+ }
206
+ /**
207
+ * Parse and verify. A type 1 certificate is verified under the key it carries, which establishes
208
+ * key possession only. Every other type needs the key the caller's trust state names.
209
+ */
210
+ export function verifyDocument(wire, publicKey) {
211
+ const doc = parseDocument(wire);
212
+ const label = LABEL_BY_TYPE[doc.type];
213
+ if (!label)
214
+ throw new KavachError("UNSUPPORTED_TYPE", "verify");
215
+ let key = publicKey;
216
+ if (doc.type === DocumentType.AccountDevice)
217
+ key = doc.accountKey;
218
+ if (!key)
219
+ throw new KavachError("METADATA_REQUIRED", "verify", "verification key required");
220
+ verify(key, label, doc.body, doc.signature);
221
+ if (doc.type === DocumentType.AccountDevice) {
222
+ assertValidSigningKey(doc.signingKey);
223
+ assertValidBoxKey(doc.boxKey);
224
+ }
225
+ return doc;
226
+ }
227
+ /** Narrow a parsed document to one type, or fail as MALFORMED. */
228
+ export function expectType(doc, type, stage = "verify") {
229
+ if (doc.type !== type)
230
+ throw malformed(stage, `expected type ${type}, got ${doc.type}`);
231
+ return doc;
232
+ }
233
+ // Building -------------------------------------------------------------------------------------
234
+ function signed(body, label, secretKey) {
235
+ return concat(body, sign(secretKey, label, body));
236
+ }
237
+ export function encodeAccountDeviceBody(f) {
238
+ return new Writer()
239
+ .u8(WIRE_VERSION)
240
+ .u8(DocumentType.AccountDevice)
241
+ .name(f.accountName)
242
+ .bytes(f.accountKey)
243
+ .u64(f.generation)
244
+ .bytes(f.deviceId)
245
+ .bytes(f.signingKey)
246
+ .bytes(f.boxKey)
247
+ .finish();
248
+ }
249
+ export function buildAccountDevice(f, accountSecretKey) {
250
+ return signed(encodeAccountDeviceBody(f), "account-sig", accountSecretKey);
251
+ }
252
+ export function encodeCircleSnapshotBody(f) {
253
+ const members = [...f.members].sort(compareBytes);
254
+ const w = new Writer().u8(WIRE_VERSION).u8(DocumentType.CircleSnapshot).bytes(f.circleId).bytes(f.ownerIdentityId).u64(f.revision).u16(members.length);
255
+ for (const m of members)
256
+ w.bytes(m);
257
+ return w.finish();
258
+ }
259
+ export function buildCircleSnapshot(f, ownerAccountSecretKey) {
260
+ return signed(encodeCircleSnapshotBody(f), "snapshot-sig", ownerAccountSecretKey);
261
+ }
262
+ export function encodeEpochManifestBody(f) {
263
+ const rows = [...f.audience].sort((a, b) => compareBytes(a.identityId, b.identityId));
264
+ const w = new Writer()
265
+ .u8(WIRE_VERSION)
266
+ .u8(DocumentType.EpochManifest)
267
+ .bytes(f.streamId)
268
+ .bytes(f.authorIdentityId)
269
+ .bytes(f.authorCertificateHash)
270
+ .u32(f.epoch)
271
+ .u64(f.createdAt)
272
+ .bytes(f.keyCommitment)
273
+ .u16(rows.length);
274
+ for (const row of rows)
275
+ w.bytes(row.identityId).bytes(row.certificateHash).bytes(row.wrapHash);
276
+ return w.finish();
277
+ }
278
+ export function buildEpochManifest(f, deviceSigningSecretKey) {
279
+ return signed(encodeEpochManifestBody(f), "epoch-sig", deviceSigningSecretKey);
280
+ }
281
+ export function encodeRecordHeader(f) {
282
+ if (f.epoch === 0)
283
+ throw malformed("encode", "epoch zero");
284
+ return new Writer()
285
+ .u8(WIRE_VERSION)
286
+ .u8(DocumentType.EncryptedRecord)
287
+ .bytes(f.streamId)
288
+ .u32(f.epoch)
289
+ .u32(f.counter)
290
+ .u64(f.sentAt)
291
+ .u8((f.headerClass << HEADER_CLASS_SHIFT) & HEADER_CLASS_MASK)
292
+ .finish();
293
+ }
294
+ /** `u8(1) || u8(kind) || u64(eventTime or 0) || payload`: the plaintext under the AEAD. */
295
+ export function encodeEnvelope(e, payload) {
296
+ if (!Number.isInteger(e.kind) || e.kind < 0 || e.kind > MAX_KIND)
297
+ throw malformed("encode", "kind out of range");
298
+ if (payload.length > MAX_PAYLOAD_BYTES)
299
+ throw new KavachError("SIZE_LIMIT", "encode", "payload over 4,096 bytes");
300
+ if (e.eventTime !== undefined && e.eventTime < 0n)
301
+ throw malformed("encode", "event time before the epoch");
302
+ return new Writer().u8(ENVELOPE_VERSION).u8(e.kind).u64(e.eventTime ?? 0n).bytes(payload).finish();
303
+ }
304
+ export function decodeEnvelope(plaintext) {
305
+ const stage = "envelope";
306
+ if (plaintext.length < ENVELOPE_BYTES)
307
+ throw malformed(stage, "envelope too short");
308
+ const r = new Reader(plaintext, stage);
309
+ if (r.u8() !== ENVELOPE_VERSION)
310
+ throw malformed(stage, "envelope version");
311
+ const kind = r.u8();
312
+ const t = r.u64();
313
+ const payload = plaintext.subarray(ENVELOPE_BYTES);
314
+ if (payload.length > MAX_PAYLOAD_BYTES)
315
+ throw new KavachError("SIZE_LIMIT", stage, "payload over 4,096 bytes");
316
+ return { kind, eventTime: t === 0n ? undefined : t, payload };
317
+ }
318
+ export function recordAad(header) {
319
+ return concat(C("record-aad"), header);
320
+ }
321
+ /** Encrypt and sign one record from its complete plaintext (the envelope with the payload). The caller supplies a fresh random nonce and never reuses it. */
322
+ export function buildEncryptedRecord(f, plaintext, epochKey, nonce, deviceSigningSecretKey) {
323
+ if (plaintext.length < ENVELOPE_BYTES || plaintext.length > ENVELOPE_BYTES + MAX_PAYLOAD_BYTES)
324
+ throw new KavachError("SIZE_LIMIT", "encode", "record plaintext length");
325
+ const header = encodeRecordHeader(f);
326
+ const ciphertext = aeadSeal(epochKey, nonce, recordAad(header), plaintext);
327
+ const body = concat(header, nonce, u32(ciphertext.length), ciphertext);
328
+ return signed(body, "record-sig", deviceSigningSecretKey);
329
+ }
330
+ /** The same from a kind, an optional event time and a payload: the envelope is encoded here. */
331
+ export function buildRecordWire(f, payload, epochKey, nonce, deviceSigningSecretKey) {
332
+ return buildEncryptedRecord(f, encodeEnvelope(f, payload), epochKey, nonce, deviceSigningSecretKey);
333
+ }
334
+ /** Decrypt a parsed record under its epoch key to its plaintext (the envelope with the payload). Verify the signature first; this does not. */
335
+ export function openRecord(record, epochKey) {
336
+ return aeadOpen(epochKey, record.nonce, recordAad(record.header), record.ciphertext);
337
+ }
338
+ export function encodeResetReceiptBody(f) {
339
+ return new Writer()
340
+ .u8(WIRE_VERSION)
341
+ .u8(DocumentType.AccountResetReceipt)
342
+ .name(f.accountName)
343
+ .bytes(f.oldIdentityId)
344
+ .bytes(f.newIdentityId)
345
+ .bytes(f.resetId)
346
+ .u64(f.issuedAt)
347
+ .bytes(f.authorityKeyId)
348
+ .finish();
349
+ }
350
+ export function buildResetReceipt(f, resetSecretKey) {
351
+ return signed(encodeResetReceiptBody(f), "reset-sig", resetSecretKey);
352
+ }
353
+ export function encodeResetKeyListBody(f) {
354
+ const keys = [...f.keys].sort((a, b) => compareBytes(a.keyId, b.keyId));
355
+ const w = new Writer().u8(WIRE_VERSION).u8(DocumentType.ResetKeyList).u64(f.version).u64(f.issuedAt).u64(f.expiresAt).u8(keys.length);
356
+ for (const k of keys)
357
+ w.bytes(k.keyId).bytes(k.publicKey);
358
+ return w.finish();
359
+ }
360
+ export function buildResetKeyList(f, managementSecretKey) {
361
+ return signed(encodeResetKeyListBody(f), "reset-keys-sig", managementSecretKey);
362
+ }
363
+ export function encodeVaultHeader(h) {
364
+ return new Writer().u8(WIRE_VERSION).u8(DocumentType.AccountVault).name(h.accountName).bytes(h.accountKey).u64(h.vaultRevision).finish();
365
+ }
366
+ export function encodeVaultPlaintext(v) {
367
+ if (v.accountSeed.length !== SEED_BYTES)
368
+ throw malformed("encodeVault", "seed length");
369
+ if (v.entries.length > MAX_MEMBERS)
370
+ throw malformed("encodeVault", "too many entries");
371
+ const entries = [...v.entries].sort((a, b) => compareBytes(a.circleId, b.circleId));
372
+ if (!strictlySortedUnique(entries.map((e) => e.circleId)))
373
+ throw malformed("encodeVault", "duplicate circle");
374
+ const w = new Writer().bytes(v.accountSeed).u64(v.lastDeviceGeneration).bytes(v.lastCertificateHash).u16(entries.length);
375
+ for (const e of entries)
376
+ w.bytes(e.circleId).bytes(e.ownerIdentityId).u8(e.sharingEnabled ? 1 : 0);
377
+ return w.finish();
378
+ }
379
+ export function decodeVaultPlaintext(plain) {
380
+ const stage = "decodeVault";
381
+ const r = new Reader(plain, stage);
382
+ const accountSeed = r.take(SEED_BYTES);
383
+ const lastDeviceGeneration = r.u64();
384
+ const lastCertificateHash = r.take(HASH_BYTES);
385
+ const count = r.u16();
386
+ if (lastDeviceGeneration === 0n)
387
+ throw malformed(stage, "generation zero");
388
+ if (count > MAX_MEMBERS)
389
+ throw malformed(stage, "too many entries");
390
+ const entries = [];
391
+ for (let i = 0; i < count; i++) {
392
+ const circleId = r.take(16);
393
+ const ownerIdentityId = r.take(HASH_BYTES);
394
+ const flag = r.u8();
395
+ if (flag !== 0 && flag !== 1)
396
+ throw malformed(stage, "sharing flag");
397
+ entries.push({ circleId, ownerIdentityId, sharingEnabled: flag === 1 });
398
+ }
399
+ r.end();
400
+ if (!strictlySortedUnique(entries.map((e) => e.circleId)))
401
+ throw malformed(stage, "entries not strictly sorted");
402
+ return { accountSeed, lastDeviceGeneration, lastCertificateHash, entries };
403
+ }
404
+ /** Encrypt a vault. The caller supplies a fresh random nonce. */
405
+ export function sealVault(header, contents, recoveryKey, nonce) {
406
+ if (header.vaultRevision === 0n)
407
+ throw malformed("sealVault", "revision zero");
408
+ const h = encodeVaultHeader(header);
409
+ const ciphertext = aeadSeal(recoveryKey, nonce, concat(C("vault-aad"), h), encodeVaultPlaintext(contents));
410
+ return concat(h, nonce, u32(ciphertext.length), ciphertext);
411
+ }
412
+ /** Read a vault's public header without opening it (the host's compare-and-swap uses it). */
413
+ export function parseVaultHeader(wire) {
414
+ const stage = "vaultHeader";
415
+ if (wire.length > MAX_DOCUMENT_BYTES)
416
+ throw new KavachError("SIZE_LIMIT", stage);
417
+ const r = new Reader(wire, stage);
418
+ if (r.u8() !== WIRE_VERSION)
419
+ throw new KavachError("UNSUPPORTED_VERSION", stage);
420
+ if (r.u8() !== DocumentType.AccountVault)
421
+ throw new KavachError("UNSUPPORTED_TYPE", stage);
422
+ const accountName = r.name();
423
+ const accountKey = r.take(PUBLIC_KEY_BYTES);
424
+ const vaultRevision = r.u64();
425
+ if (vaultRevision === 0n)
426
+ throw malformed(stage, "revision zero");
427
+ return { accountName, accountKey, vaultRevision, hash: bodyHash(wire) };
428
+ }
429
+ /**
430
+ * Open a vault under the recovery key. Binds the header to the expected account before decrypting
431
+ * and checks that `AK` derives from the recovered seed before trusting the entries.
432
+ */
433
+ export function openVault(wire, recoveryKey, expectedName, expectedAccountKey) {
434
+ const stage = "openVault";
435
+ if (wire.length > MAX_DOCUMENT_BYTES)
436
+ throw new KavachError("SIZE_LIMIT", stage);
437
+ const r = new Reader(wire, stage);
438
+ if (r.u8() !== WIRE_VERSION)
439
+ throw new KavachError("UNSUPPORTED_VERSION", stage);
440
+ if (r.u8() !== DocumentType.AccountVault)
441
+ throw new KavachError("UNSUPPORTED_TYPE", stage);
442
+ const accountName = r.name();
443
+ const accountKey = r.take(PUBLIC_KEY_BYTES);
444
+ const vaultRevision = r.u64();
445
+ if (accountName !== expectedName || !equalBytes(accountKey, expectedAccountKey) || vaultRevision === 0n) {
446
+ throw new KavachError("VAULT_BINDING", stage);
447
+ }
448
+ const header = r.consumed();
449
+ const nonce = r.take(NONCE_BYTES);
450
+ const length = r.u32();
451
+ if (length < MIN_VAULT_CIPHERTEXT || length > MAX_VAULT_CIPHERTEXT)
452
+ throw new KavachError("SIZE_LIMIT", stage, "vault ciphertext length");
453
+ const ciphertext = r.take(length);
454
+ r.end();
455
+ if (recoveryKey.length !== KEY_BYTES)
456
+ throw new KavachError("INVALID_KEY", stage);
457
+ const plain = aeadOpen(recoveryKey, nonce, concat(C("vault-aad"), header), ciphertext, stage);
458
+ const contents = decodeVaultPlaintext(plain);
459
+ if (!equalBytes(accountKeypair(contents.accountSeed).publicKey, accountKey))
460
+ throw new KavachError("VAULT_BINDING", stage, "seed does not derive AK");
461
+ return { ...contents, header: { accountName, accountKey, vaultRevision } };
462
+ }
463
+ // Recovery code --------------------------------------------------------------------------------
464
+ const B64URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
465
+ function base64url(bytes) {
466
+ let out = "";
467
+ for (let i = 0; i < bytes.length; i += 3) {
468
+ const a = bytes[i] ?? 0;
469
+ const b = bytes[i + 1];
470
+ const c = bytes[i + 2];
471
+ out += B64URL[a >> 2];
472
+ out += B64URL[((a & 3) << 4) | ((b ?? 0) >> 4)];
473
+ if (b !== undefined)
474
+ out += B64URL[((b & 15) << 2) | ((c ?? 0) >> 6)];
475
+ if (c !== undefined)
476
+ out += B64URL[c & 63];
477
+ }
478
+ return out;
479
+ }
480
+ function unbase64url(text) {
481
+ if (!/^[A-Za-z0-9_-]+$/.test(text) || text.length % 4 === 1)
482
+ return undefined;
483
+ const out = [];
484
+ let buffer = 0;
485
+ let bits = 0;
486
+ for (const ch of text) {
487
+ buffer = (buffer << 6) | B64URL.indexOf(ch);
488
+ bits += 6;
489
+ if (bits >= 8) {
490
+ bits -= 8;
491
+ out.push((buffer >> bits) & 0xff);
492
+ }
493
+ }
494
+ return Uint8Array.from(out);
495
+ }
496
+ /** `"KV1R-" || base64url(recoveryKey)`, 48 characters, no padding. */
497
+ export function encodeRecoveryCode(recoveryKey) {
498
+ if (recoveryKey.length !== KEY_BYTES)
499
+ throw new KavachError("INVALID_KEY", "recoveryCode");
500
+ return RECOVERY_CODE_PREFIX + base64url(recoveryKey);
501
+ }
502
+ export function decodeRecoveryCode(text) {
503
+ const stage = "recoveryCode";
504
+ if (!text.startsWith(RECOVERY_CODE_PREFIX))
505
+ throw malformed(stage, "prefix");
506
+ const value = text.slice(RECOVERY_CODE_PREFIX.length);
507
+ const raw = unbase64url(value);
508
+ if (!raw || raw.length !== KEY_BYTES || base64url(raw) !== value)
509
+ throw malformed(stage, "not a recovery key");
510
+ return raw;
511
+ }
512
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,YAAY,EACZ,MAAM,EACN,UAAU,EACV,SAAS,EACT,GAAG,EACJ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,CAAC,EACD,eAAe,EACf,UAAU,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,IAAI,EACJ,MAAM,EAEP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC/B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,8BAA8B,GAAG,WAAc,CAAC,CAAC,UAAU;AACxE,gGAAgG;AAChG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,cAAc,GAAG,SAAS,CAAC;AAChE,sIAAsI;AACtI,MAAM,UAAU,eAAe,CAAC,aAAqB;IACnD,OAAO,mBAAmB,GAAG,WAAW,GAAG,CAAC,GAAG,cAAc,GAAG,aAAa,GAAG,SAAS,GAAG,eAAe,CAAC;AAC9G,CAAC;AACD,MAAM,CAAC,MAAM,qBAAqB,GAAG,cAAc,GAAG,iBAAiB,GAAG,SAAS,CAAC;AACpF,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,+JAA+J;AAC/J,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,cAAc,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAGjD,MAAM,CAAN,IAAY,YAQX;AARD,WAAY,YAAY;IACtB,iEAAiB,CAAA;IACjB,mEAAkB,CAAA;IAClB,iEAAiB,CAAA;IACjB,qEAAmB,CAAA;IACnB,+DAAgB,CAAA;IAChB,6EAAuB,CAAA;IACvB,+DAAgB,CAAA;AAClB,CAAC,EARW,YAAY,KAAZ,YAAY,QAQvB;AAID,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAoF5B,MAAM,CAAC,MAAM,aAAa,GAAoC;IAC5D,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,aAAa;IAC3C,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,cAAc;IAC7C,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,WAAW;IACzC,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,YAAY;IAC5C,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,WAAW;IAC/C,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,gBAAgB;CAC9C,CAAC;AAEF,iGAAiG;AAEjG,SAAS,oBAAoB,CAAC,KAA4B;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,GAAW;IAC3C,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC;IAC/G,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,YAAY;QAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IACpB,IAAI,MAAsB,CAAC;IAC3B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxC,IAAI,UAAU,KAAK,EAAE;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;YACjE,IAAI,SAAS,CAAC,QAAQ,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAClE,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACrF,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,QAAQ,KAAK,EAAE;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAC7D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,WAAW;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAC7E,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;YAC1F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAClG,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAChE,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACtD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,WAAW;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACvH,CAAC;YACD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;YACrH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;YAC9H,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;YAChH,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;YACrB,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,GAAG,qBAAqB,IAAI,MAAM,GAAG,qBAAqB,EAAE,CAAC;gBACrE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,kBAAkB,CAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YACvK,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;YACnG,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;YAChG,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;YACrB,IAAI,OAAO,KAAK,EAAE;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAC3D,IAAI,KAAK,GAAG,cAAc;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;YACtC,IAAI,QAAQ,IAAI,EAAE,IAAI,QAAQ,GAAG,8BAA8B;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YAC7G,MAAM,IAAI,GAAoB,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACtG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;YAC3G,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;wBAAE,MAAM,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;gBAC9F,CAAC;YACH,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,qBAAqB,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChE,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACtD,MAAM;QACR,CAAC;QACD;YACE,wEAAwE;YACxE,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,GAAG,EAAE,CAAC;IACR,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,SAAsB;IACrE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,aAAa;QAAE,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC;IAClE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,QAAQ,EAAE,2BAA2B,CAAC,CAAC;IAC5F,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,aAAa,EAAE,CAAC;QAC5C,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAA2B,GAAW,EAAE,IAAe,EAAE,KAAK,GAAG,QAAQ;IACjG,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,iBAAiB,IAAI,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACxF,OAAO,GAA2B,CAAC;AACrC,CAAC;AAED,iGAAiG;AAEjG,SAAS,MAAM,CAAC,IAAgB,EAAE,KAAY,EAAE,SAAqB;IACnE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,CAA8B;IACpE,OAAO,IAAI,MAAM,EAAE;SAChB,EAAE,CAAC,YAAY,CAAC;SAChB,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;SACnB,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;SACjB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;SACjB,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;SACnB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;SACf,MAAM,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAA8B,EAAE,gBAA4B;IAC7F,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,CAA+B;IACtE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvJ,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAA+B,EAAE,qBAAiC;IACpG,OAAO,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,CAA8B;IACpE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE;SACnB,EAAE,CAAC,YAAY,CAAC;SAChB,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC;SAC9B,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;SACjB,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC;SACzB,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;SAChB,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;SACtB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/F,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAA8B,EAAE,sBAAkC;IACnG,OAAO,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;AACjF,CAAC;AAUD,MAAM,UAAU,kBAAkB,CAAC,CAAqB;IACtD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;QAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC3D,OAAO,IAAI,MAAM,EAAE;SAChB,EAAE,CAAC,YAAY,CAAC;SAChB,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC;SAChC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;SACjB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;SACb,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,kBAAkB,CAAC,GAAG,iBAAiB,CAAC;SAC7D,MAAM,EAAE,CAAC;AACd,CAAC;AASD,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,CAAW,EAAE,OAAmB;IAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ;QAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACjH,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAC;IAClH,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE;QAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;IAC5G,OAAO,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAqB;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC;IACzB,IAAI,SAAS,CAAC,MAAM,GAAG,cAAc;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACpF,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,gBAAgB;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC;IAC/G,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAkB;IAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,6JAA6J;AAC7J,MAAM,UAAU,oBAAoB,CAAC,CAAqB,EAAE,SAAqB,EAAE,QAAoB,EAAE,KAAiB,EAAE,sBAAkC;IAC5J,IAAI,SAAS,CAAC,MAAM,GAAG,cAAc,IAAI,SAAS,CAAC,MAAM,GAAG,cAAc,GAAG,iBAAiB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;IACzK,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;AAC5D,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAAC,CAAgC,EAAE,OAAmB,EAAE,QAAoB,EAAE,KAAiB,EAAE,sBAAkC;IAChK,OAAO,oBAAoB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC;AACtG,CAAC;AAED,+IAA+I;AAC/I,MAAM,UAAU,UAAU,CAAC,MAAuB,EAAE,QAAoB;IACtE,OAAO,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,CAAoC;IACzE,OAAO,IAAI,MAAM,EAAE;SAChB,EAAE,CAAC,YAAY,CAAC;SAChB,EAAE,CAAC,YAAY,CAAC,mBAAmB,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;SACnB,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;SACtB,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;SACtB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;SACf,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;SACvB,MAAM,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAoC,EAAE,cAA0B;IAChG,OAAO,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,CAA6B;IAClE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtI,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAA6B,EAAE,mBAA+B;IAC9F,OAAO,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;AAClF,CAAC;AAuBD,MAAM,UAAU,iBAAiB,CAAC,CAAc;IAC9C,OAAO,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3I,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAgB;IACnD,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,UAAU;QAAE,MAAM,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACvF,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW;QAAE,MAAM,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IAC9G,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzH,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAiB;IACpD,MAAM,KAAK,GAAG,aAAa,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,oBAAoB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACrC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,oBAAoB,KAAK,EAAE;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC3E,IAAI,KAAK,GAAG,WAAW;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACpE,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;QACpB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,CAAC,CAAC,GAAG,EAAE,CAAC;IACR,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACjH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC;AAC7E,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,MAAmB,EAAE,QAAuB,EAAE,WAAuB,EAAE,KAAiB;IAChH,IAAI,MAAM,CAAC,aAAa,KAAK,EAAE;QAAE,MAAM,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3G,OAAO,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,MAAM,KAAK,GAAG,aAAa,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACjF,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,YAAY;QAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,YAAY,CAAC,YAAY;QAAE,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC3F,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,aAAa,KAAK,EAAE;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAClE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,WAAuB,EAAE,YAAoB,EAAE,kBAA8B;IACvH,MAAM,KAAK,GAAG,WAAW,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACjF,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,YAAY;QAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,YAAY,CAAC,YAAY;QAAE,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC3F,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,WAAW,KAAK,YAAY,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,kBAAkB,CAAC,IAAI,aAAa,KAAK,EAAE,EAAE,CAAC;QACxG,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,GAAG,oBAAoB,IAAI,MAAM,GAAG,oBAAoB;QAAE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAC1I,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,GAAG,EAAE,CAAC;IACR,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,eAAe,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;IACtJ,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,iGAAiG;AAEjG,MAAM,MAAM,GAAG,kEAAkE,CAAC;AAElF,SAAS,SAAS,CAAC,KAAiB;IAClC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,GAAG,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtB,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,CAAC;QACV,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CAAC,WAAuB;IACxD,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,WAAW,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC3F,OAAO,oBAAoB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,cAAc,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK;QAAE,MAAM,SAAS,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IAC/G,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The primitive backend behind `crypto.ts`. Two implementations exist: `noble` (pure
3
+ * JavaScript, runs on Hermes and in workerd, the default) and `sodium` (libsodium's wasm, for
4
+ * Node and tests). Both are checked against the same vectors; the protocol never sees which one
5
+ * is loaded.
6
+ */
7
+ export interface SignKeypair {
8
+ readonly publicKey: Uint8Array;
9
+ readonly secretKey: Uint8Array;
10
+ }
11
+ export interface BoxKeypair {
12
+ readonly publicKey: Uint8Array;
13
+ readonly secretKey: Uint8Array;
14
+ }
15
+ export interface CryptoBackend {
16
+ readonly name: "noble" | "sodium";
17
+ blake2b(data: Uint8Array, outLen: number, key?: Uint8Array): Uint8Array;
18
+ randomBytes(length: number): Uint8Array;
19
+ signKeypairFromSeed(seed: Uint8Array): SignKeypair;
20
+ signDetached(message: Uint8Array, secretKey: Uint8Array): Uint8Array;
21
+ verifyDetached(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): boolean;
22
+ /** Canonical, on the curve, on the main subgroup, not the identity. */
23
+ isValidSignPoint(publicKey: Uint8Array): boolean;
24
+ /** `crypto_box_seed_keypair`: scalar = SHA-512(seed)[0..32], public = X25519 base point multiple. */
25
+ boxKeypairFromSeed(seed: Uint8Array): BoxKeypair;
26
+ boxKeypair(): BoxKeypair;
27
+ /** X25519; throws on an all-zero shared secret. */
28
+ scalarMult(secretKey: Uint8Array, publicKey: Uint8Array): Uint8Array;
29
+ /** `crypto_box_easy`: XSalsa20-Poly1305 under HSalsa20(X25519(sk, pk)); output mac || ciphertext. */
30
+ boxEasy(message: Uint8Array, nonce: Uint8Array, publicKey: Uint8Array, secretKey: Uint8Array): Uint8Array;
31
+ boxOpenEasy(box: Uint8Array, nonce: Uint8Array, publicKey: Uint8Array, secretKey: Uint8Array): Uint8Array;
32
+ /** XChaCha20-Poly1305 with the tag appended. */
33
+ aeadEncrypt(plaintext: Uint8Array, aad: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array;
34
+ aeadDecrypt(ciphertextAndTag: Uint8Array, aad: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array;
35
+ memzero(bytes: Uint8Array): void;
36
+ }
37
+ export declare function setCryptoBackend(backend: CryptoBackend): void;
38
+ export declare function currentBackend(): CryptoBackend | undefined;
39
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/crypto/backend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACxE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACxC,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IACnD,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACrE,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3F,uEAAuE;IACvE,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC;IACjD,qGAAqG;IACrG,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IACjD,UAAU,IAAI,UAAU,CAAC;IACzB,mDAAmD;IACnD,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACrE,qGAAqG;IACrG,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IAC1G,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IAC1G,gDAAgD;IAChD,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAAC;IACpG,WAAW,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAAC;IAC3G,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAClC;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAE7D;AAED,wBAAgB,cAAc,IAAI,aAAa,GAAG,SAAS,CAE1D"}
@@ -0,0 +1,8 @@
1
+ let current;
2
+ export function setCryptoBackend(backend) {
3
+ current = backend;
4
+ }
5
+ export function currentBackend() {
6
+ return current;
7
+ }
8
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/crypto/backend.ts"],"names":[],"mappings":"AAuCA,IAAI,OAAkC,CAAC;AAEvC,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,OAAO,GAAG,OAAO,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CryptoBackend } from "./backend.js";
2
+ export declare const nobleBackend: CryptoBackend;
3
+ //# sourceMappingURL=noble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noble.d.ts","sourceRoot":"","sources":["../../src/crypto/noble.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,aAAa,EAAe,MAAM,cAAc,CAAC;AA2C3E,eAAO,MAAM,YAAY,EAAE,aAqD1B,CAAC"}