Electroneum
Toggle main menu visibility
Loading...
Searching...
No Matches
curve25519-donna-helpers.h
Go to the documentation of this file.
1
/*
2
Public domain by Andrew M. <liquidsun@gmail.com>
3
See: https://github.com/floodyberry/curve25519-donna
4
5
Curve25519 implementation agnostic helpers
6
*/
7
8
/*
9
* In: b = 2^5 - 2^0
10
* Out: b = 2^250 - 2^0
11
*/
12
static
void
13
curve25519_pow_two5mtwo0_two250mtwo0(
bignum25519
b) {
14
bignum25519
ALIGN
(16)
t0
,c;
15
16
/* 2^5 - 2^0 */
/* b */
17
/* 2^10 - 2^5 */
curve25519_square_times(
t0
, b, 5);
18
/* 2^10 - 2^0 */
curve25519_mul_noinline
(b,
t0
, b);
19
/* 2^20 - 2^10 */
curve25519_square_times(
t0
, b, 10);
20
/* 2^20 - 2^0 */
curve25519_mul_noinline
(c,
t0
, b);
21
/* 2^40 - 2^20 */
curve25519_square_times(
t0
, c, 20);
22
/* 2^40 - 2^0 */
curve25519_mul_noinline
(
t0
,
t0
, c);
23
/* 2^50 - 2^10 */
curve25519_square_times(
t0
,
t0
, 10);
24
/* 2^50 - 2^0 */
curve25519_mul_noinline
(b,
t0
, b);
25
/* 2^100 - 2^50 */
curve25519_square_times(
t0
, b, 50);
26
/* 2^100 - 2^0 */
curve25519_mul_noinline
(c,
t0
, b);
27
/* 2^200 - 2^100 */
curve25519_square_times(
t0
, c, 100);
28
/* 2^200 - 2^0 */
curve25519_mul_noinline
(
t0
,
t0
, c);
29
/* 2^250 - 2^50 */
curve25519_square_times(
t0
,
t0
, 50);
30
/* 2^250 - 2^0 */
curve25519_mul_noinline
(b,
t0
, b);
31
}
32
33
/*
34
* z^(p - 2) = z(2^255 - 21)
35
*/
36
static
void
37
curve25519_recip(
bignum25519
out, const
bignum25519
z) {
38
bignum25519
ALIGN
(16)
a
,
t0
,b;
39
40
/* 2 */
curve25519_square_times(
a
, z, 1);
/* a = 2 */
41
/* 8 */
curve25519_square_times(
t0
,
a
, 2);
42
/* 9 */
curve25519_mul_noinline
(b,
t0
, z);
/* b = 9 */
43
/* 11 */
curve25519_mul_noinline
(
a
, b,
a
);
/* a = 11 */
44
/* 22 */
curve25519_square_times(
t0
,
a
, 1);
45
/* 2^5 - 2^0 = 31 */
curve25519_mul_noinline
(b,
t0
, b);
46
/* 2^250 - 2^0 */
curve25519_pow_two5mtwo0_two250mtwo0(b);
47
/* 2^255 - 2^5 */
curve25519_square_times(b, b, 5);
48
/* 2^255 - 21 */
curve25519_mul_noinline
(out, b,
a
);
49
}
50
51
/*
52
* z^((p-5)/8) = z^(2^252 - 3)
53
*/
54
static
void
55
curve25519_pow_two252m3(
bignum25519
two252m3, const
bignum25519
z) {
56
bignum25519
ALIGN
(16) b,c,
t0
;
57
58
/* 2 */
curve25519_square_times(c, z, 1);
/* c = 2 */
59
/* 8 */
curve25519_square_times(
t0
, c, 2);
/* t0 = 8 */
60
/* 9 */
curve25519_mul_noinline
(b,
t0
, z);
/* b = 9 */
61
/* 11 */
curve25519_mul_noinline
(c, b, c);
/* c = 11 */
62
/* 22 */
curve25519_square_times(
t0
, c, 1);
63
/* 2^5 - 2^0 = 31 */
curve25519_mul_noinline
(b,
t0
, b);
64
/* 2^250 - 2^0 */
curve25519_pow_two5mtwo0_two250mtwo0(b);
65
/* 2^252 - 2^2 */
curve25519_square_times(b, b, 2);
66
/* 2^252 - 3 */
curve25519_mul_noinline
(two252m3, b, z);
67
}
bignum25519
uint32_t bignum25519[10]
Definition
curve25519-donna-32bit.h:8
curve25519_mul_noinline
#define curve25519_mul_noinline
Definition
curve25519-donna-32bit.h:152
ALIGN
#define ALIGN(x)
Definition
ed25519-donna-portable.h:23
a
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition
pointer.h:1124
t0
t0
Definition
pow22523.h:53
external
ed25519-donna
curve25519-donna-helpers.h
Generated on
for Electroneum by
1.17.0