23 #ifndef WOLF_CRYPT_FE_OPERATIONS_H 24 #define WOLF_CRYPT_FE_OPERATIONS_H 26 #include <wolfssl/wolfcrypt/settings.h> 28 #if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) 30 #if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) 36 #if defined(USE_INTEL_SPEEDUP) && !defined(NO_CURVED25519_X64) 37 #define CURVED25519_X64 38 #elif defined(HAVE___UINT128_T) && !defined(NO_CURVED25519_128BIT) 39 #define CURVED25519_128BIT 42 #if defined(CURVED25519_X64) 43 #define CURVED25519_ASM_64BIT 44 #define CURVED25519_ASM 46 #if defined(WOLFSSL_ARMASM) 48 #define CURVED25519_ASM_64BIT 50 #define CURVED25519_ASM_32BIT 52 #define CURVED25519_ASM 67 #if defined(CURVE25519_SMALL) || defined(ED25519_SMALL) 68 #define F25519_SIZE 32 70 WOLFSSL_LOCAL
void lm_copy(byte*,
const byte*);
71 WOLFSSL_LOCAL
void lm_add(byte*,
const byte*,
const byte*);
72 WOLFSSL_LOCAL
void lm_sub(byte*,
const byte*,
const byte*);
73 WOLFSSL_LOCAL
void lm_neg(byte*,
const byte*);
74 WOLFSSL_LOCAL
void lm_invert(byte*,
const byte*);
75 WOLFSSL_LOCAL
void lm_mul(byte*,
const byte*,
const byte*);
79 #if !defined(FREESCALE_LTC_ECC) 80 WOLFSSL_LOCAL
void fe_init(
void);
82 WOLFSSL_LOCAL
int curve25519(byte * q, byte * n, byte * p);
86 #if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) 88 #ifdef CURVED25519_ASM_64BIT 89 typedef int64_t fe[4];
90 #elif defined(CURVED25519_ASM_32BIT) 91 typedef int32_t fe[8];
92 #elif defined(CURVED25519_128BIT) 93 typedef int64_t fe[5];
95 typedef int32_t fe[10];
98 WOLFSSL_LOCAL
void fe_copy(fe,
const fe);
99 WOLFSSL_LOCAL
void fe_add(fe,
const fe,
const fe);
100 WOLFSSL_LOCAL
void fe_neg(fe,
const fe);
101 WOLFSSL_LOCAL
void fe_sub(fe,
const fe,
const fe);
102 WOLFSSL_LOCAL
void fe_invert(fe,
const fe);
103 WOLFSSL_LOCAL
void fe_mul(fe,
const fe,
const fe);
109 WOLFSSL_LOCAL
void fe_0(fe);
110 WOLFSSL_LOCAL
void fe_1(fe);
111 WOLFSSL_LOCAL
int fe_isnonzero(
const fe);
112 WOLFSSL_LOCAL
int fe_isnegative(
const fe);
113 WOLFSSL_LOCAL
void fe_tobytes(
unsigned char *,
const fe);
114 WOLFSSL_LOCAL
void fe_sq(fe,
const fe);
115 WOLFSSL_LOCAL
void fe_sq2(fe,
const fe);
116 WOLFSSL_LOCAL
void fe_frombytes(fe,
const unsigned char *);
117 WOLFSSL_LOCAL
void fe_cswap(fe, fe,
int);
118 WOLFSSL_LOCAL
void fe_mul121666(fe,fe);
119 WOLFSSL_LOCAL
void fe_cmov(fe,
const fe,
int);
120 WOLFSSL_LOCAL
void fe_pow22523(fe,
const fe);
123 WOLFSSL_LOCAL uint64_t load_3(
const unsigned char *in);
124 WOLFSSL_LOCAL uint64_t load_4(
const unsigned char *in);
126 #ifdef CURVED25519_ASM 127 WOLFSSL_LOCAL
void fe_ge_to_p2(fe rx, fe ry, fe rz,
const fe px,
const fe py,
128 const fe pz,
const fe pt);
129 WOLFSSL_LOCAL
void fe_ge_to_p3(fe rx, fe ry, fe rz, fe rt,
const fe px,
130 const fe py,
const fe pz,
const fe pt);
131 WOLFSSL_LOCAL
void fe_ge_dbl(fe rx, fe ry, fe rz, fe rt,
const fe px,
132 const fe py,
const fe pz);
133 WOLFSSL_LOCAL
void fe_ge_madd(fe rx, fe ry, fe rz, fe rt,
const fe px,
134 const fe py,
const fe pz,
const fe pt,
135 const fe qxy2d,
const fe qyplusx,
137 WOLFSSL_LOCAL
void fe_ge_msub(fe rx, fe ry, fe rz, fe rt,
const fe px,
138 const fe py,
const fe pz,
const fe pt,
139 const fe qxy2d,
const fe qyplusx,
141 WOLFSSL_LOCAL
void fe_ge_add(fe rx, fe ry, fe rz, fe rt,
const fe px,
142 const fe py,
const fe pz,
const fe pt,
const fe qz,
143 const fe qt2d,
const fe qyplusx,
145 WOLFSSL_LOCAL
void fe_ge_sub(fe rx, fe ry, fe rz, fe rt,
const fe px,
146 const fe py,
const fe pz,
const fe pt,
const fe qz,
147 const fe qt2d,
const fe qyplusx,
149 WOLFSSL_LOCAL
void fe_cmov_table(fe* r, fe* base,
signed char b);
155 #if defined(CURVE25519_SMALL) || defined(ED25519_SMALL) 156 static const byte c25519_base_x[F25519_SIZE] = {9};
157 static const byte f25519_zero[F25519_SIZE] = {0};
158 static const byte f25519_one[F25519_SIZE] = {1};
159 static const byte fprime_zero[F25519_SIZE] = {0};
160 static const byte fprime_one[F25519_SIZE] = {1};
162 WOLFSSL_LOCAL
void fe_load(byte *x, word32 c);
163 WOLFSSL_LOCAL
void fe_normalize(byte *x);
164 WOLFSSL_LOCAL
void fe_inv__distinct(byte *r,
const byte *x);
170 WOLFSSL_LOCAL
void fe_select(byte *dst,
const byte *zero,
const byte *one,
178 WOLFSSL_LOCAL
void fe_mul_c(byte *r,
const byte *a, word32 b);
179 WOLFSSL_LOCAL
void fe_mul__distinct(byte *r,
const byte *a,
const byte *b);
188 WOLFSSL_LOCAL
void fe_sqrt(byte *r,
const byte *x);
194 WOLFSSL_LOCAL
void fprime_select(byte *dst,
const byte *zero,
const byte *one,
196 WOLFSSL_LOCAL
void fprime_add(byte *r,
const byte *a,
const byte *modulus);
197 WOLFSSL_LOCAL
void fprime_sub(byte *r,
const byte *a,
const byte *modulus);
198 WOLFSSL_LOCAL
void fprime_mul(byte *r,
const byte *a,
const byte *b,
199 const byte *modulus);
200 WOLFSSL_LOCAL
void fprime_copy(byte *x,
const byte *a);