kpqc 0.1.0 → 0.2.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/Gemfile +4 -0
  4. data/README.md +9 -6
  5. data/THIRD_PARTY_NOTICES.md +14 -47
  6. data/ext/kpqc/extconf_helper.rb +6 -3
  7. data/ext/kpqc/secure_clear.c +8 -0
  8. data/kpqc.gemspec +4 -5
  9. data/lib/kpqc/aimer.rb +6 -6
  10. data/lib/kpqc/version.rb +1 -2
  11. data/test/kat/aimer128f.rsp +4 -4
  12. data/test/kat/aimer128s.rsp +4 -4
  13. data/test/kat/aimer192f.rsp +4 -4
  14. data/test/kat/aimer192s.rsp +4 -4
  15. data/test/kat/aimer256f.rsp +4 -4
  16. data/test/kat/aimer256s.rsp +4 -4
  17. data/test/kat/haetae2.rsp +1 -1
  18. data/test/kat/haetae3.rsp +1 -1
  19. data/test/kat/haetae5.rsp +1 -1
  20. data/vendor/AIMer/LICENSE +1 -1
  21. data/vendor/AIMer/aim3.c +227 -0
  22. data/vendor/AIMer/aim3.h +63 -0
  23. data/vendor/AIMer/field.h +12 -4
  24. data/vendor/AIMer/field128.c +24 -381
  25. data/vendor/AIMer/field192.c +24 -400
  26. data/vendor/AIMer/field256.c +28 -447
  27. data/vendor/AIMer/field_common.c +98 -0
  28. data/vendor/AIMer/field_internal.h +218 -0
  29. data/vendor/AIMer/params/params-aimer-128f.h +8 -8
  30. data/vendor/AIMer/params/params-aimer-128s.h +8 -8
  31. data/vendor/AIMer/params/params-aimer-192f.h +8 -8
  32. data/vendor/AIMer/params/params-aimer-192s.h +8 -8
  33. data/vendor/AIMer/params/params-aimer-256f.h +8 -8
  34. data/vendor/AIMer/params/params-aimer-256s.h +8 -8
  35. data/vendor/AIMer/params.h +5 -0
  36. data/vendor/AIMer/sign.c +246 -167
  37. data/vendor/AIMer/sign.h +6 -6
  38. data/vendor/AIMer/tree.c +10 -4
  39. data/vendor/AIMer/tree.h +1 -1
  40. data/vendor/HAETAE/include/fixpoint.h +14 -14
  41. data/vendor/HAETAE/include/rans_byte.h +10 -9
  42. data/vendor/HAETAE/src/decompose.c +8 -4
  43. data/vendor/HAETAE/src/encoding.c +5 -5
  44. data/vendor/HAETAE/src/fft.c +1 -1
  45. data/vendor/HAETAE/src/fips202.c +26 -14
  46. data/vendor/HAETAE/src/fixpoint.c +21 -18
  47. data/vendor/HAETAE/src/ntt.c +2 -0
  48. data/vendor/HAETAE/src/packing.c +15 -15
  49. data/vendor/HAETAE/src/poly.c +30 -3
  50. data/vendor/HAETAE/src/polyfix.c +2 -2
  51. data/vendor/HAETAE/src/polymat.c +2 -2
  52. data/vendor/HAETAE/src/polyvec.c +7 -5
  53. data/vendor/HAETAE/src/reduce.c +2 -0
  54. data/vendor/HAETAE/src/sampler.c +231 -47
  55. data/vendor/HAETAE/src/sign.c +11 -10
  56. data/vendor/NTRUplus/NTRU+1152/api.h +27 -8
  57. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.c +12 -269
  58. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.h +4 -113
  59. data/vendor/NTRUplus/NTRU+1152/kem.c +110 -40
  60. data/vendor/NTRUplus/NTRU+1152/ntt.c +50 -54
  61. data/vendor/NTRUplus/NTRU+1152/poly.c +21 -13
  62. data/vendor/NTRUplus/NTRU+1152/poly.h +3 -3
  63. data/vendor/NTRUplus/NTRU+1152/randombytes.h +1 -0
  64. data/vendor/NTRUplus/NTRU+1152/symmetric.c +3 -9
  65. data/vendor/NTRUplus/NTRU+1152/symmetric.h +13 -3
  66. data/vendor/NTRUplus/NTRU+1152/util.h +15 -0
  67. data/vendor/NTRUplus/NTRU+768/api.h +27 -8
  68. data/vendor/NTRUplus/NTRU+768/fips202/fips202.c +12 -269
  69. data/vendor/NTRUplus/NTRU+768/fips202/fips202.h +4 -113
  70. data/vendor/NTRUplus/NTRU+768/kem.c +110 -40
  71. data/vendor/NTRUplus/NTRU+768/ntt.c +50 -54
  72. data/vendor/NTRUplus/NTRU+768/poly.c +23 -13
  73. data/vendor/NTRUplus/NTRU+768/poly.h +3 -3
  74. data/vendor/NTRUplus/NTRU+768/randombytes.h +1 -0
  75. data/vendor/NTRUplus/NTRU+768/symmetric.c +3 -9
  76. data/vendor/NTRUplus/NTRU+768/symmetric.h +13 -3
  77. data/vendor/NTRUplus/NTRU+768/util.h +15 -0
  78. data/vendor/NTRUplus/NTRU+864/api.h +27 -8
  79. data/vendor/NTRUplus/NTRU+864/fips202/fips202.c +12 -269
  80. data/vendor/NTRUplus/NTRU+864/fips202/fips202.h +4 -113
  81. data/vendor/NTRUplus/NTRU+864/kem.c +110 -40
  82. data/vendor/NTRUplus/NTRU+864/ntt.c +24 -28
  83. data/vendor/NTRUplus/NTRU+864/poly.c +26 -12
  84. data/vendor/NTRUplus/NTRU+864/poly.h +3 -3
  85. data/vendor/NTRUplus/NTRU+864/randombytes.h +1 -0
  86. data/vendor/NTRUplus/NTRU+864/symmetric.c +3 -9
  87. data/vendor/NTRUplus/NTRU+864/symmetric.h +13 -3
  88. data/vendor/NTRUplus/NTRU+864/util.h +15 -0
  89. data/vendor/SMAUG-T/src/cbd.c +4 -4
  90. data/vendor/SMAUG-T/src/ciphertext.c +2 -2
  91. data/vendor/SMAUG-T/src/dg.c +2 -2
  92. data/vendor/SMAUG-T/src/hwt.c +4 -4
  93. data/vendor/SMAUG-T/src/indcpa.c +5 -5
  94. data/vendor/SMAUG-T/src/kem.c +9 -7
  95. data/vendor/SMAUG-T/src/key.c +2 -2
  96. data/vendor/SMAUG-T/src/pack.c +8 -8
  97. metadata +17 -42
  98. data/vendor/AIMer/aim2.c +0 -163
  99. data/vendor/AIMer/aim2.h +0 -36
  100. data/vendor/AIMer/aim2_constant.h +0 -74
  101. data/vendor/SOURCES.json +0 -130
