nanocurrency 0.1.0

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 (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +40 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +43 -0
  10. data/Rakefile +16 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/ext/.DS_Store +0 -0
  14. data/ext/nanocurrency_ext/blake2-config.h +72 -0
  15. data/ext/nanocurrency_ext/blake2-impl.h +160 -0
  16. data/ext/nanocurrency_ext/blake2.h +195 -0
  17. data/ext/nanocurrency_ext/blake2b-load-sse2.h +68 -0
  18. data/ext/nanocurrency_ext/blake2b-load-sse41.h +402 -0
  19. data/ext/nanocurrency_ext/blake2b-ref.c +373 -0
  20. data/ext/nanocurrency_ext/blake2b-round.h +157 -0
  21. data/ext/nanocurrency_ext/curve25519-donna-32bit.h +579 -0
  22. data/ext/nanocurrency_ext/curve25519-donna-64bit.h +413 -0
  23. data/ext/nanocurrency_ext/curve25519-donna-helpers.h +67 -0
  24. data/ext/nanocurrency_ext/curve25519-donna-sse2.h +1112 -0
  25. data/ext/nanocurrency_ext/ed25519-donna-32bit-sse2.h +513 -0
  26. data/ext/nanocurrency_ext/ed25519-donna-32bit-tables.h +61 -0
  27. data/ext/nanocurrency_ext/ed25519-donna-64bit-sse2.h +436 -0
  28. data/ext/nanocurrency_ext/ed25519-donna-64bit-tables.h +53 -0
  29. data/ext/nanocurrency_ext/ed25519-donna-64bit-x86-32bit.h +435 -0
  30. data/ext/nanocurrency_ext/ed25519-donna-64bit-x86.h +351 -0
  31. data/ext/nanocurrency_ext/ed25519-donna-basepoint-table.h +259 -0
  32. data/ext/nanocurrency_ext/ed25519-donna-batchverify.h +275 -0
  33. data/ext/nanocurrency_ext/ed25519-donna-impl-base.h +364 -0
  34. data/ext/nanocurrency_ext/ed25519-donna-impl-sse2.h +390 -0
  35. data/ext/nanocurrency_ext/ed25519-donna-portable-identify.h +103 -0
  36. data/ext/nanocurrency_ext/ed25519-donna-portable.h +135 -0
  37. data/ext/nanocurrency_ext/ed25519-donna.h +115 -0
  38. data/ext/nanocurrency_ext/ed25519-hash-custom.c +28 -0
  39. data/ext/nanocurrency_ext/ed25519-hash-custom.h +30 -0
  40. data/ext/nanocurrency_ext/ed25519-hash.h +219 -0
  41. data/ext/nanocurrency_ext/ed25519-randombytes-custom.h +10 -0
  42. data/ext/nanocurrency_ext/ed25519-randombytes.h +91 -0
  43. data/ext/nanocurrency_ext/ed25519.c +150 -0
  44. data/ext/nanocurrency_ext/ed25519.h +30 -0
  45. data/ext/nanocurrency_ext/extconf.rb +3 -0
  46. data/ext/nanocurrency_ext/fuzz/README.md +173 -0
  47. data/ext/nanocurrency_ext/fuzz/build-nix.php +134 -0
  48. data/ext/nanocurrency_ext/fuzz/curve25519-ref10.c +1272 -0
  49. data/ext/nanocurrency_ext/fuzz/curve25519-ref10.h +8 -0
  50. data/ext/nanocurrency_ext/fuzz/ed25519-donna-sse2.c +3 -0
  51. data/ext/nanocurrency_ext/fuzz/ed25519-donna.c +1 -0
  52. data/ext/nanocurrency_ext/fuzz/ed25519-donna.h +34 -0
  53. data/ext/nanocurrency_ext/fuzz/ed25519-ref10.c +4647 -0
  54. data/ext/nanocurrency_ext/fuzz/ed25519-ref10.h +9 -0
  55. data/ext/nanocurrency_ext/fuzz/fuzz-curve25519.c +172 -0
  56. data/ext/nanocurrency_ext/fuzz/fuzz-ed25519.c +219 -0
  57. data/ext/nanocurrency_ext/modm-donna-32bit.h +469 -0
  58. data/ext/nanocurrency_ext/modm-donna-64bit.h +361 -0
  59. data/ext/nanocurrency_ext/rbext.c +164 -0
  60. data/ext/nanocurrency_ext/regression.h +1024 -0
  61. data/lib/nano/account.rb +59 -0
  62. data/lib/nano/base32.rb +87 -0
  63. data/lib/nano/block.rb +142 -0
  64. data/lib/nano/check.rb +65 -0
  65. data/lib/nano/conversion.rb +102 -0
  66. data/lib/nano/hash.rb +43 -0
  67. data/lib/nano/key.rb +69 -0
  68. data/lib/nano/utils.rb +45 -0
  69. data/lib/nano/work.rb +51 -0
  70. data/lib/nanocurrency.rb +7 -0
  71. data/lib/nanocurrency/version.rb +3 -0
  72. data/lib/nanocurrency_ext.bundle +0 -0
  73. data/nanocurrency.gemspec +44 -0
  74. metadata +192 -0
@@ -0,0 +1,390 @@
1
+ /*
2
+ conversions
3
+ */
4
+
5
+ static void
6
+ ge25519_p1p1_to_partial(ge25519 *r, const ge25519_p1p1 *p) {
7
+ packed64bignum25519 ALIGN(16) xz, tt, xzout;
8
+ curve25519_mul(r->y, p->y, p->z);
9
+ curve25519_tangle64(xz, p->x, p->z);
10
+ curve25519_tangleone64(tt, p->t);
11
+ curve25519_mul_packed64(xzout, xz, tt);
12
+ curve25519_untangle64(r->x, r->z, xzout);
13
+ }
14
+
15
+ static void
16
+ ge25519_p1p1_to_full(ge25519 *r, const ge25519_p1p1 *p) {
17
+ packed64bignum25519 ALIGN(16) zy, xt, xx, zz, ty;
18
+ curve25519_tangle64(ty, p->t, p->y);
19
+ curve25519_tangleone64(xx, p->x);
20
+ curve25519_mul_packed64(xt, xx, ty);
21
+ curve25519_untangle64(r->x, r->t, xt);
22
+ curve25519_tangleone64(zz, p->z);
23
+ curve25519_mul_packed64(zy, zz, ty);
24
+ curve25519_untangle64(r->z, r->y, zy);
25
+ }
26
+
27
+ static void
28
+ ge25519_full_to_pniels(ge25519_pniels *p, const ge25519 *r) {
29
+ curve25519_sub(p->ysubx, r->y, r->x);
30
+ curve25519_add(p->xaddy, r->x, r->y);
31
+ curve25519_copy(p->z, r->z);
32
+ curve25519_mul(p->t2d, r->t, ge25519_ec2d);
33
+ }
34
+
35
+ /*
36
+ adding & doubling
37
+ */
38
+
39
+ static void
40
+ ge25519_add_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519 *q) {
41
+ bignum25519 ALIGN(16) a,b,c,d;
42
+ packed32bignum25519 ALIGN(16) xx, yy, yypxx, yymxx, bd, ac, bdmac, bdpac;
43
+ packed64bignum25519 ALIGN(16) at, bu, atbu, ptz, qtz, cd;
44
+
45
+ curve25519_tangle32(yy, p->y, q->y);
46
+ curve25519_tangle32(xx, p->x, q->x);
47
+ curve25519_add_packed32(yypxx, yy, xx);
48
+ curve25519_sub_packed32(yymxx, yy, xx);
49
+ curve25519_tangle64_from32(at, bu, yymxx, yypxx);
50
+ curve25519_mul_packed64(atbu, at, bu);
51
+ curve25519_untangle64(a, b, atbu);
52
+ curve25519_tangle64(ptz, p->t, p->z);
53
+ curve25519_tangle64(qtz, q->t, q->z);
54
+ curve25519_mul_packed64(cd, ptz, qtz);
55
+ curve25519_untangle64(c, d, cd);
56
+ curve25519_mul(c, c, ge25519_ec2d);
57
+ curve25519_add_reduce(d, d, d);
58
+ /* reduce, so no after_basic is needed later */
59
+ curve25519_tangle32(bd, b, d);
60
+ curve25519_tangle32(ac, a, c);
61
+ curve25519_sub_packed32(bdmac, bd, ac);
62
+ curve25519_add_packed32(bdpac, bd, ac);
63
+ curve25519_untangle32(r->x, r->t, bdmac);
64
+ curve25519_untangle32(r->y, r->z, bdpac);
65
+ }
66
+
67
+
68
+ static void
69
+ ge25519_double_p1p1(ge25519_p1p1 *r, const ge25519 *p) {
70
+ bignum25519 ALIGN(16) a,b,c,x;
71
+ packed64bignum25519 ALIGN(16) xy, zx, ab, cx;
72
+ packed32bignum25519 ALIGN(16) xc, yz, xt, yc, ac, bc;
73
+
74
+ curve25519_add(x, p->x, p->y);
75
+ curve25519_tangle64(xy, p->x, p->y);
76
+ curve25519_square_packed64(ab, xy);
77
+ curve25519_untangle64(a, b, ab);
78
+ curve25519_tangle64(zx, p->z, x);
79
+ curve25519_square_packed64(cx, zx);
80
+ curve25519_untangle64(c, x, cx);
81
+ curve25519_tangle32(bc, b, c);
82
+ curve25519_tangle32(ac, a, c);
83
+ curve25519_add_reduce_packed32(yc, bc, ac);
84
+ curve25519_untangle32(r->y, c, yc);
85
+ curve25519_sub(r->z, b, a);
86
+ curve25519_tangle32(yz, r->y, r->z);
87
+ curve25519_tangle32(xc, x, c);
88
+ curve25519_sub_after_basic_packed32(xt, xc, yz);
89
+ curve25519_untangle32(r->x, r->t, xt);
90
+ }
91
+
92
+ static void
93
+ ge25519_nielsadd2_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_niels *q, unsigned char signbit) {
94
+ const bignum25519 *qb = (const bignum25519 *)q;
95
+ bignum25519 *rb = (bignum25519 *)r;
96
+ bignum25519 ALIGN(16) a,b,c;
97
+ packed64bignum25519 ALIGN(16) ab, yx, aybx;
98
+ packed32bignum25519 ALIGN(16) bd, ac, bdac;
99
+
100
+ curve25519_sub(a, p->y, p->x);
101
+ curve25519_add(b, p->y, p->x);
102
+ curve25519_tangle64(ab, a, b);
103
+ curve25519_tangle64(yx, qb[signbit], qb[signbit^1]);
104
+ curve25519_mul_packed64(aybx, ab, yx);
105
+ curve25519_untangle64(a, b, aybx);
106
+ curve25519_add(r->y, b, a);
107
+ curve25519_add_reduce(r->t, p->z, p->z);
108
+ curve25519_mul(c, p->t, q->t2d);
109
+ curve25519_copy(r->z, r->t);
110
+ curve25519_add(rb[2+signbit], rb[2+signbit], c);
111
+ curve25519_tangle32(bd, b, rb[2+(signbit^1)]);
112
+ curve25519_tangle32(ac, a, c);
113
+ curve25519_sub_packed32(bdac, bd, ac);
114
+ curve25519_untangle32(r->x, rb[2+(signbit^1)], bdac);
115
+ }
116
+
117
+ static void
118
+ ge25519_pnielsadd_p1p1(ge25519_p1p1 *r, const ge25519 *p, const ge25519_pniels *q, unsigned char signbit) {
119
+ const bignum25519 *qb = (const bignum25519 *)q;
120
+ bignum25519 *rb = (bignum25519 *)r;
121
+ bignum25519 ALIGN(16) a,b,c;
122
+ packed64bignum25519 ALIGN(16) ab, yx, aybx, zt, zt2d, tc;
123
+ packed32bignum25519 ALIGN(16) bd, ac, bdac;
124
+
125
+ curve25519_sub(a, p->y, p->x);
126
+ curve25519_add(b, p->y, p->x);
127
+ curve25519_tangle64(ab, a, b);
128
+ curve25519_tangle64(yx, qb[signbit], qb[signbit^1]);
129
+ curve25519_mul_packed64(aybx, ab, yx);
130
+ curve25519_untangle64(a, b, aybx);
131
+ curve25519_add(r->y, b, a);
132
+ curve25519_tangle64(zt, p->z, p->t);
133
+ curve25519_tangle64(zt2d, q->z, q->t2d);
134
+ curve25519_mul_packed64(tc, zt, zt2d);
135
+ curve25519_untangle64(r->t, c, tc);
136
+ curve25519_add_reduce(r->t, r->t, r->t);
137
+ curve25519_copy(r->z, r->t);
138
+ curve25519_add(rb[2+signbit], rb[2+signbit], c);
139
+ curve25519_tangle32(bd, b, rb[2+(signbit^1)]);
140
+ curve25519_tangle32(ac, a, c);
141
+ curve25519_sub_packed32(bdac, bd, ac);
142
+ curve25519_untangle32(r->x, rb[2+(signbit^1)], bdac);
143
+ }
144
+
145
+ static void
146
+ ge25519_double(ge25519 *r, const ge25519 *p) {
147
+ ge25519_p1p1 ALIGN(16) t;
148
+ ge25519_double_p1p1(&t, p);
149
+ ge25519_p1p1_to_full(r, &t);
150
+ }
151
+
152
+ static void
153
+ ge25519_add(ge25519 *r, const ge25519 *p, const ge25519 *q) {
154
+ ge25519_p1p1 ALIGN(16) t;
155
+ ge25519_add_p1p1(&t, p, q);
156
+ ge25519_p1p1_to_full(r, &t);
157
+ }
158
+
159
+ static void
160
+ ge25519_double_partial(ge25519 *r, const ge25519 *p) {
161
+ ge25519_p1p1 ALIGN(16) t;
162
+ ge25519_double_p1p1(&t, p);
163
+ ge25519_p1p1_to_partial(r, &t);
164
+ }
165
+
166
+ static void
167
+ ge25519_nielsadd2(ge25519 *r, const ge25519_niels *q) {
168
+ packed64bignum25519 ALIGN(16) ab, yx, aybx, eg, ff, hh, xz, ty;
169
+ packed32bignum25519 ALIGN(16) bd, ac, bdac;
170
+ bignum25519 ALIGN(16) a,b,c,d,e,f,g,h;
171
+
172
+ curve25519_sub(a, r->y, r->x);
173
+ curve25519_add(b, r->y, r->x);
174
+ curve25519_tangle64(ab, a, b);
175
+ curve25519_tangle64(yx, q->ysubx, q->xaddy);
176
+ curve25519_mul_packed64(aybx, ab, yx);
177
+ curve25519_untangle64(a, b, aybx);
178
+ curve25519_add(h, b, a);
179
+ curve25519_add_reduce(d, r->z, r->z);
180
+ curve25519_mul(c, r->t, q->t2d);
181
+ curve25519_add(g, d, c); /* d is reduced, so no need for after_basic */
182
+ curve25519_tangle32(bd, b, d);
183
+ curve25519_tangle32(ac, a, c);
184
+ curve25519_sub_packed32(bdac, bd, ac); /* d is reduced, so no need for after_basic */
185
+ curve25519_untangle32(e, f, bdac);
186
+ curve25519_tangle64(eg, e, g);
187
+ curve25519_tangleone64(ff, f);
188
+ curve25519_mul_packed64(xz, eg, ff);
189
+ curve25519_untangle64(r->x, r->z, xz);
190
+ curve25519_tangleone64(hh, h);
191
+ curve25519_mul_packed64(ty, eg, hh);
192
+ curve25519_untangle64(r->t, r->y, ty);
193
+ }
194
+
195
+ static void
196
+ ge25519_pnielsadd(ge25519_pniels *r, const ge25519 *p, const ge25519_pniels *q) {
197
+ ge25519_p1p1 ALIGN(16) t;
198
+ ge25519 ALIGN(16) f;
199
+ ge25519_pnielsadd_p1p1(&t, p, q, 0);
200
+ ge25519_p1p1_to_full(&f, &t);
201
+ ge25519_full_to_pniels(r, &f);
202
+ }
203
+
204
+ /*
205
+ pack & unpack
206
+ */
207
+
208
+ static void
209
+ ge25519_pack(unsigned char r[32], const ge25519 *p) {
210
+ bignum25519 ALIGN(16) tx, ty, zi;
211
+ unsigned char parity[32];
212
+ curve25519_recip(zi, p->z);
213
+ curve25519_mul(tx, p->x, zi);
214
+ curve25519_mul(ty, p->y, zi);
215
+ curve25519_contract(r, ty);
216
+ curve25519_contract(parity, tx);
217
+ r[31] ^= ((parity[0] & 1) << 7);
218
+ }
219
+
220
+
221
+ static int
222
+ ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) {
223
+ static const bignum25519 ALIGN(16) one = {1};
224
+ static const unsigned char zero[32] = {0};
225
+ unsigned char parity = p[31] >> 7;
226
+ unsigned char check[32];
227
+ bignum25519 ALIGN(16) t, root, num, den, d3;
228
+
229
+ curve25519_expand(r->y, p);
230
+ curve25519_copy(r->z, one);
231
+ curve25519_square_times(num, r->y, 1); /* x = y^2 */
232
+ curve25519_mul(den, num, ge25519_ecd); /* den = dy^2 */
233
+ curve25519_sub_reduce(num, num, r->z); /* x = y^2 - 1 */
234
+ curve25519_add(den, den, r->z); /* den = dy^2 + 1 */
235
+
236
+ /* Computation of sqrt(num/den) */
237
+ /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */
238
+ curve25519_square_times(t, den, 1);
239
+ curve25519_mul(d3, t, den);
240
+ curve25519_square_times(r->x, d3, 1);
241
+ curve25519_mul(r->x, r->x, den);
242
+ curve25519_mul(r->x, r->x, num);
243
+ curve25519_pow_two252m3(r->x, r->x);
244
+
245
+ /* 2. computation of r->x = t * num * den^3 */
246
+ curve25519_mul(r->x, r->x, d3);
247
+ curve25519_mul(r->x, r->x, num);
248
+
249
+ /* 3. Check if either of the roots works: */
250
+ curve25519_square_times(t, r->x, 1);
251
+ curve25519_mul(t, t, den);
252
+ curve25519_copy(root, t);
253
+ curve25519_sub_reduce(root, root, num);
254
+ curve25519_contract(check, root);
255
+ if (!ed25519_verify(check, zero, 32)) {
256
+ curve25519_add_reduce(t, t, num);
257
+ curve25519_contract(check, t);
258
+ if (!ed25519_verify(check, zero, 32))
259
+ return 0;
260
+ curve25519_mul(r->x, r->x, ge25519_sqrtneg1);
261
+ }
262
+
263
+ curve25519_contract(check, r->x);
264
+ if ((check[0] & 1) == parity) {
265
+ curve25519_copy(t, r->x);
266
+ curve25519_neg(r->x, t);
267
+ }
268
+ curve25519_mul(r->t, r->x, r->y);
269
+ return 1;
270
+ }
271
+
272
+
273
+
274
+ /*
275
+ scalarmults
276
+ */
277
+
278
+ #define S1_SWINDOWSIZE 5
279
+ #define S1_TABLE_SIZE (1<<(S1_SWINDOWSIZE-2))
280
+ #define S2_SWINDOWSIZE 7
281
+ #define S2_TABLE_SIZE (1<<(S2_SWINDOWSIZE-2))
282
+
283
+ static void
284
+ ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const bignum256modm s1, const bignum256modm s2) {
285
+ signed char slide1[256], slide2[256];
286
+ ge25519_pniels ALIGN(16) pre1[S1_TABLE_SIZE];
287
+ ge25519 ALIGN(16) d1;
288
+ ge25519_p1p1 ALIGN(16) t;
289
+ int32_t i;
290
+
291
+ contract256_slidingwindow_modm(slide1, s1, S1_SWINDOWSIZE);
292
+ contract256_slidingwindow_modm(slide2, s2, S2_SWINDOWSIZE);
293
+
294
+ ge25519_double(&d1, p1);
295
+ ge25519_full_to_pniels(pre1, p1);
296
+ for (i = 0; i < S1_TABLE_SIZE - 1; i++)
297
+ ge25519_pnielsadd(&pre1[i+1], &d1, &pre1[i]);
298
+
299
+ /* set neutral */
300
+ memset(r, 0, sizeof(ge25519));
301
+ r->y[0] = 1;
302
+ r->z[0] = 1;
303
+
304
+ i = 255;
305
+ while ((i >= 0) && !(slide1[i] | slide2[i]))
306
+ i--;
307
+
308
+ for (; i >= 0; i--) {
309
+ ge25519_double_p1p1(&t, r);
310
+
311
+ if (slide1[i]) {
312
+ ge25519_p1p1_to_full(r, &t);
313
+ ge25519_pnielsadd_p1p1(&t, r, &pre1[abs(slide1[i]) / 2], (unsigned char)slide1[i] >> 7);
314
+ }
315
+
316
+ if (slide2[i]) {
317
+ ge25519_p1p1_to_full(r, &t);
318
+ ge25519_nielsadd2_p1p1(&t, r, &ge25519_niels_sliding_multiples[abs(slide2[i]) / 2], (unsigned char)slide2[i] >> 7);
319
+ }
320
+
321
+ ge25519_p1p1_to_partial(r, &t);
322
+ }
323
+ }
324
+
325
+ #if !defined(HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS)
326
+
327
+ static uint32_t
328
+ ge25519_windowb_equal(uint32_t b, uint32_t c) {
329
+ return ((b ^ c) - 1) >> 31;
330
+ }
331
+
332
+ static void
333
+ ge25519_scalarmult_base_choose_niels(ge25519_niels *t, const uint8_t table[256][96], uint32_t pos, signed char b) {
334
+ bignum25519 ALIGN(16) neg;
335
+ uint32_t sign = (uint32_t)((unsigned char)b >> 7);
336
+ uint32_t mask = ~(sign - 1);
337
+ uint32_t u = (b + mask) ^ mask;
338
+ uint32_t i;
339
+
340
+ /* ysubx, xaddy, t2d in packed form. initialize to ysubx = 1, xaddy = 1, t2d = 0 */
341
+ uint8_t ALIGN(16) packed[96] = {0};
342
+ packed[0] = 1;
343
+ packed[32] = 1;
344
+
345
+ for (i = 0; i < 8; i++)
346
+ curve25519_move_conditional_bytes(packed, table[(pos * 8) + i], ge25519_windowb_equal(u, i + 1));
347
+
348
+ /* expand in to t */
349
+ curve25519_expand(t->ysubx, packed + 0);
350
+ curve25519_expand(t->xaddy, packed + 32);
351
+ curve25519_expand(t->t2d , packed + 64);
352
+
353
+ /* adjust for sign */
354
+ curve25519_swap_conditional(t->ysubx, t->xaddy, sign);
355
+ curve25519_neg(neg, t->t2d);
356
+ curve25519_swap_conditional(t->t2d, neg, sign);
357
+ }
358
+
359
+ #endif /* HAVE_GE25519_SCALARMULT_BASE_CHOOSE_NIELS */
360
+
361
+ static void
362
+ ge25519_scalarmult_base_niels(ge25519 *r, const uint8_t table[256][96], const bignum256modm s) {
363
+ signed char b[64];
364
+ uint32_t i;
365
+ ge25519_niels ALIGN(16) t;
366
+
367
+ contract256_window4_modm(b, s);
368
+
369
+ ge25519_scalarmult_base_choose_niels(&t, table, 0, b[1]);
370
+ curve25519_sub_reduce(r->x, t.xaddy, t.ysubx);
371
+ curve25519_add_reduce(r->y, t.xaddy, t.ysubx);
372
+ memset(r->z, 0, sizeof(bignum25519));
373
+ r->z[0] = 2;
374
+ curve25519_copy(r->t, t.t2d);
375
+ for (i = 3; i < 64; i += 2) {
376
+ ge25519_scalarmult_base_choose_niels(&t, table, i / 2, b[i]);
377
+ ge25519_nielsadd2(r, &t);
378
+ }
379
+ ge25519_double_partial(r, r);
380
+ ge25519_double_partial(r, r);
381
+ ge25519_double_partial(r, r);
382
+ ge25519_double(r, r);
383
+ ge25519_scalarmult_base_choose_niels(&t, table, 0, b[0]);
384
+ curve25519_mul(t.t2d, t.t2d, ge25519_ecd);
385
+ ge25519_nielsadd2(r, &t);
386
+ for(i = 2; i < 64; i += 2) {
387
+ ge25519_scalarmult_base_choose_niels(&t, table, i / 2, b[i]);
388
+ ge25519_nielsadd2(r, &t);
389
+ }
390
+ }
@@ -0,0 +1,103 @@
1
+ /* os */
2
+ #if defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__)
3
+ #define OS_WINDOWS
4
+ #elif defined(sun) || defined(__sun) || defined(__SVR4) || defined(__svr4__)
5
+ #define OS_SOLARIS
6
+ #else
7
+ #include <sys/param.h> /* need this to define BSD */
8
+ #define OS_NIX
9
+ #if defined(__linux__)
10
+ #define OS_LINUX
11
+ #elif defined(BSD)
12
+ #define OS_BSD
13
+ #if defined(MACOS_X) || (defined(__APPLE__) & defined(__MACH__))
14
+ #define OS_OSX
15
+ #elif defined(macintosh) || defined(Macintosh)
16
+ #define OS_MAC
17
+ #elif defined(__OpenBSD__)
18
+ #define OS_OPENBSD
19
+ #endif
20
+ #endif
21
+ #endif
22
+
23
+
24
+ /* compiler */
25
+ #if defined(_MSC_VER)
26
+ #define COMPILER_MSVC
27
+ #endif
28
+ #if defined(__ICC)
29
+ #define COMPILER_INTEL
30
+ #endif
31
+ #if defined(__GNUC__)
32
+ #if (__GNUC__ >= 3)
33
+ #define COMPILER_GCC ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + (__GNUC_PATCHLEVEL__))
34
+ #else
35
+ #define COMPILER_GCC ((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) )
36
+ #endif
37
+ #endif
38
+ #if defined(__PATHCC__)
39
+ #define COMPILER_PATHCC
40
+ #endif
41
+ #if defined(__clang__)
42
+ #define COMPILER_CLANG ((__clang_major__ * 10000) + (__clang_minor__ * 100) + (__clang_patchlevel__))
43
+ #endif
44
+
45
+
46
+
47
+ /* cpu */
48
+ #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__ ) || defined(_M_X64)
49
+ #define CPU_X86_64
50
+ #elif defined(__i586__) || defined(__i686__) || (defined(_M_IX86) && (_M_IX86 >= 500))
51
+ #define CPU_X86 500
52
+ #elif defined(__i486__) || (defined(_M_IX86) && (_M_IX86 >= 400))
53
+ #define CPU_X86 400
54
+ #elif defined(__i386__) || (defined(_M_IX86) && (_M_IX86 >= 300)) || defined(__X86__) || defined(_X86_) || defined(__I86__)
55
+ #define CPU_X86 300
56
+ #elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) || defined(__ia64)
57
+ #define CPU_IA64
58
+ #endif
59
+
60
+ #if defined(__sparc__) || defined(__sparc) || defined(__sparcv9)
61
+ #define CPU_SPARC
62
+ #if defined(__sparcv9)
63
+ #define CPU_SPARC64
64
+ #endif
65
+ #endif
66
+
67
+ #if defined(powerpc) || defined(__PPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(POWERPC) || defined(_M_PPC)
68
+ #define CPU_PPC
69
+ #if defined(_ARCH_PWR7)
70
+ #define CPU_POWER7
71
+ #elif defined(__64BIT__)
72
+ #define CPU_PPC64
73
+ #else
74
+ #define CPU_PPC32
75
+ #endif
76
+ #endif
77
+
78
+ #if defined(__hppa__) || defined(__hppa)
79
+ #define CPU_HPPA
80
+ #endif
81
+
82
+ #if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)
83
+ #define CPU_ALPHA
84
+ #endif
85
+
86
+ /* 64 bit cpu */
87
+ #if defined(CPU_X86_64) || defined(CPU_IA64) || defined(CPU_SPARC64) || defined(__64BIT__) || defined(__LP64__) || defined(_LP64) || (defined(_MIPS_SZLONG) && (_MIPS_SZLONG == 64))
88
+ #define CPU_64BITS
89
+ #endif
90
+
91
+ #if defined(COMPILER_MSVC)
92
+ typedef signed char int8_t;
93
+ typedef unsigned char uint8_t;
94
+ typedef signed short int16_t;
95
+ typedef unsigned short uint16_t;
96
+ typedef signed int int32_t;
97
+ typedef unsigned int uint32_t;
98
+ typedef signed __int64 int64_t;
99
+ typedef unsigned __int64 uint64_t;
100
+ #else
101
+ #include <stdint.h>
102
+ #endif
103
+