fe25519_pow2523.c 1.7 KB

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