@@ -1,241 +1,28 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
 
3
3
  #include "field.h"
4
+ #include "field_internal.h"
4
5
  #include <stddef.h>
5
6
  #include <stdint.h>
6
7
 
7
- void gf_to_bytes(uint8_t *out, const gf in)
8
+ static void gf_mod(gf c, const uint64_t a[2 * AIM3_NUM_WORDS_FIELD])
8
9
  {
9
- int i, j;
10
- for (i = 0; i < AIM2_NUM_WORDS_FIELD; i++)
11
- {
12
- uint64_t u = in[i];
13
- for (j = 0; j < 8; j++)
14
- {
15
- *out++ = u;
16
- u >>= 8;
17
- }
18
- }
19
- }
20
-
21
- void gf_from_bytes(gf out, const uint8_t *in)
22
- {
23
- int i, j;
24
- for (i = 0; i < AIM2_NUM_WORDS_FIELD; i++)
25
- {
26
- uint64_t u = 0;
27
- for (j = 7; j >= 0; j--)
28
- {
29
- u = (u << 8) | in[8 * i + j];
30
- }
31
- out[i] = u;
32
- }
33
- }
34
-
35
- void gf_set0(gf a)
36
- {
37
- a[0] = 0;
38
- a[1] = 0;
39
- a[2] = 0;
40
- }
41
-
42
- void gf_copy(gf out, const gf in)
43
- {
44
- out[0] = in[0];
45
- out[1] = in[1];
46
- out[2] = in[2];
47
- }
48
-
49
- void gf_add(gf c, const gf a, const gf b)
50
- {
51
- c[0] = a[0] ^ b[0];
52
- c[1] = a[1] ^ b[1];
53
- c[2] = a[2] ^ b[2];
54
- }
55
-
56
- static void poly64_mul(uint64_t *z1, uint64_t *z0, uint64_t x0, uint64_t y0)
57
- {
58
- const uint64_t C0 = 0x5555555555555555;
59
- const uint64_t C1 = 0x3333333333333333;
60
- const uint64_t C2 = 0x0f0f0f0f0f0f0f0f;
61
- const uint64_t C3 = 0x00ff00ff00ff00ff;
62
- const uint64_t C4 = 0x0000ffff0000ffff;
63
- const uint64_t C5 = 0x00000000ffffffff;
64
- uint64_t x1, x2, x3, x4, x5, x6, x7;
65
- uint64_t y1, y2, y3, y4, y5, y6, y7;
66
- uint64_t f0, f1, f2, f3, f4, f5, f6, f7;
67
- uint64_t g0, g1, g2, g3, g4, g5, g6, g7;
68
- uint64_t s, t;
69
-
70
- x1 = x0 ^ (x0 >> 32); // will ignore outside C5
71
- x2 = ((x0 ^ (x0 >> 16)) & C4) | ((x1 ^ (x1 << 16)) & (C4 << 16));
72
- x3 = ((x0 ^ (x0 >> 8)) & C3) | ((x1 ^ (x1 << 8)) & (C3 << 8));
73
- x4 = x2 ^ (x2 >> 8); // will ignore outside C3
74
- x5 = ((x0 ^ (x0 >> 4)) & C2) | ((x1 ^ (x1 << 4)) & (C2 << 4));
75
- x6 = ((x2 ^ (x2 >> 4)) & C2) | ((x3 ^ (x3 << 4)) & (C2 << 4));
76
- x7 = x4 ^ (x4 >> 4); // will ignore outside C2
77
- s = ((x0 >> 2) ^ x2) & C1;
78
- x0 ^= s << 2;
79
- x2 ^= s;
80
- s = ((x1 >> 2) ^ x3) & C1;
81
- x1 ^= s << 2;
82
- x3 ^= s;
83
- s = ((x4 >> 2) ^ x6) & C1;
84
- x4 ^= s << 2;
85
- x6 ^= s;
86
- s = ((x5 >> 2) ^ x7) & C1;
87
- x5 ^= s << 2;
88
- x7 ^= s;
89
- s = ((x0 >> 1) ^ x1) & C0;
90
- x0 ^= s << 1;
91
- x1 ^= s;
92
- s = ((x2 >> 1) ^ x3) & C0;
93
- x2 ^= s << 1;
94
- x3 ^= s;
95
- s = ((x4 >> 1) ^ x5) & C0;
96
- x4 ^= s << 1;
97
- x5 ^= s;
98
- s = ((x6 >> 1) ^ x7) & C0;
99
- x6 ^= s << 1;
100
- x7 ^= s;
101
-
102
- y1 = y0 ^ (y0 >> 32);
103
- y2 = ((y0 ^ (y0 >> 16)) & C4) | ((y1 ^ (y1 << 16)) & (C4 << 16));
104
- y3 = ((y0 ^ (y0 >> 8)) & C3) | ((y1 ^ (y1 << 8)) & (C3 << 8));
105
- y4 = y2 ^ (y2 >> 8);
106
- y5 = ((y0 ^ (y0 >> 4)) & C2) | ((y1 ^ (y1 << 4)) & (C2 << 4));
107
- y6 = ((y2 ^ (y2 >> 4)) & C2) | ((y3 ^ (y3 << 4)) & (C2 << 4));
108
- y7 = y4 ^ (y4 >> 4);
109
- s = ((y0 >> 2) ^ y2) & C1;
110
- y0 ^= s << 2;
111
- y2 ^= s;
112
- s = ((y1 >> 2) ^ y3) & C1;
113
- y1 ^= s << 2;
114
- y3 ^= s;
115
- s = ((y4 >> 2) ^ y6) & C1;
116
- y4 ^= s << 2;
117
- y6 ^= s;
118
- s = ((y5 >> 2) ^ y7) & C1;
119
- y5 ^= s << 2;
120
- y7 ^= s;
121
- s = ((y0 >> 1) ^ y1) & C0;
122
- y0 ^= s << 1;
123
- y1 ^= s;
124
- s = ((y2 >> 1) ^ y3) & C0;
125
- y2 ^= s << 1;
126
- y3 ^= s;
127
- s = ((y4 >> 1) ^ y5) & C0;
128
- y4 ^= s << 1;
129
- y5 ^= s;
130
- s = ((y6 >> 1) ^ y7) & C0;
131
- y6 ^= s << 1;
132
- y7 ^= s;
133
-
134
- f0 = x0 & y0;
135
- f1 = (x0 & y1) ^ (x1 & y0);
136
- f2 = (x0 & y2) ^ (x1 & y1) ^ (x2 & y0);
137
- f3 = (x0 & y3) ^ (x1 & y2) ^ (x2 & y1) ^ (x3 & y0);
138
- g0 = (x1 & y3) ^ (x2 & y2) ^ (x3 & y1);
139
- g1 = (x2 & y3) ^ (x3 & y2);
140
- g2 = x3 & y3;
141
-
142
- f4 = x4 & y4;
143
- f5 = (x4 & y5) ^ (x5 & y4);
144
- f6 = (x4 & y6) ^ (x5 & y5) ^ (x6 & y4);
145
- f7 = (x4 & y7) ^ (x5 & y6) ^ (x6 & y5) ^ (x7 & y4);
146
- g4 = (x5 & y7) ^ (x6 & y6) ^ (x7 & y5);
147
- g5 = (x6 & y7) ^ (x7 & y6);
148
- g6 = x7 & y7;
149
-
150
- s = ((f0 >> 1) ^ f1) & C0;
151
- f0 ^= s << 1;
152
- f1 ^= s;
153
- s = ((f2 >> 1) ^ f3) & C0;
154
- f2 ^= s << 1;
155
- f3 ^= s;
156
- s = ((f0 >> 2) ^ f2) & C1;
157
- f0 ^= s << 2;
158
- f2 ^= s;
159
- s = ((f1 >> 2) ^ f3) & C1;
160
- f1 ^= s << 2;
161
- f3 ^= s;
162
- s = ((g0 >> 1) ^ g1) & C0;
163
- g0 ^= s << 1;
164
- g1 ^= s;
165
- s = (g2 >> 1) & C0;
166
- g2 ^= s << 1;
167
- g3 = s;
168
- s = ((g0 >> 2) ^ g2) & C1;
169
- g0 ^= s << 2;
170
- g2 ^= s;
171
- s = ((g1 >> 2) ^ g3) & C1;
172
- g1 ^= s << 2;
173
- g3 ^= s;
174
-
175
- s = ((f4 >> 1) ^ f5) & C0;
176
- f4 ^= s << 1;
177
- f5 ^= s;
178
- s = ((f6 >> 1) ^ f7) & C0;
179
- f6 ^= s << 1;
180
- f7 ^= s;
181
- s = ((f4 >> 2) ^ f6) & C1;
182
- f4 ^= s << 2;
183
- f6 ^= s;
184
- s = ((f5 >> 2) ^ f7) & C1;
185
- f5 ^= s << 2;
186
- f7 ^= s;
187
- s = ((g4 >> 1) ^ g5) & C0;
188
- g4 ^= s << 1;
189
- g5 ^= s;
190
- s = (g6 >> 1) & C0;
191
- g6 ^= s << 1;
192
- g7 = s;
193
- s = ((g4 >> 2) ^ g6) & C1;
194
- g4 ^= s << 2;
195
- g6 ^= s;
196
- s = ((g5 >> 2) ^ g7) & C1;
197
- g5 ^= s << 2;
198
- g7 ^= s;
199
-
200
- t = f0 ^ g0;
201
- f0 ^= ((f5 ^ t) & C2) << 4;
202
- g0 ^= (g5 ^ (t >> 4)) & C2;
203
- t = f1 ^ g1;
204
- f1 ^= (f5 ^ (t << 4)) & (C2 << 4);
205
- g1 ^= ((g5 ^ t) >> 4) & C2;
206
- t = f2 ^ g2;
207
- f2 ^= ((f6 ^ t) & C2) << 4;
208
- g2 ^= (g6 ^ (t >> 4)) & C2;
209
- t = f3 ^ g3;
210
- f3 ^= (f6 ^ (t << 4)) & (C2 << 4);
211
- g3 ^= ((g6 ^ t) >> 4) & C2;
212
- t = f4 ^ g4;
213
- f4 ^= ((f7 ^ t) & C2) << 4;
214
- g4 ^= (g7 ^ (t >> 4)) & C2;
10
+ uint64_t t = a[3] ^ ((a[5] >> 57) ^ (a[5] >> 62) ^ (a[5] >> 63));
215
11
 
216
- t = f0 ^ g0;
217
- f0 ^= ((f3 ^ t) & C3) << 8;
218
- g0 ^= (g3 ^ (t >> 8)) & C3;
219
- t = f1 ^ g1;
220
- f1 ^= (f3 ^ (t << 8)) & (C3 << 8);
221
- g1 ^= ((g3 ^ t) >> 8) & C3;
222
- t = f2 ^ g2;
223
- f2 ^= ((f4 ^ t) & C3) << 8;
224
- g2 ^= (g4 ^ (t >> 8)) & C3;
12
+ c[2] = a[2] ^ a[5];
13
+ c[2] ^= (a[5] << 7) | (a[4] >> 57);
14
+ c[2] ^= (a[5] << 2) | (a[4] >> 62);
15
+ c[2] ^= (a[5] << 1) | (a[4] >> 63);
225
16
 
226
- t = f0 ^ g0;
227
- f0 ^= ((f2 ^ t) & C4) << 16;
228
- g0 ^= (g2 ^ (t >> 16)) & C4;
229
- t = f1 ^ g1;
230
- f1 ^= (f2 ^ (t << 16)) & (C4 << 16);
231
- g1 ^= ((g2 ^ t) >> 16) & C4;
17
+ c[1] = a[1] ^ a[4];
18
+ c[1] ^= (a[4] << 7) | (t >> 57);
19
+ c[1] ^= (a[4] << 2) | (t >> 62);
20
+ c[1] ^= (a[4] << 1) | (t >> 63);
232
21
 
233
- t = f0 ^ g0;
234
- f0 ^= ((t ^ f1) & C5) << 32;
235
- g0 ^= ((t >> 32) ^ g1) & C5;
236
-
237
- *z0 = f0;
238
- *z1 = g0;
22
+ c[0] = a[0] ^ t;
23
+ c[0] ^= (t << 7);
24
+ c[0] ^= (t << 2);
25
+ c[0] ^= (t << 1);
239
26
  }
