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)
80WOLFSSL_LOCAL
void fe_init(
void);
82WOLFSSL_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];
98WOLFSSL_LOCAL
void fe_copy(fe,
const fe);
99WOLFSSL_LOCAL
void fe_add(fe,
const fe,
const fe);
100WOLFSSL_LOCAL
void fe_neg(fe,
const fe);
101WOLFSSL_LOCAL
void fe_sub(fe,
const fe,
const fe);
102WOLFSSL_LOCAL
void fe_invert(fe,
const fe);
103WOLFSSL_LOCAL
void fe_mul(fe,
const fe,
const fe);
109WOLFSSL_LOCAL
void fe_0(fe);
110WOLFSSL_LOCAL
void fe_1(fe);
111WOLFSSL_LOCAL
int fe_isnonzero(
const fe);
112WOLFSSL_LOCAL
int fe_isnegative(
const fe);
113WOLFSSL_LOCAL
void fe_tobytes(
unsigned char *,
const fe);
114WOLFSSL_LOCAL
void fe_sq(fe,
const fe);
115WOLFSSL_LOCAL
void fe_sq2(fe,
const fe);
116WOLFSSL_LOCAL
void fe_frombytes(fe,
const unsigned char *);
117WOLFSSL_LOCAL
void fe_cswap(fe, fe,
int);
118WOLFSSL_LOCAL
void fe_mul121666(fe,fe);
119WOLFSSL_LOCAL
void fe_cmov(fe,
const fe,
int);
120WOLFSSL_LOCAL
void fe_pow22523(fe,
const fe);
123WOLFSSL_LOCAL uint64_t load_3(
const unsigned char *in);
124WOLFSSL_LOCAL uint64_t load_4(
const unsigned char *in);
126#ifdef CURVED25519_ASM
127WOLFSSL_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);
129WOLFSSL_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);
131WOLFSSL_LOCAL
void fe_ge_dbl(fe rx, fe ry, fe rz, fe rt,
const fe px,
132 const fe py,
const fe pz);
133WOLFSSL_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,
137WOLFSSL_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,
141WOLFSSL_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,
145WOLFSSL_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,
149WOLFSSL_LOCAL
void fe_cmov_table(fe* r, fe* base,
signed char b);
155#if defined(CURVE25519_SMALL) || defined(ED25519_SMALL)
156static const byte c25519_base_x[F25519_SIZE] = {9};
157static const byte f25519_zero[F25519_SIZE] = {0};
158static const byte f25519_one[F25519_SIZE] = {1};
159static const byte fprime_zero[F25519_SIZE] = {0};
160static const byte fprime_one[F25519_SIZE] = {1};
162WOLFSSL_LOCAL
void fe_load(
byte *x, word32 c);
163WOLFSSL_LOCAL
void fe_normalize(
byte *x);
164WOLFSSL_LOCAL
void fe_inv__distinct(
byte *r,
const byte *x);
170WOLFSSL_LOCAL
void fe_select(
byte *dst,
const byte *zero,
const byte *one,
178WOLFSSL_LOCAL
void fe_mul_c(
byte *r,
const byte *a, word32 b);
179WOLFSSL_LOCAL
void fe_mul__distinct(
byte *r,
const byte *a,
const byte *b);
188WOLFSSL_LOCAL
void fe_sqrt(
byte *r,
const byte *x);
194WOLFSSL_LOCAL
void fprime_select(
byte *dst,
const byte *zero,
const byte *one,
196WOLFSSL_LOCAL
void fprime_add(
byte *r,
const byte *a,
const byte *modulus);
197WOLFSSL_LOCAL
void fprime_sub(
byte *r,
const byte *a,
const byte *modulus);
198WOLFSSL_LOCAL
void fprime_mul(
byte *r,
const byte *a,
const byte *b,
199 const byte *modulus);
200WOLFSSL_LOCAL
void fprime_copy(
byte *x,
const byte *a);