Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
fp-gmp.c File Reference
#include "fp-gmp.h"
#include "../fp-counters.h"
#include "../../primes.h"
#include <gmp.h>
Include dependency graph for fp-gmp.c:

Go to the source code of this file.

Functions

void fp_enc (fp a, fp const b)
void fp_dec (fp a, fp const b)
void fp_pow (fp b, const fp e, const fp a)
void fp_cswap (fp x, fp y, uint8_t c)
void fp_copy (fp b, const fp a)
void fp_add (fp c, const fp a, const fp b)
void fp_sub (fp c, const fp a, const fp b)
void fp_mul (fp c, const fp a, const fp b)
void fp_sqr (fp b, const fp a)
bool fp_issquare (fp const a)
void fp_inv (fp x)
void fp_random (fp x)

Variables

const fp fp_0 = {0x0}

Function Documentation

◆ fp_add()

void fp_add ( fp c,
const fp a,
const fp b )

Definition at line 864 of file fp-gmp.c.

865{
866 // (void)mpn_add_n(c, a, b, NUMBER_OF_WORDS);
867 // CNT_FP_ADD_INC();
868 // reduce_once(c);
869 (void)mpn_add_n(c, a, b, NUMBER_OF_WORDS);
870 mpn_cnd_sub_n(mpn_cmp(c, p, NUMBER_OF_WORDS) > 0, c, c, p, NUMBER_OF_WORDS);
872}
#define CNT_FP_ADD_INC()
Definition fp-counters.h:29
#define p
Definition fp-gmp.h:44
f a
Definition to_model.m:12

References a, CNT_FP_ADD_INC, and p.

◆ fp_copy()

void fp_copy ( fp b,
const fp a )

Definition at line 856 of file fp-gmp.c.

857{
858 for (uint8_t i = 0; i < NUMBER_OF_WORDS; i++)
859 {
860 b[i] = a[i];
861 }
862}
for i

References a, and i.

◆ fp_cswap()

void fp_cswap ( fp x,
fp y,
uint8_t c )

Definition at line 840 of file fp-gmp.c.

841{
842
843 // uint64_t tmp, c64;
844
845 // c64 = (uint64_t)-c;
846 // for (int i = 0; i < NUMBER_OF_WORDS; i++)
847 // {
848 // tmp = (y[i] ^ x[i]) & c64;
849 // x[i] ^= tmp;
850 // y[i] ^= tmp;
851 // }
852
853 mpn_cnd_swap(c, x, y, NUMBER_OF_WORDS);
854}

◆ fp_dec()

void fp_dec ( fp a,
fp const b )

Definition at line 800 of file fp-gmp.c.

801{
802#ifdef MONTGOMERY
803 fp_mul(a, b, uintbig_1);
805#else
806 //(void) a;
807 //(void) b;
808 fp_copy(a, b);
809#endif
810}
#define CNT_FP_MUL_DEC()
Definition fp-counters.h:31
#define fp_mul
Definition fp-gmp.h:70
#define fp_copy
Definition fp-gmp.h:79
#define uintbig_1
Definition fp-gmp.h:26

References a, CNT_FP_MUL_DEC, fp_copy, fp_mul, and uintbig_1.

◆ fp_enc()

void fp_enc ( fp a,
fp const b )

Definition at line 789 of file fp-gmp.c.

790{
791#ifdef MONTGOMERY
794#else
795 //(void) a;
796 //(void) b;
797 fp_copy(a, b);
798#endif
799}
#define r_squared_mod_p
Definition fp-gmp.h:29

References a, CNT_FP_MUL_DEC, fp_copy, fp_mul, and r_squared_mod_p.

◆ fp_inv()

void fp_inv ( fp x)

Definition at line 975 of file fp-gmp.c.