240
27
 
241
28
  void gf_mul(gf c, const gf a, const gf b)
@@ -267,144 +54,21 @@ void gf_mul(gf c, const gf a, const gf b)
267
54
  temp[3] ^= t[0];
268
55
  temp[4] ^= t[1];
269
56
 
270
- t[0] = temp[3] ^ ((temp[5] >> 57) ^ (temp[5] >> 62) ^ (temp[5] >> 63));
271
-
272
- c[2] = temp[2] ^ temp[5];
273
- c[2] ^= (temp[5] << 7) | (temp[4] >> 57);
274
- c[2] ^= (temp[5] << 2) | (temp[4] >> 62);
275
- c[2] ^= (temp[5] << 1) | (temp[4] >> 63);
276
-
277
- c[1] = temp[1] ^ temp[4];
278
- c[1] ^= (temp[4] << 7) | (t[0] >> 57);
279
- c[1] ^= (temp[4] << 2) | (t[0] >> 62);
280
- c[1] ^= (temp[4] << 1) | (t[0] >> 63);
281
-
282
- c[0] = temp[0] ^ t[0];
283
- c[0] ^= (t[0] << 7);
284
- c[0] ^= (t[0] << 2);
285
- c[0] ^= (t[0] << 1);
286
- }
287
-
288
- void gf_mul_add(gf c, const gf a, const gf b)
289
- {
290
- uint64_t t[3] = {0,};
291
- uint64_t temp[6] = {0,};
292
-
293
- poly64_mul(&t[0], &temp[0], a[0], b[0]);
294
- poly64_mul(&t[2], &t[1], a[1], b[1]);
295
- t[0] ^= t[1];
296
-
297
- poly64_mul(&temp[5], &t[1], a[2], b[2]);
298
- t[1] ^= t[2];
299
-
300
- temp[1] = t[0] ^ temp[0];
301
- temp[2] = t[1] ^ temp[1];
302
- temp[4] = temp[5] ^ t[1];
303
- temp[3] = temp[4] ^ t[0];
304
-
305
- poly64_mul(&t[1], &t[0], (a[0] ^ a[1]), (b[0] ^ b[1]));
306
- temp[1] ^= t[0];
307
- temp[2] ^= t[1];
308
-
309
- poly64_mul(&t[1], &t[0], (a[0] ^ a[2]), (b[0] ^ b[2]));
310
- temp[2] ^= t[0];
311
- temp[3] ^= t[1];
312
-
313
- poly64_mul(&t[1], &t[0], (a[1] ^ a[2]), (b[1] ^ b[2]));
314
- temp[3] ^= t[0];
315
- temp[4] ^= t[1];
316
-
317
- t[0] = temp[3] ^ ((temp[5] >> 57) ^ (temp[5] >> 62) ^ (temp[5] >> 63));
318
-
319
- c[2] ^= temp[2] ^ temp[5];
320
- c[2] ^= (temp[5] << 7) | (temp[4] >> 57);
321
- c[2] ^= (temp[5] << 2) | (temp[4] >> 62);
322
- c[2] ^= (temp[5] << 1) | (temp[4] >> 63);
323
-
324
- c[1] ^= temp[1] ^ temp[4];
325
- c[1] ^= (temp[4] << 7) | (t[0] >> 57);
326
- c[1] ^= (temp[4] << 2) | (t[0] >> 62);
327
- c[1] ^= (temp[4] << 1) | (t[0] >> 63);
328
-
329
- c[0] ^= temp[0] ^ t[0];
330
- c[0] ^= (t[0] << 7);
331
- c[0] ^= (t[0] << 2);
332
- c[0] ^= (t[0] << 1);
333
- }
334
-
335
- static void poly64_sqr(uint64_t *z1, uint64_t *z0, uint64_t x)
336
- {
337
- const uint64_t C0 = 0x5555555555555555;
338
- const uint64_t C1 = 0x3333333333333333;
339
- const uint64_t C2 = 0x0f0f0f0f0f0f0f0f;
340
- const uint64_t C3 = 0x00ff00ff00ff00ff;
341
- const uint64_t C4 = 0x0000ffff0000ffff;
342
- const uint64_t C5 = 0x00000000ffffffff;
343
- uint64_t y = x >> 32;
344
- x &= C5;
345
- x = (x | (x << 16)) & C4;
346
- y = (y | (y << 16)) & C4;
347
- x = (x | (x << 8)) & C3;
348
- y = (y | (y << 8)) & C3;
349
- x = (x | (x << 4)) & C2;
350
- y = (y | (y << 4)) & C2;
351
- x = (x | (x << 2)) & C1;
352
- y = (y | (y << 2)) & C1;
353
- x = (x | (x << 1)) & C0;
354
- y = (y | (y << 1)) & C0;
355
- *z0 = x;
356
- *z1 = y;
57
+ gf_mod(c, temp);
357
58
  }
