kpqc 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 (191) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +21 -0
  4. data/README.md +174 -0
  5. data/Rakefile +57 -0
  6. data/THIRD_PARTY_NOTICES.md +53 -0
  7. data/ext/kpqc/aimer128f/extconf.rb +4 -0
  8. data/ext/kpqc/aimer128s/extconf.rb +4 -0
  9. data/ext/kpqc/aimer192f/extconf.rb +4 -0
  10. data/ext/kpqc/aimer192s/extconf.rb +4 -0
  11. data/ext/kpqc/aimer256f/extconf.rb +4 -0
  12. data/ext/kpqc/aimer256s/extconf.rb +4 -0
  13. data/ext/kpqc/extconf_helper.rb +93 -0
  14. data/ext/kpqc/haetae2/extconf.rb +4 -0
  15. data/ext/kpqc/haetae3/extconf.rb +4 -0
  16. data/ext/kpqc/haetae5/extconf.rb +4 -0
  17. data/ext/kpqc/module.c +195 -0
  18. data/ext/kpqc/ntruplus1152/extconf.rb +4 -0
  19. data/ext/kpqc/ntruplus768/extconf.rb +4 -0
  20. data/ext/kpqc/ntruplus864/extconf.rb +4 -0
  21. data/ext/kpqc/randombytes.c +107 -0
  22. data/ext/kpqc/smaugt128/extconf.rb +4 -0
  23. data/ext/kpqc/smaugt192/extconf.rb +4 -0
  24. data/ext/kpqc/smaugt256/extconf.rb +4 -0
  25. data/ext/kpqc/timer/extconf.rb +4 -0
  26. data/kpqc.gemspec +41 -0
  27. data/lib/kpqc/aimer.rb +38 -0
  28. data/lib/kpqc/api.rb +129 -0
  29. data/lib/kpqc/haetae.rb +25 -0
  30. data/lib/kpqc/ntruplus.rb +25 -0
  31. data/lib/kpqc/smaugt.rb +29 -0
  32. data/lib/kpqc/types.rb +103 -0
  33. data/lib/kpqc/version.rb +6 -0
  34. data/lib/kpqc.rb +33 -0
  35. data/test/algorithm_test.rb +111 -0
  36. data/test/api_test.rb +52 -0
  37. data/test/interop.mjs +34 -0
  38. data/test/interop_test.rb +82 -0
  39. data/test/kat/aimer128f.rsp +10 -0
  40. data/test/kat/aimer128s.rsp +10 -0
  41. data/test/kat/aimer192f.rsp +10 -0
  42. data/test/kat/aimer192s.rsp +10 -0
  43. data/test/kat/aimer256f.rsp +10 -0
  44. data/test/kat/aimer256s.rsp +10 -0
  45. data/test/kat/haetae2.rsp +10 -0
  46. data/test/kat/haetae3.rsp +10 -0
  47. data/test/kat/haetae5.rsp +10 -0
  48. data/test/kat/ntruplus1152.rsp +8 -0
  49. data/test/kat/ntruplus768.rsp +8 -0
  50. data/test/kat/ntruplus864.rsp +8 -0
  51. data/test/kat/smaugt128.rsp +8 -0
  52. data/test/kat/smaugt192.rsp +8 -0
  53. data/test/kat/smaugt256.rsp +8 -0
  54. data/test/kat/timer.rsp +8 -0
  55. data/test/kat_drbg.rb +155 -0
  56. data/test/kat_test.rb +99 -0
  57. data/test/test_helper.rb +21 -0
  58. data/vendor/AIMer/LICENSE +21 -0
  59. data/vendor/AIMer/aim2.c +163 -0
  60. data/vendor/AIMer/aim2.h +36 -0
  61. data/vendor/AIMer/aim2_constant.h +74 -0
  62. data/vendor/AIMer/api.h +42 -0
  63. data/vendor/AIMer/common/crypto_declassify.h +7 -0
  64. data/vendor/AIMer/common/fips202.c +878 -0
  65. data/vendor/AIMer/common/fips202.h +166 -0
  66. data/vendor/AIMer/common/rng.h +56 -0
  67. data/vendor/AIMer/field.h +43 -0
  68. data/vendor/AIMer/field128.c +454 -0
  69. data/vendor/AIMer/field192.c +485 -0
  70. data/vendor/AIMer/field256.c +564 -0
  71. data/vendor/AIMer/hash.c +50 -0
  72. data/vendor/AIMer/hash.h +37 -0
  73. data/vendor/AIMer/params/params-aimer-128f.h +34 -0
  74. data/vendor/AIMer/params/params-aimer-128s.h +34 -0
  75. data/vendor/AIMer/params/params-aimer-192f.h +34 -0
  76. data/vendor/AIMer/params/params-aimer-192s.h +34 -0
  77. data/vendor/AIMer/params/params-aimer-256f.h +34 -0
  78. data/vendor/AIMer/params/params-aimer-256s.h +34 -0
  79. data/vendor/AIMer/params.h +5 -0
  80. data/vendor/AIMer/sign.c +631 -0
  81. data/vendor/AIMer/sign.h +40 -0
  82. data/vendor/AIMer/tree.c +75 -0
  83. data/vendor/AIMer/tree.h +26 -0
  84. data/vendor/HAETAE/LICENSE +22 -0
  85. data/vendor/HAETAE/include/api.h +54 -0
  86. data/vendor/HAETAE/include/common.h +12 -0
  87. data/vendor/HAETAE/include/config.h +42 -0
  88. data/vendor/HAETAE/include/decompose.h +19 -0
  89. data/vendor/HAETAE/include/encoding.h +20 -0
  90. data/vendor/HAETAE/include/fft.h +26 -0
  91. data/vendor/HAETAE/include/fips202.h +40 -0
  92. data/vendor/HAETAE/include/fixpoint.h +125 -0
  93. data/vendor/HAETAE/include/ntt.h +16 -0
  94. data/vendor/HAETAE/include/packing.h +58 -0
  95. data/vendor/HAETAE/include/params.h +117 -0
  96. data/vendor/HAETAE/include/poly.h +65 -0
  97. data/vendor/HAETAE/include/polyfix.h +65 -0
  98. data/vendor/HAETAE/include/polymat.h +32 -0
  99. data/vendor/HAETAE/include/polyvec.h +131 -0
  100. data/vendor/HAETAE/include/randombytes.h +39 -0
  101. data/vendor/HAETAE/include/rans_byte.h +335 -0
  102. data/vendor/HAETAE/include/reduce.h +31 -0
  103. data/vendor/HAETAE/include/sampler.h +23 -0
  104. data/vendor/HAETAE/include/symmetric.h +52 -0
  105. data/vendor/HAETAE/src/decompose.c +73 -0
  106. data/vendor/HAETAE/src/encoding.c +700 -0
  107. data/vendor/HAETAE/src/fft.c +235 -0
  108. data/vendor/HAETAE/src/fips202.c +745 -0
  109. data/vendor/HAETAE/src/fixpoint.c +143 -0
  110. data/vendor/HAETAE/src/ntt.c +98 -0
  111. data/vendor/HAETAE/src/packing.c +595 -0
  112. data/vendor/HAETAE/src/poly.c +371 -0
  113. data/vendor/HAETAE/src/polyfix.c +298 -0
  114. data/vendor/HAETAE/src/polymat.c +82 -0
  115. data/vendor/HAETAE/src/polyvec.c +534 -0
  116. data/vendor/HAETAE/src/reduce.c +96 -0
  117. data/vendor/HAETAE/src/sampler.c +310 -0
  118. data/vendor/HAETAE/src/sign.c +558 -0
  119. data/vendor/HAETAE/src/symmetric-shake.c +50 -0
  120. data/vendor/NTRUplus/LICENSE +21 -0
  121. data/vendor/NTRUplus/NTRU+1152/api.h +24 -0
  122. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.c +878 -0
  123. data/vendor/NTRUplus/NTRU+1152/fips202/fips202.h +166 -0
  124. data/vendor/NTRUplus/NTRU+1152/kem.c +286 -0
  125. data/vendor/NTRUplus/NTRU+1152/ntt.c +394 -0
  126. data/vendor/NTRUplus/NTRU+1152/ntt.h +16 -0
  127. data/vendor/NTRUplus/NTRU+1152/params.h +18 -0
  128. data/vendor/NTRUplus/NTRU+1152/poly.c +318 -0
  129. data/vendor/NTRUplus/NTRU+1152/poly.h +31 -0
  130. data/vendor/NTRUplus/NTRU+1152/randombytes.h +9 -0
  131. data/vendor/NTRUplus/NTRU+1152/symmetric.c +39 -0
  132. data/vendor/NTRUplus/NTRU+1152/symmetric.h +12 -0
  133. data/vendor/NTRUplus/NTRU+768/api.h +24 -0
  134. data/vendor/NTRUplus/NTRU+768/fips202/fips202.c +878 -0
  135. data/vendor/NTRUplus/NTRU+768/fips202/fips202.h +166 -0
  136. data/vendor/NTRUplus/NTRU+768/kem.c +286 -0
  137. data/vendor/NTRUplus/NTRU+768/ntt.c +379 -0
  138. data/vendor/NTRUplus/NTRU+768/ntt.h +16 -0
  139. data/vendor/NTRUplus/NTRU+768/params.h +18 -0
  140. data/vendor/NTRUplus/NTRU+768/poly.c +320 -0
  141. data/vendor/NTRUplus/NTRU+768/poly.h +31 -0
  142. data/vendor/NTRUplus/NTRU+768/randombytes.h +9 -0
  143. data/vendor/NTRUplus/NTRU+768/symmetric.c +39 -0
  144. data/vendor/NTRUplus/NTRU+768/symmetric.h +12 -0
  145. data/vendor/NTRUplus/NTRU+864/api.h +24 -0
  146. data/vendor/NTRUplus/NTRU+864/fips202/fips202.c +878 -0
  147. data/vendor/NTRUplus/NTRU+864/fips202/fips202.h +166 -0
  148. data/vendor/NTRUplus/NTRU+864/kem.c +286 -0
  149. data/vendor/NTRUplus/NTRU+864/ntt.c +383 -0
  150. data/vendor/NTRUplus/NTRU+864/ntt.h +16 -0
  151. data/vendor/NTRUplus/NTRU+864/params.h +18 -0
  152. data/vendor/NTRUplus/NTRU+864/poly.c +314 -0
  153. data/vendor/NTRUplus/NTRU+864/poly.h +31 -0
  154. data/vendor/NTRUplus/NTRU+864/randombytes.h +9 -0
  155. data/vendor/NTRUplus/NTRU+864/symmetric.c +39 -0
  156. data/vendor/NTRUplus/NTRU+864/symmetric.h +12 -0
  157. data/vendor/SMAUG-T/LICENSE +22 -0
  158. data/vendor/SMAUG-T/include/api.h +37 -0
  159. data/vendor/SMAUG-T/include/cbd.h +15 -0
  160. data/vendor/SMAUG-T/include/ciphertext.h +45 -0
  161. data/vendor/SMAUG-T/include/common.h +12 -0
  162. data/vendor/SMAUG-T/include/config.h +48 -0
  163. data/vendor/SMAUG-T/include/dg.h +28 -0
  164. data/vendor/SMAUG-T/include/fips202.h +41 -0
  165. data/vendor/SMAUG-T/include/hash.h +21 -0
  166. data/vendor/SMAUG-T/include/hwt.h +28 -0
  167. data/vendor/SMAUG-T/include/indcpa.h +33 -0
  168. data/vendor/SMAUG-T/include/key.h +34 -0
  169. data/vendor/SMAUG-T/include/pack.h +78 -0
  170. data/vendor/SMAUG-T/include/packring.h +50 -0
  171. data/vendor/SMAUG-T/include/params.h +84 -0
  172. data/vendor/SMAUG-T/include/poly.h +41 -0
  173. data/vendor/SMAUG-T/include/randombytes.h +11 -0
  174. data/vendor/SMAUG-T/include/toomcook.h +14 -0
  175. data/vendor/SMAUG-T/include/verify.h +16 -0
  176. data/vendor/SMAUG-T/src/cbd.c +159 -0
  177. data/vendor/SMAUG-T/src/ciphertext.c +95 -0
  178. data/vendor/SMAUG-T/src/dg.c +112 -0
  179. data/vendor/SMAUG-T/src/fips202.c +745 -0
  180. data/vendor/SMAUG-T/src/hash.c +15 -0
  181. data/vendor/SMAUG-T/src/hwt.c +121 -0
  182. data/vendor/SMAUG-T/src/indcpa.c +187 -0
  183. data/vendor/SMAUG-T/src/kem.c +194 -0
  184. data/vendor/SMAUG-T/src/key.c +102 -0
  185. data/vendor/SMAUG-T/src/pack.c +349 -0
  186. data/vendor/SMAUG-T/src/packring.c +503 -0
  187. data/vendor/SMAUG-T/src/poly.c +200 -0
  188. data/vendor/SMAUG-T/src/toomcook.c +256 -0
  189. data/vendor/SMAUG-T/src/verify.c +48 -0
  190. data/vendor/SOURCES.json +130 -0
  191. metadata +280 -0
