My Project
Loading...
Searching...
No Matches
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
154typedef 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
163typedef sp_int mp_int;
164typedef sp_int_digit mp_digit;
165
166#include <wolfssl/wolfcrypt/wolfmath.h>
167
168
169MP_API int sp_init(sp_int* a);
170MP_API int sp_init_multi(sp_int* a, sp_int* b, sp_int* c, sp_int* d,
171 sp_int* e, sp_int* f);
172MP_API void sp_clear(sp_int* a);
173MP_API int sp_unsigned_bin_size(sp_int* a);
174MP_API int sp_read_unsigned_bin(sp_int* a, const byte* in, int inSz);
175MP_API int sp_read_radix(sp_int* a, const char* in, int radix);
176MP_API int sp_cmp(sp_int* a, sp_int* b);
177MP_API int sp_count_bits(sp_int* a);
178MP_API int sp_leading_bit(sp_int* a);
179MP_API int sp_to_unsigned_bin(sp_int* a, byte* out);
180MP_API int sp_to_unsigned_bin_len(sp_int* a, byte* out, int outSz);
181MP_API void sp_forcezero(sp_int* a);
182MP_API int sp_copy(sp_int* a, sp_int* r);
183MP_API int sp_set(sp_int* a, sp_int_digit d);
184MP_API void sp_clamp(sp_int* a);
185MP_API int sp_grow(sp_int* a, int l);
186MP_API int sp_sub_d(sp_int* a, sp_int_digit d, sp_int* r);
187MP_API int sp_cmp_d(sp_int* a, sp_int_digit d);
188MP_API int sp_sub(sp_int* a, sp_int* b, sp_int* r);
189MP_API int sp_mod(sp_int* a, sp_int* m, sp_int* r);
190MP_API void sp_zero(sp_int* a);
191MP_API int sp_add_d(sp_int* a, sp_int_digit d, sp_int* r);
192MP_API int sp_lshd(sp_int* a, int s);
193MP_API int sp_add(sp_int* a, sp_int* b, sp_int* r);
194MP_API int sp_set_int(sp_int* a, unsigned long b);
195MP_API int sp_tohex(sp_int* a, char* str);
196MP_API int sp_set_bit(sp_int* a, int i);
197MP_API int sp_2expt(sp_int* a, int e);
198MP_API int sp_rand_prime(sp_int* r, int len, WC_RNG* rng, void* heap);
199MP_API int sp_mul(sp_int* a, sp_int* b, sp_int* r);
200MP_API int sp_mulmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r);
201MP_API int sp_gcd(sp_int* a, sp_int* b, sp_int* r);
202MP_API int sp_invmod(sp_int* a, sp_int* m, sp_int* r);
203MP_API int sp_lcm(sp_int* a, sp_int* b, sp_int* r);
204MP_API int sp_exptmod(sp_int* b, sp_int* e, sp_int* m, sp_int* r);
205MP_API int sp_prime_is_prime(mp_int* a, int t, int* result);
206MP_API int sp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng);
207MP_API int sp_exch(sp_int* a, sp_int* b);
208MP_API int sp_get_digit_count(sp_int *a);
209MP_API int sp_init_copy (sp_int * a, sp_int * b);
210MP_API void sp_rshb(sp_int* a, int n, sp_int* r);
211MP_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:191
Definition random.h:153
Definition integer.h:200
Definition sp_int.h:154