@haneullabs/seal 0.1.0 → 1.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 (159) hide show
  1. package/CHANGELOG.md +118 -57
  2. package/dist/bcs.d.mts +39 -0
  3. package/dist/bcs.d.mts.map +1 -0
  4. package/dist/bcs.mjs +86 -0
  5. package/dist/bcs.mjs.map +1 -0
  6. package/dist/bls12381.d.mts +29 -0
  7. package/dist/bls12381.d.mts.map +1 -0
  8. package/dist/bls12381.mjs +135 -0
  9. package/dist/bls12381.mjs.map +1 -0
  10. package/dist/client.d.mts +105 -0
  11. package/dist/client.d.mts.map +1 -0
  12. package/dist/client.mjs +274 -0
  13. package/dist/client.mjs.map +1 -0
  14. package/dist/decrypt.mjs +53 -0
  15. package/dist/decrypt.mjs.map +1 -0
  16. package/dist/dem.d.mts +1 -0
  17. package/dist/dem.mjs +134 -0
  18. package/dist/dem.mjs.map +1 -0
  19. package/dist/elgamal.mjs +35 -0
  20. package/dist/elgamal.mjs.map +1 -0
  21. package/dist/encrypt.d.mts +14 -0
  22. package/dist/encrypt.d.mts.map +1 -0
  23. package/dist/encrypt.mjs +61 -0
  24. package/dist/encrypt.mjs.map +1 -0
  25. package/dist/error.d.mts +75 -0
  26. package/dist/error.d.mts.map +1 -0
  27. package/dist/error.mjs +150 -0
  28. package/dist/error.mjs.map +1 -0
  29. package/dist/ibe.mjs +176 -0
  30. package/dist/ibe.mjs.map +1 -0
  31. package/dist/index.d.mts +7 -0
  32. package/dist/index.mjs +7 -0
  33. package/dist/kdf.mjs +81 -0
  34. package/dist/kdf.mjs.map +1 -0
  35. package/dist/key-server.d.mts +22 -0
  36. package/dist/key-server.d.mts.map +1 -0
  37. package/dist/key-server.mjs +195 -0
  38. package/dist/key-server.mjs.map +1 -0
  39. package/dist/session-key.d.mts +82 -0
  40. package/dist/session-key.d.mts.map +1 -0
  41. package/dist/session-key.mjs +171 -0
  42. package/dist/session-key.mjs.map +1 -0
  43. package/dist/shamir.mjs +730 -0
  44. package/dist/shamir.mjs.map +1 -0
  45. package/dist/types.d.mts +79 -0
  46. package/dist/types.d.mts.map +1 -0
  47. package/dist/utils.mjs +89 -0
  48. package/dist/utils.mjs.map +1 -0
  49. package/dist/version.mjs +6 -0
  50. package/dist/version.mjs.map +1 -0
  51. package/docs/index.md +84 -0
  52. package/docs/llms-index.md +6 -0
  53. package/package.json +29 -25
  54. package/dist/cjs/bcs.d.ts +0 -71
  55. package/dist/cjs/bcs.js +0 -74
  56. package/dist/cjs/bcs.js.map +0 -7
  57. package/dist/cjs/bls12381.d.ts +0 -44
  58. package/dist/cjs/bls12381.js +0 -151
  59. package/dist/cjs/bls12381.js.map +0 -7
  60. package/dist/cjs/client.d.ts +0 -84
  61. package/dist/cjs/client.js +0 -414
  62. package/dist/cjs/client.js.map +0 -7
  63. package/dist/cjs/decrypt.d.ts +0 -22
  64. package/dist/cjs/decrypt.js +0 -109
  65. package/dist/cjs/decrypt.js.map +0 -7
  66. package/dist/cjs/dem.d.ts +0 -38
  67. package/dist/cjs/dem.js +0 -185
  68. package/dist/cjs/dem.js.map +0 -7
  69. package/dist/cjs/elgamal.d.ts +0 -13
  70. package/dist/cjs/elgamal.js +0 -46
  71. package/dist/cjs/elgamal.js.map +0 -7
  72. package/dist/cjs/encrypt.d.ts +0 -32
  73. package/dist/cjs/encrypt.js +0 -104
  74. package/dist/cjs/encrypt.js.map +0 -7
  75. package/dist/cjs/error.d.ts +0 -86
  76. package/dist/cjs/error.js +0 -239
  77. package/dist/cjs/error.js.map +0 -7
  78. package/dist/cjs/ibe.d.ts +0 -98
  79. package/dist/cjs/ibe.js +0 -167
  80. package/dist/cjs/ibe.js.map +0 -7
  81. package/dist/cjs/index.d.ts +0 -6
  82. package/dist/cjs/index.js +0 -33
  83. package/dist/cjs/index.js.map +0 -7
  84. package/dist/cjs/kdf.d.ts +0 -30
  85. package/dist/cjs/kdf.js +0 -97
  86. package/dist/cjs/kdf.js.map +0 -7
  87. package/dist/cjs/key-server.d.ts +0 -98
  88. package/dist/cjs/key-server.js +0 -171
  89. package/dist/cjs/key-server.js.map +0 -7
  90. package/dist/cjs/package.json +0 -5
  91. package/dist/cjs/session-key.d.ts +0 -74
  92. package/dist/cjs/session-key.js +0 -245
  93. package/dist/cjs/session-key.js.map +0 -7
  94. package/dist/cjs/shamir.d.ts +0 -91
  95. package/dist/cjs/shamir.js +0 -770
  96. package/dist/cjs/shamir.js.map +0 -7
  97. package/dist/cjs/types.d.ts +0 -83
  98. package/dist/cjs/types.js +0 -17
  99. package/dist/cjs/types.js.map +0 -7
  100. package/dist/cjs/utils.d.ts +0 -47
  101. package/dist/cjs/utils.js +0 -106
  102. package/dist/cjs/utils.js.map +0 -7
  103. package/dist/cjs/version.d.ts +0 -1
  104. package/dist/cjs/version.js +0 -25
  105. package/dist/cjs/version.js.map +0 -7
  106. package/dist/esm/bcs.d.ts +0 -71
  107. package/dist/esm/bcs.js +0 -54
  108. package/dist/esm/bcs.js.map +0 -7
  109. package/dist/esm/bls12381.d.ts +0 -44
  110. package/dist/esm/bls12381.js +0 -131
  111. package/dist/esm/bls12381.js.map +0 -7
  112. package/dist/esm/client.d.ts +0 -84
  113. package/dist/esm/client.js +0 -407
  114. package/dist/esm/client.js.map +0 -7
  115. package/dist/esm/decrypt.d.ts +0 -22
  116. package/dist/esm/decrypt.js +0 -94
  117. package/dist/esm/decrypt.js.map +0 -7
  118. package/dist/esm/dem.d.ts +0 -38
  119. package/dist/esm/dem.js +0 -165
  120. package/dist/esm/dem.js.map +0 -7
  121. package/dist/esm/elgamal.d.ts +0 -13
  122. package/dist/esm/elgamal.js +0 -26
  123. package/dist/esm/elgamal.js.map +0 -7
  124. package/dist/esm/encrypt.d.ts +0 -32
  125. package/dist/esm/encrypt.js +0 -84
  126. package/dist/esm/encrypt.js.map +0 -7
  127. package/dist/esm/error.d.ts +0 -86
  128. package/dist/esm/error.js +0 -219
  129. package/dist/esm/error.js.map +0 -7
  130. package/dist/esm/ibe.d.ts +0 -98
  131. package/dist/esm/ibe.js +0 -147
  132. package/dist/esm/ibe.js.map +0 -7
  133. package/dist/esm/index.d.ts +0 -6
  134. package/dist/esm/index.js +0 -12
  135. package/dist/esm/index.js.map +0 -7
  136. package/dist/esm/kdf.d.ts +0 -30
  137. package/dist/esm/kdf.js +0 -83
  138. package/dist/esm/kdf.js.map +0 -7
  139. package/dist/esm/key-server.d.ts +0 -98
  140. package/dist/esm/key-server.js +0 -151
  141. package/dist/esm/key-server.js.map +0 -7
  142. package/dist/esm/package.json +0 -5
  143. package/dist/esm/session-key.d.ts +0 -74
  144. package/dist/esm/session-key.js +0 -230
  145. package/dist/esm/session-key.js.map +0 -7
  146. package/dist/esm/shamir.d.ts +0 -91
  147. package/dist/esm/shamir.js +0 -750
  148. package/dist/esm/shamir.js.map +0 -7
  149. package/dist/esm/types.d.ts +0 -83
  150. package/dist/esm/types.js +0 -1
  151. package/dist/esm/types.js.map +0 -7
  152. package/dist/esm/utils.d.ts +0 -47
  153. package/dist/esm/utils.js +0 -86
  154. package/dist/esm/utils.js.map +0 -7
  155. package/dist/esm/version.d.ts +0 -1
  156. package/dist/esm/version.js +0 -5
  157. package/dist/esm/version.js.map +0 -7
  158. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  159. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,730 @@
