sp_int.h
1 /* sp_int.h
2  *
3  * Copyright (C) 2006-2020 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL.
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20  */
21 
22 
23 #ifndef WOLF_CRYPT_SP_INT_H
24 #define WOLF_CRYPT_SP_INT_H
25 
26 #include <stdint.h>
27 #include <limits.h>
28 
29 /* Make sure WOLFSSL_SP_ASM build option defined when requested */
30 #if !defined(WOLFSSL_SP_ASM) && ( \
31  defined(WOLFSSL_SP_X86_64_ASM) || defined(WOLFSSL_SP_ARM32_ASM) || \
32  defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM_THUMB_ASM) || \
33  defined(WOLFSSL_SP_ARM_CORTEX_M_ASM))
34  #define WOLFSSL_SP_ASM
35 #endif
36 
37 
38 #ifdef WOLFSSL_SP_X86_64_ASM
39  #define SP_WORD_SIZE 64
40 
41  #define HAVE_INTEL_AVX1
42  #define HAVE_INTEL_AVX2
43 #elif defined(WOLFSSL_SP_ARM64_ASM)
44  #define SP_WORD_SIZE 64
45 #elif defined(WOLFSSL_SP_ARM32_ASM)
46  #define SP_WORD_SIZE 32
47 #elif defined(WOLFSSL_SP_ARM_THUMB_ASM)
48  #define SP_WORD_SIZE 32
49 #endif
50 
51 #ifndef SP_WORD_SIZE
52  #if defined(NO_64BIT) || !defined(HAVE___UINT128_T)
53  #define SP_WORD_SIZE 32
54  #else
55  #define SP_WORD_SIZE 64
56  #endif
57 #endif
58 
59 #ifdef WOLFSSL_DSP_BUILD
60  typedef int32 sp_digit;
61  typedef uint32 sp_int_digit;
62  typedef uint64 sp_int_word;
63  #undef SP_WORD_SIZE
64  #define SP_WORD_SIZE 32
65 #elif !defined(WOLFSSL_SP_ASM)
66  #if SP_WORD_SIZE == 32
67  typedef int32_t sp_digit;
68  typedef uint32_t sp_int_digit;
69  typedef uint64_t sp_int_word;
70  #elif SP_WORD_SIZE == 64
71  typedef int64_t sp_digit;
72  typedef uint64_t sp_int_digit;
73  #ifdef __SIZEOF_INT128__
74  typedef __uint128_t uint128_t;
75  typedef __int128_t int128_t;
76  #else
77  typedef unsigned long uint128_t __attribute__ ((mode(TI)));
78  typedef long int128_t __attribute__ ((mode(TI)));
79  #endif
80  typedef uint128_t sp_int_word;
81  #else
82  #error Word size not defined
83  #endif
84 #else
85  #if SP_WORD_SIZE == 32
86  typedef uint32_t sp_digit;
87  typedef uint32_t sp_int_digit;
88  typedef uint64_t sp_int_word;
89  #elif SP_WORD_SIZE == 64
90  typedef uint64_t sp_digit;
91  typedef uint64_t sp_int_digit;
92  #ifdef __SIZEOF_INT128__
93  typedef __uint128_t uint128_t;
94  typedef __int128_t int128_t;
95  #else
96  typedef unsigned long uint128_t __attribute__ ((mode(TI)));
97  typedef long int128_t __attribute__ ((mode(TI)));
98  #endif
99  typedef uint128_t sp_int_word;
100  #else
101  #error Word size not defined
102  #endif
103 #endif
104 
105 #define SP_MASK (sp_digit)(-1)
106 
107 #ifdef WOLFSSL_SP_MATH
109 
110 #if !defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_HAVE_SP_DH)
111  #if !defined(NO_PWDBASED) && defined(WOLFSSL_SHA512)
112  #define SP_INT_DIGITS ((512 + SP_WORD_SIZE) / SP_WORD_SIZE)
113  #elif defined(WOLFSSL_SP_384)
114  #define SP_INT_DIGITS ((384 + SP_WORD_SIZE) / SP_WORD_SIZE)
115  #else
116  #define SP_INT_DIGITS ((256 + SP_WORD_SIZE) / SP_WORD_SIZE)
117  #endif
118 #elif defined(WOLFSSL_SP_4096)
119  #if defined(WOLFSSL_HAVE_SP_DH)
120  #define SP_INT_DIGITS ((8192 + SP_WORD_SIZE) / SP_WORD_SIZE)
121  #else
122  #define SP_INT_DIGITS ((4096 + SP_WORD_SIZE) / SP_WORD_SIZE)
123  #endif
124 #elif !defined(WOLFSSL_SP_NO_3072)
125  #if defined(WOLFSSL_HAVE_SP_DH)
126  #define SP_INT_DIGITS ((6144 + SP_WORD_SIZE) / SP_WORD_SIZE)
127  #else
128  #define SP_INT_DIGITS ((3072 + SP_WORD_SIZE) / SP_WORD_SIZE)
129  #endif
130 #else
131  #if defined(WOLFSSL_HAVE_SP_DH)
132  #define SP_INT_DIGITS ((4096 + SP_WORD_SIZE) / SP_WORD_SIZE)
133  #else
134  #define SP_INT_DIGITS ((2048 + SP_WORD_SIZE) / SP_WORD_SIZE)
135  #endif
136 #endif
137 
138 #define sp_isodd(a) ((a)->used != 0 && ((a)->dp[0] & 1))
139 #define sp_iseven(a) ((a)->used != 0 && ((a)->dp[0] & 1) == 0)
140 #define sp_iszero(a) ((a)->used == 0)
141 #define sp_isone(a) ((a)->used == 1 && (a)->dp[0] == 1)
142 #define sp_abs(a, b) sp_copy(a, b)
143 
144 #ifdef HAVE_WOLF_BIGINT
145  /* raw big integer */
146  typedef struct WC_BIGINT {
147  byte* buf;
148  word32 len;
149  void* heap;
150  } WC_BIGINT;
151  #define WOLF_BIGINT_DEFINED
152 #endif
153 
154 typedef struct sp_int {
155  int used;
156  int size;
157  sp_int_digit dp[SP_INT_DIGITS];
158 #ifdef HAVE_WOLF_BIGINT
159  struct WC_BIGINT raw; /* unsigned binary (big endian) */
160 #endif
161 } sp_int;
162 
163 typedef sp_int mp_int;
164 typedef sp_int_digit mp_digit;
165 
166 #include <wolfssl/wolfcrypt/wolfmath.h>
167 
168 
169 MP_API int sp_init(sp_int* a);
170 MP_API int sp_init_multi(sp_int* a, sp_int* b, sp_int* c, sp_int* d,
171  sp_int* e, sp_int* f);
172 MP_API void sp_clear(sp_int* a);
173 MP_API int sp_unsigned_bin_size(sp_int* a);
174 MP_API int sp_read_unsigned_bin(sp_int* a, const byte* in, int inSz);
175 MP_API int sp_read_radix(sp_int* a, const char* in, int radix);
176 MP_API int sp_cmp(sp_int* a, sp_int* b);
177 MP_API int sp_count_bits(sp_int* a);
178 MP_API int sp_leading_bit(sp_int* a);
179 MP_API int sp_to_unsigned_bin(sp_int* a, byte* out);
180 MP_API int sp_to_unsigned_bin_len(sp_int* a, byte* out, int outSz);
181 MP_API void sp_forcezero(sp_int* a);
182 MP_API int sp_copy(sp_int* a, sp_int* r);
183 MP_API int sp_set(sp_int* a, sp_int_digit d);
184 MP_API void sp_clamp(sp_int* a);
185 MP_API int sp_grow(sp_int* a, int l);
186 MP_API int sp_sub_d(sp_int* a, sp_int_digit d, sp_int* r);
187 MP_API int sp_cmp_d(sp_int* a, sp_int_digit d);
188 MP_API int sp_sub(sp_int* a, sp_int* b, sp_int* r);
189 MP_API int sp_mod(sp_int* a, sp_int* m, sp_int* r);
190 MP_API void sp_zero(sp_int* a);
191 MP_API int sp_add_d(sp_int* a, sp_int_digit d, sp_int* r);
192 MP_API int sp_lshd(sp_int* a, int s);
193 MP_API int sp_add(sp_int* a, sp_int* b, sp_int* r);
194 MP_API int sp_set_int(sp_int* a, unsigned long b);
195 MP_API int sp_tohex(sp_int* a, char* str);
196 MP_API int sp_set_bit(sp_int* a, int i);
197 MP_API int sp_2expt(sp_int* a, int e);
198 MP_API int sp_rand_prime(sp_int* r, int len, WC_RNG* rng, void* heap);
199 MP_API int sp_mul(sp_int* a, sp_int* b, sp_int* r);
200 MP_API int sp_mulmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r);
201 MP_API int sp_gcd(sp_int* a, sp_int* b, sp_int* r);
202 MP_API int sp_invmod(sp_int* a, sp_int* m, sp_int* r);
203 MP_API int sp_lcm(sp_int* a, sp_int* b, sp_int* r);
204 MP_API int sp_exptmod(sp_int* b, sp_int* e, sp_int* m, sp_int* r);
205 MP_API int sp_prime_is_prime(mp_int* a, int t, int* result);
206 MP_API int sp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng);
207 MP_API int sp_exch(sp_int* a, sp_int* b);
208 MP_API int sp_get_digit_count(sp_int *a);
209 MP_API int sp_init_copy (sp_int * a, sp_int * b);
210 MP_API void sp_rshb(sp_int* a, int n, sp_int* r);
211 MP_API int sp_mul_d(sp_int* a, sp_int_digit n, sp_int* r);
212 
213 
214 #define MP_OKAY 0
215 #define MP_NO 0
216 #define MP_YES 1
217 
218 #define MP_RADIX_HEX 16
219 
220 #define MP_GT 1
221 #define MP_EQ 0
222 #define MP_LT -1
223 
224 #define MP_MEM -2
225 #define MP_VAL -3
226 
227 #define DIGIT_BIT SP_WORD_SIZE
228 #define MP_MASK SP_MASK
229 
230 #define CheckFastMathSettings() 1
231 
232 #define mp_free(a)
233 
234 #define mp_isodd sp_isodd
235 #define mp_iseven sp_iseven
236 #define mp_iszero sp_iszero
237 #define mp_isone sp_isone
238 #define mp_abs sp_abs
239 
240 #define mp_init sp_init
241 #define mp_init_multi sp_init_multi
242 #define mp_clear sp_clear
243 #define mp_read_unsigned_bin sp_read_unsigned_bin
244 #define mp_unsigned_bin_size sp_unsigned_bin_size
245 #define mp_read_radix sp_read_radix
246 #define mp_cmp sp_cmp
247 #define mp_count_bits sp_count_bits
248 #define mp_leading_bit sp_leading_bit
249 #define mp_to_unsigned_bin sp_to_unsigned_bin
250 #define mp_to_unsigned_bin_len sp_to_unsigned_bin_len
251 #define mp_forcezero sp_forcezero
252 #define mp_copy sp_copy
253 #define mp_set sp_set
254 #define mp_clamp sp_clamp
255 #define mp_grow sp_grow
256 #define mp_sub_d sp_sub_d
257 #define mp_cmp_d sp_cmp_d
258 #define mp_sub sp_sub
259 #define mp_mod sp_mod
260 #define mp_zero sp_zero
261 #define mp_add_d sp_add_d
262 #define mp_lshd sp_lshd
263 #define mp_add sp_add
264 #define mp_set_int sp_set_int
265 #define mp_tohex sp_tohex
266 #define mp_set_bit sp_set_bit
267 #define mp_2expt sp_2expt
268 #define mp_rand_prime sp_rand_prime
269 #define mp_mul sp_mul
270 #define mp_mulmod sp_mulmod
271 #define mp_gcd sp_gcd
272 #define mp_invmod sp_invmod
273 #define mp_lcm sp_lcm
274 #define mp_exptmod sp_exptmod
275 #define mp_exptmod_nct sp_exptmod
276 #define mp_prime_is_prime sp_prime_is_prime
277 #define mp_prime_is_prime_ex sp_prime_is_prime_ex
278 #define mp_exch sp_exch
279 #define get_digit_count sp_get_digit_count
280 #define mp_init_copy sp_init_copy
281 #define mp_rshb(A,x) sp_rshb(A,x,A)
282 #define mp_mul_d sp_mul_d
283 
284 #endif
285 
286 #endif /* WOLF_CRYPT_SP_H */
287 
Definition: integer.h:200
Definition: integer.h:191
Definition: random.h:153
Definition: sp_int.h:154