358
59
 
359
60
  void gf_sqr(gf c, const gf a)
360
61
  {
361
- uint64_t t = 0;
362
62
  uint64_t temp[6] = {0,};
363
63
 
364
64
  poly64_sqr(&temp[1], &temp[0], a[0]);
365
65
  poly64_sqr(&temp[3], &temp[2], a[1]);
366
66
  poly64_sqr(&temp[5], &temp[4], a[2]);
367
67
 
368
- t = temp[3] ^ ((temp[5] >> 57) ^ (temp[5] >> 62) ^ (temp[5] >> 63));
369
-
370
- c[2] = temp[2] ^ temp[5];
371
- c[2] ^= (temp[5] << 7) | (temp[4] >> 57);
372
- c[2] ^= (temp[5] << 2) | (temp[4] >> 62);
373
- c[2] ^= (temp[5] << 1) | (temp[4] >> 63);
374
-
375
- c[1] = temp[1] ^ temp[4];
376
- c[1] ^= (temp[4] << 7) | (t >> 57);
377
- c[1] ^= (temp[4] << 2) | (t >> 62);
378
- c[1] ^= (temp[4] << 1) | (t >> 63);
379
-
380
- c[0] = temp[0] ^ t;
381
- c[0] ^= (t << 7);
382
- c[0] ^= (t << 2);
383
- c[0] ^= (t << 1);
384
- }
385
-
386
- void gf_exp(gf out, const gf in, const uint64_t *exp)
387
- {
388
- gf temp;
389
-
390
- gf_copy(temp, in);
391
- gf_set0(out);
392
- out[0] = 1;
393
- for (size_t i = 0; i < AIM2_NUM_WORDS_FIELD; i++)
394
- {
395
- uint64_t e = exp[i];
396
- for (size_t j = 0; j < AIM2_NUM_BITS_WORD; j++, e >>= 1)
397
- {
398
- if (e & 1)
399
- {
400
- gf_mul(out, out, temp);
401
- }
402
- gf_sqr(temp, temp);
403
- }
404
- }
68
+ gf_mod(c, temp);
405
69
  }