@@ -0,0 +1,485 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ #include "field.h"
4
+ #include <stddef.h>
5
+ #include <stdint.h>
6
+
7
+ void gf_to_bytes(uint8_t *out, const gf in)
8
+ {
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;
215
+
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;
225
+
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;
232
+
233
+ t = f0 ^ g0;
234
+ f0 ^= ((t ^ f1) & C5) << 32;
235
+ g0 ^= ((t >> 32) ^ g1) & C5;
236
+
237
+ *z0 = f0;
238
+ *z1 = g0;
239
+ }
240
+
241
+ void gf_mul(gf c, const gf a, const gf b)
242
+ {
243
+ uint64_t t[3] = {0,};
244
+ uint64_t temp[6] = {0,};
245
+
246
+ poly64_mul(&t[0], &temp[0], a[0], b[0]);
247
+ poly64_mul(&t[2], &t[1], a[1], b[1]);
248
+ t[0] ^= t[1];
249
+
250
+ poly64_mul(&temp[5], &t[1], a[2], b[2]);
251
+ t[1] ^= t[2];
252
+
253
+ temp[1] = t[0] ^ temp[0];
254
+ temp[2] = t[1] ^ temp[1];
255
+ temp[4] = temp[5] ^ t[1];
256
+ temp[3] = temp[4] ^ t[0];
257
+
258
+ poly64_mul(&t[1], &t[0], (a[0] ^ a[1]), (b[0] ^ b[1]));
259
+ temp[1] ^= t[0];
260
+ temp[2] ^= t[1];
261
+
262
+ poly64_mul(&t[1], &t[0], (a[0] ^ a[2]), (b[0] ^ b[2]));
263
+ temp[2] ^= t[0];
264
+ temp[3] ^= t[1];
265
+
266
+ poly64_mul(&t[1], &t[0], (a[1] ^ a[2]), (b[1] ^ b[2]));
267
+ temp[3] ^= t[0];
268
+ temp[4] ^= t[1];
269
+
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;
357
+ }
358
+
359
+ void gf_sqr(gf c, const gf a)
360
+ {
361
+ uint64_t t = 0;
362
+ uint64_t temp[6] = {0,};
363
+
364
+ poly64_sqr(&temp[1], &temp[0], a[0]);
365
+ poly64_sqr(&temp[3], &temp[2], a[1]);
366
+ poly64_sqr(&temp[5], &temp[4], a[2]);
367
+
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
+ }
405
+ }
406
+
407
+ void gf_mat_vec_mul(gf c, const gf a, const gf b[AIM2_NUM_BITS_FIELD])
408
+ {
409
+ const uint64_t *a_ptr = a;
410
+ const gf *b_ptr = b;
411
+
412
+ uint64_t temp_c0 = 0;
413
+ uint64_t temp_c1 = 0;
414
+ uint64_t temp_c2 = 0;
415
+ uint64_t mask;
416
+ for (size_t i = AIM2_NUM_WORDS_FIELD; i; --i, ++a_ptr)
417
+ {
418
+ uint64_t index = *a_ptr;
419
+ for (size_t j = AIM2_NUM_BITS_WORD; j; j -= 4, index >>= 4, b_ptr += 4)
420
+ {
421
+ mask = -(index & 1);
422
+ temp_c0 ^= (b_ptr[0][0] & mask);
423
+ temp_c1 ^= (b_ptr[0][1] & mask);
424
+ temp_c2 ^= (b_ptr[0][2] & mask);
425
+
426
+ mask = -((index >> 1) & 1);
427
+ temp_c0 ^= (b_ptr[1][0] & mask);
428
+ temp_c1 ^= (b_ptr[1][1] & mask);
429
+ temp_c2 ^= (b_ptr[1][2] & mask);
430
+
431
+ mask = -((index >> 2) & 1);
432
+ temp_c0 ^= (b_ptr[2][0] & mask);
433
+ temp_c1 ^= (b_ptr[2][1] & mask);
434
+ temp_c2 ^= (b_ptr[2][2] & mask);
435
+
436
+ mask = -((index >> 3) & 1);
437
+ temp_c0 ^= (b_ptr[3][0] & mask);
438
+ temp_c1 ^= (b_ptr[3][1] & mask);
439
+ temp_c2 ^= (b_ptr[3][2] & mask);
440
+ }
441
+ }
442
+ c[0] = temp_c0;
443
+ c[1] = temp_c1;
444
+ c[2] = temp_c2;
445
+ }
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
+ }