1
+ import { allEqual, hasDuplicates } from "./utils.mjs";
2
+
3
+ //#region src/shamir.ts
4
+ const GF256_SIZE = 256;
5
+ /**
6
+ * A field element in the Rijndael finite field GF(2⁸) with a fixed generator g = 0x03.
7
+ */
8
+ var GF256 = class GF256 {
9
+ constructor(value) {
10
+ if (value < 0 || value >= GF256_SIZE) throw new Error(`Invalid value ${value} for GF256`);
11
+ this.value = value;
12
+ }
13
+ log() {
14
+ if (this.value === 0) throw new Error("Invalid value");
15
+ return LOG[this.value - 1];
16
+ }
17
+ static exp(x) {
18
+ return new GF256(EXP[x % (GF256_SIZE - 1)]);
19
+ }
20
+ add(other) {
21
+ return new GF256(this.value ^ other.value);
22
+ }
23
+ sub(other) {
24
+ return this.add(other);
25
+ }
26
+ neg() {
27
+ return this;
28
+ }
29
+ mul(other) {
30
+ if (this.value === 0 || other.value === 0) return new GF256(0);
31
+ return GF256.exp(this.log() + other.log());
32
+ }
33
+ div(other) {
34
+ return this.mul(GF256.exp(GF256_SIZE - other.log() - 1));
35
+ }
36
+ equals(other) {
37
+ return this.value === other.value;
38
+ }
39
+ static zero() {
40
+ return new GF256(0);
41
+ }
42
+ static one() {
43
+ return new GF256(1);
44
+ }
45
+ };
46
+ const EXP = [
47
+ 1,
48
+ 3,
49
+ 5,
50
+ 15,
51
+ 17,
52
+ 51,
53
+ 85,
54
+ 255,
55
+ 26,
56
+ 46,
57
+ 114,
58
+ 150,
59
+ 161,
60
+ 248,
61
+ 19,
62
+ 53,
63
+ 95,
64
+ 225,
65
+ 56,
66
+ 72,
67
+ 216,
68
+ 115,
69
+ 149,
70
+ 164,
71
+ 247,
72
+ 2,
73
+ 6,
74
+ 10,
75
+ 30,
76
+ 34,
77
+ 102,
78
+ 170,
79
+ 229,
80
+ 52,
81
+ 92,
82
+ 228,
83
+ 55,
84
+ 89,
85
+ 235,
86
+ 38,
87
+ 106,
88
+ 190,
89
+ 217,
90
+ 112,
91
+ 144,
92
+ 171,
93
+ 230,
94
+ 49,
95
+ 83,
96
+ 245,
97
+ 4,
98
+ 12,
99
+ 20,
100
+ 60,
101
+ 68,
102
+ 204,
103
+ 79,
104
+ 209,
105
+ 104,
106
+ 184,
107
+ 211,
108
+ 110,
109
+ 178,
110
+ 205,
111
+ 76,
112
+ 212,
113
+ 103,
114
+ 169,
115
+ 224,
116
+ 59,
117
+ 77,
118
+ 215,
119
+ 98,
120
+ 166,
121
+ 241,
122
+ 8,
123
+ 24,
124
+ 40,
125
+ 120,
126
+ 136,
127
+ 131,
128
+ 158,
129
+ 185,
130
+ 208,
131
+ 107,
132
+ 189,
133
+ 220,
134
+ 127,
135
+ 129,
136
+ 152,
137
+ 179,
138
+ 206,
139
+ 73,
140
+ 219,
141
+ 118,
142
+ 154,
143
+ 181,
144
+ 196,
145
+ 87,
146
+ 249,
147
+ 16,
148
+ 48,
149
+ 80,
150
+ 240,
151
+ 11,
152
+ 29,
153
+ 39,
154
+ 105,
155
+ 187,
156
+ 214,
157
+ 97,
158
+ 163,
159
+ 254,
160
+ 25,
161
+ 43,
162
+ 125,
163
+ 135,
164
+ 146,
165
+ 173,
166
+ 236,
167
+ 47,
168
+ 113,
169
+ 147,
170
+ 174,
171
+ 233,
172
+ 32,
173
+ 96,
174
+ 160,
175
+ 251,
176
+ 22,
177
+ 58,
178
+ 78,
179
+ 210,
180
+ 109,
181
+ 183,
182
+ 194,
183
+ 93,
184
+ 231,
185
+ 50,
186
+ 86,
187
+ 250,
188
+ 21,
189
+ 63,
190
+ 65,
191
+ 195,
192
+ 94,
193
+ 226,
194
+ 61,
195
+ 71,
196
+ 201,
197
+ 64,
198
+ 192,
199
+ 91,
200
+ 237,
201
+ 44,
202
+ 116,
203
+ 156,
204
+ 191,
205
+ 218,
206
+ 117,
207
+ 159,
208
+ 186,
209
+ 213,
210
+ 100,
211
+ 172,
212
+ 239,
213
+ 42,
214
+ 126,
215
+ 130,
216
+ 157,
217
+ 188,
218
+ 223,
219
+ 122,
220
+ 142,
221
+ 137,
222
+ 128,
223
+ 155,
224
+ 182,
225
+ 193,
226
+ 88,
227
+ 232,
228
+ 35,
229
+ 101,
230
+ 175,
231
+ 234,
232
+ 37,
233
+ 111,
234
+ 177,
235
+ 200,
236
+ 67,
237
+ 197,
238
+ 84,
239
+ 252,
240
+ 31,
241
+ 33,
242
+ 99,
243
+ 165,
244
+ 244,
245
+ 7,
246
+ 9,
247
+ 27,
248
+ 45,
249
+ 119,
250
+ 153,
251
+ 176,
252
+ 203,
253
+ 70,
254
+ 202,
255
+ 69,
256
+ 207,
257
+ 74,
258
+ 222,
259
+ 121,
260
+ 139,
261
+ 134,
262
+ 145,
263
+ 168,
264
+ 227,
265
+ 62,
266
+ 66,
267
+ 198,
268
+ 81,
269
+ 243,
270
+ 14,
271
+ 18,
272
+ 54,
273
+ 90,
274
+ 238,
275
+ 41,
276
+ 123,
277
+ 141,
278
+ 140,
279
+ 143,
280
+ 138,
281
+ 133,
282
+ 148,
283
+ 167,
284
+ 242,
285
+ 13,
286
+ 23,
287
+ 57,
288
+ 75,
289
+ 221,
290
+ 124,
291
+ 132,
292
+ 151,
293
+ 162,
294
+ 253,
295
+ 28,
296
+ 36,
297
+ 108,
298
+ 180,
299
+ 199,
300
+ 82,
301
+ 246
302
+ ];
303
+ const LOG = [
304
+ 0,
305
+ 25,
306
+ 1,
307
+ 50,
308
+ 2,
309
+ 26,
310
+ 198,
311
+ 75,
312
+ 199,
313
+ 27,
314
+ 104,
315
+ 51,
316
+ 238,
317
+ 223,
318
+ 3,
319
+ 100,
320
+ 4,
321
+ 224,
322
+ 14,
323
+ 52,
324
+ 141,
325
+ 129,
326
+ 239,
327
+ 76,
328
+ 113,
329
+ 8,
330
+ 200,
331
+ 248,
332
+ 105,
333
+ 28,
334
+ 193,
335
+ 125,
336
+ 194,
337
+ 29,
338
+ 181,
339
+ 249,
340
+ 185,
341
+ 39,
342
+ 106,
343
+ 77,
344
+ 228,
345
+ 166,
346
+ 114,
347
+ 154,
348
+ 201,
349
+ 9,
350
+ 120,
351
+ 101,
352
+ 47,
353
+ 138,
354
+ 5,
355
+ 33,
356
+ 15,
357
+ 225,
358
+ 36,
359
+ 18,
360
+ 240,
361
+ 130,
362
+ 69,
363
+ 53,
364
+ 147,
365
+ 218,
366
+ 142,
367
+ 150,
368
+ 143,
369
+ 219,
370
+ 189,
371
+ 54,
372
+ 208,
373
+ 206,
374
+ 148,
375
+ 19,
376
+ 92,
377
+ 210,
378
+ 241,
379
+ 64,
380
+ 70,
381
+ 131,
382
+ 56,
383
+ 102,
384
+ 221,
385
+ 253,
386
+ 48,
387
+ 191,
388
+ 6,
389
+ 139,
390
+ 98,
391
+ 179,
392
+ 37,
393
+ 226,
394
+ 152,
395
+ 34,
396
+ 136,
397
+ 145,
398
+ 16,
399
+ 126,
400
+ 110,
401
+ 72,
402
+ 195,
403
+ 163,
404
+ 182,
405
+ 30,
406
+ 66,
407
+ 58,
408
+ 107,
409
+ 40,
410
+ 84,
411
+ 250,
412
+ 133,
413
+ 61,
414
+ 186,
415
+ 43,
416
+ 121,
417
+ 10,
418
+ 21,
419
+ 155,
420
+ 159,
421
+ 94,
422
+ 202,
423
+ 78,
424
+ 212,
425
+ 172,
426
+ 229,
427
+ 243,
428
+ 115,
429
+ 167,
430
+ 87,
431
+ 175,
432
+ 88,
433
+ 168,
434
+ 80,
435
+ 244,
436
+ 234,
437
+ 214,
438
+ 116,
439
+ 79,
440
+ 174,
441
+ 233,
442
+ 213,
443
+ 231,
444
+ 230,
445
+ 173,
446
+ 232,
447
+ 44,
448
+ 215,
449
+ 117,
450
+ 122,
451
+ 235,
452
+ 22,
453
+ 11,
454
+ 245,
455
+ 89,
456
+ 203,
457
+ 95,
458
+ 176,
459
+ 156,
460
+ 169,
461
+ 81,
462
+ 160,
463
+ 127,
464
+ 12,
465
+ 246,
466
+ 111,
467
+ 23,
468
+ 196,
469
+ 73,
470
+ 236,
471
+ 216,
472
+ 67,
473
+ 31,
474
+ 45,
475
+ 164,
476
+ 118,
477
+ 123,
478
+ 183,
479
+ 204,
480
+ 187,
481
+ 62,
482
+ 90,
483
+ 251,
484
+ 96,
485
+ 177,
486
+ 134,
487
+ 59,
488
+ 82,
489
+ 161,
490
+ 108,
491
+ 170,
492
+ 85,
493
+ 41,
494
+ 157,
495
+ 151,
496
+ 178,
497
+ 135,
498
+ 144,
499
+ 97,
500
+ 190,
501
+ 220,
502
+ 252,
503
+ 188,
504
+ 149,
505
+ 207,
506
+ 205,
507
+ 55,
508
+ 63,
509
+ 91,
510
+ 209,
511
+ 83,
512
+ 57,
513
+ 132,
514
+ 60,
515
+ 65,
516
+ 162,
517
+ 109,
518
+ 71,
519
+ 20,
520
+ 42,
521
+ 158,
522
+ 93,
523
+ 86,
524
+ 242,
525
+ 211,
526
+ 171,
527
+ 68,
528
+ 17,
529
+ 146,
530
+ 217,
531
+ 35,
532
+ 32,
533
+ 46,
534
+ 137,
535
+ 180,
536
+ 124,
537
+ 184,
538
+ 38,
539
+ 119,
540
+ 153,
541
+ 227,
542
+ 165,
543
+ 103,
544
+ 74,
545
+ 237,
546
+ 222,
547
+ 197,
548
+ 49,
549
+ 254,
550
+ 24,
551
+ 13,
552
+ 99,
553
+ 140,
554
+ 128,
555
+ 192,
556
+ 247,
557
+ 112,
558
+ 7
559
+ ];
560
+ /**
561
+ * A polynomial over the field GF(2⁸).
562
+ */
563
+ var Polynomial = class Polynomial {
564
+ /**
565
+ * Construct a new Polynomial over [GF256] from the given coefficients.
566
+ * The first coefficient is the constant term.
567
+ */
568
+ constructor(coefficients) {
569
+ this.coefficients = coefficients.slice();
570
+ while (this.coefficients.length > 0 && this.coefficients[this.coefficients.length - 1].value === 0) this.coefficients.pop();
571
+ }
572
+ /**
573
+ * Construct a polynomial from the given bytes.
574
+ * Each byte is a coefficient of the polynomial starting from the constant term.
575
+ */
576
+ static fromBytes(bytes) {
577
+ return new Polynomial(Array.from(bytes, (b) => new GF256(b)));
578
+ }
579
+ degree() {
580
+ if (this.coefficients.length === 0) return 0;
581
+ return this.coefficients.length - 1;
582
+ }
583
+ /** Get the coefficient of the polynomial at the given index. */
584
+ getCoefficient(index) {
585
+ if (index >= this.coefficients.length) return GF256.zero();
586
+ return this.coefficients[index];
587
+ }
588
+ /** Add two polynomials. */
589
+ add(other) {
590
+ const degree = Math.max(this.degree(), other.degree());
591
+ return new Polynomial(Array.from({ length: degree + 1 }, (_, i) => this.getCoefficient(i).add(other.getCoefficient(i))));
592
+ }
593
+ /** Multiply two polynomials. */
594
+ mul(other) {
595
+ const degree = this.degree() + other.degree();
596
+ return new Polynomial(Array.from({ length: degree + 1 }, (_, i) => {
597
+ let sum = GF256.zero();
598
+ for (let j = 0; j <= i; j++) if (j <= this.degree() && i - j <= other.degree()) sum = sum.add(this.getCoefficient(j).mul(other.getCoefficient(i - j)));
599
+ return sum;
600
+ }));
601
+ }
602
+ /** The polynomial s * this. */
603
+ scale(s) {
604
+ return new Polynomial(this.coefficients.map((c) => c.mul(s)));
605
+ }
606
+ /** The polynomial (1 / s) * this. */
607
+ div(s) {
608
+ return this.scale(new GF256(1).div(s));
609
+ }
610
+ /** The polynomial x + c. */
611
+ static monic_linear(c) {
612
+ return new Polynomial([c, GF256.one()]);
613
+ }
614
+ /** The zero polynomial. */
615
+ static zero() {
616
+ return new Polynomial([]);
617
+ }
618
+ /** The polynomial 1. */
619
+ static one() {
620
+ return new Polynomial([GF256.one()]);
621
+ }
622
+ /** Given a set of coordinates, interpolate a polynomial. */
623
+ static interpolate(coordinates) {
624
+ if (coordinates.length < 1) throw new Error("At least one coefficient is required");
625
+ if (hasDuplicates(coordinates.map(({ x }) => x.value))) throw new Error("Coefficients must have unique x values");
626
+ return coordinates.reduce((sum, { x: x_j, y: y_j }, j) => sum.add(coordinates.filter((_, i) => i !== j).reduce((product, { x: x_i }) => product.mul(Polynomial.monic_linear(x_i.neg()).div(x_j.sub(x_i))), Polynomial.one()).scale(y_j)), Polynomial.zero());
627
+ }
628
+ /** Given a set of coordinates, interpolate a polynomial and evaluate it at x = 0. */
629
+ static combine(coordinates) {
630
+ if (coordinates.length < 1) throw new Error("At least one coefficient is required");
631
+ if (hasDuplicates(coordinates.map(({ x }) => x.value))) throw new Error("Coefficients must have unique x values");
632
+ const quotient = coordinates.reduce((sum, { x: x_j, y: y_j }, j) => {
633
+ const denominator = x_j.mul(coordinates.filter((_, i) => i !== j).reduce((product, { x: x_i }) => product.mul(x_i.sub(x_j)), GF256.one()));
634
+ return sum.add(y_j.div(denominator));
635
+ }, GF256.zero());
636
+ return coordinates.reduce((product, { x }) => product.mul(x), GF256.one()).mul(quotient);
637
+ }
638
+ /** Evaluate the polynomial at x. */
639
+ evaluate(x) {
640
+ return this.coefficients.toReversed().reduce((sum, coefficient) => sum.mul(x).add(coefficient), GF256.zero());
641
+ }
642
+ };
643
+ function toInternalShare(share) {
644
+ return {
645
+ index: new GF256(share.index),
646
+ share: Array.from(share.share, (byte) => new GF256(byte))
647
+ };
648
+ }
649
+ function toShare(internalShare) {
650
+ return {
651
+ index: internalShare.index.value,
652
+ share: new Uint8Array(internalShare.share.map((byte) => byte.value))
653
+ };
654
+ }
655
+ /**
656
+ * Sample a random polynomial with the given constant and degree.
657
+ *
658
+ * @param constant The constant term of the polynomial.
659
+ * @param degree The degree of the polynomial.
660
+ * @returns A random polynomial with the given constant and degree.
661
+ */
662
+ function samplePolynomial(constant, degree) {
663
+ const randomCoefficients = new Uint8Array(degree);
664
+ crypto.getRandomValues(randomCoefficients);
665
+ return Polynomial.fromBytes(new Uint8Array([constant.value, ...randomCoefficients]));
666
+ }
667
+ /**
668
+ * Split a secret into shares.
669
+ *
670
+ * @param secret The secret to split.
671
+ * @param threshold The minimum number of shares required to reconstruct the secret.
672
+ * @param total The total number of shares to generate.
673
+ * @returns The shares.
674
+ */
675
+ function split(secret, threshold, total) {
676
+ if (threshold > total || threshold < 1 || total >= GF256_SIZE) throw new Error(`Invalid threshold ${threshold} or total ${total}`);
677
+ const polynomials = Array.from(secret, (s) => samplePolynomial(new GF256(s), threshold - 1));
678
+ return Array.from({ length: total }, (_, i) => {
679
+ const index = new GF256(i + 1);
680
+ return toShare({
681
+ index,
682
+ share: polynomials.map((p) => p.evaluate(index))
683
+ });
684
+ });
685
+ }
686
+ /** Validate a set of shares and return them in internal shares representation along with the length of the shares. */
687
+ function validateShares(shares) {
688
+ if (shares.length < 1) throw new Error("At least one share is required");
689
+ if (!allEqual(shares.map(({ share }) => share.length))) throw new Error("All shares must have the same length");
690
+ if (hasDuplicates(shares.map(({ index }) => index))) throw new Error("Shares must have unique indices");
691
+ const internalShares = shares.map(toInternalShare);
692
+ return {
693
+ internalShares,
694
+ length: internalShares[0].share.length
695
+ };
696
+ }
697
+ /**
698
+ * Combine shares into a secret. If fewer than the threshold number of shares are provided,
699
+ * the result will be indistinguishable from random.
700
+ *
701
+ * @param shares The shares to combine.
702
+ * @returns The secret.
703
+ */
704
+ function combine(shares) {
705
+ const { internalShares, length } = validateShares(shares);
706
+ return new Uint8Array(Array.from({ length }, (_, i) => Polynomial.combine(internalShares.map(({ index, share }) => ({
707
+ x: index,
708
+ y: share[i]
709
+ }))).value));
710
+ }
711
+ /**
712
+ * Interpolate a polynomial from the given shares.
713
+ *
714
+ * @param shares The shares to interpolate from.
715
+ * @returns A function that evaluates the polynomial at a given x.
716
+ */
717
+ function interpolate(shares) {
718
+ const { internalShares, length } = validateShares(shares);
719
+ const polynomials = Array.from({ length }, (_, i) => Polynomial.interpolate(internalShares.map(({ index, share }) => ({
720
+ x: index,
721
+ y: share[i]
722
+ }))));
723
+ return (x) => {
724
+ return new Uint8Array(polynomials.map((p) => p.evaluate(new GF256(x)).value));
725
+ };
726
+ }
727
+
728
+ //#endregion
729
+ export { combine, interpolate, split };
730
+ //# sourceMappingURL=shamir.mjs.map