406
70
 
407
- void gf_mat_vec_mul(gf c, const gf a, const gf b[AIM2_NUM_BITS_FIELD])
71
+ void gf_mat_vec_mul(gf c, const gf a, const gf b[AIM3_NUM_BITS_FIELD])
408
72
  {
409
73
  const uint64_t *a_ptr = a;
410
74
  const gf *b_ptr = b;
@@ -413,27 +77,27 @@ void gf_mat_vec_mul(gf c, const gf a, const gf b[AIM2_NUM_BITS_FIELD])
413
77
  uint64_t temp_c1 = 0;
414
78
  uint64_t temp_c2 = 0;
415
79
  uint64_t mask;
416
- for (size_t i = AIM2_NUM_WORDS_FIELD; i; --i, ++a_ptr)
80
+ for (size_t i = AIM3_NUM_WORDS_FIELD; i; --i, ++a_ptr)
417
81
  {
418
82
  uint64_t index = *a_ptr;
419
- for (size_t j = AIM2_NUM_BITS_WORD; j; j -= 4, index >>= 4, b_ptr += 4)
83
+ for (size_t j = AIM3_NUM_BITS_WORD; j; j -= 4, index >>= 4, b_ptr += 4)
420
84
  {
421
- mask = -(index & 1);
85
+ mask = 0U - (index & 1);
422
86
  temp_c0 ^= (b_ptr[0][0] & mask);
423
87
  temp_c1 ^= (b_ptr[0][1] & mask);
424
88
  temp_c2 ^= (b_ptr[0][2] & mask);
425
89
 
426
- mask = -((index >> 1) & 1);
90
+ mask = 0U - ((index >> 1) & 1);
427
91
  temp_c0 ^= (b_ptr[1][0] & mask);
428
92
  temp_c1 ^= (b_ptr[1][1] & mask);
429
93
  temp_c2 ^= (b_ptr[1][2] & mask);
430
94
 
431
- mask = -((index >> 2) & 1);
95
+ mask = 0U - ((index >> 2) & 1);
432
96
  temp_c0 ^= (b_ptr[2][0] & mask);
433
97
  temp_c1 ^= (b_ptr[2][1] & mask);
434
98
  temp_c2 ^= (b_ptr[2][2] & mask);
435
99
 
436
- mask = -((index >> 3) & 1);
100
+ mask = 0U - ((index >> 3) & 1);
437
101
  temp_c0 ^= (b_ptr[3][0] & mask);
438
102
  temp_c1 ^= (b_ptr[3][1] & mask);
439
103
  temp_c2 ^= (b_ptr[3][2] & mask);
@@ -443,43 +107,3 @@ void gf_mat_vec_mul(gf c, const gf a, const gf b[AIM2_NUM_BITS_FIELD])
443
107
  c[1] = temp_c1;
444
108
  c[2] = temp_c2;
445
109
  }
446
-
447
- void gf_mat_vec_mul_add(gf c, const gf a, const gf b[AIM2_NUM_BITS_FIELD])
448
- {
449
- const uint64_t *a_ptr = a;
450
- const gf *b_ptr = b;
451
-
452
- uint64_t temp_c0 = 0;
453
- uint64_t temp_c1 = 0;
454
- uint64_t temp_c2 = 0;
455
- uint64_t mask;
456
- for (size_t i = AIM2_NUM_WORDS_FIELD; i; --i, ++a_ptr)
457
- {
458
- uint64_t index = *a_ptr;
459
- for (size_t j = AIM2_NUM_BITS_WORD; j; j -= 4, index >>= 4, b_ptr += 4)
460
- {
461
- mask = -(index & 1);
462
- temp_c0 ^= (b_ptr[0][0] & mask);
463
- temp_c1 ^= (b_ptr[0][1] & mask);
464
- temp_c2 ^= (b_ptr[0][2] & mask);
465
-
466
- mask = -((index >> 1) & 1);
467
- temp_c0 ^= (b_ptr[1][0] & mask);
468
- temp_c1 ^= (b_ptr[1][1] & mask);
469
- temp_c2 ^= (b_ptr[1][2] & mask);
470
-
471
- mask = -((index >> 2) & 1);
472
- temp_c0 ^= (b_ptr[2][0] & mask);
473
- temp_c1 ^= (b_ptr[2][1] & mask);
474
- temp_c2 ^= (b_ptr[2][2] & mask);
475
-
476
- mask = -((index >> 3) & 1);
477
- temp_c0 ^= (b_ptr[3][0] & mask);
478
- temp_c1 ^= (b_ptr[3][1] & mask);
479
- temp_c2 ^= (b_ptr[3][2] & mask);
480
- }
481
- }
482
- c[0] ^= temp_c0;
483
- c[1] ^= temp_c1;
484
- c[2] ^= temp_c2;
485
- }