lib0 0.2.77 → 0.2.79

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 (202) hide show
  1. package/README.md +1 -1
  2. package/array.d.ts +1 -0
  3. package/array.d.ts.map +1 -1
  4. package/array.js +18 -0
  5. package/binary.test.d.ts.map +1 -1
  6. package/buffer.d.ts +3 -0
  7. package/buffer.d.ts.map +1 -1
  8. package/buffer.js +40 -0
  9. package/buffer.test.d.ts +2 -1
  10. package/buffer.test.d.ts.map +1 -1
  11. package/cache.d.ts.map +1 -1
  12. package/cache.js +0 -1
  13. package/cache.test.d.ts.map +1 -1
  14. package/component.d.ts +5 -5
  15. package/component.d.ts.map +1 -1
  16. package/component.js +14 -11
  17. package/coverage/tmp/coverage-10499-1691528887100-0.json +1 -0
  18. package/decoding.d.ts +2 -0
  19. package/decoding.d.ts.map +1 -1
  20. package/decoding.js +26 -0
  21. package/dist/aes-gcm.cjs +161 -0
  22. package/dist/aes-gcm.cjs.map +1 -0
  23. package/dist/{array-fd99bc23.cjs → array-704ca50e.cjs} +22 -2
  24. package/dist/array-704ca50e.cjs.map +1 -0
  25. package/dist/array.cjs +2 -1
  26. package/dist/array.cjs.map +1 -1
  27. package/dist/array.d.ts +1 -0
  28. package/dist/array.d.ts.map +1 -1
  29. package/dist/binary.test.d.ts.map +1 -1
  30. package/dist/{broadcastchannel-fff713ef.cjs → broadcastchannel-7801969a.cjs} +2 -2
  31. package/dist/{broadcastchannel-fff713ef.cjs.map → broadcastchannel-7801969a.cjs.map} +1 -1
  32. package/dist/broadcastchannel.cjs +9 -9
  33. package/dist/{buffer-621617f6.cjs → buffer-c5d69c70.cjs} +126 -7
  34. package/dist/buffer-c5d69c70.cjs.map +1 -0
  35. package/dist/buffer.cjs +12 -9
  36. package/dist/buffer.cjs.map +1 -1
  37. package/dist/buffer.d.ts +3 -0
  38. package/dist/buffer.d.ts.map +1 -1
  39. package/dist/buffer.test.d.ts +2 -1
  40. package/dist/buffer.test.d.ts.map +1 -1
  41. package/dist/cache.cjs +5 -3
  42. package/dist/cache.cjs.map +1 -1
  43. package/dist/cache.d.ts.map +1 -1
  44. package/dist/cache.test.d.ts.map +1 -1
  45. package/dist/common.cjs +37 -0
  46. package/dist/common.cjs.map +1 -0
  47. package/dist/component.cjs +20 -17
  48. package/dist/component.cjs.map +1 -1
  49. package/dist/component.d.ts +5 -5
  50. package/dist/component.d.ts.map +1 -1
  51. package/dist/decoding.cjs +9 -7
  52. package/dist/decoding.cjs.map +1 -1
  53. package/dist/decoding.d.ts +2 -0
  54. package/dist/decoding.d.ts.map +1 -1
  55. package/dist/{diff-18852f48.cjs → diff-fbaa426b.cjs} +2 -2
  56. package/dist/{diff-18852f48.cjs.map → diff-fbaa426b.cjs.map} +1 -1
  57. package/dist/diff.cjs +4 -4
  58. package/dist/ecdsa.cjs +118 -0
  59. package/dist/ecdsa.cjs.map +1 -0
  60. package/dist/encoding.cjs +9 -7
  61. package/dist/encoding.cjs.map +1 -1
  62. package/dist/encoding.d.ts +2 -0
  63. package/dist/encoding.d.ts.map +1 -1
  64. package/dist/encoding.test.d.ts +1 -0
  65. package/dist/encoding.test.d.ts.map +1 -1
  66. package/dist/{environment-0c5ff22b.cjs → environment-ad129e4d.cjs} +3 -3
  67. package/dist/{environment-0c5ff22b.cjs.map → environment-ad129e4d.cjs.map} +1 -1
  68. package/dist/environment.cjs +5 -5
  69. package/dist/{function-831844d3.cjs → function-314fdc56.cjs} +3 -3
  70. package/dist/{function-831844d3.cjs.map → function-314fdc56.cjs.map} +1 -1
  71. package/dist/function.cjs +3 -3
  72. package/dist/hash/rabin-gf2-polynomial.d.ts +45 -0
  73. package/dist/hash/rabin-gf2-polynomial.d.ts.map +1 -0
  74. package/dist/hash/rabin-uncached.d.ts +29 -0
  75. package/dist/hash/rabin-uncached.d.ts.map +1 -0
  76. package/dist/hash/rabin.d.ts +27 -0
  77. package/dist/hash/rabin.d.ts.map +1 -0
  78. package/dist/hash/rabin.test.d.ts +8 -0
  79. package/dist/hash/rabin.test.d.ts.map +1 -0
  80. package/dist/hash/sha256.fallback.d.ts +2 -0
  81. package/dist/hash/sha256.fallback.d.ts.map +1 -0
  82. package/dist/hash/sha256.node.d.ts +2 -0
  83. package/dist/hash/sha256.node.d.ts.map +1 -0
  84. package/dist/hash/sha256.test.d.ts +6 -0
  85. package/dist/hash/sha256.test.d.ts.map +1 -0
  86. package/dist/index.cjs +11 -11
  87. package/dist/list.cjs +3 -3
  88. package/dist/logging.cjs +5 -5
  89. package/dist/logging.common.cjs +21 -21
  90. package/dist/logging.common.cjs.map +1 -1
  91. package/dist/logging.node.cjs +5 -5
  92. package/dist/logging.test.d.ts.map +1 -1
  93. package/dist/{number-dc113762.cjs → number-466d8922.cjs} +29 -10
  94. package/dist/number-466d8922.cjs.map +1 -0
  95. package/dist/number.cjs +2 -1
  96. package/dist/number.cjs.map +1 -1
  97. package/dist/number.d.ts +1 -0
  98. package/dist/number.d.ts.map +1 -1
  99. package/dist/number.test.d.ts +1 -1
  100. package/dist/number.test.d.ts.map +1 -1
  101. package/dist/{object-aad630ed.cjs → object-fecf6a7b.cjs} +2 -1
  102. package/dist/object-fecf6a7b.cjs.map +1 -0
  103. package/dist/object.cjs +1 -1
  104. package/dist/object.d.ts.map +1 -1
  105. package/dist/observable.cjs +1 -1
  106. package/dist/performance.node.cjs +3 -3
  107. package/dist/{prng-9ccc85f7.cjs → prng-1149c8c4.cjs} +3 -3
  108. package/dist/{prng-9ccc85f7.cjs.map → prng-1149c8c4.cjs.map} +1 -1
  109. package/dist/prng.cjs +8 -8
  110. package/dist/prng.test.d.ts.map +1 -1
  111. package/dist/queue.cjs.map +1 -1
  112. package/dist/queue.d.ts.map +1 -1
  113. package/dist/rabin-gf2-polynomial.cjs +437 -0
  114. package/dist/rabin-gf2-polynomial.cjs.map +1 -0
  115. package/dist/rabin-uncached.cjs +87 -0
  116. package/dist/rabin-uncached.cjs.map +1 -0
  117. package/dist/rabin.cjs +125 -0
  118. package/dist/rabin.cjs.map +1 -0
  119. package/dist/random.cjs +12 -0
  120. package/dist/random.cjs.map +1 -1
  121. package/dist/random.d.ts +1 -1
  122. package/dist/random.d.ts.map +1 -1
  123. package/dist/rsa-oaep.cjs +112 -0
  124. package/dist/rsa-oaep.cjs.map +1 -0
  125. package/dist/set.test.d.ts.map +1 -1
  126. package/dist/sha256.fallback.cjs +179 -0
  127. package/dist/sha256.fallback.cjs.map +1 -0
  128. package/dist/sha256.node.cjs +17 -0
  129. package/dist/sha256.node.cjs.map +1 -0
  130. package/dist/{string-e7eb0c1d.cjs → string-6d104757.cjs} +10 -2
  131. package/dist/string-6d104757.cjs.map +1 -0
  132. package/dist/string.cjs +3 -2
  133. package/dist/string.cjs.map +1 -1
  134. package/dist/string.d.ts +5 -0
  135. package/dist/string.d.ts.map +1 -1
  136. package/dist/testing.cjs +23 -17
  137. package/dist/testing.cjs.map +1 -1
  138. package/dist/testing.d.ts +13 -7
  139. package/dist/testing.d.ts.map +1 -1
  140. package/dist/url.cjs +1 -1
  141. package/dist/webcrypto.node.cjs.map +1 -1
  142. package/dist/webcrypto.node.d.ts.map +1 -1
  143. package/dist/{websocket-0632cb8c.cjs → websocket-44e4ead5.cjs} +1 -1
  144. package/dist/{websocket-0632cb8c.cjs.map → websocket-44e4ead5.cjs.map} +1 -1
  145. package/dist/websocket.cjs +2 -2
  146. package/encoding.d.ts +2 -0
  147. package/encoding.d.ts.map +1 -1
  148. package/encoding.js +42 -0
  149. package/encoding.test.d.ts +1 -0
  150. package/encoding.test.d.ts.map +1 -1
  151. package/hash/rabin-gf2-polynomial.d.ts +45 -0
  152. package/hash/rabin-gf2-polynomial.d.ts.map +1 -0
  153. package/hash/rabin-gf2-polynomial.js +379 -0
  154. package/hash/rabin-uncached.d.ts +29 -0
  155. package/hash/rabin-uncached.d.ts.map +1 -0
  156. package/hash/rabin-uncached.js +68 -0
  157. package/hash/rabin.d.ts +27 -0
  158. package/hash/rabin.d.ts.map +1 -0
  159. package/hash/rabin.js +100 -0
  160. package/hash/rabin.test.d.ts +8 -0
  161. package/hash/rabin.test.d.ts.map +1 -0
  162. package/hash/sha256.fallback.d.ts +2 -0
  163. package/hash/sha256.fallback.d.ts.map +1 -0
  164. package/hash/sha256.fallback.js +172 -0
  165. package/hash/sha256.node.d.ts +2 -0
  166. package/hash/sha256.node.d.ts.map +1 -0
  167. package/hash/sha256.node.js +10 -0
  168. package/hash/sha256.test.d.ts +6 -0
  169. package/hash/sha256.test.d.ts.map +1 -0
  170. package/logging.common.js +16 -16
  171. package/logging.test.d.ts.map +1 -1
  172. package/number.d.ts +1 -0
  173. package/number.d.ts.map +1 -1
  174. package/number.js +17 -0
  175. package/number.test.d.ts +1 -1
  176. package/number.test.d.ts.map +1 -1
  177. package/object.d.ts.map +1 -1
  178. package/object.js +1 -0
  179. package/package.json +24 -6
  180. package/prng.test.d.ts.map +1 -1
  181. package/queue.d.ts.map +1 -1
  182. package/queue.js +0 -1
  183. package/random.d.ts +1 -1
  184. package/random.d.ts.map +1 -1
  185. package/random.js +4 -1
  186. package/set.test.d.ts.map +1 -1
  187. package/string.d.ts +5 -0
  188. package/string.d.ts.map +1 -1
  189. package/string.js +6 -0
  190. package/test.html +2 -0
  191. package/test.js +4 -0
  192. package/testing.d.ts +13 -7
  193. package/testing.d.ts.map +1 -1
  194. package/testing.js +14 -8
  195. package/webcrypto.node.d.ts.map +1 -1
  196. package/webcrypto.node.js +0 -1
  197. package/coverage/tmp/coverage-36234-1685177795346-0.json +0 -1
  198. package/dist/array-fd99bc23.cjs.map +0 -1
  199. package/dist/buffer-621617f6.cjs.map +0 -1
  200. package/dist/number-dc113762.cjs.map +0 -1
  201. package/dist/object-aad630ed.cjs.map +0 -1
  202. package/dist/string-e7eb0c1d.cjs.map +0 -1