976{
977#if defined(USE_GMP_SEC_FUNCTIONS) || defined(MONTGOMERY)
978 static __thread uint64_t tp[itch_size];
979#endif
980#ifdef MONTGOMERY
981 fp_dec(x, x);
982 fp tmp;
983 fp_copy(tmp, x);
984 mpn_sec_invert(x, tmp, p, NUMBER_OF_WORDS, (unsigned int)(2 * NUMBER_OF_WORDS * mp_bits_per_limb), tp);
985 fp_enc(x, x);
986#else
987#ifndef USE_GMP_SEC_FUNCTIONS
988 mpz_t res, mpzx, mpzp;
989 mpz_init(res);
990 mpz_roinit_n(mpzx, x, NUMBER_OF_WORDS);
991 mpz_roinit_n(mpzp, p, NUMBER_OF_WORDS);
992 mpz_invert(res, mpzx, mpzp);
993 int i = 0;
994 for (; i < res->_mp_size; ++i)
995 {
996 x[i] = ((uint64_t *)res->_mp_d)[i];
997 }
998 for (; i < NUMBER_OF_WORDS; ++i)
999 {
1000 x[i] = 0;
1001 }
1002 mpz_clear(res);
1003#else
1004 fp tmp;
1005 fp_copy(tmp, x);
1006 mpn_sec_invert(x, tmp, p, NUMBER_OF_WORDS, (unsigned int)(2 * NUMBER_OF_WORDS * mp_bits_per_limb), tp);
1007#endif
1008#endif
1009}
uint64_t fp[NUMBER_OF_WORDS]
Definition fp-gmp.h:22
#define fp_enc
Definition fp-gmp.h:55
#define fp_dec
Definition fp-gmp.h:58
#define itch_size

References fp_copy, fp_dec, fp_enc, i, itch_size, and p.

◆ fp_issquare()

bool fp_issquare ( fp const a)

Definition at line 968 of file fp-gmp.c.

969{
970 mpz_t mpzx, mpzp;
971 int s = mpz_legendre(mpz_roinit_n(mpzx, a, NUMBER_OF_WORDS), mpz_roinit_n(mpzp, p, NUMBER_OF_WORDS));
972 return s + 1;
973}

References a, and p.

◆ fp_mul()

void fp_mul ( fp c,
const fp a,
const fp b )

Definition at line 891 of file fp-gmp.c.

892{
893#ifdef MONTGOMERY
894 static __thread uint64_t tp[itch_size];
895
896 // mp_size_t size = mpn_sec_mul_itch(NUMBER_OF_WORDS, 1) ;
897 uint64_t A[NUMBER_OF_WORDS + 1] = {0x0};
898 uint64_t tmp_1[NUMBER_OF_WORDS + 1] = {0x0};
899 uint64_t tmp_2[NUMBER_OF_WORDS + 2] = {0x0};
900 uint64_t a_i[1] = {0x0};
901 for (int i = 0; i < NUMBER_OF_WORDS; i++)
902 {
903 // tmp_1 = x_i * y
904 a_i[0] = a[i];
905 mpn_sec_mul(tmp_1, b, NUMBER_OF_WORDS, a_i, 1, tp);
906
907 // tmp_2 = A + x_i * y
908 mpn_add(tmp_2, A, NUMBER_OF_WORDS + 1, tmp_1, NUMBER_OF_WORDS + 1);
909
910 // tmp_1 = u_i * m
911 mpn_sec_mul(tmp_1, p, NUMBER_OF_WORDS, tmp_2, 1, tp);
912
913 // tmp_1 = A + x_i * y + u_i * m
914 mpn_add(tmp_1, tmp_1, NUMBER_OF_WORDS + 1, tmp_2, NUMBER_OF_WORDS + 2);
915
916 // A = (A + x_i * y + u_i * m) / r
917 mpn_copyd(A, tmp_1 + 1, NUMBER_OF_WORDS);
918
919 A[NUMBER_OF_WORDS] = 0;
920 }
921
922 mpn_cnd_sub_n(mpn_cmp(A, p, NUMBER_OF_WORDS) > 0, c, A, p, NUMBER_OF_WORDS);
923
924#else
925#ifndef USE_GMP_SEC_FUNCTIONS
926 uint64_t tmp[NUMBER_OF_WORDS * 2];
927 uint64_t thrash[NUMBER_OF_WORDS + 1];
928 mpn_mul_n(tmp, a, b, NUMBER_OF_WORDS);
929 mpn_tdiv_qr(thrash, c, 0, tmp, 2 * NUMBER_OF_WORDS, p, NUMBER_OF_WORDS);
930#else
931 static __thread uint64_t tp[itch_size];
932 uint64_t tmp[NUMBER_OF_WORDS * 2];
933 mpn_sec_mul(tmp, a, NUMBER_OF_WORDS, b, NUMBER_OF_WORDS, tp);
934 mpn_sec_div_r(tmp, 2 * NUMBER_OF_WORDS, p, NUMBER_OF_WORDS, tp);
935 fp_copy(c, tmp);
936#endif
937#endif
938
940}
#define CNT_FP_MUL_INC()
Definition fp-counters.h:30
A
Definition tests.py:29

