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 	int i;
15 
16 	/* 2 */ fe25519_square(&z2,x);
17 	/* 4 */ fe25519_square(&t,&z2);
18 	/* 8 */ fe25519_square(&t,&t);
19 	/* 9 */ fe25519_mul(&z9,&t,x);
20 	/* 11 */ fe25519_mul(&z11,&z9,&z2);
21 	/* 22 */ fe25519_square(&t,&z11);
22 	/* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0,&t,&z9);
23 
24 	/* 2^6 - 2^1 */ fe25519_square(&t,&z2_5_0);
25 	/* 2^10 - 2^5 */ for (i = 1;i < 5;i++) { fe25519_square(&t,&t); }
26 	/* 2^10 - 2^0 */ fe25519_mul(&z2_10_0,&t,&z2_5_0);
27 
28 	/* 2^11 - 2^1 */ fe25519_square(&t,&z2_10_0);
29 	/* 2^20 - 2^10 */ for (i = 1;i < 10;i++) { fe25519_square(&t,&t); }
30 	/* 2^20 - 2^0 */ fe25519_mul(&z2_20_0,&t,&z2_10_0);
31 
32 	/* 2^21 - 2^1 */ fe25519_square(&t,&z2_20_0);
33 	/* 2^40 - 2^20 */ for (i = 1;i < 20;i++) { fe25519_square(&t,&t); }
34 	/* 2^40 - 2^0 */ fe25519_mul(&t,&t,&z2_20_0);
35 
36 	/* 2^41 - 2^1 */ fe25519_square(&t,&t);
37 	/* 2^50 - 2^10 */ for (i = 1;i < 10;i++) { fe25519_square(&t,&t); }
38 	/* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t,&z2_10_0);
39 
40 	/* 2^51 - 2^1 */ fe25519_square(&t,&z2_50_0);
41 	/* 2^100 - 2^50 */ for (i = 1;i < 50;i++) { fe25519_square(&t,&t); }
42 	/* 2^100 - 2^0 */ fe25519_mul(&z2_100_0,&t,&z2_50_0);
43 
44 	/* 2^101 - 2^1 */ fe25519_square(&t,&z2_100_0);
45 	/* 2^200 - 2^100 */ for (i = 1;i < 100;i++) { fe25519_square(&t,&t); }
46 	/* 2^200 - 2^0 */ fe25519_mul(&t,&t,&z2_100_0);
47 
48 	/* 2^201 - 2^1 */ fe25519_square(&t,&t);
49 	/* 2^250 - 2^50 */ for (i = 1;i < 50;i++) { fe25519_square(&t,&t); }
50 	/* 2^250 - 2^0 */ fe25519_mul(&t,&t,&z2_50_0);
51 
52 	/* 2^251 - 2^1 */ fe25519_square(&t,&t);
53 	/* 2^252 - 2^2 */ fe25519_square(&t,&t);
54 	/* 2^252 - 3 */ fe25519_mul(r,&t,x);
55 }
56