Coverage Report

Created: 2020-02-14 15:38

/src/botan/src/lib/pubkey/ed25519/ed25519_fe.cpp
Line
Count
Source
1
/*
2
* Ed25519 field element
3
* (C) 2017 Ribose Inc
4
*
5
* Based on the public domain code from SUPERCOP ref10 by
6
* Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang
7
*
8
* Botan is released under the Simplified BSD License (see license.txt)
9
*/
10
11
#include <botan/internal/ed25519_fe.h>
12
#include <botan/internal/ed25519_internal.h>
13
14
namespace Botan {
15
16
//static
17
FE_25519 FE_25519::invert(const FE_25519& z)
18
71
   {
19
71
   fe t0;
20
71
   fe t1;
21
71
   fe t2;
22
71
   fe t3;
23
71
24
71
   fe_sq(t0, z);
25
71
   fe_sq_iter(t1, t0, 2);
26
71
   fe_mul(t1, z, t1);
27
71
   fe_mul(t0, t0, t1);
28
71
   fe_sq(t2, t0);
29
71
   fe_mul(t1, t1, t2);
30
71
   fe_sq_iter(t2, t1, 5);
31
71
   fe_mul(t1, t2, t1);
32
71
   fe_sq_iter(t2, t1, 10);
33
71
   fe_mul(t2, t2, t1);
34
71
   fe_sq_iter(t3, t2, 20);
35
71
   fe_mul(t2, t3, t2);
36
71
   fe_sq_iter(t2, t2, 10);
37
71
   fe_mul(t1, t2, t1);
38
71
   fe_sq_iter(t2, t1, 50);
39
71
   fe_mul(t2, t2, t1);
40
71
   fe_sq_iter(t3, t2, 100);
41
71
   fe_mul(t2, t3, t2);
42
71
   fe_sq_iter(t2, t2, 50);
43
71
   fe_mul(t1, t2, t1);
44
71
   fe_sq_iter(t1, t1, 5);
45
71
46
71
   fe_mul(t0, t1, t0);
47
71
   return t0;
48
71
   }
49
50
FE_25519 FE_25519::pow_22523(const fe& z)
51
69
   {
52
69
   fe t0;
53
69
   fe t1;
54
69
   fe t2;
55
69
56
69
   fe_sq(t0, z);
57
69
   fe_sq_iter(t1, t0, 2);
58
69
   fe_mul(t1, z, t1);
59
69
   fe_mul(t0, t0, t1);
60
69
   fe_sq(t0, t0);
61
69
   fe_mul(t0, t1, t0);
62
69
   fe_sq_iter(t1, t0, 5);
63
69
   fe_mul(t0, t1, t0);
64
69
   fe_sq_iter(t1, t0, 10);
65
69
   fe_mul(t1, t1, t0);
66
69
   fe_sq_iter(t2, t1, 20);
67
69
   fe_mul(t1, t2, t1);
68
69
   fe_sq_iter(t1, t1, 10);
69
69
   fe_mul(t0, t1, t0);
70
69
   fe_sq_iter(t1, t0, 50);
71
69
   fe_mul(t1, t1, t0);
72
69
   fe_sq_iter(t2, t1, 100);
73
69
   fe_mul(t1, t2, t1);
74
69
   fe_sq_iter(t1, t1, 50);
75
69
   fe_mul(t0, t1, t0);
76
69
   fe_sq_iter(t0, t0, 2);
77
69
78
69
   fe_mul(t0, t0, z);
79
69
   return t0;
80
69
   }
81
82
/*
83
h = f * g
84
Can overlap h with f or g.
85
86
Preconditions:
87
|f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
88
|g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
89
90
Postconditions:
91
|h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
92
*/
93
94
/*
95
Notes on implementation strategy:
96
97
Using schoolbook multiplication.
98
Karatsuba would save a little in some cost models.
99
100
Most multiplications by 2 and 19 are 32-bit precomputations;
101
cheaper than 64-bit postcomputations.
102
103
There is one remaining multiplication by 19 in the carry chain;
104
one *19 precomputation can be merged into this,
105
but the resulting data flow is considerably less clean.
106
107
There are 12 carries below.
108
10 of them are 2-way parallelizable and vectorizable.
109
Can get away with 11 carries, but then data flow is much deeper.
110
111
With tighter constraints on inputs can squeeze carries into int32.
112
*/
113
114
//static
115
FE_25519 FE_25519::mul(const FE_25519& f, const FE_25519& g)
116
93.4k
   {
117
93.4k
   const int32_t f0 = f[0];
118
93.4k
   const int32_t f1 = f[1];
119
93.4k
   const int32_t f2 = f[2];
120
93.4k
   const int32_t f3 = f[3];
121
93.4k
   const int32_t f4 = f[4];
122
93.4k
   const int32_t f5 = f[5];
123
93.4k
   const int32_t f6 = f[6];
124
93.4k
   const int32_t f7 = f[7];
125
93.4k
   const int32_t f8 = f[8];
126
93.4k
   const int32_t f9 = f[9];
127
93.4k
128
93.4k
   const int32_t g0 = g[0];
129
93.4k
   const int32_t g1 = g[1];
130
93.4k
   const int32_t g2 = g[2];
131
93.4k
   const int32_t g3 = g[3];
132
93.4k
   const int32_t g4 = g[4];
133
93.4k
   const int32_t g5 = g[5];
134
93.4k
   const int32_t g6 = g[6];
135
93.4k
   const int32_t g7 = g[7];
136
93.4k
   const int32_t g8 = g[8];
137
93.4k
   const int32_t g9 = g[9];
138
93.4k
139
93.4k
   const int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */
140
93.4k
   const int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */
141
93.4k
   const int32_t g3_19 = 19 * g3;
142
93.4k
   const int32_t g4_19 = 19 * g4;
143
93.4k
   const int32_t g5_19 = 19 * g5;
144
93.4k
   const int32_t g6_19 = 19 * g6;
145
93.4k
   const int32_t g7_19 = 19 * g7;
146
93.4k
   const int32_t g8_19 = 19 * g8;
147
93.4k
   const int32_t g9_19 = 19 * g9;
148
93.4k
   const int32_t f1_2 = 2 * f1;
149
93.4k
   const int32_t f3_2 = 2 * f3;
150
93.4k
   const int32_t f5_2 = 2 * f5;
151
93.4k
   const int32_t f7_2 = 2 * f7;
152
93.4k
   const int32_t f9_2 = 2 * f9;
153
93.4k
154
93.4k
   const int64_t f0g0    = f0   * static_cast<int64_t>(g0);
155
93.4k
   const int64_t f0g1    = f0   * static_cast<int64_t>(g1);
156
93.4k
   const int64_t f0g2    = f0   * static_cast<int64_t>(g2);
157
93.4k
   const int64_t f0g3    = f0   * static_cast<int64_t>(g3);
158
93.4k
   const int64_t f0g4    = f0   * static_cast<int64_t>(g4);
159
93.4k
   const int64_t f0g5    = f0   * static_cast<int64_t>(g5);
160
93.4k
   const int64_t f0g6    = f0   * static_cast<int64_t>(g6);
161
93.4k
   const int64_t f0g7    = f0   * static_cast<int64_t>(g7);
162
93.4k
   const int64_t f0g8    = f0   * static_cast<int64_t>(g8);
163
93.4k
   const int64_t f0g9    = f0   * static_cast<int64_t>(g9);
164
93.4k
   const int64_t f1g0    = f1   * static_cast<int64_t>(g0);
165
93.4k
   const int64_t f1g1_2  = f1_2 * static_cast<int64_t>(g1);
166
93.4k
   const int64_t f1g2    = f1   * static_cast<int64_t>(g2);
167
93.4k
   const int64_t f1g3_2  = f1_2 * static_cast<int64_t>(g3);
168
93.4k
   const int64_t f1g4    = f1   * static_cast<int64_t>(g4);
169
93.4k
   const int64_t f1g5_2  = f1_2 * static_cast<int64_t>(g5);
170
93.4k
   const int64_t f1g6    = f1   * static_cast<int64_t>(g6);
171
93.4k
   const int64_t f1g7_2  = f1_2 * static_cast<int64_t>(g7);
172
93.4k
   const int64_t f1g8    = f1   * static_cast<int64_t>(g8);
173
93.4k
   const int64_t f1g9_38 = f1_2 * static_cast<int64_t>(g9_19);
174
93.4k
   const int64_t f2g0    = f2   * static_cast<int64_t>(g0);
175
93.4k
   const int64_t f2g1    = f2   * static_cast<int64_t>(g1);
176
93.4k
   const int64_t f2g2    = f2   * static_cast<int64_t>(g2);
177
93.4k
   const int64_t f2g3    = f2   * static_cast<int64_t>(g3);
178
93.4k
   const int64_t f2g4    = f2   * static_cast<int64_t>(g4);
179
93.4k
   const int64_t f2g5    = f2   * static_cast<int64_t>(g5);
180
93.4k
   const int64_t f2g6    = f2   * static_cast<int64_t>(g6);
181
93.4k
   const int64_t f2g7    = f2   * static_cast<int64_t>(g7);
182
93.4k
   const int64_t f2g8_19 = f2   * static_cast<int64_t>(g8_19);
183
93.4k
   const int64_t f2g9_19 = f2   * static_cast<int64_t>(g9_19);
184
93.4k
   const int64_t f3g0    = f3   * static_cast<int64_t>(g0);
185
93.4k
   const int64_t f3g1_2  = f3_2 * static_cast<int64_t>(g1);
186
93.4k
   const int64_t f3g2    = f3   * static_cast<int64_t>(g2);
187
93.4k
   const int64_t f3g3_2  = f3_2 * static_cast<int64_t>(g3);
188
93.4k
   const int64_t f3g4    = f3   * static_cast<int64_t>(g4);
189
93.4k
   const int64_t f3g5_2  = f3_2 * static_cast<int64_t>(g5);
190
93.4k
   const int64_t f3g6    = f3   * static_cast<int64_t>(g6);
191
93.4k
   const int64_t f3g7_38 = f3_2 * static_cast<int64_t>(g7_19);
192
93.4k
   const int64_t f3g8_19 = f3   * static_cast<int64_t>(g8_19);
193
93.4k
   const int64_t f3g9_38 = f3_2 * static_cast<int64_t>(g9_19);
194
93.4k
   const int64_t f4g0    = f4   * static_cast<int64_t>(g0);
195
93.4k
   const int64_t f4g1    = f4   * static_cast<int64_t>(g1);
196
93.4k
   const int64_t f4g2    = f4   * static_cast<int64_t>(g2);
197
93.4k
   const int64_t f4g3    = f4   * static_cast<int64_t>(g3);
198
93.4k
   const int64_t f4g4    = f4   * static_cast<int64_t>(g4);
199
93.4k
   const int64_t f4g5    = f4   * static_cast<int64_t>(g5);
200
93.4k
   const int64_t f4g6_19 = f4   * static_cast<int64_t>(g6_19);
201
93.4k
   const int64_t f4g7_19 = f4   * static_cast<int64_t>(g7_19);
202
93.4k
   const int64_t f4g8_19 = f4   * static_cast<int64_t>(g8_19);
203
93.4k
   const int64_t f4g9_19 = f4   * static_cast<int64_t>(g9_19);
204
93.4k
   const int64_t f5g0    = f5   * static_cast<int64_t>(g0);
205
93.4k
   const int64_t f5g1_2  = f5_2 * static_cast<int64_t>(g1);
206
93.4k
   const int64_t f5g2    = f5   * static_cast<int64_t>(g2);
207
93.4k
   const int64_t f5g3_2  = f5_2 * static_cast<int64_t>(g3);
208
93.4k
   const int64_t f5g4    = f5   * static_cast<int64_t>(g4);
209
93.4k
   const int64_t f5g5_38 = f5_2 * static_cast<int64_t>(g5_19);
210
93.4k
   const int64_t f5g6_19 = f5   * static_cast<int64_t>(g6_19);
211
93.4k
   const int64_t f5g7_38 = f5_2 * static_cast<int64_t>(g7_19);
212
93.4k
   const int64_t f5g8_19 = f5   * static_cast<int64_t>(g8_19);
213
93.4k
   const int64_t f5g9_38 = f5_2 * static_cast<int64_t>(g9_19);
214
93.4k
   const int64_t f6g0    = f6   * static_cast<int64_t>(g0);
215
93.4k
   const int64_t f6g1    = f6   * static_cast<int64_t>(g1);
216
93.4k
   const int64_t f6g2    = f6   * static_cast<int64_t>(g2);
217
93.4k
   const int64_t f6g3    = f6   * static_cast<int64_t>(g3);
218
93.4k
   const int64_t f6g4_19 = f6   * static_cast<int64_t>(g4_19);
219
93.4k
   const int64_t f6g5_19 = f6   * static_cast<int64_t>(g5_19);
220
93.4k
   const int64_t f6g6_19 = f6   * static_cast<int64_t>(g6_19);
221
93.4k
   const int64_t f6g7_19 = f6   * static_cast<int64_t>(g7_19);
222
93.4k
   const int64_t f6g8_19 = f6   * static_cast<int64_t>(g8_19);
223
93.4k
   const int64_t f6g9_19 = f6   * static_cast<int64_t>(g9_19);
224
93.4k
   const int64_t f7g0    = f7   * static_cast<int64_t>(g0);
225
93.4k
   const int64_t f7g1_2  = f7_2 * static_cast<int64_t>(g1);
226
93.4k
   const int64_t f7g2    = f7   * static_cast<int64_t>(g2);
227
93.4k
   const int64_t f7g3_38 = f7_2 * static_cast<int64_t>(g3_19);
228
93.4k
   const int64_t f7g4_19 = f7   * static_cast<int64_t>(g4_19);
229
93.4k
   const int64_t f7g5_38 = f7_2 * static_cast<int64_t>(g5_19);
230
93.4k
   const int64_t f7g6_19 = f7   * static_cast<int64_t>(g6_19);
231
93.4k
   const int64_t f7g7_38 = f7_2 * static_cast<int64_t>(g7_19);
232
93.4k
   const int64_t f7g8_19 = f7   * static_cast<int64_t>(g8_19);
233
93.4k
   const int64_t f7g9_38 = f7_2 * static_cast<int64_t>(g9_19);
234
93.4k
   const int64_t f8g0    = f8   * static_cast<int64_t>(g0);
235
93.4k
   const int64_t f8g1    = f8   * static_cast<int64_t>(g1);
236
93.4k
   const int64_t f8g2_19 = f8   * static_cast<int64_t>(g2_19);
237
93.4k
   const int64_t f8g3_19 = f8   * static_cast<int64_t>(g3_19);
238
93.4k
   const int64_t f8g4_19 = f8   * static_cast<int64_t>(g4_19);
239
93.4k
   const int64_t f8g5_19 = f8   * static_cast<int64_t>(g5_19);
240
93.4k
   const int64_t f8g6_19 = f8   * static_cast<int64_t>(g6_19);
241
93.4k
   const int64_t f8g7_19 = f8   * static_cast<int64_t>(g7_19);
242
93.4k
   const int64_t f8g8_19 = f8   * static_cast<int64_t>(g8_19);
243
93.4k
   const int64_t f8g9_19 = f8   * static_cast<int64_t>(g9_19);
244
93.4k
   const int64_t f9g0    = f9   * static_cast<int64_t>(g0);
245
93.4k
   const int64_t f9g1_38 = f9_2 * static_cast<int64_t>(g1_19);
246
93.4k
   const int64_t f9g2_19 = f9   * static_cast<int64_t>(g2_19);
247
93.4k
   const int64_t f9g3_38 = f9_2 * static_cast<int64_t>(g3_19);
248
93.4k
   const int64_t f9g4_19 = f9   * static_cast<int64_t>(g4_19);
249
93.4k
   const int64_t f9g5_38 = f9_2 * static_cast<int64_t>(g5_19);
250
93.4k
   const int64_t f9g6_19 = f9   * static_cast<int64_t>(g6_19);
251
93.4k
   const int64_t f9g7_38 = f9_2 * static_cast<int64_t>(g7_19);
252
93.4k
   const int64_t f9g8_19 = f9   * static_cast<int64_t>(g8_19);
253
93.4k
   const int64_t f9g9_38 = f9_2 * static_cast<int64_t>(g9_19);
254
93.4k
255
93.4k
   int64_t h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38;
256
93.4k
   int64_t h1 = f0g1+f1g0   +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19;
257
93.4k
   int64_t h2 = f0g2+f1g1_2 +f2g0   +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38;
258
93.4k
   int64_t h3 = f0g3+f1g2   +f2g1   +f3g0   +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19;
259
93.4k
   int64_t h4 = f0g4+f1g3_2 +f2g2   +f3g1_2 +f4g0   +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38;
260
93.4k
   int64_t h5 = f0g5+f1g4   +f2g3   +f3g2   +f4g1   +f5g0   +f6g9_19+f7g8_19+f8g7_19+f9g6_19;
261
93.4k
   int64_t h6 = f0g6+f1g5_2 +f2g4   +f3g3_2 +f4g2   +f5g1_2 +f6g0   +f7g9_38+f8g8_19+f9g7_38;
262
93.4k
   int64_t h7 = f0g7+f1g6   +f2g5   +f3g4   +f4g3   +f5g2   +f6g1   +f7g0   +f8g9_19+f9g8_19;
263
93.4k
   int64_t h8 = f0g8+f1g7_2 +f2g6   +f3g5_2 +f4g4   +f5g3_2 +f6g2   +f7g1_2 +f8g0   +f9g9_38;
264
93.4k
   int64_t h9 = f0g9+f1g8   +f2g7   +f3g6   +f4g5   +f5g4   +f6g3   +f7g2   +f8g1   +f9g0   ;
265
93.4k
266
93.4k
   /*
267
93.4k
   |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38))
268
93.4k
   i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8
269
93.4k
   |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19))
270
93.4k
   i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9
271
93.4k
   */
272
93.4k
   carry<26>(h0, h1);
273
93.4k
   carry<26>(h4, h5);
274
93.4k
275
93.4k
   /* |h0| <= 2^25 */
276
93.4k
   /* |h4| <= 2^25 */
277
93.4k
   /* |h1| <= 1.71*2^59 */
278
93.4k
   /* |h5| <= 1.71*2^59 */
279
93.4k
280
93.4k
   carry<25>(h1, h2);
281
93.4k
   carry<25>(h5, h6);
282
93.4k
283
93.4k
   /* |h1| <= 2^24; from now on fits into int32 */
284
93.4k
   /* |h5| <= 2^24; from now on fits into int32 */
285
93.4k
   /* |h2| <= 1.41*2^60 */
286
93.4k
   /* |h6| <= 1.41*2^60 */
287
93.4k
288
93.4k
   carry<26>(h2, h3);
289
93.4k
   carry<26>(h6, h7);
290
93.4k
   /* |h2| <= 2^25; from now on fits into int32 unchanged */
291
93.4k
   /* |h6| <= 2^25; from now on fits into int32 unchanged */
292
93.4k
   /* |h3| <= 1.71*2^59 */
293
93.4k
   /* |h7| <= 1.71*2^59 */
294
93.4k
295
93.4k
   carry<25>(h3, h4);
296
93.4k
   carry<25>(h7, h8);
297
93.4k
   /* |h3| <= 2^24; from now on fits into int32 unchanged */
298
93.4k
   /* |h7| <= 2^24; from now on fits into int32 unchanged */
299
93.4k
   /* |h4| <= 1.72*2^34 */
300
93.4k
   /* |h8| <= 1.41*2^60 */
301
93.4k
302
93.4k
   carry<26>(h4, h5);
303
93.4k
   carry<26>(h8, h9);
304
93.4k
   /* |h4| <= 2^25; from now on fits into int32 unchanged */
305
93.4k
   /* |h8| <= 2^25; from now on fits into int32 unchanged */
306
93.4k
   /* |h5| <= 1.01*2^24 */
307
93.4k
   /* |h9| <= 1.71*2^59 */
308
93.4k
309
93.4k
   carry<25, 19>(h9, h0);
310
93.4k
311
93.4k
   /* |h9| <= 2^24; from now on fits into int32 unchanged */
312
93.4k
   /* |h0| <= 1.1*2^39 */
313
93.4k
314
93.4k
   carry<26>(h0, h1);
315
93.4k
   /* |h0| <= 2^25; from now on fits into int32 unchanged */
316
93.4k
   /* |h1| <= 1.01*2^24 */
317
93.4k
318
93.4k
   return FE_25519(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9);
319
93.4k
   }
320
321
/*
322
h = f * f
323
Can overlap h with f.
324
325
Preconditions:
326
|f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
327
328
Postconditions:
329
|h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
330
*/
331
332
/*
333
See fe_mul.c for discussion of implementation strategy.
334
*/
335
336
//static
337
FE_25519 FE_25519::sqr_iter(const FE_25519& f, size_t iter)
338
53.1k
   {
339
53.1k
   int32_t f0 = f[0];
340
53.1k
   int32_t f1 = f[1];
341
53.1k
   int32_t f2 = f[2];
342
53.1k
   int32_t f3 = f[3];
343
53.1k
   int32_t f4 = f[4];
344
53.1k
   int32_t f5 = f[5];
345
53.1k
   int32_t f6 = f[6];
346
53.1k
   int32_t f7 = f[7];
347
53.1k
   int32_t f8 = f[8];
348
53.1k
   int32_t f9 = f[9];
349
53.1k
350
140k
   for(size_t i = 0; i != iter; ++i)
351
86.9k
      {
352
86.9k
      const int32_t f0_2 = 2 * f0;
353
86.9k
      const int32_t f1_2 = 2 * f1;
354
86.9k
      const int32_t f2_2 = 2 * f2;
355
86.9k
      const int32_t f3_2 = 2 * f3;
356
86.9k
      const int32_t f4_2 = 2 * f4;
357
86.9k
      const int32_t f5_2 = 2 * f5;
358
86.9k
      const int32_t f6_2 = 2 * f6;
359
86.9k
      const int32_t f7_2 = 2 * f7;
360
86.9k
      const int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */
361
86.9k
      const int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */
362
86.9k
      const int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */
363
86.9k
      const int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */
364
86.9k
      const int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */
365
86.9k
366
86.9k
      const int64_t f0f0    = f0   * static_cast<int64_t>(f0);
367
86.9k
      const int64_t f0f1_2  = f0_2 * static_cast<int64_t>(f1);
368
86.9k
      const int64_t f0f2_2  = f0_2 * static_cast<int64_t>(f2);
369
86.9k
      const int64_t f0f3_2  = f0_2 * static_cast<int64_t>(f3);
370
86.9k
      const int64_t f0f4_2  = f0_2 * static_cast<int64_t>(f4);
371
86.9k
      const int64_t f0f5_2  = f0_2 * static_cast<int64_t>(f5);
372
86.9k
      const int64_t f0f6_2  = f0_2 * static_cast<int64_t>(f6);
373
86.9k
      const int64_t f0f7_2  = f0_2 * static_cast<int64_t>(f7);
374
86.9k
      const int64_t f0f8_2  = f0_2 * static_cast<int64_t>(f8);
375
86.9k
      const int64_t f0f9_2  = f0_2 * static_cast<int64_t>(f9);
376
86.9k
      const int64_t f1f1_2  = f1_2 * static_cast<int64_t>(f1);
377
86.9k
      const int64_t f1f2_2  = f1_2 * static_cast<int64_t>(f2);
378
86.9k
      const int64_t f1f3_4  = f1_2 * static_cast<int64_t>(f3_2);
379
86.9k
      const int64_t f1f4_2  = f1_2 * static_cast<int64_t>(f4);
380
86.9k
      const int64_t f1f5_4  = f1_2 * static_cast<int64_t>(f5_2);
381
86.9k
      const int64_t f1f6_2  = f1_2 * static_cast<int64_t>(f6);
382
86.9k
      const int64_t f1f7_4  = f1_2 * static_cast<int64_t>(f7_2);
383
86.9k
      const int64_t f1f8_2  = f1_2 * static_cast<int64_t>(f8);
384
86.9k
      const int64_t f1f9_76 = f1_2 * static_cast<int64_t>(f9_38);
385
86.9k
      const int64_t f2f2    = f2   * static_cast<int64_t>(f2);
386
86.9k
      const int64_t f2f3_2  = f2_2 * static_cast<int64_t>(f3);
387
86.9k
      const int64_t f2f4_2  = f2_2 * static_cast<int64_t>(f4);
388
86.9k
      const int64_t f2f5_2  = f2_2 * static_cast<int64_t>(f5);
389
86.9k
      const int64_t f2f6_2  = f2_2 * static_cast<int64_t>(f6);
390
86.9k
      const int64_t f2f7_2  = f2_2 * static_cast<int64_t>(f7);
391
86.9k
      const int64_t f2f8_38 = f2_2 * static_cast<int64_t>(f8_19);
392
86.9k
      const int64_t f2f9_38 = f2   * static_cast<int64_t>(f9_38);
393
86.9k
      const int64_t f3f3_2  = f3_2 * static_cast<int64_t>(f3);
394
86.9k
      const int64_t f3f4_2  = f3_2 * static_cast<int64_t>(f4);
395
86.9k
      const int64_t f3f5_4  = f3_2 * static_cast<int64_t>(f5_2);
396
86.9k
      const int64_t f3f6_2  = f3_2 * static_cast<int64_t>(f6);
397
86.9k
      const int64_t f3f7_76 = f3_2 * static_cast<int64_t>(f7_38);
398
86.9k
      const int64_t f3f8_38 = f3_2 * static_cast<int64_t>(f8_19);
399
86.9k
      const int64_t f3f9_76 = f3_2 * static_cast<int64_t>(f9_38);
400
86.9k
      const int64_t f4f4    = f4   * static_cast<int64_t>(f4);
401
86.9k
      const int64_t f4f5_2  = f4_2 * static_cast<int64_t>(f5);
402
86.9k
      const int64_t f4f6_38 = f4_2 * static_cast<int64_t>(f6_19);
403
86.9k
      const int64_t f4f7_38 = f4   * static_cast<int64_t>(f7_38);
404
86.9k
      const int64_t f4f8_38 = f4_2 * static_cast<int64_t>(f8_19);
405
86.9k
      const int64_t f4f9_38 = f4   * static_cast<int64_t>(f9_38);
406
86.9k
      const int64_t f5f5_38 = f5   * static_cast<int64_t>(f5_38);
407
86.9k
      const int64_t f5f6_38 = f5_2 * static_cast<int64_t>(f6_19);
408
86.9k
      const int64_t f5f7_76 = f5_2 * static_cast<int64_t>(f7_38);
409
86.9k
      const int64_t f5f8_38 = f5_2 * static_cast<int64_t>(f8_19);
410
86.9k
      const int64_t f5f9_76 = f5_2 * static_cast<int64_t>(f9_38);
411
86.9k
      const int64_t f6f6_19 = f6   * static_cast<int64_t>(f6_19);
412
86.9k
      const int64_t f6f7_38 = f6   * static_cast<int64_t>(f7_38);
413
86.9k
      const int64_t f6f8_38 = f6_2 * static_cast<int64_t>(f8_19);
414
86.9k
      const int64_t f6f9_38 = f6   * static_cast<int64_t>(f9_38);
415
86.9k
      const int64_t f7f7_38 = f7   * static_cast<int64_t>(f7_38);
416
86.9k
      const int64_t f7f8_38 = f7_2 * static_cast<int64_t>(f8_19);
417
86.9k
      const int64_t f7f9_76 = f7_2 * static_cast<int64_t>(f9_38);
418
86.9k
      const int64_t f8f8_19 = f8   * static_cast<int64_t>(f8_19);
419
86.9k
      const int64_t f8f9_38 = f8   * static_cast<int64_t>(f9_38);
420
86.9k
      const int64_t f9f9_38 = f9   * static_cast<int64_t>(f9_38);
421
86.9k
422
86.9k
      int64_t h0 = f0f0  +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;
423
86.9k
      int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;
424
86.9k
      int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;
425
86.9k
      int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;
426
86.9k
      int64_t h4 = f0f4_2+f1f3_4 +f2f2   +f5f9_76+f6f8_38+f7f7_38;
427
86.9k
      int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;
428
86.9k
      int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;
429
86.9k
      int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;
430
86.9k
      int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4   +f9f9_38;
431
86.9k
      int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;
432
86.9k
433
86.9k
      carry<26>(h0, h1);
434
86.9k
      carry<26>(h4, h5);
435
86.9k
      carry<25>(h1, h2);
436
86.9k
      carry<25>(h5, h6);
437
86.9k
      carry<26>(h2, h3);
438
86.9k
      carry<26>(h6, h7);
439
86.9k
440
86.9k
      carry<25>(h3, h4);
441
86.9k
      carry<25>(h7, h8);
442
86.9k
443
86.9k
      carry<26>(h4, h5);
444
86.9k
      carry<26>(h8, h9);
445
86.9k
      carry<25,19>(h9, h0);
446
86.9k
      carry<26>(h0, h1);
447
86.9k
448
86.9k
      f0 = static_cast<int32_t>(h0);
449
86.9k
      f1 = static_cast<int32_t>(h1);
450
86.9k
      f2 = static_cast<int32_t>(h2);
451
86.9k
      f3 = static_cast<int32_t>(h3);
452
86.9k
      f4 = static_cast<int32_t>(h4);
453
86.9k
      f5 = static_cast<int32_t>(h5);
454
86.9k
      f6 = static_cast<int32_t>(h6);
455
86.9k
      f7 = static_cast<int32_t>(h7);
456
86.9k
      f8 = static_cast<int32_t>(h8);
457
86.9k
      f9 = static_cast<int32_t>(h9);
458
86.9k
      }
459
53.1k
460
53.1k
   return FE_25519(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
461
53.1k
   }
462
463
/*
464
h = 2 * f * f
465
Can overlap h with f.
466
467
Preconditions:
468
|f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
469
470
Postconditions:
471
|h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
472
*/
473
474
/*
475
See fe_mul.c for discussion of implementation strategy.
476
*/
477
478
//static
479
FE_25519 FE_25519::sqr2(const FE_25519& f)
480
17.1k
   {
481
17.1k
   const int32_t f0 = f[0];
482
17.1k
   const int32_t f1 = f[1];
483
17.1k
   const int32_t f2 = f[2];
484
17.1k
   const int32_t f3 = f[3];
485
17.1k
   const int32_t f4 = f[4];
486
17.1k
   const int32_t f5 = f[5];
487
17.1k
   const int32_t f6 = f[6];
488
17.1k
   const int32_t f7 = f[7];
489
17.1k
   const int32_t f8 = f[8];
490
17.1k
   const int32_t f9 = f[9];
491
17.1k
   const int32_t f0_2 = 2 * f0;
492
17.1k
   const int32_t f1_2 = 2 * f1;
493
17.1k
   const int32_t f2_2 = 2 * f2;
494
17.1k
   const int32_t f3_2 = 2 * f3;
495
17.1k
   const int32_t f4_2 = 2 * f4;
496
17.1k
   const int32_t f5_2 = 2 * f5;
497
17.1k
   const int32_t f6_2 = 2 * f6;
498
17.1k
   const int32_t f7_2 = 2 * f7;
499
17.1k
   const int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */
500
17.1k
   const int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */
501
17.1k
   const int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */
502
17.1k
   const int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */
503
17.1k
   const int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */
504
17.1k
   const int64_t f0f0    = f0   * static_cast<int64_t>(f0);
505
17.1k
   const int64_t f0f1_2  = f0_2 * static_cast<int64_t>(f1);
506
17.1k
   const int64_t f0f2_2  = f0_2 * static_cast<int64_t>(f2);
507
17.1k
   const int64_t f0f3_2  = f0_2 * static_cast<int64_t>(f3);
508
17.1k
   const int64_t f0f4_2  = f0_2 * static_cast<int64_t>(f4);
509
17.1k
   const int64_t f0f5_2  = f0_2 * static_cast<int64_t>(f5);
510
17.1k
   const int64_t f0f6_2  = f0_2 * static_cast<int64_t>(f6);
511
17.1k
   const int64_t f0f7_2  = f0_2 * static_cast<int64_t>(f7);
512
17.1k
   const int64_t f0f8_2  = f0_2 * static_cast<int64_t>(f8);
513
17.1k
   const int64_t f0f9_2  = f0_2 * static_cast<int64_t>(f9);
514
17.1k
   const int64_t f1f1_2  = f1_2 * static_cast<int64_t>(f1);
515
17.1k
   const int64_t f1f2_2  = f1_2 * static_cast<int64_t>(f2);
516
17.1k
   const int64_t f1f3_4  = f1_2 * static_cast<int64_t>(f3_2);
517
17.1k
   const int64_t f1f4_2  = f1_2 * static_cast<int64_t>(f4);
518
17.1k
   const int64_t f1f5_4  = f1_2 * static_cast<int64_t>(f5_2);
519
17.1k
   const int64_t f1f6_2  = f1_2 * static_cast<int64_t>(f6);
520
17.1k
   const int64_t f1f7_4  = f1_2 * static_cast<int64_t>(f7_2);
521
17.1k
   const int64_t f1f8_2  = f1_2 * static_cast<int64_t>(f8);
522
17.1k
   const int64_t f1f9_76 = f1_2 * static_cast<int64_t>(f9_38);
523
17.1k
   const int64_t f2f2    = f2   * static_cast<int64_t>(f2);
524
17.1k
   const int64_t f2f3_2  = f2_2 * static_cast<int64_t>(f3);
525
17.1k
   const int64_t f2f4_2  = f2_2 * static_cast<int64_t>(f4);
526
17.1k
   const int64_t f2f5_2  = f2_2 * static_cast<int64_t>(f5);
527
17.1k
   const int64_t f2f6_2  = f2_2 * static_cast<int64_t>(f6);
528
17.1k
   const int64_t f2f7_2  = f2_2 * static_cast<int64_t>(f7);
529
17.1k
   const int64_t f2f8_38 = f2_2 * static_cast<int64_t>(f8_19);
530
17.1k
   const int64_t f2f9_38 = f2   * static_cast<int64_t>(f9_38);
531
17.1k
   const int64_t f3f3_2  = f3_2 * static_cast<int64_t>(f3);
532
17.1k
   const int64_t f3f4_2  = f3_2 * static_cast<int64_t>(f4);
533
17.1k
   const int64_t f3f5_4  = f3_2 * static_cast<int64_t>(f5_2);
534
17.1k
   const int64_t f3f6_2  = f3_2 * static_cast<int64_t>(f6);
535
17.1k
   const int64_t f3f7_76 = f3_2 * static_cast<int64_t>(f7_38);
536
17.1k
   const int64_t f3f8_38 = f3_2 * static_cast<int64_t>(f8_19);
537
17.1k
   const int64_t f3f9_76 = f3_2 * static_cast<int64_t>(f9_38);
538
17.1k
   const int64_t f4f4    = f4   * static_cast<int64_t>(f4);
539
17.1k
   const int64_t f4f5_2  = f4_2 * static_cast<int64_t>(f5);
540
17.1k
   const int64_t f4f6_38 = f4_2 * static_cast<int64_t>(f6_19);
541
17.1k
   const int64_t f4f7_38 = f4   * static_cast<int64_t>(f7_38);
542
17.1k
   const int64_t f4f8_38 = f4_2 * static_cast<int64_t>(f8_19);
543
17.1k
   const int64_t f4f9_38 = f4   * static_cast<int64_t>(f9_38);
544
17.1k
   const int64_t f5f5_38 = f5   * static_cast<int64_t>(f5_38);
545
17.1k
   const int64_t f5f6_38 = f5_2 * static_cast<int64_t>(f6_19);
546
17.1k
   const int64_t f5f7_76 = f5_2 * static_cast<int64_t>(f7_38);
547
17.1k
   const int64_t f5f8_38 = f5_2 * static_cast<int64_t>(f8_19);
548
17.1k
   const int64_t f5f9_76 = f5_2 * static_cast<int64_t>(f9_38);
549
17.1k
   const int64_t f6f6_19 = f6   * static_cast<int64_t>(f6_19);
550
17.1k
   const int64_t f6f7_38 = f6   * static_cast<int64_t>(f7_38);
551
17.1k
   const int64_t f6f8_38 = f6_2 * static_cast<int64_t>(f8_19);
552
17.1k
   const int64_t f6f9_38 = f6   * static_cast<int64_t>(f9_38);
553
17.1k
   const int64_t f7f7_38 = f7   * static_cast<int64_t>(f7_38);
554
17.1k
   const int64_t f7f8_38 = f7_2 * static_cast<int64_t>(f8_19);
555
17.1k
   const int64_t f7f9_76 = f7_2 * static_cast<int64_t>(f9_38);
556
17.1k
   const int64_t f8f8_19 = f8   * static_cast<int64_t>(f8_19);
557
17.1k
   const int64_t f8f9_38 = f8   * static_cast<int64_t>(f9_38);
558
17.1k
   const int64_t f9f9_38 = f9   * static_cast<int64_t>(f9_38);
559
17.1k
560
17.1k
   int64_t h0 = f0f0  +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;
561
17.1k
   int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;
562
17.1k
   int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;
563
17.1k
   int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;
564
17.1k
   int64_t h4 = f0f4_2+f1f3_4 +f2f2   +f5f9_76+f6f8_38+f7f7_38;
565
17.1k
   int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;
566
17.1k
   int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;
567
17.1k
   int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;
568
17.1k
   int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4   +f9f9_38;
569
17.1k
   int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;
570
17.1k
571
17.1k
   h0 += h0;
572
17.1k
   h1 += h1;
573
17.1k
   h2 += h2;
574
17.1k
   h3 += h3;
575
17.1k
   h4 += h4;
576
17.1k
   h5 += h5;
577
17.1k
   h6 += h6;
578
17.1k
   h7 += h7;
579
17.1k
   h8 += h8;
580
17.1k
   h9 += h9;
581
17.1k
582
17.1k
   carry<26>(h0, h1);
583
17.1k
   carry<26>(h4, h5);
584
17.1k
585
17.1k
   carry<25>(h1, h2);
586
17.1k
   carry<25>(h5, h6);
587
17.1k
588
17.1k
   carry<26>(h2, h3);
589
17.1k
   carry<26>(h6, h7);
590
17.1k
591
17.1k
   carry<25>(h3, h4);
592
17.1k
   carry<25>(h7, h8);
593
17.1k
   carry<26>(h4, h5);
594
17.1k
   carry<26>(h8, h9);
595
17.1k
   carry<25,19>(h9, h0);
596
17.1k
   carry<26>(h0, h1);
597
17.1k
598
17.1k
   return FE_25519(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9);
599
17.1k
   }
600
601
/*
602
Ignores top bit of h.
603
*/
604
605
void FE_25519::from_bytes(const uint8_t s[32])
606
69
   {
607
69
   int64_t h0 = load_4(s);
608
69
   int64_t h1 = load_3(s + 4) << 6;
609
69
   int64_t h2 = load_3(s + 7) << 5;
610
69
   int64_t h3 = load_3(s + 10) << 3;
611
69
   int64_t h4 = load_3(s + 13) << 2;
612
69
   int64_t h5 = load_4(s + 16);
613
69
   int64_t h6 = load_3(s + 20) << 7;
614
69
   int64_t h7 = load_3(s + 23) << 5;
615
69
   int64_t h8 = load_3(s + 26) << 4;
616
69
   int64_t h9 = (load_3(s + 29) & 0x7fffff) << 2;
617
69
618
69
   carry<25,19>(h9, h0);
619
69
   carry<25>(h1, h2);
620
69
   carry<25>(h3, h4);
621
69
   carry<25>(h5, h6);
622
69
   carry<25>(h7, h8);
623
69
624
69
   carry<26>(h0, h1);
625
69
   carry<26>(h2, h3);
626
69
   carry<26>(h4, h5);
627
69
   carry<26>(h6, h7);
628
69
   carry<26>(h8, h9);
629
69
630
69
   m_fe[0] = static_cast<int32_t>(h0);
631
69
   m_fe[1] = static_cast<int32_t>(h1);
632
69
   m_fe[2] = static_cast<int32_t>(h2);
633
69
   m_fe[3] = static_cast<int32_t>(h3);
634
69
   m_fe[4] = static_cast<int32_t>(h4);
635
69
   m_fe[5] = static_cast<int32_t>(h5);
636
69
   m_fe[6] = static_cast<int32_t>(h6);
637
69
   m_fe[7] = static_cast<int32_t>(h7);
638
69
   m_fe[8] = static_cast<int32_t>(h8);
639
69
   m_fe[9] = static_cast<int32_t>(h9);
640
69
   }
641
642
/*
643
Preconditions:
644
|h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
645
646
Write p=2^255-19; q=floor(h/p).
647
Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
648
649
Proof:
650
Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
651
Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4.
652
653
Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
654
Then 0<y<1.
655
656
Write r=h-pq.
657
Have 0<=r<=p-1=2^255-20.
658
Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
659
660
Write x=r+19(2^-255)r+y.
661
Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
662
663
Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
664
so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
665
*/
666
667
void FE_25519::to_bytes(uint8_t s[32]) const
668
309
   {
669
309
   const int64_t X25 = (1 << 25);
670
309
671
309
   int32_t h0 = m_fe[0];
672
309
   int32_t h1 = m_fe[1];
673
309
   int32_t h2 = m_fe[2];
674
309
   int32_t h3 = m_fe[3];
675
309
   int32_t h4 = m_fe[4];
676
309
   int32_t h5 = m_fe[5];
677
309
   int32_t h6 = m_fe[6];
678
309
   int32_t h7 = m_fe[7];
679
309
   int32_t h8 = m_fe[8];
680
309
   int32_t h9 = m_fe[9];
681
309
   int32_t q;
682
309
683
309
   q = (19 * h9 + ((static_cast<int32_t>(1) << 24))) >> 25;
684
309
   q = (h0 + q) >> 26;
685
309
   q = (h1 + q) >> 25;
686
309
   q = (h2 + q) >> 26;
687
309
   q = (h3 + q) >> 25;
688
309
   q = (h4 + q) >> 26;
689
309
   q = (h5 + q) >> 25;
690
309
   q = (h6 + q) >> 26;
691
309
   q = (h7 + q) >> 25;
692
309
   q = (h8 + q) >> 26;
693
309
   q = (h9 + q) >> 25;
694
309
695
309
   /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */
696
309
   h0 += 19 * q;
697
309
   /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */
698
309
699
309
   carry0<26>(h0, h1);
700
309
   carry0<25>(h1, h2);
701
309
   carry0<26>(h2, h3);
702
309
   carry0<25>(h3, h4);
703
309
   carry0<26>(h4, h5);
704
309
   carry0<25>(h5, h6);
705
309
   carry0<26>(h6, h7);
706
309
   carry0<25>(h7, h8);
707
309
   carry0<26>(h8, h9);
708
309
709
309
   int32_t carry9 = h9 >> 25;
710
309
   h9 -= carry9 * X25;
711
309
   /* h10 = carry9 */
712
309
713
309
   /*
714
309
   Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
715
309
   Have h0+...+2^230 h9 between 0 and 2^255-1;
716
309
   evidently 2^255 h10-2^255 q = 0.
717
309
   Goal: Output h0+...+2^230 h9.
718
309
   */
719
309
720
309
   s[0] = static_cast<uint8_t>(h0 >> 0);
721
309
   s[1] = static_cast<uint8_t>(h0 >> 8);
722
309
   s[2] = static_cast<uint8_t>(h0 >> 16);
723
309
   s[3] = static_cast<uint8_t>((h0 >> 24) | (h1 << 2));
724
309
   s[4] = static_cast<uint8_t>(h1 >> 6);
725
309
   s[5] = static_cast<uint8_t>(h1 >> 14);
726
309
   s[6] = static_cast<uint8_t>((h1 >> 22) | (h2 << 3));
727
309
   s[7] = static_cast<uint8_t>(h2 >> 5);
728
309
   s[8] = static_cast<uint8_t>(h2 >> 13);
729
309
   s[9] = static_cast<uint8_t>((h2 >> 21) | (h3 << 5));
730
309
   s[10] = static_cast<uint8_t>(h3 >> 3);
731
309
   s[11] = static_cast<uint8_t>(h3 >> 11);
732
309
   s[12] = static_cast<uint8_t>((h3 >> 19) | (h4 << 6));
733
309
   s[13] = static_cast<uint8_t>(h4 >> 2);
734
309
   s[14] = static_cast<uint8_t>(h4 >> 10);
735
309
   s[15] = static_cast<uint8_t>(h4 >> 18);
736
309
   s[16] = static_cast<uint8_t>(h5 >> 0);
737
309
   s[17] = static_cast<uint8_t>(h5 >> 8);
738
309
   s[18] = static_cast<uint8_t>(h5 >> 16);
739
309
   s[19] = static_cast<uint8_t>((h5 >> 24) | (h6 << 1));
740
309
   s[20] = static_cast<uint8_t>(h6 >> 7);
741
309
   s[21] = static_cast<uint8_t>(h6 >> 15);
742
309
   s[22] = static_cast<uint8_t>((h6 >> 23) | (h7 << 3));
743
309
   s[23] = static_cast<uint8_t>(h7 >> 5);
744
309
   s[24] = static_cast<uint8_t>(h7 >> 13);
745
309
   s[25] = static_cast<uint8_t>((h7 >> 21) | (h8 << 4));
746
309
   s[26] = static_cast<uint8_t>(h8 >> 4);
747
309
   s[27] = static_cast<uint8_t>(h8 >> 12);
748
309
   s[28] = static_cast<uint8_t>((h8 >> 20) | (h9 << 6));
749
309
   s[29] = static_cast<uint8_t>(h9 >> 2);
750
309
   s[30] = static_cast<uint8_t>(h9 >> 10);
751
309
   s[31] = static_cast<uint8_t>(h9 >> 18);
752
309
   }
753
754
}