Mercurial > dropbear
comparison libtomcrypt/src/headers/tomcrypt_math.h @ 1478:3a933956437e coverity
update coverity
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 09 Feb 2018 23:49:22 +0800 |
parents | 6dba84798cd5 |
children |
comparison
equal
deleted
inserted
replaced
1439:8d24733026c5 | 1478:3a933956437e |
---|---|
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
2 * | |
3 * LibTomCrypt is a library that provides various cryptographic | |
4 * algorithms in a highly modular and flexible manner. | |
5 * | |
6 * The library is free for all purposes without any express | |
7 * guarantee it works. | |
8 */ | |
9 | |
1 /** math functions **/ | 10 /** math functions **/ |
2 | 11 |
3 #define LTC_MP_LT -1 | 12 #define LTC_MP_LT -1 |
4 #define LTC_MP_EQ 0 | 13 #define LTC_MP_EQ 0 |
5 #define LTC_MP_GT 1 | 14 #define LTC_MP_GT 1 |
13 | 22 |
14 #ifndef LTC_MRSA | 23 #ifndef LTC_MRSA |
15 typedef void rsa_key; | 24 typedef void rsa_key; |
16 #endif | 25 #endif |
17 | 26 |
27 #ifndef LTC_MILLER_RABIN_REPS | |
28 /* Number of rounds of the Miller-Rabin test | |
29 * "Reasonable values of reps are between 15 and 50." c.f. gmp doc of mpz_probab_prime_p() | |
30 * As of https://security.stackexchange.com/a/4546 we should use 40 rounds */ | |
31 #define LTC_MILLER_RABIN_REPS 40 | |
32 #endif | |
33 | |
34 int radix_to_bin(const void *in, int radix, void *out, unsigned long *len); | |
35 | |
18 /** math descriptor */ | 36 /** math descriptor */ |
19 typedef struct { | 37 typedef struct { |
20 /** Name of the math provider */ | 38 /** Name of the math provider */ |
21 char *name; | 39 const char *name; |
22 | 40 |
23 /** Bits per digit, amount of bits must fit in an unsigned long */ | 41 /** Bits per digit, amount of bits must fit in an unsigned long */ |
24 int bits_per_digit; | 42 int bits_per_digit; |
25 | 43 |
26 /* ---- init/deinit functions ---- */ | 44 /* ---- init/deinit functions ---- */ |
28 /** initialize a bignum | 46 /** initialize a bignum |
29 @param a The number to initialize | 47 @param a The number to initialize |
30 @return CRYPT_OK on success | 48 @return CRYPT_OK on success |
31 */ | 49 */ |
32 int (*init)(void **a); | 50 int (*init)(void **a); |
33 | 51 |
34 /** init copy | 52 /** init copy |
35 @param dst The number to initialize and write to | 53 @param dst The number to initialize and write to |
36 @param src The number to copy from | 54 @param src The number to copy from |
37 @return CRYPT_OK on success | 55 @return CRYPT_OK on success |
38 */ | 56 */ |
39 int (*init_copy)(void **dst, void *src); | 57 int (*init_copy)(void **dst, void *src); |
40 | 58 |
41 /** deinit | 59 /** deinit |
42 @param a The number to free | 60 @param a The number to free |
43 @return CRYPT_OK on success | 61 @return CRYPT_OK on success |
44 */ | 62 */ |
45 void (*deinit)(void *a); | 63 void (*deinit)(void *a); |
46 | 64 |
50 @param src The number to negate | 68 @param src The number to negate |
51 @param dst The destination | 69 @param dst The destination |
52 @return CRYPT_OK on success | 70 @return CRYPT_OK on success |
53 */ | 71 */ |
54 int (*neg)(void *src, void *dst); | 72 int (*neg)(void *src, void *dst); |
55 | 73 |
56 /** copy | 74 /** copy |
57 @param src The number to copy from | 75 @param src The number to copy from |
58 @param dst The number to write to | 76 @param dst The number to write to |
59 @return CRYPT_OK on success | 77 @return CRYPT_OK on success |
60 */ | 78 */ |
61 int (*copy)(void *src, void *dst); | 79 int (*copy)(void *src, void *dst); |
62 | 80 |
63 /* ---- trivial low level functions ---- */ | 81 /* ---- trivial low level functions ---- */ |
64 | 82 |
65 /** set small constant | 83 /** set small constant |
66 @param a Number to write to | 84 @param a Number to write to |
67 @param n Source upto bits_per_digit (actually meant for very small constants) | 85 @param n Source upto bits_per_digit (actually meant for very small constants) |
68 @return CRYPT_OK on succcess | 86 @return CRYPT_OK on success |
69 */ | 87 */ |
70 int (*set_int)(void *a, unsigned long n); | 88 int (*set_int)(void *a, ltc_mp_digit n); |
71 | 89 |
72 /** get small constant | 90 /** get small constant |
73 @param a Number to read, only fetches upto bits_per_digit from the number | 91 @param a Small number to read, |
74 @return The lower bits_per_digit of the integer (unsigned) | 92 only fetches up to bits_per_digit from the number |
93 @return The lower bits_per_digit of the integer (unsigned) | |
75 */ | 94 */ |
76 unsigned long (*get_int)(void *a); | 95 unsigned long (*get_int)(void *a); |
77 | 96 |
78 /** get digit n | 97 /** get digit n |
79 @param a The number to read from | 98 @param a The number to read from |
80 @param n The number of the digit to fetch | 99 @param n The number of the digit to fetch |
81 @return The bits_per_digit sized n'th digit of a | 100 @return The bits_per_digit sized n'th digit of a |
82 */ | 101 */ |
83 unsigned long (*get_digit)(void *a, int n); | 102 ltc_mp_digit (*get_digit)(void *a, int n); |
84 | 103 |
85 /** Get the number of digits that represent the number | 104 /** Get the number of digits that represent the number |
86 @param a The number to count | 105 @param a The number to count |
87 @return The number of digits used to represent the number | 106 @return The number of digits used to represent the number |
88 */ | 107 */ |
89 int (*get_digit_count)(void *a); | 108 int (*get_digit_count)(void *a); |
90 | 109 |
91 /** compare two integers | 110 /** compare two integers |
92 @param a The left side integer | 111 @param a The left side integer |
93 @param b The right side integer | 112 @param b The right side integer |
94 @return LTC_MP_LT if a < b, LTC_MP_GT if a > b and LTC_MP_EQ otherwise. (signed comparison) | 113 @return LTC_MP_LT if a < b, |
114 LTC_MP_GT if a > b and | |
115 LTC_MP_EQ otherwise. (signed comparison) | |
95 */ | 116 */ |
96 int (*compare)(void *a, void *b); | 117 int (*compare)(void *a, void *b); |
97 | 118 |
98 /** compare against int | 119 /** compare against int |
99 @param a The left side integer | 120 @param a The left side integer |
100 @param b The right side integer (upto bits_per_digit) | 121 @param b The right side integer (upto bits_per_digit) |
101 @return LTC_MP_LT if a < b, LTC_MP_GT if a > b and LTC_MP_EQ otherwise. (signed comparison) | 122 @return LTC_MP_LT if a < b, |
102 */ | 123 LTC_MP_GT if a > b and |
103 int (*compare_d)(void *a, unsigned long n); | 124 LTC_MP_EQ otherwise. (signed comparison) |
125 */ | |
126 int (*compare_d)(void *a, ltc_mp_digit n); | |
104 | 127 |
105 /** Count the number of bits used to represent the integer | 128 /** Count the number of bits used to represent the integer |
106 @param a The integer to count | 129 @param a The integer to count |
107 @return The number of bits required to represent the integer | 130 @return The number of bits required to represent the integer |
108 */ | 131 */ |
109 int (*count_bits)(void * a); | 132 int (*count_bits)(void * a); |
110 | 133 |
111 /** Count the number of LSB bits which are zero | 134 /** Count the number of LSB bits which are zero |
112 @param a The integer to count | 135 @param a The integer to count |
113 @return The number of contiguous zero LSB bits | 136 @return The number of contiguous zero LSB bits |
114 */ | 137 */ |
115 int (*count_lsb_bits)(void *a); | 138 int (*count_lsb_bits)(void *a); |
116 | 139 |
120 @return CRYPT_OK on success | 143 @return CRYPT_OK on success |
121 */ | 144 */ |
122 int (*twoexpt)(void *a , int n); | 145 int (*twoexpt)(void *a , int n); |
123 | 146 |
124 /* ---- radix conversions ---- */ | 147 /* ---- radix conversions ---- */ |
125 | 148 |
126 /** read ascii string | 149 /** read ascii string |
127 @param a The integer to store into | 150 @param a The integer to store into |
128 @param str The string to read | 151 @param str The string to read |
129 @param radix The radix the integer has been represented in (2-64) | 152 @param radix The radix the integer has been represented in (2-64) |
130 @return CRYPT_OK on success | 153 @return CRYPT_OK on success |
131 */ | 154 */ |
137 @param radix The radix the integer is to be represented in (2-64) | 160 @param radix The radix the integer is to be represented in (2-64) |
138 @return CRYPT_OK on success | 161 @return CRYPT_OK on success |
139 */ | 162 */ |
140 int (*write_radix)(void *a, char *str, int radix); | 163 int (*write_radix)(void *a, char *str, int radix); |
141 | 164 |
142 /** get size as unsigned char string | 165 /** get size as unsigned char string |
143 @param a The integer to get the size (when stored in array of octets) | 166 @param a The integer to get the size (when stored in array of octets) |
144 @return The length of the integer | 167 @return The length of the integer in octets |
145 */ | 168 */ |
146 unsigned long (*unsigned_size)(void *a); | 169 unsigned long (*unsigned_size)(void *a); |
147 | 170 |
148 /** store an integer as an array of octets | 171 /** store an integer as an array of octets |
149 @param src The integer to store | 172 @param src The integer to store |
150 @param dst The buffer to store the integer in | 173 @param dst The buffer to store the integer in |
151 @return CRYPT_OK on success | 174 @return CRYPT_OK on success |
152 */ | 175 */ |
153 int (*unsigned_write)(void *src, unsigned char *dst); | 176 int (*unsigned_write)(void *src, unsigned char *dst); |
154 | 177 |
155 /** read an array of octets and store as integer | 178 /** read an array of octets and store as integer |
156 @param dst The integer to load | 179 @param dst The integer to load |
157 @param src The array of octets | 180 @param src The array of octets |
158 @param len The number of octets | 181 @param len The number of octets |
159 @return CRYPT_OK on success | 182 @return CRYPT_OK on success |
160 */ | 183 */ |
161 int (*unsigned_read)(void *dst, unsigned char *src, unsigned long len); | 184 int (*unsigned_read)( void *dst, |
185 unsigned char *src, | |
186 unsigned long len); | |
162 | 187 |
163 /* ---- basic math ---- */ | 188 /* ---- basic math ---- */ |
164 | 189 |
165 /** add two integers | 190 /** add two integers |
166 @param a The first source integer | 191 @param a The first source integer |
167 @param b The second source integer | 192 @param b The second source integer |
168 @param c The destination of "a + b" | 193 @param c The destination of "a + b" |
169 @return CRYPT_OK on success | 194 @return CRYPT_OK on success |
170 */ | 195 */ |
171 int (*add)(void *a, void *b, void *c); | 196 int (*add)(void *a, void *b, void *c); |
172 | 197 |
173 | 198 /** add two integers |
174 /** add two integers | |
175 @param a The first source integer | 199 @param a The first source integer |
176 @param b The second source integer (single digit of upto bits_per_digit in length) | 200 @param b The second source integer |
201 (single digit of upto bits_per_digit in length) | |
177 @param c The destination of "a + b" | 202 @param c The destination of "a + b" |
178 @return CRYPT_OK on success | 203 @return CRYPT_OK on success |
179 */ | 204 */ |
180 int (*addi)(void *a, unsigned long b, void *c); | 205 int (*addi)(void *a, ltc_mp_digit b, void *c); |
181 | 206 |
182 /** subtract two integers | 207 /** subtract two integers |
183 @param a The first source integer | 208 @param a The first source integer |
184 @param b The second source integer | 209 @param b The second source integer |
185 @param c The destination of "a - b" | 210 @param c The destination of "a - b" |
186 @return CRYPT_OK on success | 211 @return CRYPT_OK on success |
187 */ | 212 */ |
188 int (*sub)(void *a, void *b, void *c); | 213 int (*sub)(void *a, void *b, void *c); |
189 | 214 |
190 /** subtract two integers | 215 /** subtract two integers |
191 @param a The first source integer | 216 @param a The first source integer |
192 @param b The second source integer (single digit of upto bits_per_digit in length) | 217 @param b The second source integer |
218 (single digit of upto bits_per_digit in length) | |
193 @param c The destination of "a - b" | 219 @param c The destination of "a - b" |
194 @return CRYPT_OK on success | 220 @return CRYPT_OK on success |
195 */ | 221 */ |
196 int (*subi)(void *a, unsigned long b, void *c); | 222 int (*subi)(void *a, ltc_mp_digit b, void *c); |
197 | 223 |
198 /** multiply two integers | 224 /** multiply two integers |
199 @param a The first source integer | 225 @param a The first source integer |
200 @param b The second source integer (single digit of upto bits_per_digit in length) | 226 @param b The second source integer |
227 (single digit of upto bits_per_digit in length) | |
201 @param c The destination of "a * b" | 228 @param c The destination of "a * b" |
202 @return CRYPT_OK on success | 229 @return CRYPT_OK on success |
203 */ | 230 */ |
204 int (*mul)(void *a, void *b, void *c); | 231 int (*mul)(void *a, void *b, void *c); |
205 | 232 |
206 /** multiply two integers | 233 /** multiply two integers |
207 @param a The first source integer | 234 @param a The first source integer |
208 @param b The second source integer (single digit of upto bits_per_digit in length) | 235 @param b The second source integer |
236 (single digit of upto bits_per_digit in length) | |
209 @param c The destination of "a * b" | 237 @param c The destination of "a * b" |
210 @return CRYPT_OK on success | 238 @return CRYPT_OK on success |
211 */ | 239 */ |
212 int (*muli)(void *a, unsigned long b, void *c); | 240 int (*muli)(void *a, ltc_mp_digit b, void *c); |
213 | 241 |
214 /** Square an integer | 242 /** Square an integer |
215 @param a The integer to square | 243 @param a The integer to square |
216 @param b The destination | 244 @param b The destination |
217 @return CRYPT_OK on success | 245 @return CRYPT_OK on success |
225 @param d The remainder (can be NULL to signify don't care) | 253 @param d The remainder (can be NULL to signify don't care) |
226 @return CRYPT_OK on success | 254 @return CRYPT_OK on success |
227 */ | 255 */ |
228 int (*mpdiv)(void *a, void *b, void *c, void *d); | 256 int (*mpdiv)(void *a, void *b, void *c, void *d); |
229 | 257 |
230 /** divide by two | 258 /** divide by two |
231 @param a The integer to divide (shift right) | 259 @param a The integer to divide (shift right) |
232 @param b The destination | 260 @param b The destination |
233 @return CRYPT_OK on success | 261 @return CRYPT_OK on success |
234 */ | 262 */ |
235 int (*div_2)(void *a, void *b); | 263 int (*div_2)(void *a, void *b); |
236 | 264 |
237 /** Get remainder (small value) | 265 /** Get remainder (small value) |
238 @param a The integer to reduce | 266 @param a The integer to reduce |
239 @param b The modulus (upto bits_per_digit in length) | 267 @param b The modulus (upto bits_per_digit in length) |
240 @param c The destination for the residue | 268 @param c The destination for the residue |
241 @return CRYPT_OK on success | 269 @return CRYPT_OK on success |
242 */ | 270 */ |
243 int (*modi)(void *a, unsigned long b, unsigned long *c); | 271 int (*modi)(void *a, ltc_mp_digit b, ltc_mp_digit *c); |
244 | 272 |
245 /** gcd | 273 /** gcd |
246 @param a The first integer | 274 @param a The first integer |
247 @param b The second integer | 275 @param b The second integer |
248 @param c The destination for (a, b) | 276 @param c The destination for (a, b) |
249 @return CRYPT_OK on success | 277 @return CRYPT_OK on success |
250 */ | 278 */ |
251 int (*gcd)(void *a, void *b, void *c); | 279 int (*gcd)(void *a, void *b, void *c); |
252 | 280 |
253 /** lcm | 281 /** lcm |
254 @param a The first integer | 282 @param a The first integer |
255 @param b The second integer | 283 @param b The second integer |
256 @param c The destination for [a, b] | 284 @param c The destination for [a, b] |
257 @return CRYPT_OK on success | 285 @return CRYPT_OK on success |
258 */ | 286 */ |
259 int (*lcm)(void *a, void *b, void *c); | 287 int (*lcm)(void *a, void *b, void *c); |
260 | 288 |
261 /** Modular multiplication | 289 /** Modular multiplication |
262 @param a The first source | 290 @param a The first source |
263 @param b The second source | 291 @param b The second source |
264 @param c The modulus | 292 @param c The modulus |
265 @param d The destination (a*b mod c) | 293 @param d The destination (a*b mod c) |
266 @return CRYPT_OK on success | 294 @return CRYPT_OK on success |
267 */ | 295 */ |
268 int (*mulmod)(void *a, void *b, void *c, void *d); | 296 int (*mulmod)(void *a, void *b, void *c, void *d); |
275 */ | 303 */ |
276 int (*sqrmod)(void *a, void *b, void *c); | 304 int (*sqrmod)(void *a, void *b, void *c); |
277 | 305 |
278 /** Modular inversion | 306 /** Modular inversion |
279 @param a The value to invert | 307 @param a The value to invert |
280 @param b The modulus | 308 @param b The modulus |
281 @param c The destination (1/a mod b) | 309 @param c The destination (1/a mod b) |
282 @return CRYPT_OK on success | 310 @return CRYPT_OK on success |
283 */ | 311 */ |
284 int (*invmod)(void *, void *, void *); | 312 int (*invmod)(void *, void *, void *); |
285 | 313 |
286 /* ---- reduction ---- */ | 314 /* ---- reduction ---- */ |
287 | 315 |
288 /** setup montgomery | 316 /** setup Montgomery |
289 @param a The modulus | 317 @param a The modulus |
290 @param b The destination for the reduction digit | 318 @param b The destination for the reduction digit |
291 @return CRYPT_OK on success | 319 @return CRYPT_OK on success |
292 */ | 320 */ |
293 int (*montgomery_setup)(void *a, void **b); | 321 int (*montgomery_setup)(void *a, void **b); |
294 | 322 |
295 /** get normalization value | 323 /** get normalization value |
296 @param a The destination for the normalization value | 324 @param a The destination for the normalization value |
297 @param b The modulus | 325 @param b The modulus |
298 @return CRYPT_OK on success | 326 @return CRYPT_OK on success |
299 */ | 327 */ |
300 int (*montgomery_normalization)(void *a, void *b); | 328 int (*montgomery_normalization)(void *a, void *b); |
308 int (*montgomery_reduce)(void *a, void *b, void *c); | 336 int (*montgomery_reduce)(void *a, void *b, void *c); |
309 | 337 |
310 /** clean up (frees memory) | 338 /** clean up (frees memory) |
311 @param a The value "b" from montgomery_setup() | 339 @param a The value "b" from montgomery_setup() |
312 @return CRYPT_OK on success | 340 @return CRYPT_OK on success |
313 */ | 341 */ |
314 void (*montgomery_deinit)(void *a); | 342 void (*montgomery_deinit)(void *a); |
315 | 343 |
316 /* ---- exponentiation ---- */ | 344 /* ---- exponentiation ---- */ |
317 | 345 |
318 /** Modular exponentiation | 346 /** Modular exponentiation |
324 */ | 352 */ |
325 int (*exptmod)(void *a, void *b, void *c, void *d); | 353 int (*exptmod)(void *a, void *b, void *c, void *d); |
326 | 354 |
327 /** Primality testing | 355 /** Primality testing |
328 @param a The integer to test | 356 @param a The integer to test |
329 @param b The destination of the result (FP_YES if prime) | 357 @param b The number of Miller-Rabin tests that shall be executed |
330 @return CRYPT_OK on success | 358 @param c The destination of the result (FP_YES if prime) |
331 */ | 359 @return CRYPT_OK on success |
332 int (*isprime)(void *a, int *b); | 360 */ |
361 int (*isprime)(void *a, int b, int *c); | |
333 | 362 |
334 /* ---- (optional) ecc point math ---- */ | 363 /* ---- (optional) ecc point math ---- */ |
335 | 364 |
336 /** ECC GF(p) point multiplication (from the NIST curves) | 365 /** ECC GF(p) point multiplication (from the NIST curves) |
337 @param k The integer to multiply the point by | 366 @param k The integer to multiply the point by |
338 @param G The point to multiply | 367 @param G The point to multiply |
339 @param R The destination for kG | 368 @param R The destination for kG |
340 @param modulus The modulus for the field | 369 @param modulus The modulus for the field |
341 @param map Boolean indicated whether to map back to affine or not (can be ignored if you work in affine only) | 370 @param map Boolean indicated whether to map back to affine or not |
342 @return CRYPT_OK on success | 371 (can be ignored if you work in affine only) |
343 */ | 372 @return CRYPT_OK on success |
344 int (*ecc_ptmul)(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); | 373 */ |
345 | 374 int (*ecc_ptmul)( void *k, |
346 /** ECC GF(p) point addition | 375 ecc_point *G, |
376 ecc_point *R, | |
377 void *modulus, | |
378 int map); | |
379 | |
380 /** ECC GF(p) point addition | |
347 @param P The first point | 381 @param P The first point |
348 @param Q The second point | 382 @param Q The second point |
349 @param R The destination of P + Q | 383 @param R The destination of P + Q |
350 @param modulus The modulus | 384 @param modulus The modulus |
351 @param mp The "b" value from montgomery_setup() | 385 @param mp The "b" value from montgomery_setup() |
352 @return CRYPT_OK on success | 386 @return CRYPT_OK on success |
353 */ | 387 */ |
354 int (*ecc_ptadd)(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); | 388 int (*ecc_ptadd)(ecc_point *P, |
355 | 389 ecc_point *Q, |
356 /** ECC GF(p) point double | 390 ecc_point *R, |
391 void *modulus, | |
392 void *mp); | |
393 | |
394 /** ECC GF(p) point double | |
357 @param P The first point | 395 @param P The first point |
358 @param R The destination of 2P | 396 @param R The destination of 2P |
359 @param modulus The modulus | 397 @param modulus The modulus |
360 @param mp The "b" value from montgomery_setup() | 398 @param mp The "b" value from montgomery_setup() |
361 @return CRYPT_OK on success | 399 @return CRYPT_OK on success |
362 */ | 400 */ |
363 int (*ecc_ptdbl)(ecc_point *P, ecc_point *R, void *modulus, void *mp); | 401 int (*ecc_ptdbl)(ecc_point *P, |
364 | 402 ecc_point *R, |
365 /** ECC mapping from projective to affine, currently uses (x,y,z) => (x/z^2, y/z^3, 1) | 403 void *modulus, |
404 void *mp); | |
405 | |
406 /** ECC mapping from projective to affine, | |
407 currently uses (x,y,z) => (x/z^2, y/z^3, 1) | |
366 @param P The point to map | 408 @param P The point to map |
367 @param modulus The modulus | 409 @param modulus The modulus |
368 @param mp The "b" value from montgomery_setup() | 410 @param mp The "b" value from montgomery_setup() |
369 @return CRYPT_OK on success | 411 @return CRYPT_OK on success |
370 @remark The mapping can be different but keep in mind a ecc_point only has three | 412 @remark The mapping can be different but keep in mind a |
371 integers (x,y,z) so if you use a different mapping you have to make it fit. | 413 ecc_point only has three integers (x,y,z) so if |
414 you use a different mapping you have to make it fit. | |
372 */ | 415 */ |
373 int (*ecc_map)(ecc_point *P, void *modulus, void *mp); | 416 int (*ecc_map)(ecc_point *P, void *modulus, void *mp); |
374 | 417 |
375 /** Computes kA*A + kB*B = C using Shamir's Trick | 418 /** Computes kA*A + kB*B = C using Shamir's Trick |
376 @param A First point to multiply | 419 @param A First point to multiply |
377 @param kA What to multiple A by | 420 @param kA What to multiple A by |
378 @param B Second point to multiply | 421 @param B Second point to multiply |
379 @param kB What to multiple B by | 422 @param kB What to multiple B by |
380 @param C [out] Destination point (can overlap with A or B | 423 @param C [out] Destination point (can overlap with A or B) |
381 @param modulus Modulus for curve | 424 @param modulus Modulus for curve |
382 @return CRYPT_OK on success | 425 @return CRYPT_OK on success |
383 */ | 426 */ |
384 int (*ecc_mul2add)(ecc_point *A, void *kA, | 427 int (*ecc_mul2add)(ecc_point *A, void *kA, |
385 ecc_point *B, void *kB, | 428 ecc_point *B, void *kB, |
386 ecc_point *C, | 429 ecc_point *C, |
387 void *modulus); | 430 void *modulus); |
388 | 431 |
389 /* ---- (optional) rsa optimized math (for internal CRT) ---- */ | 432 /* ---- (optional) rsa optimized math (for internal CRT) ---- */ |
390 | 433 |
391 /** RSA Key Generation | 434 /** RSA Key Generation |
392 @param prng An active PRNG state | 435 @param prng An active PRNG state |
393 @param wprng The index of the PRNG desired | 436 @param wprng The index of the PRNG desired |
394 @param size The size of the modulus (key size) desired (octets) | 437 @param size The size of the key in octets |
395 @param e The "e" value (public key). e==65537 is a good choice | 438 @param e The "e" value (public key). |
439 e==65537 is a good choice | |
396 @param key [out] Destination of a newly created private key pair | 440 @param key [out] Destination of a newly created private key pair |
397 @return CRYPT_OK if successful, upon error all allocated ram is freed | 441 @return CRYPT_OK if successful, upon error all allocated ram is freed |
398 */ | 442 */ |
399 int (*rsa_keygen)(prng_state *prng, int wprng, int size, long e, rsa_key *key); | 443 int (*rsa_keygen)(prng_state *prng, |
400 | 444 int wprng, |
445 int size, | |
446 long e, | |
447 rsa_key *key); | |
401 | 448 |
402 /** RSA exponentiation | 449 /** RSA exponentiation |
403 @param in The octet array representing the base | 450 @param in The octet array representing the base |
404 @param inlen The length of the input | 451 @param inlen The length of the input |
405 @param out The destination (to be stored in an octet array format) | 452 @param out The destination (to be stored in an octet array format) |
406 @param outlen The length of the output buffer and the resulting size (zero padded to the size of the modulus) | 453 @param outlen The length of the output buffer and the resulting size |
454 (zero padded to the size of the modulus) | |
407 @param which PK_PUBLIC for public RSA and PK_PRIVATE for private RSA | 455 @param which PK_PUBLIC for public RSA and PK_PRIVATE for private RSA |
408 @param key The RSA key to use | 456 @param key The RSA key to use |
409 @return CRYPT_OK on success | 457 @return CRYPT_OK on success |
410 */ | 458 */ |
411 int (*rsa_me)(const unsigned char *in, unsigned long inlen, | 459 int (*rsa_me)(const unsigned char *in, unsigned long inlen, |
412 unsigned char *out, unsigned long *outlen, int which, | 460 unsigned char *out, unsigned long *outlen, int which, |
413 rsa_key *key); | 461 rsa_key *key); |
462 | |
463 /* ---- basic math continued ---- */ | |
464 | |
465 /** Modular addition | |
466 @param a The first source | |
467 @param b The second source | |
468 @param c The modulus | |
469 @param d The destination (a + b mod c) | |
470 @return CRYPT_OK on success | |
471 */ | |
472 int (*addmod)(void *a, void *b, void *c, void *d); | |
473 | |
474 /** Modular substraction | |
475 @param a The first source | |
476 @param b The second source | |
477 @param c The modulus | |
478 @param d The destination (a - b mod c) | |
479 @return CRYPT_OK on success | |
480 */ | |
481 int (*submod)(void *a, void *b, void *c, void *d); | |
482 | |
483 /* ---- misc stuff ---- */ | |
484 | |
485 /** Make a pseudo-random mpi | |
486 @param a The mpi to make random | |
487 @param size The desired length | |
488 @return CRYPT_OK on success | |
489 */ | |
490 int (*rand)(void *a, int size); | |
414 } ltc_math_descriptor; | 491 } ltc_math_descriptor; |
415 | 492 |
416 extern ltc_math_descriptor ltc_mp; | 493 extern ltc_math_descriptor ltc_mp; |
417 | 494 |
418 int ltc_init_multi(void **a, ...); | 495 int ltc_init_multi(void **a, ...); |
419 void ltc_deinit_multi(void *a, ...); | 496 void ltc_deinit_multi(void *a, ...); |
497 void ltc_cleanup_multi(void **a, ...); | |
420 | 498 |
421 #ifdef LTM_DESC | 499 #ifdef LTM_DESC |
422 extern const ltc_math_descriptor ltm_desc; | 500 extern const ltc_math_descriptor ltm_desc; |
423 #endif | 501 #endif |
424 | 502 |
437 /* some handy macros */ | 515 /* some handy macros */ |
438 #define mp_init(a) ltc_mp.init(a) | 516 #define mp_init(a) ltc_mp.init(a) |
439 #define mp_init_multi ltc_init_multi | 517 #define mp_init_multi ltc_init_multi |
440 #define mp_clear(a) ltc_mp.deinit(a) | 518 #define mp_clear(a) ltc_mp.deinit(a) |
441 #define mp_clear_multi ltc_deinit_multi | 519 #define mp_clear_multi ltc_deinit_multi |
520 #define mp_cleanup_multi ltc_cleanup_multi | |
442 #define mp_init_copy(a, b) ltc_mp.init_copy(a, b) | 521 #define mp_init_copy(a, b) ltc_mp.init_copy(a, b) |
443 | 522 |
444 #define mp_neg(a, b) ltc_mp.neg(a, b) | 523 #define mp_neg(a, b) ltc_mp.neg(a, b) |
445 #define mp_copy(a, b) ltc_mp.copy(a, b) | 524 #define mp_copy(a, b) ltc_mp.copy(a, b) |
446 | 525 |
473 #define mp_mod(a, b, c) ltc_mp.mpdiv(a, b, NULL, c) | 552 #define mp_mod(a, b, c) ltc_mp.mpdiv(a, b, NULL, c) |
474 #define mp_mod_d(a, b, c) ltc_mp.modi(a, b, c) | 553 #define mp_mod_d(a, b, c) ltc_mp.modi(a, b, c) |
475 #define mp_gcd(a, b, c) ltc_mp.gcd(a, b, c) | 554 #define mp_gcd(a, b, c) ltc_mp.gcd(a, b, c) |
476 #define mp_lcm(a, b, c) ltc_mp.lcm(a, b, c) | 555 #define mp_lcm(a, b, c) ltc_mp.lcm(a, b, c) |
477 | 556 |
557 #define mp_addmod(a, b, c, d) ltc_mp.addmod(a, b, c, d) | |
558 #define mp_submod(a, b, c, d) ltc_mp.submod(a, b, c, d) | |
478 #define mp_mulmod(a, b, c, d) ltc_mp.mulmod(a, b, c, d) | 559 #define mp_mulmod(a, b, c, d) ltc_mp.mulmod(a, b, c, d) |
479 #define mp_sqrmod(a, b, c) ltc_mp.sqrmod(a, b, c) | 560 #define mp_sqrmod(a, b, c) ltc_mp.sqrmod(a, b, c) |
480 #define mp_invmod(a, b, c) ltc_mp.invmod(a, b, c) | 561 #define mp_invmod(a, b, c) ltc_mp.invmod(a, b, c) |
481 | 562 |
482 #define mp_montgomery_setup(a, b) ltc_mp.montgomery_setup(a, b) | 563 #define mp_montgomery_setup(a, b) ltc_mp.montgomery_setup(a, b) |
483 #define mp_montgomery_normalization(a, b) ltc_mp.montgomery_normalization(a, b) | 564 #define mp_montgomery_normalization(a, b) ltc_mp.montgomery_normalization(a, b) |
484 #define mp_montgomery_reduce(a, b, c) ltc_mp.montgomery_reduce(a, b, c) | 565 #define mp_montgomery_reduce(a, b, c) ltc_mp.montgomery_reduce(a, b, c) |
485 #define mp_montgomery_free(a) ltc_mp.montgomery_deinit(a) | 566 #define mp_montgomery_free(a) ltc_mp.montgomery_deinit(a) |
486 | 567 |
487 #define mp_exptmod(a,b,c,d) ltc_mp.exptmod(a,b,c,d) | 568 #define mp_exptmod(a,b,c,d) ltc_mp.exptmod(a,b,c,d) |
488 #define mp_prime_is_prime(a, b, c) ltc_mp.isprime(a, c) | 569 #define mp_prime_is_prime(a, b, c) ltc_mp.isprime(a, b, c) |
489 | 570 |
490 #define mp_iszero(a) (mp_cmp_d(a, 0) == LTC_MP_EQ ? LTC_MP_YES : LTC_MP_NO) | 571 #define mp_iszero(a) (mp_cmp_d(a, 0) == LTC_MP_EQ ? LTC_MP_YES : LTC_MP_NO) |
491 #define mp_isodd(a) (mp_get_digit_count(a) > 0 ? (mp_get_digit(a, 0) & 1 ? LTC_MP_YES : LTC_MP_NO) : LTC_MP_NO) | 572 #define mp_isodd(a) (mp_get_digit_count(a) > 0 ? (mp_get_digit(a, 0) & 1 ? LTC_MP_YES : LTC_MP_NO) : LTC_MP_NO) |
492 #define mp_exch(a, b) do { void *ABC__tmp = a; a = b; b = ABC__tmp; } while(0); | 573 #define mp_exch(a, b) do { void *ABC__tmp = a; a = b; b = ABC__tmp; } while(0) |
493 | 574 |
494 #define mp_tohex(a, b) mp_toradix(a, b, 16) | 575 #define mp_tohex(a, b) mp_toradix(a, b, 16) |
495 | 576 |
496 #endif | 577 #define mp_rand(a, b) ltc_mp.rand(a, b) |
497 | 578 |
498 /* $Source$ */ | 579 #endif |
499 /* $Revision$ */ | 580 |
500 /* $Date$ */ | 581 /* ref: $Format:%D$ */ |
582 /* git commit: $Format:%H$ */ | |
583 /* commit time: $Format:%ai$ */ |