Go to the documentation of this file.
32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
41 #if (X25519_SUPPORT == ENABLED || ED25519_SUPPORT == ENABLED)
44 static const int32_t CURVE25519_SQRT_MINUS_1[9] =
46 0x0A0EA0B0, 0x0770D93A, 0x0BF91E31, 0x06300D5A, 0x1D7A72F4,
47 0x004C9EFD, 0x1C2CAD34, 0x1009F83B, 0x002B8324
65 for(i = 1; i < 9; i++)
85 r[0] = temp & 0x1FFFFFFF;
86 temp =
ASR32(temp, 29);
88 r[1] = temp & 0x1FFFFFFF;
89 temp =
ASR32(temp, 29);
91 r[2] = temp & 0x1FFFFFFF;
92 temp =
ASR32(temp, 29);
94 r[3] = temp & 0x1FFFFFFF;
95 temp =
ASR32(temp, 29);
97 r[4] = temp & 0x1FFFFFFF;
98 temp =
ASR32(temp, 29);
100 r[5] = temp & 0x1FFFFFFF;
101 temp =
ASR32(temp, 29);
103 r[6] = temp & 0x1FFFFFFF;
104 temp =
ASR32(temp, 29);
106 r[7] = temp & 0x1FFFFFFF;
107 temp =
ASR32(temp, 29);
109 r[8] = temp & 0x007FFFFF;
110 temp =
ASR32(temp, 23);
130 for(temp =
b, i = 0; i < 8; i++)
133 r[i] = temp & 0x1FFFFFFF;
134 temp =
ASR32(temp, 29);
138 r[8] = temp & 0x007FFFFF;
139 temp =
ASR32(temp, 23);
159 r[0] = temp & 0x1FFFFFFF;
160 temp =
ASR32(temp, 29);
162 r[1] = temp & 0x1FFFFFFF;
163 temp =
ASR32(temp, 29);
165 r[2] = temp & 0x1FFFFFFF;
166 temp =
ASR32(temp, 29);
168 r[3] = temp & 0x1FFFFFFF;
169 temp =
ASR32(temp, 29);
171 r[4] = temp & 0x1FFFFFFF;
172 temp =
ASR32(temp, 29);
174 r[5] = temp & 0x1FFFFFFF;
175 temp =
ASR32(temp, 29);
177 r[6] = temp & 0x1FFFFFFF;
178 temp =
ASR32(temp, 29);
180 r[7] = temp & 0x1FFFFFFF;
181 temp =
ASR32(temp, 29);
183 r[8] = temp & 0x007FFFFF;
184 temp =
ASR32(temp, 23);
204 for(temp = -
b, i = 0; i < 8; i++)
207 r[i] = temp & 0x1FFFFFFF;
208 temp =
ASR32(temp, 29);
212 r[8] = temp & 0x007FFFFF;
213 temp =
ASR32(temp, 23);
233 temp = (int64_t)
a[0] *
b[0];
234 u[0] = temp & 0x1FFFFFFF;
235 temp =
ASR64(temp, 29);
236 temp += (int64_t)
a[0] *
b[1];
237 temp += (int64_t)
a[1] *
b[0];
238 u[1] = temp & 0x1FFFFFFF;
239 temp =
ASR64(temp, 29);
240 temp += (int64_t)
a[0] *
b[2];
241 temp += (int64_t)
a[1] *
b[1];
242 temp += (int64_t)
a[2] *
b[0];
243 u[2] = temp & 0x1FFFFFFF;
244 temp =
ASR64(temp, 29);
245 temp += (int64_t)
a[0] *
b[3];
246 temp += (int64_t)
a[1] *
b[2];
247 temp += (int64_t)
a[2] *
b[1];
248 temp += (int64_t)
a[3] *
b[0];
249 u[3] = temp & 0x1FFFFFFF;
250 temp =
ASR64(temp, 29);
251 temp += (int64_t)
a[0] *
b[4];
252 temp += (int64_t)
a[1] *
b[3];
253 temp += (int64_t)
a[2] *
b[2];
254 temp += (int64_t)
a[3] *
b[1];
255 temp += (int64_t)
a[4] *
b[0];
256 u[4] = temp & 0x1FFFFFFF;
257 temp =
ASR64(temp, 29);
258 temp += (int64_t)
a[0] *
b[5];
259 temp += (int64_t)
a[1] *
b[4];
260 temp += (int64_t)
a[2] *
b[3];
261 temp += (int64_t)
a[3] *
b[2];
262 temp += (int64_t)
a[4] *
b[1];
263 temp += (int64_t)
a[5] *
b[0];
264 u[5] = temp & 0x1FFFFFFF;
265 temp =
ASR64(temp, 29);
266 temp += (int64_t)
a[0] *
b[6];
267 temp += (int64_t)
a[1] *
b[5];
268 temp += (int64_t)
a[2] *
b[4];
269 temp += (int64_t)
a[3] *
b[3];
270 temp += (int64_t)
a[4] *
b[2];
271 temp += (int64_t)
a[5] *
b[1];
272 temp += (int64_t)
a[6] *
b[0];
273 u[6] = temp & 0x1FFFFFFF;
274 temp =
ASR64(temp, 29);
275 temp += (int64_t)
a[0] *
b[7];
276 temp += (int64_t)
a[1] *
b[6];
277 temp += (int64_t)
a[2] *
b[5];
278 temp += (int64_t)
a[3] *
b[4];
279 temp += (int64_t)
a[4] *
b[3];
280 temp += (int64_t)
a[5] *
b[2];
281 temp += (int64_t)
a[6] *
b[1];
282 temp += (int64_t)
a[7] *
b[0];
283 u[7] = temp & 0x1FFFFFFF;
284 temp =
ASR64(temp, 29);
285 temp += (int64_t)
a[0] *
b[8];
286 temp += (int64_t)
a[1] *
b[7];
287 temp += (int64_t)
a[2] *
b[6];
288 temp += (int64_t)
a[3] *
b[5];
289 temp += (int64_t)
a[4] *
b[4];
290 temp += (int64_t)
a[5] *
b[3];
291 temp += (int64_t)
a[6] *
b[2];
292 temp += (int64_t)
a[7] *
b[1];
293 temp += (int64_t)
a[8] *
b[0];
294 u[8] = temp & 0x1FFFFFFF;
295 temp =
ASR64(temp, 29);
296 temp += (int64_t)
a[1] *
b[8];
297 temp += (int64_t)
a[2] *
b[7];
298 temp += (int64_t)
a[3] *
b[6];
299 temp += (int64_t)
a[4] *
b[5];
300 temp += (int64_t)
a[5] *
b[4];
301 temp += (int64_t)
a[6] *
b[3];
302 temp += (int64_t)
a[7] *
b[2];
303 temp += (int64_t)
a[8] *
b[1];
304 u[9] = temp & 0x1FFFFFFF;
305 temp =
ASR64(temp, 29);
306 temp += (int64_t)
a[2] *
b[8];
307 temp += (int64_t)
a[3] *
b[7];
308 temp += (int64_t)
a[4] *
b[6];
309 temp += (int64_t)
a[5] *
b[5];
310 temp += (int64_t)
a[6] *
b[4];
311 temp += (int64_t)
a[7] *
b[3];
312 temp += (int64_t)
a[8] *
b[2];
313 u[10] = temp & 0x1FFFFFFF;
314 temp =
ASR64(temp, 29);
315 temp += (int64_t)
a[3] *
b[8];
316 temp += (int64_t)
a[4] *
b[7];
317 temp += (int64_t)
a[5] *
b[6];
318 temp += (int64_t)
a[6] *
b[5];
319 temp += (int64_t)
a[7] *
b[4];
320 temp += (int64_t)
a[8] *
b[3];
321 u[11] = temp & 0x1FFFFFFF;
322 temp =
ASR64(temp, 29);
323 temp += (int64_t)
a[4] *
b[8];
324 temp += (int64_t)
a[5] *
b[7];
325 temp += (int64_t)
a[6] *
b[6];
326 temp += (int64_t)
a[7] *
b[5];
327 temp += (int64_t)
a[8] *
b[4];
328 u[12] = temp & 0x1FFFFFFF;
329 temp =
ASR64(temp, 29);
330 temp += (int64_t)
a[5] *
b[8];
331 temp += (int64_t)
a[6] *
b[7];
332 temp += (int64_t)
a[7] *
b[6];
333 temp += (int64_t)
a[8] *
b[5];
334 u[13] = temp & 0x1FFFFFFF;
335 temp =
ASR64(temp, 29);
336 temp += (int64_t)
a[6] *
b[8];
337 temp += (int64_t)
a[7] *
b[7];
338 temp += (int64_t)
a[8] *
b[6];
339 u[14] = temp & 0x1FFFFFFF;
340 temp =
ASR64(temp, 29);
341 temp += (int64_t)
a[7] *
b[8];
342 temp += (int64_t)
a[8] *
b[7];
343 u[15] = temp & 0x1FFFFFFF;
344 temp =
ASR64(temp, 29);
345 temp += (int64_t)
a[8] *
b[8];
346 u[16] = temp & 0x1FFFFFFF;
347 temp =
ASR64(temp, 29);
348 u[17] = temp & 0xFFFFFFFF;
352 temp += (int64_t)
u[9] * 1216;
353 r[0] = temp & 0x1FFFFFFF;
354 temp =
ASR64(temp, 29);
356 temp += (int64_t)
u[10] * 1216;
357 r[1] = temp & 0x1FFFFFFF;
358 temp =
ASR64(temp, 29);
360 temp += (int64_t)
u[11] * 1216;
361 r[2] = temp & 0x1FFFFFFF;
362 temp =
ASR64(temp, 29);
364 temp += (int64_t)
u[12] * 1216;
365 r[3] = temp & 0x1FFFFFFF;
366 temp =
ASR64(temp, 29);
368 temp += (int64_t)
u[13] * 1216;
369 r[4] = temp & 0x1FFFFFFF;
370 temp =
ASR64(temp, 29);
372 temp += (int64_t)
u[14] * 1216;
373 r[5] = temp & 0x1FFFFFFF;
374 temp =
ASR64(temp, 29);
376 temp += (int64_t)
u[15] * 1216;
377 r[6] = temp & 0x1FFFFFFF;
378 temp =
ASR64(temp, 29);
380 temp += (int64_t)
u[16] * 1216;
381 r[7] = temp & 0x1FFFFFFF;
382 temp =
ASR64(temp, 29);
384 temp += (int64_t)
u[17] * 1216;
385 r[8] = temp & 0x007FFFFF;
386 temp =
ASR64(temp, 23);
391 r[0] = temp & 0x1FFFFFFF;
392 temp =
ASR64(temp, 29);
393 r[1] += temp & 0xFFFFFFFF;
409 temp = (int64_t)
a[0] *
b;
410 r[0] = temp & 0x1FFFFFFF;
411 temp =
ASR64(temp, 29);
412 temp += (int64_t)
a[1] *
b;
413 r[1] = temp & 0x1FFFFFFF;
414 temp =
ASR64(temp, 29);
415 temp += (int64_t)
a[2] *
b;
416 r[2] = temp & 0x1FFFFFFF;
417 temp =
ASR64(temp, 29);
418 temp += (int64_t)
a[3] *
b;
419 r[3] = temp & 0x1FFFFFFF;
420 temp =
ASR64(temp, 29);
421 temp += (int64_t)
a[4] *
b;
422 r[4] = temp & 0x1FFFFFFF;
423 temp =
ASR64(temp, 29);
424 temp += (int64_t)
a[5] *
b;
425 r[5] = temp & 0x1FFFFFFF;
426 temp =
ASR64(temp, 29);
427 temp += (int64_t)
a[6] *
b;
428 r[6] = temp & 0x1FFFFFFF;
429 temp =
ASR64(temp, 29);
430 temp += (int64_t)
a[7] *
b;
431 r[7] = temp & 0x1FFFFFFF;
432 temp =
ASR64(temp, 29);
433 temp += (int64_t)
a[8] *
b;
434 r[8] = temp & 0x007FFFFF;
435 temp =
ASR64(temp, 23);
440 r[0] = temp & 0x1FFFFFFF;
441 temp =
ASR64(temp, 29);
442 r[1] += temp & 0xFFFFFFFF;
474 for(i = 1; i <
n; i++)
637 for(temp = 0, i = 0; i < 8; i++)
640 r[i] = temp & 0x1FFFFFFF;
641 temp =
ASR32(temp, 29);
645 r[8] = temp & 0x007FFFFF;
646 temp =
ASR32(temp, 23);
649 for(temp *= 19, i = 0; i < 9; i++)
652 r[i] = temp & 0x1FFFFFFF;
653 temp =
ASR32(temp, 29);
657 for(temp = 19, i = 0; i < 9; i++)
660 b[i] = temp & 0x1FFFFFFF;
661 temp =
ASR32(temp, 29);
684 for(i = 0; i < 9; i++)
708 for(i = 0; i < 9; i++)
711 dummy =
mask & (
a[i] ^
b[i]);
736 for(i = 0; i < 9; i++)
760 for(i = 0; i < 9; i++)
767 return ((uint32_t) (
mask | (~
mask + 1))) >> 31;
783 for(
a[0] = 0, i = 0; i < 8; i++)
786 a[i] |= (temp << (i * 3)) & 0x1FFFFFFF;
787 a[i + 1] = temp >> (29 - i * 3);
804 for(i = 0; i < 8; i++)
806 temp = (
a[i + 1] << (29 - i * 3)) | (
a[i] >> (i * 3));
void curve25519Add(int32_t *r, const int32_t *a, const int32_t *b)
Modular addition.
void curve25519Canonicalize(int32_t *r, const int32_t *a)
Reduce non-canonical value.
void curve25519Export(int32_t *a, uint8_t *data)
Export an octet string.
void curve25519Select(int32_t *r, const int32_t *a, const int32_t *b, uint32_t c)
Select an integer.
uint32_t curve25519Sqrt(int32_t *r, const int32_t *a, const int32_t *b)
Compute the square root of (A / B) modulo p.
uint32_t curve25519Comp(const int32_t *a, const int32_t *b)
Compare integers.
General definitions for cryptographic algorithms.
__weak_func void curve25519Sqr(int32_t *r, const int32_t *a)
Modular squaring.
void curve25519Copy(int32_t *a, const int32_t *b)
Copy an integer.
void curve25519Swap(int32_t *a, int32_t *b, uint32_t c)
Conditional swap.
void curve25519SetInt(int32_t *a, int32_t b)
Set integer value.
void curve25519Inv(int32_t *r, const int32_t *a)
Modular multiplicative inverse.
void curve25519Sub(int32_t *r, const int32_t *a, const int32_t *b)
Modular subtraction.
Curve25519 elliptic curve.
void curve25519AddInt(int32_t *r, const int32_t *a, int32_t b)
Modular addition.
__weak_func void curve25519MulInt(int32_t *r, const int32_t *a, int32_t b)
Modular multiplication.
void curve25519Import(int32_t *a, const uint8_t *data)
Import an octet string.
void curve25519Pwr2(int32_t *r, const int32_t *a, uint_t n)
Raise an integer to power 2^n.
__weak_func void curve25519Mul(int32_t *r, const int32_t *a, const int32_t *b)
Modular multiplication.
ECC (Elliptic Curve Cryptography)
void curve25519SubInt(int32_t *r, const int32_t *a, int32_t b)
Modular subtraction.