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$ */