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,379 @@
1
+ #include <stdint.h>
2
+ #include "params.h"
3
+ #include "ntt.h"
4
+
5
+ #define NTRUPLUS_R -147 // R = 2^16 mod q
6
+ #define NTRUPLUS_RINV -682 // (R)^(-1) mod q
7
+ #define NTRUPLUS_RSQ 867 // (R^2) mod q
8
+ #define NTRUPLUS_QINV 12929 // (q)^(-1) mod (2^16)
9
+
10
+ #define NTRUPLUS_OMEGA -886 // (omega * R) mod q
11
+ #define NTRUPLUS_ZMINUSZ5INV -1665 // (z - z^5)^(-1) * R mod q
12
+ // where z = zeta^((n/d)/6)
13
+
14
+ #define NTRUPLUS_NINV -811 // (n/d)^(-1) * R mod q
15
+ #define NTRUPLUS_2NINV -1622 // 2 * (n/d)^(-1) * R mod q
16
+
17
+ // zetas: Montgomery-form twiddle factors
18
+ const int16_t zetas[192] = {
19
+ -147, -1033, -682, -248, -708, 682, 1, -722,
20
+ -723, -257, -1124, -867, -256, 1484, 1262, -1590,
21
+ 1611, 222, 1164, -1346, 1716, -1521, -357, 395,
22
+ -455, 639, 502, 655, -699, 541, 95, -1577,
23
+ -1241, 550, -44, 39, -820, -216, -121, -757,
24
+ -348, 937, 893, 387, -603, 1713, -1105, 1058,
25
+ 1449, 837, 901, 1637, -569, -1617, -1530, 1199,
26
+ 50, -830, -625, 4, 176, -156, 1257, -1507,
27
+ -380, -606, 1293, 661, 1428, -1580, -565, -992,
28
+ 548, -800, 64, -371, 961, 641, 87, 630,
29
+ 675, -834, 205, 54, -1081, 1351, 1413, -1331,
30
+ -1673, -1267, -1558, 281, -1464, -588, 1015, 436,
31
+ 223, 1138, -1059, -397, -183, 1655, 559, -1674,
32
+ 277, 933, 1723, 437, -1514, 242, 1640, 432,
33
+ -1583, 696, 774, 1671, 927, 514, 512, 489,
34
+ 297, 601, 1473, 1130, 1322, 871, 760, 1212,
35
+ -312, -352, 443, 943, 8, 1250, -100, 1660,
36
+ -31, 1206, -1341, -1247, 444, 235, 1364, -1209,
37
+ 361, 230, 673, 582, 1409, 1501, 1401, 251,
38
+ 1022, -1063, 1053, 1188, 417, -1391, -27, -1626,
39
+ 1685, -315, 1408, -1248, 400, 274, -1543, 32,
40
+ -1550, 1531, -1367, -124, 1458, 1379, -940, -1681,
41
+ 22, 1709, -275, 1108, 354, -1728, -968, 858,
42
+ 1221, -218, 294, -732, -1095, 892, 1588, -779
43
+ };
44
+
45
+ /*************************************************
46
+ * Name: montgomery_reduce
47
+ *
48
+ * Description: Montgomery reduction; given a 32-bit integer a, computes
49
+ * a 16-bit integer congruent to a * R^-1 mod q,
50
+ * where R = 2^16.
51
+ *
52
+ * Arguments: - int32_t a: input integer to be reduced;
53
+ * must lie in {-q*2^15, ..., q*2^15-1}
54
+ *
55
+ * Returns: an integer in {-q+1, ..., q-1} congruent to
56
+ * a * R^-1 mod q.
57
+ **************************************************/
58
+ static inline int16_t montgomery_reduce(int32_t a)
59
+ {
60
+ int16_t t;
61
+
62
+ t = (int16_t)a * NTRUPLUS_QINV;
63
+ t = (a - (int32_t)t * NTRUPLUS_Q) >> 16;
64
+ return t;
65
+ }
66
+
67
+ /*************************************************
68
+ * Name: barrett_reduce
69
+ *
70
+ * Description: Barrett reduction; given a 16-bit integer a, computes a
71
+ * centered representative congruent to a mod q in
72
+ * {-(q+1)/2, ..., (q+1)/2}.
73
+ *
74
+ * Arguments: - int16_t a: input integer to be reduced
75
+ *
76
+ * Returns: integer in {-(q+1)/2, ..., (q+1)/2} congruent to a mod q.
77
+ **************************************************/
78
+ static inline int16_t barrett_reduce(int16_t a)
79
+ {
80
+ int16_t t;
81
+ const int16_t v = ((1<<26) + NTRUPLUS_Q/2) / NTRUPLUS_Q;
82
+
83
+ t = ((int32_t)v*a + (1<<25)) >> 26;
84
+ t *= NTRUPLUS_Q;
85
+ return a - t;
86
+ }
87
+
88
+ /*************************************************
89
+ * Name: fqmul
90
+ *
91
+ * Description: Multiplication followed by Montgomery reduction.
92
+ *
93
+ * Arguments: - int16_t a: first factor
94
+ * - int16_t b: second factor
95
+ *
96
+ * Returns: 16-bit integer congruent to a*b*R^-1 mod q.
97
+ **************************************************/
98
+ static inline int16_t fqmul(int16_t a, int16_t b)
99
+ {
100
+ return montgomery_reduce((int32_t)a * b);
101
+ }
102
+
103
+
104
+ /*************************************************
105
+ * Name: fqinv
106
+ *
107
+ * Description: Computes the multiplicative inverse of a value in the
108
+ * finite field Z_q.
109
+ *
110
+ * Arguments: - int16_t a: input value a mod q
111
+ *
112
+ * Returns: 16-bit integer congruent to a^{-1} mod q.
113
+ **************************************************/
114
+ static inline int16_t fqinv(int16_t a)
115
+ {
116
+ int16_t t1, t2, t3;
117
+
118
+ t1 = fqmul(a, a); // 10
119
+ t2 = fqmul(t1, t1); // 100
120
+ t2 = fqmul(t2, t2); // 1000
121
+ t3 = fqmul(t2, t2); // 10000
122
+
123
+ t1 = fqmul(t1, t2); // 1010
124
+
125
+ t2 = fqmul(t1, t3); // 11010
126
+ t2 = fqmul(t2, t2); // 110100
127
+ t2 = fqmul(t2, a); // 110101
128
+
129
+ t1 = fqmul(t1, t2); // 111111
130
+
131
+ t2 = fqmul(t2, t2); // 1101010
132
+ t2 = fqmul(t2, t2); // 11010100
133
+ t2 = fqmul(t2, t2); // 110101000
134
+ t2 = fqmul(t2, t2); // 1101010000
135
+ t2 = fqmul(t2, t2); // 11010100000
136
+ t2 = fqmul(t2, t2); // 110101000000
137
+ t2 = fqmul(t2, t1); // 110101111111
138
+
139
+ t2 = fqmul(NTRUPLUS_RINV, t2);
140
+
141
+ return t2;
142
+ }
143
+
144
+ /*************************************************
145
+ * Name: ntt
146
+ *
147
+ * Description: Number-theoretic transform (NTT) in R_q. Transforms the
148
+ * coefficient representation of r into a representation
149
+ * where each block of 4 coefficients corresponds to an
150
+ * element of Zq[X]/(X^4 - zeta_i).
151
+ *
152
+ * Arguments: - int16_t r[NTRUPLUS_N]: pointer to input/output vector;
153
+ * input coefficients of r in R_q,
154
+ * output NTT representation in the
155
+ * product ring Zq[X]/(X^4 - zeta_i)
156
+ *
157
+ * Returns: none.
158
+ **************************************************/
159
+ void ntt(int16_t r[NTRUPLUS_N])
160
+ {
161
+ int16_t t1, t2, t3;
162
+ int16_t zeta1, zeta2;
163
+ int k = 1;
164
+
165
+ zeta1 = zetas[k++];
166
+
167
+ for (int i = 0; i < NTRUPLUS_N / 2; i++)
168
+ {
169
+ t1 = fqmul(zeta1, r[i + NTRUPLUS_N / 2]);
170
+
171
+ r[i + NTRUPLUS_N / 2] = r[i] + r[i + NTRUPLUS_N / 2] - t1;
172
+ r[i ] = r[i] + t1;
173
+ }
174
+
175
+ for (int start = 0; start < NTRUPLUS_N; start += 384)
176
+ {
177
+ zeta1 = zetas[k++];
178
+ zeta2 = zetas[k++];
179
+
180
+ for (int i = start; i < start + 128; i++)
181
+ {
182
+ t1 = fqmul(zeta1, r[i + 128]);
183
+ t2 = fqmul(zeta2, r[i + 256]);
184
+ t3 = fqmul(NTRUPLUS_OMEGA, t1 - t2);
185
+
186
+ r[i + 256] = r[i] - t1 - t3;
187
+ r[i + 128] = r[i] - t2 + t3;
188
+ r[i ] = r[i] + t1 + t2;
189
+ }
190
+ }
191
+
192
+ for (int step = 64; step >= 4; step >>= 1)
193
+ {
194
+ for (int start = 0; start < NTRUPLUS_N; start += (step << 1))
195
+ {
196
+ zeta1 = zetas[k++];
197
+
198
+ for (int i = start; i < start + step; i++)
199
+ {
200
+ t1 = fqmul(zeta1, r[i + step]);
201
+
202
+ r[i + step] = r[i] - t1;
203
+ r[i ] = r[i] + t1;
204
+ }
205
+ }
206
+ }
207
+
208
+ for (int i = 0; i < NTRUPLUS_N; i++)
209
+ r[i] = barrett_reduce(r[i]);
210
+ }
211
+
212
+ /*************************************************
213
+ * Name: invntt
214
+ *
215
+ * Description: Inverse number-theoretic transform (NTT) in R_q. Transforms
216
+ * the NTT representation in r, where each block of 4
217
+ * coefficients corresponds to an element of Zq[X]/(X^4 - zeta_i),
218
+ * back to the coefficient representation in R_q.
219
+ *
220
+ * Arguments: - int16_t r[NTRUPLUS_N]: pointer to input/output vector;
221
+ * input NTT representation in the
222
+ * product ring Zq[X]/(X^4 - zeta_i),
223
+ * output coefficient representation
224
+ * in R_q
225
+ *
226
+ * Returns: none.
227
+ **************************************************/
228
+ void invntt(int16_t r[NTRUPLUS_N])
229
+ {
230
+ int16_t t1, t2, t3;
231
+ int16_t zeta1, zeta2;
232
+ int k = 191;
233
+
234
+ for (int step = 4; step <= 64; step <<= 1)
235
+ {
236
+ for (int start = 0; start < NTRUPLUS_N; start += (step << 1))
237
+ {
238
+ zeta1 = zetas[k--];
239
+
240
+ for (int i = start; i < start + step; i++)
241
+ {
242
+ t1 = r[i + step];
243
+
244
+ r[i + step] = fqmul(zeta1, t1 - r[i]);
245
+ r[i ] = barrett_reduce(r[i] + t1);
246
+ }
247
+ }
248
+ }
249
+
250
+ for (int start = 0; start < NTRUPLUS_N; start += 384)
251
+ {
252
+ zeta2 = zetas[k--];
253
+ zeta1 = zetas[k--];
254
+
255
+ for (int i = start; i < start + 128; i++)
256
+ {
257
+ t1 = fqmul(NTRUPLUS_OMEGA, r[i + 128] - r[i]);
258
+ t2 = fqmul(zeta1, r[i + 256] - r[i] + t1);
259
+ t3 = fqmul(zeta2, r[i + 256] - r[i + 128] - t1);
260
+
261
+ r[i ] = r[i] + r[i + 128] + r[i + 256];
262
+ r[i + 128] = t2;
263
+ r[i + 256] = t3;
264
+ }
265
+ }
266
+
267
+ for (int i = 0; i < NTRUPLUS_N/2; i++)
268
+ {
269
+ t1 = r[i] + r[i + NTRUPLUS_N/2];
270
+ t2 = fqmul(NTRUPLUS_ZMINUSZ5INV, r[i] - r[i + NTRUPLUS_N/2]);
271
+
272
+ r[i ] = fqmul(NTRUPLUS_NINV, t1 - t2);
273
+ r[i + NTRUPLUS_N/2] = fqmul(NTRUPLUS_2NINV, t2);
274
+ }
275
+ }
276
+
277
+ /*************************************************
278
+ * Name: baseinv
279
+ *
280
+ * Description: Inversion of a polynomial in Zq[X]/(X^4 - zeta), used as
281
+ * a building block for inversion of elements in R_q in the
282
+ * NTT domain.
283
+ *
284
+ * Arguments: - int16_t r[4]: pointer to the output polynomial
285
+ * - const int16_t a[4]: pointer to the input polynomial
286
+ * - const int16_t zeta: parameter defining X^4 - zeta
287
+ *
288
+ * Returns: 0 if a is invertible, 1 otherwise.
289
+ **************************************************/
290
+ int baseinv(int16_t r[4], const int16_t a[4], const int16_t zeta)
291
+ {
292
+ int16_t t0, t1, t2, t3;
293
+
294
+ t0 = montgomery_reduce(a[2]*a[2] - 2*a[1]*a[3]); // R^-1
295
+ t1 = montgomery_reduce(a[3]*a[3]); // R^-1
296
+ t0 = montgomery_reduce(a[0]*a[0] + t0*zeta); // R^-1
297
+ t1 = montgomery_reduce(a[1]*a[1] + t1*zeta - 2*a[0]*a[2]); // R^-1
298
+ t2 = montgomery_reduce(t1*zeta); // R^-1
299
+
300
+ t3 = montgomery_reduce(t0*t0 - t1*t2); // R^-3
301
+
302
+ if (t3 == 0) return 1;
303
+
304
+ r[0] = montgomery_reduce(a[0]*t0 + a[2]*t2); // R^-2
305
+ r[1] = montgomery_reduce(a[3]*t2 + a[1]*t0); // R^-2
306
+ r[2] = montgomery_reduce(a[2]*t0 + a[0]*t1); // R^-2
307
+ r[3] = montgomery_reduce(a[1]*t1 + a[3]*t0); // R^-2
308
+
309
+ t3 = fqinv(t3); // R^5
310
+
311
+ r[0] = montgomery_reduce(r[0]*t3); // R^0
312
+ r[1] = -montgomery_reduce(r[1]*t3); // R^0
313
+ r[2] = montgomery_reduce(r[2]*t3); // R^0
314
+ r[3] = -montgomery_reduce(r[3]*t3); // R^0
315
+
316
+ return 0;
317
+ }
318
+
319
+ /*************************************************
320
+ * Name: basemul
321
+ *
322
+ * Description: Multiplication of polynomials in Zq[X]/(X^4 - zeta),
323
+ * used for multiplication of elements in R_q in the NTT domain.
324
+ *
325
+ * Arguments: - int16_t r[4]: pointer to the output polynomial
326
+ * - const int16_t a[4]: pointer to the first factor
327
+ * - const int16_t b[4]: pointer to the second factor
328
+ * - const int16_t zeta: parameter defining X^4 - zeta
329
+ *
330
+ * Returns: none.
331
+ **************************************************/
332
+ void basemul(int16_t r[4], const int16_t a[4], const int16_t b[4], const int16_t zeta)
333
+ {
334
+ r[0] = montgomery_reduce(a[1]*b[3]+a[2]*b[2]+a[3]*b[1]); // R^-1
335
+ r[1] = montgomery_reduce(a[2]*b[3]+a[3]*b[2]); // R^-1
336
+ r[2] = montgomery_reduce(a[3]*b[3]); // R^-1
337
+
338
+ r[0] = montgomery_reduce(r[0]*zeta+a[0]*b[0]); // R^-1
339
+ r[1] = montgomery_reduce(r[1]*zeta+a[0]*b[1]+a[1]*b[0]); // R^-1
340
+ r[2] = montgomery_reduce(r[2]*zeta+a[0]*b[2]+a[1]*b[1]+a[2]*b[0]); // R^-1
341
+ r[3] = montgomery_reduce(a[0]*b[3]+a[1]*b[2]+a[2]*b[1]+a[3]*b[0]); // R^-1
342
+
343
+ r[0] = montgomery_reduce(r[0]*NTRUPLUS_RSQ); // R^0
344
+ r[1] = montgomery_reduce(r[1]*NTRUPLUS_RSQ); // R^0
345
+ r[2] = montgomery_reduce(r[2]*NTRUPLUS_RSQ); // R^0
346
+ r[3] = montgomery_reduce(r[3]*NTRUPLUS_RSQ); // R^0
347
+ }
348
+
349
+ /*************************************************
350
+ * Name: basemul_add
351
+ *
352
+ * Description: Multiplication then addition of polynomials in
353
+ * Zq[X]/(X^4 - zeta), used for multiplication of
354
+ * elements in R_q in the NTT domain.
355
+ *
356
+ * Arguments: - int16_t r[4]: pointer to the output polynomial
357
+ * - const int16_t a[4]: pointer to the first factor
358
+ * - const int16_t b[4]: pointer to the second factor
359
+ * - const int16_t c[4]: pointer to the third factor
360
+ * - const int16_t zeta: parameter defining X^4 - zeta
361
+ *
362
+ * Returns: none.
363
+ **************************************************/
364
+ void basemul_add(int16_t r[4], const int16_t a[4], const int16_t b[4], const int16_t c[4], const int16_t zeta)
365
+ {
366
+ r[0] = montgomery_reduce(a[1]*b[3]+a[2]*b[2]+a[3]*b[1]); // R^-1
367
+ r[1] = montgomery_reduce(a[2]*b[3]+a[3]*b[2]); // R^-1
368
+ r[2] = montgomery_reduce(a[3]*b[3]); // R^-1
369
+
370
+ r[0] = montgomery_reduce(r[0]*zeta+a[0]*b[0]); // R^-1
371
+ r[1] = montgomery_reduce(r[1]*zeta+a[0]*b[1]+a[1]*b[0]); // R^-1
372
+ r[2] = montgomery_reduce(r[2]*zeta+a[0]*b[2]+a[1]*b[1]+a[2]*b[0]); // R^-1
373
+ r[3] = montgomery_reduce(a[0]*b[3]+a[1]*b[2]+a[2]*b[1]+a[3]*b[0]); // R^-1
374
+
375
+ r[0] = montgomery_reduce(c[0]*NTRUPLUS_R + r[0]*NTRUPLUS_RSQ); // R^0
376
+ r[1] = montgomery_reduce(c[1]*NTRUPLUS_R + r[1]*NTRUPLUS_RSQ); // R^0
377
+ r[2] = montgomery_reduce(c[2]*NTRUPLUS_R + r[2]*NTRUPLUS_RSQ); // R^0
378
+ r[3] = montgomery_reduce(c[3]*NTRUPLUS_R + r[3]*NTRUPLUS_RSQ); // R^0
379
+ }
@@ -0,0 +1,16 @@
1
+ #ifndef NTT_H
2
+ #define NTT_H
3
+
4
+ #include <stdint.h>
5
+ #include "params.h"
6
+
7
+ extern const int16_t zetas[192];
8
+
9
+ void ntt(int16_t r[NTRUPLUS_N]);
10
+ void invntt(int16_t r[NTRUPLUS_N]);
11
+
12
+ int baseinv(int16_t r[4], const int16_t a[4], const int16_t zeta);
13
+ void basemul(int16_t r[4], const int16_t a[4], const int16_t b[4], const int16_t zeta);
14
+ void basemul_add(int16_t r[4], const int16_t a[4], const int16_t b[4], const int16_t c[4], const int16_t zeta);
15
+
16
+ #endif
@@ -0,0 +1,18 @@
1
+ #ifndef PARAMS_H
2
+ #define PARAMS_H
3
+
4
+ #define NTRUPLUS_ALGNAME "NTRU+768"
5
+
6
+ #define NTRUPLUS_N 768
7
+ #define NTRUPLUS_Q 3457
8
+ #define NTRUPLUS_D 4
9
+
10
+ #define NTRUPLUS_SYMBYTES 32 /* size in bytes of hashes, and seeds */
11
+ #define NTRUPLUS_SSBYTES 32 /* size in bytes of shared key */
12
+ #define NTRUPLUS_POLYBYTES 1152
13
+
14
+ #define NTRUPLUS_PUBLICKEYBYTES NTRUPLUS_POLYBYTES
15
+ #define NTRUPLUS_SECRETKEYBYTES ((NTRUPLUS_POLYBYTES << 1) + NTRUPLUS_SYMBYTES)
16
+ #define NTRUPLUS_CIPHERTEXTBYTES NTRUPLUS_POLYBYTES
17
+
18
+ #endif