summaryrefslogtreecommitdiff
path: root/fe448.c
diff options
context:
space:
mode:
Diffstat (limited to 'fe448.c')
-rw-r--r--fe448.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/fe448.c b/fe448.c
index 961e944..b0c413d 100644
--- a/fe448.c
+++ b/fe448.c
@@ -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 */
}