@@ -0,0 +1,437 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var math = require('./math-08e068f9.cjs');
6
+ var webcrypto = require('lib0/webcrypto');
7
+ var array = require('./array-704ca50e.cjs');
8
+ var encoding = require('./buffer-c5d69c70.cjs');
9
+ require('./set-0f209abb.cjs');
10
+ require('./string-6d104757.cjs');
11
+ require('./environment-ad129e4d.cjs');
12
+ require('./map-9a5915e4.cjs');
13
+ require('./conditions-f5c0c102.cjs');
14
+ require('./storage.cjs');
15
+ require('./function-314fdc56.cjs');
16
+ require('./object-fecf6a7b.cjs');
17
+ require('./binary-ac8e39e2.cjs');
18
+ require('./number-466d8922.cjs');
19
+ require('./error-8582d695.cjs');
20
+
21
+ function _interopNamespace(e) {
22
+ if (e && e.__esModule) return e;
23
+ var n = Object.create(null);
24
+ if (e) {
25
+ Object.keys(e).forEach(function (k) {
26
+ if (k !== 'default') {
27
+ var d = Object.getOwnPropertyDescriptor(e, k);
28
+ Object.defineProperty(n, k, d.get ? d : {
29
+ enumerable: true,
30
+ get: function () { return e[k]; }
31
+ });
32
+ }
33
+ });
34
+ }
35
+ n["default"] = e;
36
+ return Object.freeze(n);
37
+ }
38
+
39
+ var webcrypto__namespace = /*#__PURE__*/_interopNamespace(webcrypto);
40
+
41
+ /**
42
+ * The idea of the Rabin fingerprint algorithm is to represent the binary as a polynomial in a
43
+ * finite field (Galois Field G(2)). The polynomial will then be taken "modulo" by an irreducible
44
+ * polynomial of the desired size.
45
+ *
46
+ * This implementation is inefficient and is solely used to verify the actually performant
47
+ * implementation in `./rabin.js`.
48
+ *
49
+ * @module rabin-gf2-polynomial
50
+ */
51
+
52
+ /**
53
+ * @param {number} degree
54
+ */
55
+ const _degreeToMinByteLength = degree => math.floor(degree / 8) + 1;
56
+
57
+ /**
58
+ * This is a GF2 Polynomial abstraction that is not meant for production!
59
+ *
60
+ * It is easy to understand and it's correctness is as obvious as possible. It can be used to verify
61
+ * efficient implementations of algorithms on GF2.
62
+ */
63
+ class GF2Polynomial {
64
+ constructor () {
65
+ /**
66
+ * @type {Set<number>}
67
+ */
68
+ this.degrees = new Set();
69
+ }
70
+ }
71
+
72
+ /**
73
+ * From Uint8Array (MSB).
74
+ *
75
+ * @param {Uint8Array} bytes
76
+ */
77
+ const createFromBytes = bytes => {
78
+ const p = new GF2Polynomial();
79
+ for (let bsi = bytes.length - 1, currDegree = 0; bsi >= 0; bsi--) {
80
+ const currByte = bytes[bsi];
81
+ for (let i = 0; i < 8; i++) {
82
+ if (((currByte >>> i) & 1) === 1) {
83
+ p.degrees.add(currDegree);
84
+ }
85
+ currDegree++;
86
+ }
87
+ }
88
+ return p
89
+ };
90
+
91
+ /**
92
+ * Transform to Uint8Array (MSB).
93
+ *
94
+ * @param {GF2Polynomial} p
95
+ * @param {number} byteLength
96
+ */
97
+ const toUint8Array = (p, byteLength = _degreeToMinByteLength(getHighestDegree(p))) => {
98
+ const buf = encoding.createUint8ArrayFromLen(byteLength);
99
+ /**
100
+ * @param {number} i
101
+ */
102
+ const setBit = i => {
103
+ const bi = math.floor(i / 8);
104
+ buf[buf.length - 1 - bi] |= (1 << (i % 8));
105
+ };
106
+ p.degrees.forEach(setBit);
107
+ return buf
108
+ };
109
+
110
+ /**
111
+ * Create from unsigned integer (max 32bit uint) - read most-significant-byte first.
112
+ *
113
+ * @param {number} uint
114
+ */
115
+ const createFromUint = uint => {
116
+ const buf = new Uint8Array(4);
117
+ for (let i = 0; i < 4; i++) {
118
+ buf[i] = uint >>> 8 * (3 - i);
119
+ }
120
+ return createFromBytes(buf)
121
+ };
122
+
123
+ /**
124
+ * Create a random polynomial of a specified degree.
125
+ *
126
+ * @param {number} degree
127
+ */
128
+ const createRandom = degree => {
129
+ const bs = new Uint8Array(_degreeToMinByteLength(degree));
130
+ webcrypto__namespace.getRandomValues(bs);
131
+ // Get first byte and explicitly set the bit of "degree" to 1 (the result must have the specified
132
+ // degree).
133
+ const firstByte = bs[0] | 1 << (degree % 8);
134
+ // Find out how many bits of the first byte need to be filled with zeros because they are >degree.
135
+ const zeros = 7 - (degree % 8);
136
+ bs[0] = ((firstByte << zeros) & 0xff) >>> zeros;
137
+ return createFromBytes(bs)
138
+ };
139
+
140
+ /**
141
+ * @param {GF2Polynomial} p
142
+ * @return number
143
+ */
144
+ const getHighestDegree = p => array.fold(array.from(p.degrees), 0, math.max);
145
+
146
+ /**
147
+ * Add (+) p2 int the p1 polynomial.
148
+ *
149
+ * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.
150
+ *
151
+ * @param {GF2Polynomial} p1
152
+ * @param {GF2Polynomial} p2
153
+ */
154
+ const addInto = (p1, p2) => {
155
+ p2.degrees.forEach(degree => {
156
+ if (p1.degrees.has(degree)) {
157
+ p1.degrees.delete(degree);
158
+ } else {
159
+ p1.degrees.add(degree);
160
+ }
161
+ });
162
+ };
163
+
164
+ /**
165
+ * Or (|) p2 into the p1 polynomial.
166
+ *
167
+ * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.
168
+ *
169
+ * @param {GF2Polynomial} p1
170
+ * @param {GF2Polynomial} p2
171
+ */
172
+ const orInto = (p1, p2) => {
173
+ p2.degrees.forEach(degree => {
174
+ p1.degrees.add(degree);
175
+ });
176
+ };
177
+
178
+ /**
179
+ * Add (+) p2 to the p1 polynomial.
180
+ *
181
+ * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.
182
+ *
183
+ * @param {GF2Polynomial} p1
184
+ * @param {GF2Polynomial} p2
185
+ */
186
+ const add = (p1, p2) => {
187
+ const result = new GF2Polynomial();
188
+ p2.degrees.forEach(degree => {
189
+ if (!p1.degrees.has(degree)) {
190
+ result.degrees.add(degree);
191
+ }
192
+ });
193
+ p1.degrees.forEach(degree => {
194
+ if (!p2.degrees.has(degree)) {
195
+ result.degrees.add(degree);
196
+ }
197
+ });
198
+ return result
199
+ };
200
+
201
+ /**
202
+ * Add (+) p2 to the p1 polynomial.
203
+ *
204
+ * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.
205
+ *
206
+ * @param {GF2Polynomial} p
207
+ */
208
+ const clone = (p) => {
209
+ const result = new GF2Polynomial();
210
+ p.degrees.forEach(d => result.degrees.add(d));
211
+ return result
212
+ };
213
+
214
+ /**
215
+ * Add (+) p2 to the p1 polynomial.
216
+ *
217
+ * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.
218
+ *
219
+ * @param {GF2Polynomial} p
220
+ * @param {number} degree
221
+ */
222
+ const addDegreeInto = (p, degree) => {
223
+ if (p.degrees.has(degree)) {
224
+ p.degrees.delete(degree);
225
+ } else {
226
+ p.degrees.add(degree);
227
+ }
228
+ };
229
+
230
+ /**
231
+ * Multiply (•) p1 with p2 and store the result in p1.
232
+ *
233
+ * @param {GF2Polynomial} p1
234
+ * @param {GF2Polynomial} p2
235
+ */
236
+ const multiply = (p1, p2) => {
237
+ const result = new GF2Polynomial();
238
+ p1.degrees.forEach(degree1 => {
239
+ p2.degrees.forEach(degree2 => {
240
+ addDegreeInto(result, degree1 + degree2);
241
+ });
242
+ });
243
+ return result
244
+ };
245
+
246
+ /**
247
+ * Multiply (•) p1 with p2 and store the result in p1.
248
+ *
249
+ * @param {GF2Polynomial} p
250
+ * @param {number} shift
251
+ */
252
+ const shiftLeft = (p, shift) => {
253
+ const result = new GF2Polynomial();
254
+ p.degrees.forEach(degree => {
255
+ const r = degree + shift;
256
+ r >= 0 && result.degrees.add(r);
257
+ });
258
+ return result
259
+ };
260
+
261
+ /**
262
+ * Computes p1 % p2. I.e. the remainder of p1/p2.
263
+ *
264
+ * @param {GF2Polynomial} p1
265
+ * @param {GF2Polynomial} p2
266
+ */
267
+ const mod = (p1, p2) => {
268
+ const maxDeg1 = getHighestDegree(p1);
269
+ const maxDeg2 = getHighestDegree(p2);
270
+ const result = clone(p1);
271
+ for (let i = maxDeg1 - maxDeg2; i >= 0; i--) {
272
+ if (result.degrees.has(maxDeg2 + i)) {
273
+ const shifted = shiftLeft(p2, i);
274
+ addInto(result, shifted);
275
+ }
276
+ }
277
+ return result
278
+ };
279
+
280
+ /**
281
+ * Computes (p^e mod m).
282
+ *
283
+ * http://en.wikipedia.org/wiki/Modular_exponentiation
284
+ *
285
+ * @param {GF2Polynomial} p
286
+ * @param {number} e
287
+ * @param {GF2Polynomial} m
288
+ */
289
+ const modPow = (p, e, m) => {
290
+ let result = ONE;
291
+ while (true) {
292
+ if ((e & 1) === 1) {
293
+ result = mod(multiply(result, p), m);
294
+ }
295
+ e >>>= 1;
296
+ if (e === 0) {
297
+ return result
298
+ }
299
+ p = mod(multiply(p, p), m);
300
+ }
301
+ };
302
+
303
+ /**
304
+ * Find the greatest common divisor using Euclid's Algorithm.
305
+ *
306
+ * @param {GF2Polynomial} p1
307
+ * @param {GF2Polynomial} p2
308
+ */
309
+ const gcd = (p1, p2) => {
310
+ while (p2.degrees.size > 0) {
311
+ const modded = mod(p1, p2);
312
+ p1 = p2;
313
+ p2 = modded;
314
+ }
315
+ return p1
316
+ };
317
+
318
+ /**
319
+ * true iff p1 equals p2
320
+ *
321
+ * @param {GF2Polynomial} p1
322
+ * @param {GF2Polynomial} p2
323
+ */
324
+ const equals = (p1, p2) => {
325
+ if (p1.degrees.size !== p2.degrees.size) return false
326
+ for (const d of p1.degrees) {
327
+ if (!p2.degrees.has(d)) return false
328
+ }
329
+ return true
330
+ };
331
+
332
+ const X = createFromBytes(new Uint8Array([2]));
333
+ const ONE = createFromBytes(new Uint8Array([1]));
334
+
335
+ /**
336
+ * Computes ( x^(2^p) - x ) mod f
337
+ *
338
+ * (shamelessly copied from
339
+ * https://github.com/opendedup/rabinfingerprint/blob/master/src/org/rabinfingerprint/polynomial/Polynomial.java)
340
+ *
341
+ * @param {GF2Polynomial} f
342
+ * @param {number} p
343
+ */
344
+ const reduceExponent = (f, p) => {
345
+ // compute (x^q^p mod f)
346
+ const q2p = math.pow(2, p);
347
+ const x2q2p = modPow(X, q2p, f);
348
+ // subtract (x mod f)
349
+ return mod(add(x2q2p, X), f)
350
+ };
351
+
352
+ /**
353
+ * BenOr Reducibility Test
354
+ *
355
+ * Tests and Constructions of Irreducible Polynomials over Finite Fields
356
+ * (1997) Shuhong Gao, Daniel Panario
357
+ *
358
+ * http://citeseer.ist.psu.edu/cache/papers/cs/27167/http:zSzzSzwww.math.clemson.eduzSzfacultyzSzGaozSzpaperszSzGP97a.pdf/gao97tests.pdf
359
+ *
360
+ * @param {GF2Polynomial} p
361
+ */
362
+ const isIrreducibleBenOr = p => {
363
+ const degree = getHighestDegree(p);
364
+ for (let i = 1; i < degree / 2; i++) {
365
+ const b = reduceExponent(p, i);
366
+ const g = gcd(p, b);
367
+ if (!equals(g, ONE)) {
368
+ return false
369
+ }
370
+ }
371
+ return true
372
+ };
373
+
374
+ /**
375
+ * @param {number} degree
376
+ */
377
+ const createIrreducible = degree => {
378
+ while (true) {
379
+ const p = createRandom(degree);
380
+ if (isIrreducibleBenOr(p)) return p
381
+ }
382
+ };
383
+
384
+ /**
385
+ * Create a fingerprint of buf using the irreducible polynomial m.
386
+ *
387
+ * @param {Uint8Array} buf
388
+ * @param {GF2Polynomial} m
389
+ */
390
+ const fingerprint = (buf, m) => toUint8Array(mod(createFromBytes(buf), m), _degreeToMinByteLength(getHighestDegree(m) - 1));
391
+
392
+ class RabinPolynomialEncoder {
393
+ /**
394
+ * @param {GF2Polynomial} m The irreducible polynomial
395
+ */
396
+ constructor (m) {
397
+ this.fingerprint = new GF2Polynomial();
398
+ this.m = m;
399
+ }
400
+
401
+ /**
402
+ * @param {number} b
403
+ */
404
+ write (b) {
405
+ const bp = createFromBytes(new Uint8Array([b]));
406
+ const fingerprint = shiftLeft(this.fingerprint, 8);
407
+ orInto(fingerprint, bp);
408
+ this.fingerprint = mod(fingerprint, this.m);
409
+ }
410
+
411
+ getFingerprint () {
412
+ return toUint8Array(this.fingerprint, _degreeToMinByteLength(getHighestDegree(this.m) - 1))
413
+ }
414
+ }
415
+
416
+ exports.GF2Polynomial = GF2Polynomial;
417
+ exports.RabinPolynomialEncoder = RabinPolynomialEncoder;
418
+ exports.add = add;
419
+ exports.addDegreeInto = addDegreeInto;
420
+ exports.addInto = addInto;
421
+ exports.clone = clone;
422
+ exports.createFromBytes = createFromBytes;
423
+ exports.createFromUint = createFromUint;
424
+ exports.createIrreducible = createIrreducible;
425
+ exports.createRandom = createRandom;
426
+ exports.equals = equals;
427
+ exports.fingerprint = fingerprint;
428
+ exports.gcd = gcd;
429
+ exports.getHighestDegree = getHighestDegree;
430
+ exports.isIrreducibleBenOr = isIrreducibleBenOr;
431
+ exports.mod = mod;
432
+ exports.modPow = modPow;
433
+ exports.multiply = multiply;
434
+ exports.orInto = orInto;
435
+ exports.shiftLeft = shiftLeft;
436
+ exports.toUint8Array = toUint8Array;
437
+ //# sourceMappingURL=rabin-gf2-polynomial.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabin-gf2-polynomial.cjs","sources":["../hash/rabin-gf2-polynomial.js"],"sourcesContent":["/**\n * The idea of the Rabin fingerprint algorithm is to represent the binary as a polynomial in a\n * finite field (Galois Field G(2)). The polynomial will then be taken \"modulo\" by an irreducible\n * polynomial of the desired size.\n *\n * This implementation is inefficient and is solely used to verify the actually performant\n * implementation in `./rabin.js`.\n *\n * @module rabin-gf2-polynomial\n */\n\nimport * as math from '../math.js'\nimport * as webcrypto from 'lib0/webcrypto'\nimport * as array from '../array.js'\nimport * as buffer from '../buffer.js'\n\n/**\n * @param {number} degree\n */\nconst _degreeToMinByteLength = degree => math.floor(degree / 8) + 1\n\n/**\n * This is a GF2 Polynomial abstraction that is not meant for production!\n *\n * It is easy to understand and it's correctness is as obvious as possible. It can be used to verify\n * efficient implementations of algorithms on GF2.\n */\nexport class GF2Polynomial {\n constructor () {\n /**\n * @type {Set<number>}\n */\n this.degrees = new Set()\n }\n}\n\n/**\n * From Uint8Array (MSB).\n *\n * @param {Uint8Array} bytes\n */\nexport const createFromBytes = bytes => {\n const p = new GF2Polynomial()\n for (let bsi = bytes.length - 1, currDegree = 0; bsi >= 0; bsi--) {\n const currByte = bytes[bsi]\n for (let i = 0; i < 8; i++) {\n if (((currByte >>> i) & 1) === 1) {\n p.degrees.add(currDegree)\n }\n currDegree++\n }\n }\n return p\n}\n\n/**\n * Transform to Uint8Array (MSB).\n *\n * @param {GF2Polynomial} p\n * @param {number} byteLength\n */\nexport const toUint8Array = (p, byteLength = _degreeToMinByteLength(getHighestDegree(p))) => {\n const buf = buffer.createUint8ArrayFromLen(byteLength)\n /**\n * @param {number} i\n */\n const setBit = i => {\n const bi = math.floor(i / 8)\n buf[buf.length - 1 - bi] |= (1 << (i % 8))\n }\n p.degrees.forEach(setBit)\n return buf\n}\n\n/**\n * Create from unsigned integer (max 32bit uint) - read most-significant-byte first.\n *\n * @param {number} uint\n */\nexport const createFromUint = uint => {\n const buf = new Uint8Array(4)\n for (let i = 0; i < 4; i++) {\n buf[i] = uint >>> 8 * (3 - i)\n }\n return createFromBytes(buf)\n}\n\n/**\n * Create a random polynomial of a specified degree.\n *\n * @param {number} degree\n */\nexport const createRandom = degree => {\n const bs = new Uint8Array(_degreeToMinByteLength(degree))\n webcrypto.getRandomValues(bs)\n // Get first byte and explicitly set the bit of \"degree\" to 1 (the result must have the specified\n // degree).\n const firstByte = bs[0] | 1 << (degree % 8)\n // Find out how many bits of the first byte need to be filled with zeros because they are >degree.\n const zeros = 7 - (degree % 8)\n bs[0] = ((firstByte << zeros) & 0xff) >>> zeros\n return createFromBytes(bs)\n}\n\n/**\n * @param {GF2Polynomial} p\n * @return number\n */\nexport const getHighestDegree = p => array.fold(array.from(p.degrees), 0, math.max)\n\n/**\n * Add (+) p2 int the p1 polynomial.\n *\n * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const addInto = (p1, p2) => {\n p2.degrees.forEach(degree => {\n if (p1.degrees.has(degree)) {\n p1.degrees.delete(degree)\n } else {\n p1.degrees.add(degree)\n }\n })\n}\n\n/**\n * Or (|) p2 into the p1 polynomial.\n *\n * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const orInto = (p1, p2) => {\n p2.degrees.forEach(degree => {\n p1.degrees.add(degree)\n })\n}\n\n/**\n * Add (+) p2 to the p1 polynomial.\n *\n * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const add = (p1, p2) => {\n const result = new GF2Polynomial()\n p2.degrees.forEach(degree => {\n if (!p1.degrees.has(degree)) {\n result.degrees.add(degree)\n }\n })\n p1.degrees.forEach(degree => {\n if (!p2.degrees.has(degree)) {\n result.degrees.add(degree)\n }\n })\n return result\n}\n\n/**\n * Add (+) p2 to the p1 polynomial.\n *\n * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.\n *\n * @param {GF2Polynomial} p\n */\nexport const clone = (p) => {\n const result = new GF2Polynomial()\n p.degrees.forEach(d => result.degrees.add(d))\n return result\n}\n\n/**\n * Add (+) p2 to the p1 polynomial.\n *\n * Addition is defined as xor in F2. Substraction is equivalent to addition in F2.\n *\n * @param {GF2Polynomial} p\n * @param {number} degree\n */\nexport const addDegreeInto = (p, degree) => {\n if (p.degrees.has(degree)) {\n p.degrees.delete(degree)\n } else {\n p.degrees.add(degree)\n }\n}\n\n/**\n * Multiply (•) p1 with p2 and store the result in p1.\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const multiply = (p1, p2) => {\n const result = new GF2Polynomial()\n p1.degrees.forEach(degree1 => {\n p2.degrees.forEach(degree2 => {\n addDegreeInto(result, degree1 + degree2)\n })\n })\n return result\n}\n\n/**\n * Multiply (•) p1 with p2 and store the result in p1.\n *\n * @param {GF2Polynomial} p\n * @param {number} shift\n */\nexport const shiftLeft = (p, shift) => {\n const result = new GF2Polynomial()\n p.degrees.forEach(degree => {\n const r = degree + shift\n r >= 0 && result.degrees.add(r)\n })\n return result\n}\n\n/**\n * Computes p1 % p2. I.e. the remainder of p1/p2.\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const mod = (p1, p2) => {\n const maxDeg1 = getHighestDegree(p1)\n const maxDeg2 = getHighestDegree(p2)\n const result = clone(p1)\n for (let i = maxDeg1 - maxDeg2; i >= 0; i--) {\n if (result.degrees.has(maxDeg2 + i)) {\n const shifted = shiftLeft(p2, i)\n addInto(result, shifted)\n }\n }\n return result\n}\n\n/**\n * Computes (p^e mod m).\n *\n * http://en.wikipedia.org/wiki/Modular_exponentiation\n *\n * @param {GF2Polynomial} p\n * @param {number} e\n * @param {GF2Polynomial} m\n */\nexport const modPow = (p, e, m) => {\n let result = ONE\n while (true) {\n if ((e & 1) === 1) {\n result = mod(multiply(result, p), m)\n }\n e >>>= 1\n if (e === 0) {\n return result\n }\n p = mod(multiply(p, p), m)\n }\n}\n\n/**\n * Find the greatest common divisor using Euclid's Algorithm.\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const gcd = (p1, p2) => {\n while (p2.degrees.size > 0) {\n const modded = mod(p1, p2)\n p1 = p2\n p2 = modded\n }\n return p1\n}\n\n/**\n * true iff p1 equals p2\n *\n * @param {GF2Polynomial} p1\n * @param {GF2Polynomial} p2\n */\nexport const equals = (p1, p2) => {\n if (p1.degrees.size !== p2.degrees.size) return false\n for (const d of p1.degrees) {\n if (!p2.degrees.has(d)) return false\n }\n return true\n}\n\nconst X = createFromBytes(new Uint8Array([2]))\nconst ONE = createFromBytes(new Uint8Array([1]))\n\n/**\n * Computes ( x^(2^p) - x ) mod f\n *\n * (shamelessly copied from\n * https://github.com/opendedup/rabinfingerprint/blob/master/src/org/rabinfingerprint/polynomial/Polynomial.java)\n *\n * @param {GF2Polynomial} f\n * @param {number} p\n */\nconst reduceExponent = (f, p) => {\n // compute (x^q^p mod f)\n const q2p = math.pow(2, p)\n const x2q2p = modPow(X, q2p, f)\n // subtract (x mod f)\n return mod(add(x2q2p, X), f)\n}\n\n/**\n * BenOr Reducibility Test\n *\n * Tests and Constructions of Irreducible Polynomials over Finite Fields\n * (1997) Shuhong Gao, Daniel Panario\n *\n * http://citeseer.ist.psu.edu/cache/papers/cs/27167/http:zSzzSzwww.math.clemson.eduzSzfacultyzSzGaozSzpaperszSzGP97a.pdf/gao97tests.pdf\n *\n * @param {GF2Polynomial} p\n */\nexport const isIrreducibleBenOr = p => {\n const degree = getHighestDegree(p)\n for (let i = 1; i < degree / 2; i++) {\n const b = reduceExponent(p, i)\n const g = gcd(p, b)\n if (!equals(g, ONE)) {\n return false\n }\n }\n return true\n}\n\n/**\n * @param {number} degree\n */\nexport const createIrreducible = degree => {\n while (true) {\n const p = createRandom(degree)\n if (isIrreducibleBenOr(p)) return p\n }\n}\n\n/**\n * Create a fingerprint of buf using the irreducible polynomial m.\n *\n * @param {Uint8Array} buf\n * @param {GF2Polynomial} m\n */\nexport const fingerprint = (buf, m) => toUint8Array(mod(createFromBytes(buf), m), _degreeToMinByteLength(getHighestDegree(m) - 1))\n\nexport class RabinPolynomialEncoder {\n /**\n * @param {GF2Polynomial} m The irreducible polynomial\n */\n constructor (m) {\n this.fingerprint = new GF2Polynomial()\n this.m = m\n }\n\n /**\n * @param {number} b\n */\n write (b) {\n const bp = createFromBytes(new Uint8Array([b]))\n const fingerprint = shiftLeft(this.fingerprint, 8)\n orInto(fingerprint, bp)\n this.fingerprint = mod(fingerprint, this.m)\n }\n\n getFingerprint () {\n return toUint8Array(this.fingerprint, _degreeToMinByteLength(getHighestDegree(this.m) - 1))\n }\n}\n"],"names":["math.floor","buffer.createUint8ArrayFromLen","webcrypto","array.fold","array.from","math.max","math.pow"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var math = require('./math-08e068f9.cjs');
6
+ var encoding = require('./buffer-c5d69c70.cjs');
7
+ require('./string-6d104757.cjs');
8
+ require('./array-704ca50e.cjs');
9
+ require('./set-0f209abb.cjs');
10
+ require('./environment-ad129e4d.cjs');
11
+ require('./map-9a5915e4.cjs');
12
+ require('./conditions-f5c0c102.cjs');
13
+ require('./storage.cjs');
14
+ require('./function-314fdc56.cjs');
15
+ require('./object-fecf6a7b.cjs');
16
+ require('./binary-ac8e39e2.cjs');
17
+ require('./number-466d8922.cjs');
18
+ require('./error-8582d695.cjs');
19
+
20
+ /**
21
+ * It is not recommended to use this package. This is the uncached implementation of the rabin
22
+ * fingerprint algorithm. However, it can be used to verify the `rabin.js` implementation.
23
+ *
24
+ * @module rabin-uncached
25
+ */
26
+
27
+ class RabinUncachedEncoder {
28
+ /**
29
+ * @param {Uint8Array} m assert(m[0] === 1)
30
+ */
31
+ constructor (m) {
32
+ this.m = m;
33
+ this.blen = m.byteLength;
34
+ this.bs = new Uint8Array(this.blen);
35
+ /**
36
+ * This describes the position of the most significant byte (starts with 0 and increases with
37
+ * shift)
38
+ */
39
+ this.bpos = 0;
40
+ }
41
+
42
+ /**
43
+ * Add/Xor/Substract bytes.
44
+ *
45
+ * Discards bytes that are out of range.
46
+ * @todo put this in function or inline
47
+ *
48
+ * @param {Uint8Array} cs
49
+ */
50
+ add (cs) {
51
+ const copyLen = math.min(this.blen, cs.byteLength);
52
+ // copy from right to left until max is reached
53
+ for (let i = 0; i < copyLen; i++) {
54
+ this.bs[(this.bpos + this.blen - i - 1) % this.blen] ^= cs[cs.byteLength - i - 1];
55
+ }
56
+ }
57
+
58
+ /**
59
+ * @param {number} byte
60
+ */
61
+ write (byte) {
62
+ // [0,m1,m2,b]
63
+ // x <- bpos
64
+ // Shift one byte to the left, add b
65
+ this.bs[this.bpos] = byte;
66
+ this.bpos = (this.bpos + 1) % this.blen;
67
+ // mod
68
+ for (let i = 7; i >= 0; i--) {
69
+ if (((this.bs[this.bpos] >>> i) & 1) === 1) {
70
+ this.add(encoding.shiftNBitsLeft(this.m, i));
71
+ }
72
+ }
73
+ // if (this.bs[this.bpos] !== 0) { error.unexpectedCase() }
74
+ // assert(this.bs[this.bpos] === 0)
75
+ }
76
+
77
+ getFingerprint () {
78
+ const result = new Uint8Array(this.blen - 1);
79
+ for (let i = 0; i < result.byteLength; i++) {
80
+ result[i] = this.bs[(this.bpos + i + 1) % this.blen];
81
+ }
82
+ return result
83
+ }
84
+ }
85
+
86
+ exports.RabinUncachedEncoder = RabinUncachedEncoder;
87
+ //# sourceMappingURL=rabin-uncached.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabin-uncached.cjs","sources":["../hash/rabin-uncached.js"],"sourcesContent":["/**\n * It is not recommended to use this package. This is the uncached implementation of the rabin\n * fingerprint algorithm. However, it can be used to verify the `rabin.js` implementation.\n *\n * @module rabin-uncached\n */\n\nimport * as math from '../math.js'\nimport * as buffer from '../buffer.js'\n\nexport class RabinUncachedEncoder {\n /**\n * @param {Uint8Array} m assert(m[0] === 1)\n */\n constructor (m) {\n this.m = m\n this.blen = m.byteLength\n this.bs = new Uint8Array(this.blen)\n /**\n * This describes the position of the most significant byte (starts with 0 and increases with\n * shift)\n */\n this.bpos = 0\n }\n\n /**\n * Add/Xor/Substract bytes.\n *\n * Discards bytes that are out of range.\n * @todo put this in function or inline\n *\n * @param {Uint8Array} cs\n */\n add (cs) {\n const copyLen = math.min(this.blen, cs.byteLength)\n // copy from right to left until max is reached\n for (let i = 0; i < copyLen; i++) {\n this.bs[(this.bpos + this.blen - i - 1) % this.blen] ^= cs[cs.byteLength - i - 1]\n }\n }\n\n /**\n * @param {number} byte\n */\n write (byte) {\n // [0,m1,m2,b]\n // x <- bpos\n // Shift one byte to the left, add b\n this.bs[this.bpos] = byte\n this.bpos = (this.bpos + 1) % this.blen\n // mod\n for (let i = 7; i >= 0; i--) {\n if (((this.bs[this.bpos] >>> i) & 1) === 1) {\n this.add(buffer.shiftNBitsLeft(this.m, i))\n }\n }\n // if (this.bs[this.bpos] !== 0) { error.unexpectedCase() }\n // assert(this.bs[this.bpos] === 0)\n }\n\n getFingerprint () {\n const result = new Uint8Array(this.blen - 1)\n for (let i = 0; i < result.byteLength; i++) {\n result[i] = this.bs[(this.bpos + i + 1) % this.blen]\n }\n return result\n }\n}\n"],"names":["math.min","buffer.shiftNBitsLeft"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AAIA;AACO,MAAM,oBAAoB,CAAC;AAClC;AACA;AACA;AACA,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;AAClB,IAAI,IAAI,CAAC,CAAC,GAAG,EAAC;AACd,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,WAAU;AAC5B,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAC;AACvC;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,IAAI,GAAG,EAAC;AACjB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE;AACX,IAAI,MAAM,OAAO,GAAGA,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAC;AACtD;AACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;AACtC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,EAAC;AACvF,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE;AACf;AACA;AACA;AACA,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAI;AAC7B,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,KAAI;AAC3C;AACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACjC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AAClD,QAAQ,IAAI,CAAC,GAAG,CAACC,uBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC;AAClD,OAAO;AACP,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA,EAAE,cAAc,CAAC,GAAG;AACpB,IAAI,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAC;AAChD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AAChD,MAAM,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAC;AAC1D,KAAK;AACL,IAAI,OAAO,MAAM;AACjB,GAAG;AACH;;;;"}
package/dist/rabin.cjs ADDED
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var encoding = require('./buffer-c5d69c70.cjs');
6
+ var map = require('./map-9a5915e4.cjs');
7
+ require('./string-6d104757.cjs');
8
+ require('./array-704ca50e.cjs');
9
+ require('./set-0f209abb.cjs');
10
+ require('./environment-ad129e4d.cjs');
11
+ require('./conditions-f5c0c102.cjs');
12
+ require('./storage.cjs');
13
+ require('./function-314fdc56.cjs');
14
+ require('./object-fecf6a7b.cjs');
15
+ require('./math-08e068f9.cjs');
16
+ require('./binary-ac8e39e2.cjs');
17
+ require('./number-466d8922.cjs');
18
+ require('./error-8582d695.cjs');
19
+
20
+ /**
21
+ * @module rabin
22
+ *
23
+ * Very efficient & versatile fingerprint/hashing algorithm. However, it is not cryptographically
24
+ * secure. Well suited for fingerprinting.
25
+ */
26
+
27
+ const StandardIrreducible8 = new Uint8Array([1, 221]);
28
+ const StandardIrreducible16 = new Uint8Array([1, 244, 157]);
29
+ const StandardIrreducible32 = new Uint8Array([1, 149, 183, 205, 191]);
30
+ const StandardIrreducible64 = new Uint8Array([1, 133, 250, 114, 193, 250, 28, 193, 231]);
31
+ const StandardIrreducible128 = new Uint8Array([1, 94, 109, 166, 228, 6, 222, 102, 239, 27, 128, 184, 13, 50, 112, 169, 199]);
32
+
33
+ /**
34
+ * Maps from a modulo to the precomputed values.
35
+ *
36
+ * @type {Map<string,Uint8Array>}
37
+ */
38
+ const _precomputedFingerprintCache = new Map();
39
+
40
+ /**
41
+ * @param {Uint8Array} m
42
+ */
43
+ const ensureCache = m => map.setIfUndefined(_precomputedFingerprintCache, encoding.toBase64(m), () => {
44
+ const byteLen = m.byteLength;
45
+ const cache = new Uint8Array(256 * byteLen);
46
+ // Use dynamic computing to compute the cached results.
47
+ // Starting values: cache(0) = 0; cache(1) = m
48
+ cache.set(m, byteLen);
49
+ for (let bit = 1; bit < 8; bit++) {
50
+ const mBitShifted = encoding.shiftNBitsLeft(m, bit);
51
+ const bitShifted = 1 << bit;
52
+ for (let j = 0; j < bitShifted; j++) {
53
+ // apply the shifted result (reducing the degree of the polynomial)
54
+ const msb = bitShifted | j;
55
+ const rest = msb ^ mBitShifted[0];
56
+ for (let i = 0; i < byteLen; i++) {
57
+ // rest is already precomputed in the cache
58
+ cache[msb * byteLen + i] = cache[rest * byteLen + i] ^ mBitShifted[i];
59
+ }
60
+ // if (cache[(bitShifted | j) * byteLen] !== (bitShifted | j)) { error.unexpectedCase() }
61
+ }
62
+ }
63
+ return cache
64
+ });
65
+
66
+ class RabinEncoder {
67
+ /**
68
+ * @param {Uint8Array} m assert(m[0] === 1)
69
+ */
70
+ constructor (m) {
71
+ this.m = m;
72
+ this.blen = m.byteLength;
73
+ this.bs = new Uint8Array(this.blen);
74
+ this.cache = ensureCache(m);
75
+ /**
76
+ * This describes the position of the most significant byte (starts with 0 and increases with
77
+ * shift)
78
+ */
79
+ this.bpos = 0;
80
+ }
81
+
82
+ /**
83
+ * @param {number} byte
84
+ */
85
+ write (byte) {
86
+ // assert(this.bs[0] === 0)
87
+ // Shift one byte to the left, add b
88
+ this.bs[this.bpos] = byte;
89
+ this.bpos = (this.bpos + 1) % this.blen;
90
+ const msb = this.bs[this.bpos];
91
+ for (let i = 0; i < this.blen; i++) {
92
+ this.bs[(this.bpos + i) % this.blen] ^= this.cache[msb * this.blen + i];
93
+ }
94
+ // assert(this.bs[this.bpos] === 0)
95
+ }
96
+
97
+ getFingerprint () {
98
+ const result = new Uint8Array(this.blen - 1);
99
+ for (let i = 0; i < result.byteLength; i++) {
100
+ result[i] = this.bs[(this.bpos + i + 1) % this.blen];
101
+ }
102
+ return result
103
+ }
104
+ }
105
+
106
+ /**
107
+ * @param {Uint8Array} irreducible
108
+ * @param {Uint8Array} data
109
+ */
110
+ const fingerprint = (irreducible, data) => {
111
+ const encoder = new RabinEncoder(irreducible);
112
+ for (let i = 0; i < data.length; i++) {
113
+ encoder.write(data[i]);
114
+ }
115
+ return encoder.getFingerprint()
116
+ };
117
+
118
+ exports.RabinEncoder = RabinEncoder;
119
+ exports.StandardIrreducible128 = StandardIrreducible128;
120
+ exports.StandardIrreducible16 = StandardIrreducible16;
121
+ exports.StandardIrreducible32 = StandardIrreducible32;
122
+ exports.StandardIrreducible64 = StandardIrreducible64;
123
+ exports.StandardIrreducible8 = StandardIrreducible8;
124
+ exports.fingerprint = fingerprint;
125
+ //# sourceMappingURL=rabin.cjs.map