References a, CNT_FP_MUL_INC, fp_copy, i, itch_size, and p.

◆ fp_pow()

void fp_pow ( fp b,
const fp e,
const fp a )

Definition at line 812 of file fp-gmp.c.

813{
814 // It is required that e > 0.
815 if (fp_iszero(e))
816 {
817 fp_set1(b);
818 }
819 else
820 {
821 fp tmp;
822 fp_copy(tmp, a);
823 fp_dec(tmp, tmp);
824 mp_size_t pow_size = mpn_sec_powm_itch(NUMBER_OF_WORDS, NUMBER_OF_WORDS, NUMBER_OF_WORDS);
825 uint64_t tp_pow[pow_size];
826 mpn_sec_powm(b, tmp, NUMBER_OF_WORDS, e, NUMBER_OF_WORDS, p, NUMBER_OF_WORDS, tp_pow);
827 fp_enc(b, b);
828 }
829}

References a, fp_copy, fp_dec, fp_enc, and p.

◆ fp_random()

void fp_random ( fp x)

Definition at line 1047 of file fp-gmp.c.

1048{
1049 while (1)
1050 {
1051 randombytes(x, sizeof(fp));
1052 uint64_t m = ((uint64_t)1 << pbits % 64) - 1;
1053 x[NUMBER_OF_WORDS - 1] &= m;
1054
1055 for (size_t i = NUMBER_OF_WORDS - 1; i < NUMBER_OF_WORDS; --i)
1056 if (x[i] < p[i])
1057 return;
1058 else if (x[i] > p[i])
1059 break;
1060 }
1061}
void randombytes(void *x, size_t l)
Definition rng.c:8
#define pbits

References i, p, pbits, and randombytes().

Here is the call graph for this function:

◆ fp_sqr()

void fp_sqr ( fp b,
const fp a )

Definition at line 942 of file fp-gmp.c.

943{
944#ifdef MONTGOMERY
945 // fp_mul(b, a, a);
946 // CNT_FP_MUL_DEC();
947
948 uint64_t tmp[NUMBER_OF_WORDS * 2];
949 mpn_sqr(tmp, a, NUMBER_OF_WORDS);
950 fp_mont_redc(b, tmp);
951
952#else
953#ifndef USE_GMP_SEC_FUNCTIONS
954 uint64_t tmp[NUMBER_OF_WORDS * 2];
955 uint64_t thrash[NUMBER_OF_WORDS + 1];
956 mpn_sqr(tmp, a, NUMBER_OF_WORDS);
957 mpn_tdiv_qr(thrash, b, 0, tmp, 2 * NUMBER_OF_WORDS, p, NUMBER_OF_WORDS);
958#else
959 fp_mul(b, a, a);
961// mpn_sec_sqr(tmp, a, NUMBER_OF_WORDS, tp);
962// mpn_sec_div_r(tmp, 2 * NUMBER_OF_WORDS, p, NUMBER_OF_WORDS, tp);
963#endif
964#endif
966}
#define CNT_FP_SQR_INC()
Definition fp-counters.h:32
void fp_mont_redc(fp a, const uint64_t b[2 *NUMBER_OF_WORDS])

References a, CNT_FP_MUL_DEC, CNT_FP_SQR_INC, fp_mont_redc(), fp_mul, and p.

Here is the call graph for this function:

◆ fp_sub()

void fp_sub ( fp c,
const fp a,
const fp b )

Definition at line 874 of file fp-gmp.c.

875{
876 // mp_limb_t borrow = mpn_sub_n(c, a, b, NUMBER_OF_WORDS);
877 // CNT_FP_ADD_INC();
878 // if (borrow)
879 // {
880 // mpn_add_n(c, c, p, NUMBER_OF_WORDS);
881 // }
882
883 mpn_cnd_add_n(mpn_sub_n(c, a, b, NUMBER_OF_WORDS), c, c, p, NUMBER_OF_WORDS);
885}

References a, CNT_FP_ADD_INC, and p.

Variable Documentation

◆ fp_0

const fp fp_0 = {0x0}

Definition at line 787 of file fp-gmp.c.

787{0x0};