ArduinoLibs
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
NewHope.cpp
1 /*
2  * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  */
22 
23 #include "NewHope.h"
24 #include <Crypto.h>
25 #include <ChaCha.h>
26 #include <SHA3.h>
27 #include <SHAKE.h>
28 #include <RNG.h>
29 #include <string.h>
30 
31 // Define this to 0 to disable the "torref" version, which will save
32 // some code and data memory if you don't need that variant.
33 #define NEWHOPE_TORREF 1
34 
130 // The following is public domain code from the reference C version of
131 // New Hope at https://cryptojedi.org/crypto/#newhope. This part of
132 // the Arduino port remains public domain. Original authors:
133 // Erdem Alkim, Léo Ducas, Thomas Pöppelmann, Peter Schwabe
134 
135 #define PARAM_N 1024
136 #define PARAM_K 16
137 #define PARAM_Q 12289
138 #define POLY_BYTES 1792
139 #define NEWHOPE_SEEDBYTES 32
140 #define NEWHOPE_RECBYTES 256
141 
142 static uint16_t const omegas_montgomery[PARAM_N/2] = {
143  4075,6974,7373,7965,3262,5079,522,2169,6364,1018,1041,8775,2344,
144  11011,5574,1973,4536,1050,6844,3860,3818,6118,2683,1190,4789,7822,
145  7540,6752,5456,4449,3789,12142,11973,382,3988,468,6843,5339,6196,
146  3710,11316,1254,5435,10930,3998,10256,10367,3879,11889,1728,6137,
147  4948,5862,6136,3643,6874,8724,654,10302,1702,7083,6760,56,3199,9987,
148  605,11785,8076,5594,9260,6403,4782,6212,4624,9026,8689,4080,11868,
149  6221,3602,975,8077,8851,9445,5681,3477,1105,142,241,12231,1003,
150  3532,5009,1956,6008,11404,7377,2049,10968,12097,7591,5057,3445,
151  4780,2920,7048,3127,8120,11279,6821,11502,8807,12138,2127,2839,
152  3957,431,1579,6383,9784,5874,677,3336,6234,2766,1323,9115,12237,
153  2031,6956,6413,2281,3969,3991,12133,9522,4737,10996,4774,5429,11871,
154  3772,453,5908,2882,1805,2051,1954,11713,3963,2447,6142,8174,3030,
155  1843,2361,12071,2908,3529,3434,3202,7796,2057,5369,11939,1512,6906,
156  10474,11026,49,10806,5915,1489,9789,5942,10706,10431,7535,426,8974,
157  3757,10314,9364,347,5868,9551,9634,6554,10596,9280,11566,174,2948,
158  2503,6507,10723,11606,2459,64,3656,8455,5257,5919,7856,1747,9166,
159  5486,9235,6065,835,3570,4240,11580,4046,10970,9139,1058,8210,11848,
160  922,7967,1958,10211,1112,3728,4049,11130,5990,1404,325,948,11143,
161  6190,295,11637,5766,8212,8273,2919,8527,6119,6992,8333,1360,2555,
162  6167,1200,7105,7991,3329,9597,12121,5106,5961,10695,10327,3051,9923,
163  4896,9326,81,3091,1000,7969,4611,726,1853,12149,4255,11112,2768,
164  10654,1062,2294,3553,4805,2747,4846,8577,9154,1170,2319,790,11334,
165  9275,9088,1326,5086,9094,6429,11077,10643,3504,3542,8668,9744,1479,
166  1,8246,7143,11567,10984,4134,5736,4978,10938,5777,8961,4591,5728,
167  6461,5023,9650,7468,949,9664,2975,11726,2744,9283,10092,5067,12171,
168  2476,3748,11336,6522,827,9452,5374,12159,7935,3296,3949,9893,4452,
169  10908,2525,3584,8112,8011,10616,4989,6958,11809,9447,12280,1022,
170  11950,9821,11745,5791,5092,2089,9005,2881,3289,2013,9048,729,7901,
171  1260,5755,4632,11955,2426,10593,1428,4890,5911,3932,9558,8830,3637,
172  5542,145,5179,8595,3707,10530,355,3382,4231,9741,1207,9041,7012,1168,
173  10146,11224,4645,11885,10911,10377,435,7952,4096,493,9908,6845,6039,
174  2422,2187,9723,8643,9852,9302,6022,7278,1002,4284,5088,1607,7313,
175  875,8509,9430,1045,2481,5012,7428,354,6591,9377,11847,2401,1067,
176  7188,11516,390,8511,8456,7270,545,8585,9611,12047,1537,4143,4714,
177  4885,1017,5084,1632,3066,27,1440,8526,9273,12046,11618,9289,3400,
178  9890,3136,7098,8758,11813,7384,3985,11869,6730,10745,10111,2249,
179  4048,2884,11136,2126,1630,9103,5407,2686,9042,2969,8311,9424,
180  9919,8779,5332,10626,1777,4654,10863,7351,3636,9585,5291,8374,
181  2166,4919,12176,9140,12129,7852,12286,4895,10805,2780,5195,2305,
182  7247,9644,4053,10600,3364,3271,4057,4414,9442,7917,2174
183 };
184 
185 static uint16_t const omegas_inv_montgomery[PARAM_N/2] = {
186  4075,5315,4324,4916,10120,11767,7210,9027,10316,6715,1278,9945,
187  3514,11248,11271,5925,147,8500,7840,6833,5537,4749,4467,7500,11099,
188  9606,6171,8471,8429,5445,11239,7753,9090,12233,5529,5206,10587,
189  1987,11635,3565,5415,8646,6153,6427,7341,6152,10561,400,8410,1922,
190  2033,8291,1359,6854,11035,973,8579,6093,6950,5446,11821,8301,11907,
191  316,52,3174,10966,9523,6055,8953,11612,6415,2505,5906,10710,11858,
192  8332,9450,10162,151,3482,787,5468,1010,4169,9162,5241,9369,7509,
193  8844,7232,4698,192,1321,10240,4912,885,6281,10333,7280,8757,11286,
194  58,12048,12147,11184,8812,6608,2844,3438,4212,11314,8687,6068,421,
195  8209,3600,3263,7665,6077,7507,5886,3029,6695,4213,504,11684,2302,
196  1962,1594,6328,7183,168,2692,8960,4298,5184,11089,6122,9734,10929,
197  3956,5297,6170,3762,9370,4016,4077,6523,652,11994,6099,1146,11341,
198  11964,10885,6299,1159,8240,8561,11177,2078,10331,4322,11367,441,
199  4079,11231,3150,1319,8243,709,8049,8719,11454,6224,3054,6803,3123,
200  10542,4433,6370,7032,3834,8633,12225,9830,683,1566,5782,9786,9341,
201  12115,723,3009,1693,5735,2655,2738,6421,11942,2925,1975,8532,3315,
202  11863,4754,1858,1583,6347,2500,10800,6374,1483,12240,1263,1815,
203  5383,10777,350,6920,10232,4493,9087,8855,8760,9381,218,9928,10446,
204  9259,4115,6147,9842,8326,576,10335,10238,10484,9407,6381,11836,8517,
205  418,6860,7515,1293,7552,2767,156,8298,8320,10008,5876,5333,10258,
206  10115,4372,2847,7875,8232,9018,8925,1689,8236,2645,5042,9984,7094,
207  9509,1484,7394,3,4437,160,3149,113,7370,10123,3915,6998,2704,8653,
208  4938,1426,7635,10512,1663,6957,3510,2370,2865,3978,9320,3247,9603,
209  6882,3186,10659,10163,1153,9405,8241,10040,2178,1544,5559,420,8304,
210  4905,476,3531,5191,9153,2399,8889,3000,671,243,3016,3763,10849,12262,
211  9223,10657,7205,11272,7404,7575,8146,10752,242,2678,3704,11744,
212  5019,3833,3778,11899,773,5101,11222,9888,442,2912,5698,11935,4861,
213  7277,9808,11244,2859,3780,11414,4976,10682,7201,8005,11287,5011,
214  6267,2987,2437,3646,2566,10102,9867,6250,5444,2381,11796,8193,4337,
215  11854,1912,1378,404,7644,1065,2143,11121,5277,3248,11082,2548,8058,
216  8907,11934,1759,8582,3694,7110,12144,6747,8652,3459,2731,8357,6378,
217  7399,10861,1696,9863,334,7657,6534,11029,4388,11560,3241,10276,9000,
218  9408,3284,10200,7197,6498,544,2468,339,11267,9,2842,480,5331,7300,
219  1673,4278,4177,8705,9764,1381,7837,2396,8340,8993,4354,130,6915,
220  2837,11462,5767,953,8541,9813,118,7222,2197,3006,9545,563,9314,
221  2625,11340,4821,2639,7266,5828,6561,7698,3328,6512,1351,7311,6553,
222  8155,1305,722,5146,4043,12288,10810,2545,3621,8747,8785,1646,1212,
223  5860,3195,7203,10963,3201,3014,955,11499,9970,11119,3135,3712,7443,
224  9542,7484,8736,9995,11227,1635,9521,1177,8034,140,10436,11563,7678,
225  4320,11289,9198,12208,2963,7393,2366,9238
226 };
227 
228 static uint16_t const psis_bitrev_montgomery[PARAM_N] = {
229  4075,6974,7373,7965,3262,5079,522,2169,6364,1018,1041,8775,2344,
230  11011,5574,1973,4536,1050,6844,3860,3818,6118,2683,1190,4789,7822,
231  7540,6752,5456,4449,3789,12142,11973,382,3988,468,6843,5339,6196,3710,
232  11316,1254,5435,10930,3998,10256,10367,3879,11889,1728,6137,4948,
233  5862,6136,3643,6874,8724,654,10302,1702,7083,6760,56,3199,9987,605,
234  11785,8076,5594,9260,6403,4782,6212,4624,9026,8689,4080,11868,6221,
235  3602,975,8077,8851,9445,5681,3477,1105,142,241,12231,1003,3532,5009,
236  1956,6008,11404,7377,2049,10968,12097,7591,5057,3445,4780,2920,
237  7048,3127,8120,11279,6821,11502,8807,12138,2127,2839,3957,431,1579,
238  6383,9784,5874,677,3336,6234,2766,1323,9115,12237,2031,6956,6413,
239  2281,3969,3991,12133,9522,4737,10996,4774,5429,11871,3772,453,
240  5908,2882,1805,2051,1954,11713,3963,2447,6142,8174,3030,1843,2361,
241  12071,2908,3529,3434,3202,7796,2057,5369,11939,1512,6906,10474,
242  11026,49,10806,5915,1489,9789,5942,10706,10431,7535,426,8974,3757,
243  10314,9364,347,5868,9551,9634,6554,10596,9280,11566,174,2948,2503,
244  6507,10723,11606,2459,64,3656,8455,5257,5919,7856,1747,9166,5486,
245  9235,6065,835,3570,4240,11580,4046,10970,9139,1058,8210,11848,922,
246  7967,1958,10211,1112,3728,4049,11130,5990,1404,325,948,11143,6190,
247  295,11637,5766,8212,8273,2919,8527,6119,6992,8333,1360,2555,6167,
248  1200,7105,7991,3329,9597,12121,5106,5961,10695,10327,3051,9923,
249  4896,9326,81,3091,1000,7969,4611,726,1853,12149,4255,11112,2768,
250  10654,1062,2294,3553,4805,2747,4846,8577,9154,1170,2319,790,11334,
251  9275,9088,1326,5086,9094,6429,11077,10643,3504,3542,8668,9744,1479,
252  1,8246,7143,11567,10984,4134,5736,4978,10938,5777,8961,4591,5728,
253  6461,5023,9650,7468,949,9664,2975,11726,2744,9283,10092,5067,12171,
254  2476,3748,11336,6522,827,9452,5374,12159,7935,3296,3949,9893,4452,
255  10908,2525,3584,8112,8011,10616,4989,6958,11809,9447,12280,1022,
256  11950,9821,11745,5791,5092,2089,9005,2881,3289,2013,9048,729,7901,
257  1260,5755,4632,11955,2426,10593,1428,4890,5911,3932,9558,8830,3637,
258  5542,145,5179,8595,3707,10530,355,3382,4231,9741,1207,9041,7012,
259  1168,10146,11224,4645,11885,10911,10377,435,7952,4096,493,9908,6845,
260  6039,2422,2187,9723,8643,9852,9302,6022,7278,1002,4284,5088,1607,
261  7313,875,8509,9430,1045,2481,5012,7428,354,6591,9377,11847,2401,
262  1067,7188,11516,390,8511,8456,7270,545,8585,9611,12047,1537,4143,
263  4714,4885,1017,5084,1632,3066,27,1440,8526,9273,12046,11618,9289,
264  3400,9890,3136,7098,8758,11813,7384,3985,11869,6730,10745,10111,
265  2249,4048,2884,11136,2126,1630,9103,5407,2686,9042,2969,8311,9424,
266  9919,8779,5332,10626,1777,4654,10863,7351,3636,9585,5291,8374,
267  2166,4919,12176,9140,12129,7852,12286,4895,10805,2780,5195,2305,
268  7247,9644,4053,10600,3364,3271,4057,4414,9442,7917,2174,3947,
269  11951,2455,6599,10545,10975,3654,2894,7681,7126,7287,12269,4119,
270  3343,2151,1522,7174,7350,11041,2442,2148,5959,6492,8330,8945,5598,
271  3624,10397,1325,6565,1945,11260,10077,2674,3338,3276,11034,506,
272  6505,1392,5478,8778,1178,2776,3408,10347,11124,2575,9489,12096,
273  6092,10058,4167,6085,923,11251,11912,4578,10669,11914,425,10453,
274  392,10104,8464,4235,8761,7376,2291,3375,7954,8896,6617,7790,1737,
275  11667,3982,9342,6680,636,6825,7383,512,4670,2900,12050,7735,994,
276  1687,11883,7021,146,10485,1403,5189,6094,2483,2054,3042,10945,
277  3981,10821,11826,8882,8151,180,9600,7684,5219,10880,6780,204,
278  11232,2600,7584,3121,3017,11053,7814,7043,4251,4739,11063,6771,
279  7073,9261,2360,11925,1928,11825,8024,3678,3205,3359,11197,5209,
280  8581,3238,8840,1136,9363,1826,3171,4489,7885,346,2068,1389,8257,
281  3163,4840,6127,8062,8921,612,4238,10763,8067,125,11749,10125,5416,
282  2110,716,9839,10584,11475,11873,3448,343,1908,4538,10423,7078,
283  4727,1208,11572,3589,2982,1373,1721,10753,4103,2429,4209,5412,
284  5993,9011,438,3515,7228,1218,8347,5232,8682,1327,7508,4924,448,
285  1014,10029,12221,4566,5836,12229,2717,1535,3200,5588,5845,412,
286  5102,7326,3744,3056,2528,7406,8314,9202,6454,6613,1417,10032,7784,
287  1518,3765,4176,5063,9828,2275,6636,4267,6463,2065,7725,3495,8328,
288  8755,8144,10533,5966,12077,9175,9520,5596,6302,8400,579,6781,11014,
289  5734,11113,11164,4860,1131,10844,9068,8016,9694,3837,567,9348,7000,
290  6627,7699,5082,682,11309,5207,4050,7087,844,7434,3769,293,9057,
291  6940,9344,10883,2633,8190,3944,5530,5604,3480,2171,9282,11024,2213,
292  8136,3805,767,12239,216,11520,6763,10353,7,8566,845,7235,3154,4360,
293  3285,10268,2832,3572,1282,7559,3229,8360,10583,6105,3120,6643,6203,
294  8536,8348,6919,3536,9199,10891,11463,5043,1658,5618,8787,5789,4719,
295  751,11379,6389,10783,3065,7806,6586,2622,5386,510,7628,6921,578,
296  10345,11839,8929,4684,12226,7154,9916,7302,8481,3670,11066,2334,
297  1590,7878,10734,1802,1891,5103,6151,8820,3418,7846,9951,4693,417,
298  9996,9652,4510,2946,5461,365,881,1927,1015,11675,11009,1371,12265,
299  2485,11385,5039,6742,8449,1842,12217,8176,9577,4834,7937,9461,2643,
300  11194,3045,6508,4094,3451,7911,11048,5406,4665,3020,6616,11345,
301  7519,3669,5287,1790,7014,5410,11038,11249,2035,6125,10407,4565,
302  7315,5078,10506,2840,2478,9270,4194,9195,4518,7469,1160,6878,2730,
303  10421,10036,1734,3815,10939,5832,10595,10759,4423,8420,9617,7119,
304  11010,11424,9173,189,10080,10526,3466,10588,7592,3578,11511,7785,
305  9663,530,12150,8957,2532,3317,9349,10243,1481,9332,3454,3758,7899,
306  4218,2593,11410,2276,982,6513,1849,8494,9021,4523,7988,8,457,648,
307  150,8000,2307,2301,874,5650,170,9462,2873,9855,11498,2535,11169,
308  5808,12268,9687,1901,7171,11787,3846,1573,6063,3793,466,11259,
309  10608,3821,6320,4649,6263,2929
310 };
311 
312 static uint16_t const psis_inv_montgomery[PARAM_N] = {
313  256,10570,1510,7238,1034,7170,6291,7921,11665,3422,4000,2327,
314  2088,5565,795,10647,1521,5484,2539,7385,1055,7173,8047,11683,
315  1669,1994,3796,5809,4341,9398,11876,12230,10525,12037,12253,
316  3506,4012,9351,4847,2448,7372,9831,3160,2207,5582,2553,7387,6322,
317  9681,1383,10731,1533,219,5298,4268,7632,6357,9686,8406,4712,9451,
318  10128,4958,5975,11387,8649,11769,6948,11526,12180,1740,10782,
319  6807,2728,7412,4570,4164,4106,11120,12122,8754,11784,3439,5758,
320  11356,6889,9762,11928,1704,1999,10819,12079,12259,7018,11536,
321  1648,1991,2040,2047,2048,10826,12080,8748,8272,8204,1172,1923,
322  7297,2798,7422,6327,4415,7653,6360,11442,12168,7005,8023,9924,
323  8440,8228,2931,7441,1063,3663,5790,9605,10150,1450,8985,11817,
324  10466,10273,12001,3470,7518,1074,1909,7295,9820,4914,702,5367,
325  7789,8135,9940,1420,3714,11064,12114,12264,1752,5517,9566,11900,
326  1700,3754,5803,829,1874,7290,2797,10933,5073,7747,8129,6428,
327  6185,11417,1631,233,5300,9535,10140,11982,8734,8270,2937,10953,
328  8587,8249,2934,9197,4825,5956,4362,9401,1343,3703,529,10609,
329  12049,6988,6265,895,3639,4031,4087,4095,585,10617,8539,4731,
330  4187,9376,3095,9220,10095,10220,1460,10742,12068,1724,5513,
331  11321,6884,2739,5658,6075,4379,11159,10372,8504,4726,9453,3106,
332  7466,11600,10435,8513,9994,8450,9985,3182,10988,8592,2983,9204,
333  4826,2445,5616,6069,867,3635,5786,11360,5134,2489,10889,12089,
334  1727,7269,2794,9177,1311,5454,9557,6632,2703,9164,10087,1441,
335  3717,531,3587,2268,324,5313,759,1864,5533,2546,7386,9833,8427,
336  4715,11207,1601,7251,4547,11183,12131,1733,10781,10318,1474,
337  10744,5046,4232,11138,10369,6748,964,7160,4534,7670,8118,8182,
338  4680,11202,6867,981,8918,1274,182,26,7026,8026,11680,12202,
339  10521,1503,7237,4545,5916,9623,8397,11733,10454,3249,9242,6587,
340  941,1890,270,10572,6777,9746,6659,6218,6155,6146,878,1881,7291,
341  11575,12187,1741,7271,8061,11685,6936,4502,9421,4857,4205,7623,
342  1089,10689,1527,8996,10063,11971,10488,6765,2722,3900,9335,11867,
343  6962,11528,5158,4248,4118,5855,2592,5637,6072,2623,7397,8079,
344  9932,4930,5971,853,3633,519,8852,11798,3441,11025,1575,225,8810,
345  11792,12218,3501,9278,3081,9218,4828,7712,8124,11694,12204,3499,
346  4011,573,3593,5780,7848,9899,10192,1456,208,7052,2763,7417,11593,
347  10434,12024,8740,11782,10461,3250,5731,7841,9898,1414,202,3540,
348  7528,2831,2160,10842,5060,4234,4116,588,84,12,7024,2759,9172,6577,
349  11473,1639,9012,3043,7457,6332,11438,1634,1989,9062,11828,8712,
350  11778,12216,10523,6770,9745,10170,4964,9487,6622,946,8913,6540,
351  6201,4397,9406,8366,9973,8447,8229,11709,8695,10020,3187,5722,
352  2573,10901,6824,4486,4152,9371,8361,2950,2177,311,1800,9035,
353  8313,11721,3430,490,70,10,1757,251,3547,7529,11609,3414,7510,
354  4584,4166,9373,1339,5458,7802,11648,1664,7260,9815,10180,6721,
355  9738,10169,8475,8233,9954,1422,8981,1283,5450,11312,1616,3742,
356  11068,10359,4991,713,3613,9294,8350,4704,672,96,7036,9783,11931,
357  3460,5761,823,10651,12055,10500,1500,5481,783,3623,11051,8601,
358  8251,8201,11705,10450,5004,4226,7626,2845,2162,3820,7568,9859,
359  3164,452,10598,1514,5483,6050,6131,4387,7649,8115,6426,918,8909,
360  8295,1185,5436,11310,8638,1234,5443,11311,5127,2488,2111,10835,
361  5059,7745,2862,3920,560,80,1767,2008,3798,11076,6849,2734,10924,
362  12094,8750,1250,10712,6797,971,7161,1023,8924,4786,7706,4612,4170,
363  7618,6355,4419,5898,11376,10403,10264,6733,4473,639,5358,2521,
364  9138,3061,5704,4326,618,5355,765,5376,768,7132,4530,9425,3102,
365  9221,6584,11474,10417,10266,12000,6981,6264,4406,2385,7363,4563,
366  4163,7617,9866,3165,9230,11852,10471,5007,5982,11388,5138,734,
367  3616,11050,12112,6997,11533,12181,10518,12036,3475,2252,7344,
368  9827,4915,9480,6621,4457,7659,9872,6677,4465,4149,7615,4599,657,
369  3605,515,10607,6782,4480,640,1847,3775,5806,2585,5636,9583,1369,
370  10729,8555,10000,11962,5220,7768,8132,8184,9947,1421,203,29,8782,
371  11788,1684,10774,10317,4985,9490,8378,4708,11206,5112,5997,7879,
372  11659,12199,8765,10030,4944,5973,6120,6141,6144,7900,11662,1666,
373  238,34,3516,5769,9602,8394,9977,6692,956,10670,6791,9748,11926,
374  8726,11780,5194,742,106,8793,10034,3189,10989,5081,4237,5872,4350,
375  2377,10873,6820,6241,11425,10410,10265,3222,5727,9596,4882,2453,
376  2106,3812,11078,12116,5242,4260,11142,8614,11764,12214,5256,4262,
377  4120,11122,5100,11262,5120,2487,5622,9581,8391,8221,2930,10952,
378  12098,6995,6266,9673,4893,699,3611,4027,5842,11368,1624,232,8811,
379  8281,1183,169,8802,3013,2186,5579,797,3625,4029,11109,1587,7249,
380  11569,8675,6506,2685,10917,12093,12261,12285,1755,7273,1039,1904,
381  272,3550,9285,3082,5707,6082,4380,7648,11626,5172,4250,9385,8363,
382  8217,4685,5936,848,8899,6538,934,1889,3781,9318,10109,10222,6727,
383  961,5404,772,5377,9546,8386,1198,8949,3034,2189,7335,4559,5918,2601,
384  10905,5069,9502,3113,7467,8089,11689,5181,9518,8382,2953,3933,4073,
385  4093,7607,8109,2914,5683,4323,11151,1593,10761,6804,972,3650,2277,
386  5592,4310,7638,9869,4921,703,1856,9043,4803,9464,1352,8971,11815,
387  5199,7765,6376,4422,7654,2849,407,8836,6529,7955,2892,9191,1313,
388  10721,12065,12257,1751,9028,8312,2943,2176,3822,546,78,8789,11789,
389  10462,12028,6985,4509,9422,1346,5459,4291,613,10621,6784,9747,3148,
390  7472,2823,5670,810,7138,8042,4660,7688,6365,6176,6149,2634,5643,
391  9584,10147,11983,5223,9524,11894,10477,8519,1217,3685,2282,326,
392  10580,3267,7489,4581,2410,5611,11335,6886,8006,8166,11700,3427,
393  11023,8597,10006,3185,455,65,5276,7776,4622,5927,7869,9902,11948,
394  5218,2501,5624,2559,10899,1557,1978,10816,10323,8497,4725,675,1852,
395  10798,12076,10503,3256,9243,3076,2195,10847,12083,10504,12034,10497
396 };
397 
398 static uint16_t const bitrev_table[PARAM_N] = {
399  0,512,256,768,128,640,384,896,64,576,320,832,192,704,448,960,32,544,288,800,160,672,416,928,96,608,352,864,224,736,480,992,
400  16,528,272,784,144,656,400,912,80,592,336,848,208,720,464,976,48,560,304,816,176,688,432,944,112,624,368,880,240,752,496,1008,
401  8,520,264,776,136,648,392,904,72,584,328,840,200,712,456,968,40,552,296,808,168,680,424,936,104,616,360,872,232,744,488,1000,
402  24,536,280,792,152,664,408,920,88,600,344,856,216,728,472,984,56,568,312,824,184,696,440,952,120,632,376,888,248,760,504,1016,
403  4,516,260,772,132,644,388,900,68,580,324,836,196,708,452,964,36,548,292,804,164,676,420,932,100,612,356,868,228,740,484,996,
404  20,532,276,788,148,660,404,916,84,596,340,852,212,724,468,980,52,564,308,820,180,692,436,948,116,628,372,884,244,756,500,1012,
405  12,524,268,780,140,652,396,908,76,588,332,844,204,716,460,972,44,556,300,812,172,684,428,940,108,620,364,876,236,748,492,1004,
406  28,540,284,796,156,668,412,924,92,604,348,860,220,732,476,988,60,572,316,828,188,700,444,956,124,636,380,892,252,764,508,1020,
407  2,514,258,770,130,642,386,898,66,578,322,834,194,706,450,962,34,546,290,802,162,674,418,930,98,610,354,866,226,738,482,994,
408  18,530,274,786,146,658,402,914,82,594,338,850,210,722,466,978,50,562,306,818,178,690,434,946,114,626,370,882,242,754,498,1010,
409  10,522,266,778,138,650,394,906,74,586,330,842,202,714,458,970,42,554,298,810,170,682,426,938,106,618,362,874,234,746,490,1002,
410  26,538,282,794,154,666,410,922,90,602,346,858,218,730,474,986,58,570,314,826,186,698,442,954,122,634,378,890,250,762,506,1018,
411  6,518,262,774,134,646,390,902,70,582,326,838,198,710,454,966,38,550,294,806,166,678,422,934,102,614,358,870,230,742,486,998,
412  22,534,278,790,150,662,406,918,86,598,342,854,214,726,470,982,54,566,310,822,182,694,438,950,118,630,374,886,246,758,502,1014,
413  14,526,270,782,142,654,398,910,78,590,334,846,206,718,462,974,46,558,302,814,174,686,430,942,110,622,366,878,238,750,494,1006,
414  30,542,286,798,158,670,414,926,94,606,350,862,222,734,478,990,62,574,318,830,190,702,446,958,126,638,382,894,254,766,510,1022,
415  1,513,257,769,129,641,385,897,65,577,321,833,193,705,449,961,33,545,289,801,161,673,417,929,97,609,353,865,225,737,481,993,
416  17,529,273,785,145,657,401,913,81,593,337,849,209,721,465,977,49,561,305,817,177,689,433,945,113,625,369,881,241,753,497,1009,
417  9,521,265,777,137,649,393,905,73,585,329,841,201,713,457,969,41,553,297,809,169,681,425,937,105,617,361,873,233,745,489,1001,
418  25,537,281,793,153,665,409,921,89,601,345,857,217,729,473,985,57,569,313,825,185,697,441,953,121,633,377,889,249,761,505,1017,
419  5,517,261,773,133,645,389,901,69,581,325,837,197,709,453,965,37,549,293,805,165,677,421,933,101,613,357,869,229,741,485,997,
420  21,533,277,789,149,661,405,917,85,597,341,853,213,725,469,981,53,565,309,821,181,693,437,949,117,629,373,885,245,757,501,1013,
421  13,525,269,781,141,653,397,909,77,589,333,845,205,717,461,973,45,557,301,813,173,685,429,941,109,621,365,877,237,749,493,1005,
422  29,541,285,797,157,669,413,925,93,605,349,861,221,733,477,989,61,573,317,829,189,701,445,957,125,637,381,893,253,765,509,1021,
423  3,515,259,771,131,643,387,899,67,579,323,835,195,707,451,963,35,547,291,803,163,675,419,931,99,611,355,867,227,739,483,995,
424  19,531,275,787,147,659,403,915,83,595,339,851,211,723,467,979,51,563,307,819,179,691,435,947,115,627,371,883,243,755,499,1011,
425  11,523,267,779,139,651,395,907,75,587,331,843,203,715,459,971,43,555,299,811,171,683,427,939,107,619,363,875,235,747,491,1003,
426  27,539,283,795,155,667,411,923,91,603,347,859,219,731,475,987,59,571,315,827,187,699,443,955,123,635,379,891,251,763,507,1019,
427  7,519,263,775,135,647,391,903,71,583,327,839,199,711,455,967,39,551,295,807,167,679,423,935,103,615,359,871,231,743,487,999,
428  23,535,279,791,151,663,407,919,87,599,343,855,215,727,471,983,55,567,311,823,183,695,439,951,119,631,375,887,247,759,503,1015,
429  15,527,271,783,143,655,399,911,79,591,335,847,207,719,463,975,47,559,303,815,175,687,431,943,111,623,367,879,239,751,495,1007,
430  31,543,287,799,159,671,415,927,95,607,351,863,223,735,479,991,63,575,319,831,191,703,447,959,127,639,383,895,255,767,511,1023
431 };
432 
433 /* Incomplete-reduction routines; for details on allowed input ranges
434  * and produced output ranges, see the description in the paper:
435  * https://cryptojedi.org/papers/#newhope */
436 
437 #define qinv 12287 // -inverse_mod(p,2^18)
438 #define rlog 18
439 
440 inline uint16_t montgomery_reduce(uint32_t a)
441 {
442  uint32_t u;
443 
444  u = (a * qinv);
445  u &= ((1<<rlog)-1);
446  u *= PARAM_Q;
447  a = a + u;
448  return a >> 18;
449 }
450 
451 inline uint16_t barrett_reduce(uint16_t a)
452 {
453  uint32_t u;
454 
455  u = ((uint32_t) a * 5) >> 16;
456  u *= PARAM_Q;
457  a -= u;
458  return a;
459 }
460 
461 static void bitrev_vector(uint16_t* poly)
462 {
463  unsigned int i,r;
464  uint16_t tmp;
465 
466  for(i = 0; i < PARAM_N; i++)
467  {
468  r = bitrev_table[i];
469  if (i < r)
470  {
471  tmp = poly[i];
472  poly[i] = poly[r];
473  poly[r] = tmp;
474  }
475  }
476 }
477 
478 static void mul_coefficients(uint16_t* poly, const uint16_t* factors)
479 {
480  unsigned int i;
481 
482  for(i = 0; i < PARAM_N; i++)
483  poly[i] = montgomery_reduce((poly[i] * factors[i]));
484 }
485 
486 /* GS_bo_to_no; omegas need to be in Montgomery domain */
487 static void ntt(uint16_t * a, const uint16_t* omega)
488 {
489  int i, start, j, jTwiddle, distance;
490  uint16_t temp, W;
491 
492 
493  for(i=0;i<10;i+=2)
494  {
495  // Even level
496  distance = (1<<i);
497  for(start = 0; start < distance;start++)
498  {
499  jTwiddle = 0;
500  for(j=start;j<PARAM_N-1;j+=2*distance)
501  {
502  W = omega[jTwiddle++];
503  temp = a[j];
504  a[j] = (temp + a[j + distance]); // Omit reduction (be lazy)
505  a[j + distance] = montgomery_reduce((W * ((uint32_t)temp + 3*PARAM_Q - a[j + distance])));
506  }
507  }
508 
509  // Odd level
510  distance <<= 1;
511  for(start = 0; start < distance;start++)
512  {
513  jTwiddle = 0;
514  for(j=start;j<PARAM_N-1;j+=2*distance)
515  {
516  W = omega[jTwiddle++];
517  temp = a[j];
518  a[j] = barrett_reduce((temp + a[j + distance]));
519  a[j + distance] = montgomery_reduce((W * ((uint32_t)temp + 3*PARAM_Q - a[j + distance])));
520  }
521  }
522  }
523 }
524 
525 static int32_t abs(int32_t v)
526 {
527  int32_t mask = v >> 31;
528  return (v ^ mask) - mask;
529 }
530 
531 static int32_t f(int32_t *v0, int32_t *v1, uint32_t x)
532 {
533  int32_t xit, t, r, b;
534 
535  // Next 6 lines compute t = x/PARAM_Q;
536  b = x*2730;
537  t = b >> 25;
538  b = x - t*12289;
539  b = 12288 - b;
540  b >>= 31;
541  t -= b;
542 
543  r = t & 1;
544  xit = (t>>1);
545  *v0 = xit+r; // v0 = round(x/(2*PARAM_Q))
546 
547  t -= 1;
548  r = t & 1;
549  *v1 = (t>>1)+r;
550 
551  return abs(x-((*v0)*2*PARAM_Q));
552 }
553 
554 static int32_t g(int32_t x)
555 {
556  int32_t t,c,b;
557 
558  // Next 6 lines compute t = x/(4*PARAM_Q);
559  b = x*2730;
560  t = b >> 27;
561  b = x - t*49156;
562  b = 49155 - b;
563  b >>= 31;
564  t -= b;
565 
566  c = t & 1;
567  t = (t >> 1) + c; // t = round(x/(8*PARAM_Q))
568 
569  t *= 8*PARAM_Q;
570 
571  return abs(t - x);
572 }
573 
574 static int16_t LDDecode(int32_t xi0, int32_t xi1, int32_t xi2, int32_t xi3)
575 {
576  int32_t t;
577 
578  t = g(xi0);
579  t += g(xi1);
580  t += g(xi2);
581  t += g(xi3);
582 
583  t -= 8*PARAM_Q;
584  t >>= 31;
585  return t&1;
586 }
587 
588 static void crypto_chacha20_set_key(uint32_t *block, const unsigned char *k, const unsigned char *n);
589 
590 static void helprec(uint16_t *c, const uint16_t *v, const unsigned char *seed, unsigned char nonce)
591 {
592  int32_t v0[4], v1[4], v_tmp[4], k;
593  unsigned char rbit;
594  unsigned char *rand;
595  unsigned char n[8];
596  uint32_t input[16];
597  uint32_t output[16];
598  int i;
599 
600  for(i=0;i<7;i++)
601  n[i] = 0;
602  n[7] = nonce;
603 
604  //crypto_stream_chacha20(rand,32,n,seed);
605  crypto_chacha20_set_key(input, seed, n);
606  ChaCha::hashCore(output, input, 20);
607  rand = (unsigned char *)output;
608 
609  for(i=0; i<256; i++)
610  {
611  rbit = (rand[i>>3] >> (i&7)) & 1;
612 
613  k = f(v0+0, v1+0, 8*v[ 0+i] + 4*rbit);
614  k += f(v0+1, v1+1, 8*v[256+i] + 4*rbit);
615  k += f(v0+2, v1+2, 8*v[512+i] + 4*rbit);
616  k += f(v0+3, v1+3, 8*v[768+i] + 4*rbit);
617 
618  k = (2*PARAM_Q-1-k) >> 31;
619 
620  v_tmp[0] = ((~k) & v0[0]) ^ (k & v1[0]);
621  v_tmp[1] = ((~k) & v0[1]) ^ (k & v1[1]);
622  v_tmp[2] = ((~k) & v0[2]) ^ (k & v1[2]);
623  v_tmp[3] = ((~k) & v0[3]) ^ (k & v1[3]);
624 
625  c[ 0+i] = (v_tmp[0] - v_tmp[3]) & 3;
626  c[256+i] = (v_tmp[1] - v_tmp[3]) & 3;
627  c[512+i] = (v_tmp[2] - v_tmp[3]) & 3;
628  c[768+i] = ( -k + 2*v_tmp[3]) & 3;
629  }
630 
631  clean(input);
632  clean(output);
633 }
634 
635 static void rec(unsigned char *key, const uint16_t *v, const uint16_t *c)
636 {
637  int i;
638  int32_t tmp[4];
639 
640  for(i=0;i<32;i++)
641  key[i] = 0;
642 
643  for(i=0; i<256; i++)
644  {
645  tmp[0] = 16*PARAM_Q + 8*(int32_t)v[ 0+i] - PARAM_Q * (2*c[ 0+i]+c[768+i]);
646  tmp[1] = 16*PARAM_Q + 8*(int32_t)v[256+i] - PARAM_Q * (2*c[256+i]+c[768+i]);
647  tmp[2] = 16*PARAM_Q + 8*(int32_t)v[512+i] - PARAM_Q * (2*c[512+i]+c[768+i]);
648  tmp[3] = 16*PARAM_Q + 8*(int32_t)v[768+i] - PARAM_Q * ( c[768+i]);
649 
650  key[i>>3] |= LDDecode(tmp[0], tmp[1], tmp[2], tmp[3]) << (i & 7);
651  }
652 }
653 
654 static void poly_frombytes(uint16_t *r, const unsigned char *a)
655 {
656  int i;
657  for(i=0;i<PARAM_N/4;i++)
658  {
659  r[4*i+0] = a[7*i+0] | (((uint16_t)a[7*i+1] & 0x3f) << 8);
660  r[4*i+1] = (a[7*i+1] >> 6) | (((uint16_t)a[7*i+2]) << 2) | (((uint16_t)a[7*i+3] & 0x0f) << 10);
661  r[4*i+2] = (a[7*i+3] >> 4) | (((uint16_t)a[7*i+4]) << 4) | (((uint16_t)a[7*i+5] & 0x03) << 12);
662  r[4*i+3] = (a[7*i+5] >> 2) | (((uint16_t)a[7*i+6]) << 6);
663  }
664 }
665 
666 static void poly_tobytes(unsigned char *r, const uint16_t *p)
667 {
668  int i;
669  uint16_t t0,t1,t2,t3,m;
670  int16_t c;
671  for(i=0;i<PARAM_N/4;i++)
672  {
673  t0 = barrett_reduce(p[4*i+0]); //Make sure that coefficients have only 14 bits
674  t1 = barrett_reduce(p[4*i+1]);
675  t2 = barrett_reduce(p[4*i+2]);
676  t3 = barrett_reduce(p[4*i+3]);
677 
678  m = t0 - PARAM_Q;
679  c = m;
680  c >>= 15;
681  t0 = m ^ ((t0^m)&c); // <Make sure that coefficients are in [0,q]
682 
683  m = t1 - PARAM_Q;
684  c = m;
685  c >>= 15;
686  t1 = m ^ ((t1^m)&c); // <Make sure that coefficients are in [0,q]
687 
688  m = t2 - PARAM_Q;
689  c = m;
690  c >>= 15;
691  t2 = m ^ ((t2^m)&c); // <Make sure that coefficients are in [0,q]
692 
693  m = t3 - PARAM_Q;
694  c = m;
695  c >>= 15;
696  t3 = m ^ ((t3^m)&c); // <Make sure that coefficients are in [0,q]
697 
698  r[7*i+0] = t0 & 0xff;
699  r[7*i+1] = (t0 >> 8) | (t1 << 6);
700  r[7*i+2] = (t1 >> 2);
701  r[7*i+3] = (t1 >> 10) | (t2 << 4);
702  r[7*i+4] = (t2 >> 4);
703  r[7*i+5] = (t2 >> 12) | (t3 << 2);
704  r[7*i+6] = (t3 >> 6);
705  }
706 }
707 
708 static void poly_pointwise(uint16_t *r, const uint16_t *a, const uint16_t *b)
709 {
710  int i;
711  uint16_t t;
712  for(i=0;i<PARAM_N;i++)
713  {
714  t = montgomery_reduce(3186*b[i]); /* t is now in Montgomery domain */
715  r[i] = montgomery_reduce(a[i] * t); /* r->coeffs[i] is back in normal domain */
716  }
717 }
718 
719 static void poly_add(uint16_t *r, const uint16_t *a, const uint16_t *b)
720 {
721  int i;
722  for(i=0;i<PARAM_N;i++)
723  r[i] = barrett_reduce(a[i] + b[i]);
724 }
725 
726 static void poly_ntt(uint16_t *r)
727 {
728  mul_coefficients(r, psis_bitrev_montgomery);
729  ntt(r, omegas_montgomery);
730 }
731 
732 static void poly_invntt(uint16_t *r)
733 {
734  bitrev_vector(r);
735  ntt(r, omegas_inv_montgomery);
736  mul_coefficients(r, psis_inv_montgomery);
737 }
738 
739 static void encode_a(unsigned char *r, const uint16_t *pk, const unsigned char *seed)
740 {
741  int i;
742  poly_tobytes(r, pk);
743  for(i=0;i<NEWHOPE_SEEDBYTES;i++)
744  r[POLY_BYTES+i] = seed[i];
745 }
746 
747 static void encode_b(unsigned char *r, const uint16_t *b, const uint16_t *c)
748 {
749  int i;
750  poly_tobytes(r,b);
751  for(i=0;i<PARAM_N/4;i++)
752  r[POLY_BYTES+i] = c[4*i] | (c[4*i+1] << 2) | (c[4*i+2] << 4) | (c[4*i+3] << 6);
753 }
754 
755 static void decode_b_2nd_half(uint16_t *c, const unsigned char *r)
756 {
757  int i;
758  for(i=0;i<PARAM_N/4;i++)
759  {
760  c[4*i+0] = r[POLY_BYTES+i] & 0x03;
761  c[4*i+1] = (r[POLY_BYTES+i] >> 2) & 0x03;
762  c[4*i+2] = (r[POLY_BYTES+i] >> 4) & 0x03;
763  c[4*i+3] = (r[POLY_BYTES+i] >> 6);
764  }
765 }
766 
767 #if NEWHOPE_TORREF
768 
769 #define _5q (5*PARAM_Q)
770 
771 #define compare_and_swap(x,i,j) \
772  c = _5q - 1 - x[16*(i)];\
773  c >>= 31;\
774  t = x[16*(i)] ^ x[16*(j)];\
775  t &= c;\
776  x[16*(i)] ^= t;\
777  x[16*(j)] ^= t;
778 
779 static void batcher84(uint16_t *x)
780 {
781  static uint8_t const swap_table[] = {
782  0, 1, 2, 3, 0, 2, 1, 3, 1, 2, 4, 5, 6, 7, 4, 6,
783  5, 7, 5, 6, 0, 4, 2, 6, 2, 4, 1, 5, 3, 7, 3, 5,
784  1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 8, 10, 9, 11, 9, 10,
785  12, 13, 14, 15, 12, 14, 13, 15, 13, 14, 8, 12, 10, 14, 10, 12,
786  9, 13, 11, 15, 11, 13, 9, 10, 11, 12, 13, 14, 0, 8, 4, 12,
787  4, 8, 2, 10, 6, 14, 6, 10, 2, 4, 6, 8, 10, 12, 1, 9,
788  5, 13, 5, 9, 3, 11, 7, 15, 7, 11, 3, 5, 7, 9, 11, 13,
789  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
790  18, 19, 16, 18, 17, 19, 17, 18, 20, 21, 22, 23, 20, 22, 21, 23,
791  21, 22, 16, 20, 18, 22, 18, 20, 17, 21, 19, 23, 19, 21, 17, 18,
792  19, 20, 21, 22, 24, 25, 26, 27, 24, 26, 25, 27, 25, 26, 28, 29,
793  30, 31, 28, 30, 29, 31, 29, 30, 24, 28, 26, 30, 26, 28, 25, 29,
794  27, 31, 27, 29, 25, 26, 27, 28, 29, 30, 16, 24, 20, 28, 20, 24,
795  18, 26, 22, 30, 22, 26, 18, 20, 22, 24, 26, 28, 17, 25, 21, 29,
796  21, 25, 19, 27, 23, 31, 23, 27, 19, 21, 23, 25, 27, 29, 17, 18,
797  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 16, 8, 24,
798  8, 16, 4, 20, 12, 28, 12, 20, 4, 8, 12, 16, 20, 24, 2, 18,
799  10, 26, 10, 18, 6, 22, 14, 30, 14, 22, 6, 10, 14, 18, 22, 26,
800  2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 1, 17,
801  9, 25, 9, 17, 5, 21, 13, 29, 13, 21, 5, 9, 13, 17, 21, 25,
802  3, 19, 11, 27, 11, 19, 7, 23, 15, 31, 15, 23, 7, 11, 15, 19,
803  23, 27, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29,
804  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
805  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33,
806  34, 35, 32, 34, 33, 35, 33, 34, 36, 37, 38, 39, 36, 38, 37, 39,
807  37, 38, 32, 36, 34, 38, 34, 36, 33, 37, 35, 39, 35, 37, 33, 34,
808  35, 36, 37, 38, 40, 41, 42, 43, 40, 42, 41, 43, 41, 42, 44, 45,
809  46, 47, 44, 46, 45, 47, 45, 46, 40, 44, 42, 46, 42, 44, 41, 45,
810  43, 47, 43, 45, 41, 42, 43, 44, 45, 46, 32, 40, 36, 44, 36, 40,
811  34, 42, 38, 46, 38, 42, 34, 36, 38, 40, 42, 44, 33, 41, 37, 45,
812  37, 41, 35, 43, 39, 47, 39, 43, 35, 37, 39, 41, 43, 45, 33, 34,
813  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51,
814  48, 50, 49, 51, 49, 50, 52, 53, 54, 55, 52, 54, 53, 55, 53, 54,
815  48, 52, 50, 54, 50, 52, 49, 53, 51, 55, 51, 53, 49, 50, 51, 52,
816  53, 54, 56, 57, 58, 59, 56, 58, 57, 59, 57, 58, 60, 61, 62, 63,
817  60, 62, 61, 63, 61, 62, 56, 60, 58, 62, 58, 60, 57, 61, 59, 63,
818  59, 61, 57, 58, 59, 60, 61, 62, 48, 56, 52, 60, 52, 56, 50, 58,
819  54, 62, 54, 58, 50, 52, 54, 56, 58, 60, 49, 57, 53, 61, 53, 57,
820  51, 59, 55, 63, 55, 59, 51, 53, 55, 57, 59, 61, 49, 50, 51, 52,
821  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 32, 48, 40, 56, 40, 48,
822  36, 52, 44, 60, 44, 52, 36, 40, 44, 48, 52, 56, 34, 50, 42, 58,
823  42, 50, 38, 54, 46, 62, 46, 54, 38, 42, 46, 50, 54, 58, 34, 36,
824  38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 33, 49, 41, 57,
825  41, 49, 37, 53, 45, 61, 45, 53, 37, 41, 45, 49, 53, 57, 35, 51,
826  43, 59, 43, 51, 39, 55, 47, 63, 47, 55, 39, 43, 47, 51, 55, 59,
827  35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 33, 34,
828  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
829  51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 32, 16, 48,
830  16, 32, 8, 40, 24, 56, 24, 40, 8, 16, 24, 32, 40, 48, 4, 36,
831  20, 52, 20, 36, 12, 44, 28, 60, 28, 44, 12, 20, 28, 36, 44, 52,
832  4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 2, 34,
833  18, 50, 18, 34, 10, 42, 26, 58, 26, 42, 10, 18, 26, 34, 42, 50,
834  6, 38, 22, 54, 22, 38, 14, 46, 30, 62, 30, 46, 14, 22, 30, 38,
835  46, 54, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58,
836  2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
837  34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 1, 33,
838  17, 49, 17, 33, 9, 41, 25, 57, 25, 41, 9, 17, 25, 33, 41, 49,
839  5, 37, 21, 53, 21, 37, 13, 45, 29, 61, 29, 45, 13, 21, 29, 37,
840  45, 53, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57,
841  3, 35, 19, 51, 19, 35, 11, 43, 27, 59, 27, 43, 11, 19, 27, 35,
842  43, 51, 7, 39, 23, 55, 23, 39, 15, 47, 31, 63, 31, 47, 15, 23,
843  31, 39, 47, 55, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51,
844  55, 59, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29,
845  31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61,
846  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
847  17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
848  33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
849  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65,
850  66, 67, 64, 66, 65, 67, 65, 66, 68, 69, 70, 71, 68, 70, 69, 71,
851  69, 70, 64, 68, 66, 70, 66, 68, 65, 69, 67, 71, 67, 69, 65, 66,
852  67, 68, 69, 70, 72, 73, 74, 75, 72, 74, 73, 75, 73, 74, 76, 77,
853  78, 79, 76, 78, 77, 79, 77, 78, 72, 76, 74, 78, 74, 76, 73, 77,
854  75, 79, 75, 77, 73, 74, 75, 76, 77, 78, 64, 72, 68, 76, 68, 72,
855  66, 74, 70, 78, 70, 74, 66, 68, 70, 72, 74, 76, 65, 73, 69, 77,
856  69, 73, 67, 75, 71, 79, 71, 75, 67, 69, 71, 73, 75, 77, 65, 66,
857  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 80, 81, 82, 83,
858  80, 82, 81, 83, 81, 82, 81, 82, 81, 82, 64, 80, 72, 80, 68, 72,
859  76, 80, 66, 82, 74, 82, 70, 74, 78, 82, 66, 68, 70, 72, 74, 76,
860  78, 80, 65, 81, 73, 81, 69, 73, 77, 81, 67, 83, 75, 83, 71, 75,
861  79, 83, 67, 69, 71, 73, 75, 77, 79, 81, 65, 66, 67, 68, 69, 70,
862  71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 72, 80, 68, 72,
863  76, 80, 74, 82, 70, 74, 78, 82, 66, 68, 70, 72, 74, 76, 78, 80,
864  73, 81, 69, 73, 77, 81, 75, 83, 71, 75, 79, 83, 67, 69, 71, 73,
865  75, 77, 79, 81, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
866  77, 78, 79, 80, 81, 82, 0, 64, 32, 64, 16, 80, 48, 80, 16, 32,
867  48, 64, 8, 72, 40, 72, 24, 40, 56, 72, 8, 16, 24, 32, 40, 48,
868  56, 64, 72, 80, 4, 68, 36, 68, 20, 36, 52, 68, 12, 76, 44, 76,
869  28, 44, 60, 76, 12, 20, 28, 36, 44, 52, 60, 68, 4, 8, 12, 16,
870  20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80,
871  2, 66, 34, 66, 18, 82, 50, 82, 18, 34, 50, 66, 10, 74, 42, 74,
872  26, 42, 58, 74, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 6, 70,
873  38, 70, 22, 38, 54, 70, 14, 78, 46, 78, 30, 46, 62, 78, 14, 22,
874  30, 38, 46, 54, 62, 70, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42,
875  46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 2, 4, 6, 8, 10, 12,
876  14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44,
877  46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
878  78, 80, 1, 65, 33, 65, 17, 81, 49, 81, 17, 33, 49, 65, 9, 73,
879  41, 73, 25, 41, 57, 73, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81,
880  5, 69, 37, 69, 21, 37, 53, 69, 13, 77, 45, 77, 29, 45, 61, 77,
881  13, 21, 29, 37, 45, 53, 61, 69, 5, 9, 13, 17, 21, 25, 29, 33,
882  37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 3, 67, 35, 67,
883  19, 83, 51, 83, 19, 35, 51, 67, 11, 75, 43, 75, 27, 43, 59, 75,
884  11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 7, 71, 39, 71, 23, 39,
885  55, 71, 15, 79, 47, 79, 31, 47, 63, 79, 15, 23, 31, 39, 47, 55,
886  63, 71, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59,
887  63, 67, 71, 75, 79, 83, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21,
888  23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53,
889  55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 1, 2,
890  3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
891  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
892  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
893  51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
894  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82
895  };
896  unsigned index, i, j;
897  int32_t c;
898  uint16_t t;
899  for (index = 0; index < sizeof(swap_table); index += 2) {
900  i = swap_table[index];
901  j = swap_table[index + 1];
902  compare_and_swap(x, i, j);
903  }
904 }
905 
906 static int discardtopoly(uint16_t *x)
907 {
908  int32_t i, r=0;
909 
910  for(i=0;i<16;i++)
911  batcher84(x+i);
912 
913  // Check whether we're safe:
914  for(i=1008;i<1024;i++)
915  r |= 61444 - x[i];
916  if(r >>= 31) return -1;
917 
918  return 0;
919 }
920 
921 #endif // NEWHOPE_TORREF
922 
923 // End of public domain code imported from the C reference code.
924 
925 // Formats the ChaCha20 input block using a key and nonce.
926 static void crypto_chacha20_set_key(uint32_t *block, const unsigned char *k, const unsigned char *n)
927 {
928  static const char tag256[] = "expand 32-byte k";
929  memcpy(block, tag256, 16);
930  memcpy(block + 4, k, 32);
931  memset(block + 12, 0, 8);
932  if (n)
933  memcpy(block + 14, n, 8);
934  else
935  memset(block + 14, 0, 8);
936 }
937 
938 static void poly_uniform(uint16_t *a, const unsigned char *seed)
939 {
940  SHAKE128 shake;
941  int ctr = 0;
942  int posn = PARAM_N;
943  uint16_t val;
944 
945  // Absorb the seed material into the SHAKE128 object.
946  shake.update(seed, NEWHOPE_SEEDBYTES);
947 
948  while (ctr < PARAM_N) {
949  // Extract data from the SHAKE128 object directly into "a".
950  if (posn >= PARAM_N) {
951  shake.extend((uint8_t *)(a + ctr),
952  (PARAM_N - ctr) * sizeof(uint16_t));
953  posn = ctr;
954  }
955 
956  // Process as much of the data as we can, discarding values
957  // that are greater than or equal to 5 * PARAM_Q.
958  while (posn < PARAM_N) {
959  val = a[posn++];
960  if (val < (5 * PARAM_Q))
961  a[ctr++] = val;
962  }
963  }
964 }
965 
966 #if NEWHOPE_TORREF
967 
968 // Extended version of NewHopePoly that can hold the complete
969 // intermediate state for poly_uniform_torref(). This allows us
970 // to generate the polynomial in-place and save 2k of stack space.
971 class NewHopePolyExtended
972 {
973 public:
974  ~NewHopePolyExtended() { clean(coeffs); }
975 
976  uint16_t coeffs[84 * 16];
977 };
978 
979 static void poly_uniform_torref(uint16_t *a, const unsigned char *seed)
980 {
981  SHAKE128 shake;
982  shake.update(seed, 32);
983  do {
984  shake.extend((uint8_t *)a, 84 * 16 * sizeof(uint16_t));
985  } while (discardtopoly(a));
986 }
987 
988 #else // !NEWHOPE_TORREF
989 
990 typedef NewHopePoly NewHopePolyExtended;
991 
992 static void poly_uniform_torref(uint16_t *a, const unsigned char *seed)
993 {
994  poly_uniform(a, seed);
995 }
996 
997 #endif // NEWHOPE_TORREF
998 
999 static void poly_getnoise(uint16_t *r, unsigned char *seed, unsigned char nonce)
1000 {
1001  uint32_t input[16];
1002  uint32_t buf[16];
1003  int i, j;
1004  uint32_t a, b;
1005 
1006  // Note: The rest of this function assumes that we are running on a
1007  // little-endian CPU. Since we're generating random noise from a
1008  // random seed, it doesn't actually matter what the endian-ness is
1009  // as it will be just as random in both directions. It's only a
1010  // problem for verifying fixed test vectors.
1011 
1012  crypto_chacha20_set_key(input, seed, 0);
1013  input[14] = nonce; // Assumes little-endian.
1014 
1015  for (i = 0; i < PARAM_N; ++i) {
1016  // Generate a new block of random data if necessary.
1017  j = i % 16;
1018  if (j == 0) {
1019  ChaCha::hashCore(buf, input, 20);
1020  ++(input[12]); // Assumes little-endian.
1021  }
1022 
1023  // This is a slightly more efficient way to count bits than in
1024  // the reference C implementation. The technique is from:
1025  // https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
1026  a = buf[j] & 0xFFFF; // Assumes little-endian.
1027  a = a - ((a >> 1) & 0x5555);
1028  a = (a & 0x3333) + ((a >> 2) & 0x3333);
1029  a = ((a >> 4) + a) & 0x0F0F;
1030  a = ((a >> 8) + a) & 0x00FF;
1031 
1032  b = (buf[j] >> 16) & 0xFFFF; // Assumes little-endian.
1033  b = b - ((b >> 1) & 0x5555);
1034  b = (b & 0x3333) + ((b >> 2) & 0x3333);
1035  b = ((b >> 4) + b) & 0x0F0F;
1036  b = ((b >> 8) + b) & 0x00FF;
1037 
1038  r[i] = a + PARAM_Q - b;
1039  }
1040 
1041  clean(input);
1042  clean(buf);
1043 }
1044 
1045 static void sha3256(unsigned char *output, const unsigned char *input, unsigned int inputByteLen)
1046 {
1047  SHA3_256 sha3;
1048  sha3.update(input, inputByteLen);
1049  sha3.finalize(output, 32);
1050 }
1051 
1058 {
1059 }
1060 
1065 {
1066  clean(coeffs);
1067 }
1068 
1073 {
1074  clean(coeffs);
1075 }
1076 
1111 void NewHope::keygen(uint8_t send[NEWHOPE_SENDABYTES], NewHopePoly &sk,
1112  Variant variant, const uint8_t *random_seed)
1113 {
1114  NewHopePolyExtended a;
1115  NewHopePoly pk;
1116  uint8_t seed[NEWHOPE_SEEDBYTES];
1117  uint8_t noiseseed[32];
1118 
1119  if (!random_seed) {
1120  RNG.rand(seed, NEWHOPE_SEEDBYTES);
1121  RNG.rand(noiseseed, 32);
1122  } else {
1123  memcpy(seed, random_seed, NEWHOPE_SEEDBYTES);
1124  memcpy(noiseseed, random_seed + NEWHOPE_SEEDBYTES, 32);
1125  }
1126  sha3256(seed, seed, NEWHOPE_SEEDBYTES);
1127 
1128  // The order of calls is rearranged compared to the reference C version.
1129  // This allows us to get away with two temporary poly objects (a, pk)
1130  // instead of four (a, e, r, pk). This saves 4k of stack space.
1131 
1132  if (variant == Ref)
1133  poly_uniform(a.coeffs, seed);
1134  else
1135  poly_uniform_torref(a.coeffs, seed);
1136 
1137  poly_getnoise(sk.coeffs, noiseseed, 0);
1138  poly_ntt(sk.coeffs);
1139 
1140  poly_pointwise(pk.coeffs, sk.coeffs, a.coeffs);
1141 
1142  poly_getnoise(a.coeffs, noiseseed, 1);
1143  poly_ntt(a.coeffs);
1144 
1145  poly_add(pk.coeffs, a.coeffs, pk.coeffs);
1146 
1147  encode_a(send, pk.coeffs, seed);
1148 
1149  clean(seed);
1150  clean(noiseseed);
1151 }
1152 
1170 void NewHope::sharedb(uint8_t shared_key[NEWHOPE_SHAREDBYTES],
1171  uint8_t send[NEWHOPE_SENDBBYTES],
1172  uint8_t received[NEWHOPE_SENDABYTES],
1173  Variant variant, const uint8_t *random_seed)
1174 {
1175  NewHopePolyExtended a;
1176  NewHopePoly v, bp;
1177  unsigned char noiseseed[32];
1178 
1179  if (!random_seed)
1180  RNG.rand(noiseseed, 32);
1181  else
1182  memcpy(noiseseed, random_seed, 32);
1183 
1184  // The order of calls is rearranged compared to the reference C version.
1185  // This allows us to get away with 3 temporary poly objects (v, a, bp)
1186  // instead of 8 (sp, ep, v, a, pka, c, epp, bp). Saves 10k of stack space.
1187 
1188  if (variant == Ref)
1189  poly_uniform(a.coeffs, received + POLY_BYTES);
1190  else
1191  poly_uniform_torref(a.coeffs, received + POLY_BYTES);
1192 
1193  poly_getnoise(v.coeffs, noiseseed, 0);
1194  poly_ntt(v.coeffs);
1195 
1196  poly_pointwise(bp.coeffs, a.coeffs, v.coeffs);
1197 
1198  poly_getnoise(a.coeffs, noiseseed, 1);
1199  poly_ntt(a.coeffs);
1200 
1201  poly_add(bp.coeffs, bp.coeffs, a.coeffs);
1202 
1203  poly_frombytes(a.coeffs, received);
1204 
1205  poly_pointwise(v.coeffs, a.coeffs, v.coeffs);
1206  poly_invntt(v.coeffs);
1207 
1208  poly_getnoise(a.coeffs, noiseseed, 2);
1209  poly_add(v.coeffs, v.coeffs, a.coeffs);
1210 
1211  helprec(a.coeffs, v.coeffs, noiseseed, 3);
1212 
1213  encode_b(send, bp.coeffs, a.coeffs);
1214 
1215  rec(shared_key, v.coeffs, a.coeffs);
1216 
1217  sha3256(shared_key, shared_key, 32);
1218 
1219  clean(noiseseed);
1220 }
1221 
1231 void NewHope::shareda(uint8_t shared_key[NEWHOPE_SHAREDBYTES],
1232  const NewHopePoly &sk,
1233  uint8_t received[NEWHOPE_SENDBBYTES])
1234 {
1235  NewHopePoly v, bp;
1236 
1237  // The order of calls is rearranged compared to the reference C version.
1238  // This allows us to get away with two temporary poly objects (v, bp)
1239  // instead of three (v, bp, c). This saves 2k of stack space.
1240 
1241  poly_frombytes(bp.coeffs, received);
1242 
1243  poly_pointwise(v.coeffs, sk.coeffs, bp.coeffs);
1244  poly_invntt(v.coeffs);
1245 
1246  decode_b_2nd_half(bp.coeffs, received);
1247 
1248  rec(shared_key, v.coeffs, bp.coeffs);
1249 
1250  sha3256(shared_key, shared_key, 32);
1251 }
~NewHopePoly()
Clears sensitive data and destroys this "poly" object.
Definition: NewHope.cpp:1064
void rand(uint8_t *data, size_t len)
Generates random bytes into a caller-supplied buffer.
Definition: RNG.cpp:508
Variant
Describes the variant of the New Hope algorithm to implement.
Definition: NewHope.h:55
SHAKE Extendable-Output Function (XOF) with 128-bit security.
Definition: SHAKE.h:52
static void keygen(uint8_t send[NEWHOPE_SENDABYTES], NewHopePoly &sk, Variant variant=Ref, const uint8_t *random_seed=0)
Generates the key pair for Alice in a New Hope key exchange.
Definition: NewHope.cpp:1111
void clear()
Clears sensitive data in this "poly" object.
Definition: NewHope.cpp:1072
static void sharedb(uint8_t shared_key[NEWHOPE_SHAREDBYTES], uint8_t send[NEWHOPE_SENDBBYTES], uint8_t received[NEWHOPE_SENDABYTES], Variant variant=Ref, const uint8_t *random_seed=0)
Generates the public key and shared secret for Bob.
Definition: NewHope.cpp:1170
void finalize(void *hash, size_t len)
Finalizes the hashing process and returns the hash.
Definition: SHA3.cpp:71
NewHopePoly()
Constructs a new "poly" object for the NewHope algorithm.
Definition: NewHope.cpp:1057
NewHope polynomial representation.
Definition: NewHope.h:34
void update(const void *data, size_t len)
Updates the XOF with more data.
Definition: SHAKE.cpp:64
static void shareda(uint8_t shared_key[NEWHOPE_SHAREDBYTES], const NewHopePoly &sk, uint8_t received[NEWHOPE_SENDBBYTES])
Generates the shared secret for Alice.
Definition: NewHope.cpp:1231
static void hashCore(uint32_t *output, const uint32_t *input, uint8_t rounds)
Executes the ChaCha hash core on an input memory block.
Definition: ChaCha.cpp:253
SHA3-256 hash algorithm.
Definition: SHA3.h:29
The standard "reference" version of the New Hope algorithm.
Definition: NewHope.h:57
void extend(uint8_t *data, size_t len)
Generates extendable output from this XOF.
Definition: SHAKE.cpp:71
void update(const void *data, size_t len)
Updates the hash with more data.
Definition: SHA3.cpp:66