1 #include "fe25519.h"
2
fe25519_pow2523(fe25519 * r,const fe25519 * x)3 void fe25519_pow2523(fe25519 *r, const fe25519 *x)
4 {
5 fe25519 z2;
6 fe25519 z9;
7 fe25519 z11;
8 fe25519 z2_5_0;
9 fe25519 z2_10_0;
10 fe25519 z2_20_0;
11 fe25519 z2_50_0;
12 fe25519 z2_100_0;
13 fe25519 t;
14
15 /* 2 */ fe25519_square(&z2,x);
16 /* 4 */ fe25519_square(&t,&z2);
17 /* 8 */ fe25519_square(&t,&t);
18 /* 9 */ fe25519_mul(&z9,&t,x);
19 /* 11 */ fe25519_mul(&z11,&z9,&z2);
20 /* 22 */ fe25519_square(&t,&z11);
21 /* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0,&t,&z9);
22
23 /* 2^6 - 2^1 */ fe25519_square(&t,&z2_5_0);
24 /* 2^10 - 2^5 */ fe25519_nsquare(&t,4);
25 /* 2^10 - 2^0 */ fe25519_mul(&z2_10_0,&t,&z2_5_0);
26
27 /* 2^11 - 2^1 */ fe25519_square(&t,&z2_10_0);
28 /* 2^20 - 2^10 */ fe25519_nsquare(&t,9);
29 /* 2^20 - 2^0 */ fe25519_mul(&z2_20_0,&t,&z2_10_0);
30
31 /* 2^21 - 2^1 */ fe25519_square(&t,&z2_20_0);
32 /* 2^40 - 2^20 */ fe25519_nsquare(&t,19);
33 /* 2^40 - 2^0 */ fe25519_mul(&t,&t,&z2_20_0);
34
35 /* 2^41 - 2^1 */ fe25519_square(&t,&t);
36 /* 2^50 - 2^10 */ fe25519_nsquare(&t,9);
37 /* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t,&z2_10_0);
38
39 /* 2^51 - 2^1 */ fe25519_square(&t,&z2_50_0);
40 /* 2^100 - 2^50 */ fe25519_nsquare(&t,49);
41 /* 2^100 - 2^0 */ fe25519_mul(&z2_100_0,&t,&z2_50_0);
42
43 /* 2^101 - 2^1 */ fe25519_square(&t,&z2_100_0);
44 /* 2^200 - 2^100 */ fe25519_nsquare(&t,99);
45 /* 2^200 - 2^0 */ fe25519_mul(&t,&t,&z2_100_0);
46
47 /* 2^201 - 2^1 */ fe25519_square(&t,&t);
48 /* 2^250 - 2^50 */ fe25519_nsquare(&t,49);
49 /* 2^250 - 2^0 */ fe25519_mul(&t,&t,&z2_50_0);
50
51 /* 2^251 - 2^1 */ fe25519_square(&t,&t);
52 /* 2^252 - 2^2 */ fe25519_square(&t,&t);
53 /* 2^252 - 3 */ fe25519_mul(r,&t,x);
54 }
55