curve25519_donna_32bit.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. Public domain by Andrew M. <liquidsun@gmail.com>
  3. See: https://github.com/floodyberry/curve25519-donna
  4. 32 bit integer curve25519 implementation
  5. */
  6. typedef uint32_t bignum25519[10];
  7. /* out = in */
  8. void curve25519_copy(bignum25519 out, const bignum25519 in);
  9. /* out = a + b */
  10. void curve25519_add(bignum25519 out, const bignum25519 a, const bignum25519 b);
  11. void curve25519_add_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b);
  12. void curve25519_add_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b);
  13. /* out = a - b */
  14. void curve25519_sub(bignum25519 out, const bignum25519 a, const bignum25519 b);
  15. /* out = in * scalar */
  16. void curve25519_scalar_product(bignum25519 out, const bignum25519 in, const uint32_t scalar);
  17. /* out = a - b, where a is the result of a basic op (add,sub) */
  18. void curve25519_sub_after_basic(bignum25519 out, const bignum25519 a, const bignum25519 b);
  19. void curve25519_sub_reduce(bignum25519 out, const bignum25519 a, const bignum25519 b);
  20. /* out = -a */
  21. void curve25519_neg(bignum25519 out, const bignum25519 a);
  22. /* out = a * b */
  23. #define curve25519_mul_noinline curve25519_mul
  24. void curve25519_mul(bignum25519 out, const bignum25519 a, const bignum25519 b);
  25. /* out = in * in */
  26. void curve25519_square(bignum25519 out, const bignum25519 in);
  27. /* out = in ^ (2 * count) */
  28. void curve25519_square_times(bignum25519 out, const bignum25519 in, int count);
  29. /* Take a little-endian, 32-byte number and expand it into polynomial form */
  30. void curve25519_expand(bignum25519 out, const unsigned char in[32]);
  31. /* Take a fully reduced polynomial form number and contract it into a
  32. * little-endian, 32-byte array
  33. */
  34. void curve25519_contract(unsigned char out[32], const bignum25519 in);
  35. /* if (iswap) swap(a, b) */
  36. void curve25519_swap_conditional(bignum25519 a, bignum25519 b, uint32_t iswap);
  37. /* uint32_t to Zmod(2^255-19) */
  38. void curve25519_set(bignum25519 r, uint32_t x);
  39. /* set d */
  40. void curve25519_set_d(bignum25519 r);
  41. /* set 2d */
  42. void curve25519_set_2d(bignum25519 r);
  43. /* set sqrt(-1) */
  44. void curve25519_set_sqrtneg1(bignum25519 r);
  45. /* constant time Zmod(2^255-19) negative test */
  46. int curve25519_isnegative(const bignum25519 f);
  47. /* constant time Zmod(2^255-19) non-zero test */
  48. int curve25519_isnonzero(const bignum25519 f);
  49. /* reduce Zmod(2^255-19) */
  50. void curve25519_reduce(bignum25519 r, const bignum25519 in);
  51. void curve25519_divpowm1(bignum25519 r, const bignum25519 u, const bignum25519 v);
  52. /* Zmod(2^255-19) from byte array to bignum25519 expansion with modular reduction */
  53. void curve25519_expand_reduce(bignum25519 out, const unsigned char in[32]);