diff options
Diffstat (limited to 'fe448.c')
| -rw-r--r-- | fe448.c | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -342,4 +342,65 @@ void fe448_invert(fe448 *r, const fe448 *x) /* pow(2**446-2**222-1) */ void fe448_pow446(fe448 *r, const fe448 *x) { + fe448 t0; + fe448 t1; + fe448 t2; + int i; + + fe448_square(&t0, x); + fe448_mul(&t0, &t0, x); /* 2^2 - 1 */ + fe448_square(&t0, &t0); /* 2^3 - 2 */ + fe448_mul(&t1, &t0, x); /* 2^3 - 1 */ + fe448_square(&t0, &t1); /* 2^4 - 2^1 */ + for (i = 0; i < 2; i++) + { + fe448_square(&t0, &t0); + } /* 2^6 - 2^3 */ + fe448_mul(&t1, &t1, &t0); /* 2^6 - 1 */ + fe448_square(&t0, &t1); /* 2^7 - 2^1 */ + for (i = 0; i < 5; i++) + { + fe448_square(&t0, &t0); + } /* 2^12 - 2^6 */ + fe448_mul(&t1, &t1, &t0); /* 2^12 - 1 */ + fe448_square(&t1, &t1); /* 2^13 - 2^1 */ + fe448_mul(&t1, &t1, x); /* 2^13 - 1 */ + fe448_square(&t0, &t1); /* 2^14 - 2^1 */ + for (i = 0; i < 12; i++) + { + fe448_square(&t0, &t0); + } /* 2^26 - 2^13 */ + fe448_mul(&t1, &t1, &t0); /* 2^26 - 1 */ + fe448_square(&t1, &t1); /* 2^26 - 2^1 */ + fe448_mul(&t1, &t1, x); /* 2^27 - 1 */ + fe448_square(&t0, &t1); /* 2^28 - 2^1 */ + for (i = 0; i < 26; i++) + { + fe448_square(&t0, &t0); + } /* 2^54 - 2^27 */ + fe448_mul(&t1, &t1, &t0); /* 2^54 - 1 */ + fe448_square(&t1, &t1); /* 2^55 - 2^1 */ + fe448_mul(&t1, &t1, x); /* 2^55 - 1 */ + fe448_square(&t0, &t1); /* 2^56 - 2^1 */ + for (i = 0; i < 54; i++) + { + fe448_square(&t0, &t0); + } /* 2^110 - 2^55 */ + fe448_mul(&t1, &t1, &t0); /* 2^110 - 1 */ + fe448_square(&t1, &t1); /* 2^111 - 2^1 */ + fe448_mul(&t1, &t1, x); /* 2^111 - 1 */ + fe448_square(&t0, &t1); /* 2^112 - 2^1 */ + for (i = 0; i < 110; i++) + { + fe448_square(&t0, &t0); + } /* 2^222 - 2^111 */ + fe448_mul(&t2, &t1, &t0); /* 2^222 - 1 */ + fe448_square(&t1, &t2); /* 2^223 - 2^1 */ + fe448_mul(&t1, &t1, x); /* 2^223 - 1 */ + fe448_square(&t0, &t1); /* 2^224 - 2^1 */ + for (i = 0; i < 222; i++) + { + fe448_square(&t0, &t0); + } /* 2^446 - 2^223 */ + fe448_mul(r, &t2, &t0); /* 2^446 - 2^222 - 1 */ } |
