380
|
1 /** math functions **/ |
|
2 |
|
3 #define LTC_MP_LT -1 |
|
4 #define LTC_MP_EQ 0 |
|
5 #define LTC_MP_GT 1 |
|
6 |
|
7 #define LTC_MP_NO 0 |
|
8 #define LTC_MP_YES 1 |
|
9 |
|
10 #ifndef MECC |
|
11 typedef void ecc_point; |
|
12 #endif |
|
13 |
|
14 #ifndef MRSA |
|
15 typedef void rsa_key; |
|
16 #endif |
|
17 |
|
18 /** math descriptor */ |
|
19 typedef struct { |
|
20 /** Name of the math provider */ |
|
21 char *name; |
|
22 |
|
23 /** Bits per digit, amount of bits must fit in an unsigned long */ |
|
24 int bits_per_digit; |
|
25 |
|
26 /* ---- init/deinit functions ---- */ |
|
27 |
|
28 /** initialize a bignum |
|
29 @param a The number to initialize |
|
30 @return CRYPT_OK on success |
|
31 */ |
|
32 int (*init)(void **a); |
|
33 |
|
34 /** init copy |
|
35 @param dst The number to initialize and write to |
|
36 @param src The number to copy from |
|
37 @return CRYPT_OK on success |
|
38 */ |
|
39 int (*init_copy)(void **dst, void *src); |
|
40 |
|
41 /** deinit |
|
42 @param a The number to free |
|
43 @return CRYPT_OK on success |
|
44 */ |
|
45 void (*deinit)(void *a); |
|
46 |
|
47 /* ---- data movement ---- */ |
|
48 |
|
49 /** negate |
|
50 @param src The number to negate |
|
51 @param dst The destination |
|
52 @return CRYPT_OK on success |
|
53 */ |
|
54 int (*neg)(void *src, void *dst); |
|
55 |
|
56 /** copy |
|
57 @param src The number to copy from |
|
58 @param dst The number to write to |
|
59 @return CRYPT_OK on success |
|
60 */ |
|
61 int (*copy)(void *src, void *dst); |
|
62 |
|
63 /* ---- trivial low level functions ---- */ |
|
64 |
|
65 /** set small constant |
|
66 @param a Number to write to |
|
67 @param n Source upto bits_per_digit (actually meant for very small constants) |
|
68 @return CRYPT_OK on succcess |
|
69 */ |
|
70 int (*set_int)(void *a, unsigned long n); |
|
71 |
|
72 /** get small constant |
|
73 @param a Number to read, only fetches upto bits_per_digit from the number |
|
74 @return The lower bits_per_digit of the integer (unsigned) |
|
75 */ |
|
76 unsigned long (*get_int)(void *a); |
|
77 |
|
78 /** get digit n |
|
79 @param a The number to read from |
|
80 @param n The number of the digit to fetch |
|
81 @return The bits_per_digit sized n'th digit of a |
|
82 */ |
|
83 unsigned long (*get_digit)(void *a, int n); |
|
84 |
|
85 /** Get the number of digits that represent the number |
|
86 @param a The number to count |
|
87 @return The number of digits used to represent the number |
|
88 */ |
|
89 int (*get_digit_count)(void *a); |
|
90 |
|
91 /** compare two integers |
|
92 @param a The left side integer |
|
93 @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) |
|
95 */ |
|
96 int (*compare)(void *a, void *b); |
|
97 |
|
98 /** compare against int |
|
99 @param a The left side integer |
|
100 @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) |
|
102 */ |
|
103 int (*compare_d)(void *a, unsigned long n); |
|
104 |
|
105 /** Count the number of bits used to represent the integer |
|
106 @param a The integer to count |
|
107 @return The number of bits required to represent the integer |
|
108 */ |
|
109 int (*count_bits)(void * a); |
|
110 |
|
111 /** Count the number of LSB bits which are zero |
|
112 @param a The integer to count |
|
113 @return The number of contiguous zero LSB bits |
|
114 */ |
|
115 int (*count_lsb_bits)(void *a); |
|
116 |
|
117 /** Compute a power of two |
|
118 @param a The integer to store the power in |
|
119 @param n The power of two you want to store (a = 2^n) |
|
120 @return CRYPT_OK on success |
|
121 */ |
|
122 int (*twoexpt)(void *a , int n); |
|
123 |
|
124 /* ---- radix conversions ---- */ |
|
125 |
|
126 /** read ascii string |
|
127 @param a The integer to store into |
|
128 @param str The string to read |
|
129 @param radix The radix the integer has been represented in (2-64) |
|
130 @return CRYPT_OK on success |
|
131 */ |
|
132 int (*read_radix)(void *a, const char *str, int radix); |
|
133 |
|
134 /** write number to string |
|
135 @param a The integer to store |
|
136 @param str The destination for the string |
|
137 @param radix The radix the integer is to be represented in (2-64) |
|
138 @return CRYPT_OK on success |
|
139 */ |
|
140 int (*write_radix)(void *a, char *str, int radix); |
|
141 |
|
142 /** get size as unsigned char string |
|
143 @param a The integer to get the size (when stored in array of octets) |
|
144 @return The length of the integer |
|
145 */ |
|
146 unsigned long (*unsigned_size)(void *a); |
|
147 |
|
148 /** store an integer as an array of octets |
|
149 @param src The integer to store |
|
150 @param dst The buffer to store the integer in |
|
151 @return CRYPT_OK on success |
|
152 */ |
|
153 int (*unsigned_write)(void *src, unsigned char *dst); |
|
154 |
|
155 /** read an array of octets and store as integer |
|
156 @param dst The integer to load |
|
157 @param src The array of octets |
|
158 @param len The number of octets |
|
159 @return CRYPT_OK on success |
|
160 */ |
|
161 int (*unsigned_read)(void *dst, unsigned char *src, unsigned long len); |
|
162 |
|
163 /* ---- basic math ---- */ |
|
164 |
|
165 /** add two integers |
|
166 @param a The first source integer |
|
167 @param b The second source integer |
|
168 @param c The destination of "a + b" |
|
169 @return CRYPT_OK on success |
|
170 */ |
|
171 int (*add)(void *a, void *b, void *c); |
|
172 |
|
173 |
|
174 /** add two integers |
|
175 @param a The first source integer |
|
176 @param b The second source integer (single digit of upto bits_per_digit in length) |
|
177 @param c The destination of "a + b" |
|
178 @return CRYPT_OK on success |
|
179 */ |
|
180 int (*addi)(void *a, unsigned long b, void *c); |
|
181 |
|
182 /** subtract two integers |
|
183 @param a The first source integer |
|
184 @param b The second source integer |
|
185 @param c The destination of "a - b" |
|
186 @return CRYPT_OK on success |
|
187 */ |
|
188 int (*sub)(void *a, void *b, void *c); |
|
189 |
|
190 /** subtract two integers |
|
191 @param a The first source integer |
|
192 @param b The second source integer (single digit of upto bits_per_digit in length) |
|
193 @param c The destination of "a - b" |
|
194 @return CRYPT_OK on success |
|
195 */ |
|
196 int (*subi)(void *a, unsigned long b, void *c); |
|
197 |
|
198 /** multiply two integers |
|
199 @param a The first source integer |
|
200 @param b The second source integer (single digit of upto bits_per_digit in length) |
|
201 @param c The destination of "a * b" |
|
202 @return CRYPT_OK on success |
|
203 */ |
|
204 int (*mul)(void *a, void *b, void *c); |
|
205 |
|
206 /** multiply two integers |
|
207 @param a The first source integer |
|
208 @param b The second source integer (single digit of upto bits_per_digit in length) |
|
209 @param c The destination of "a * b" |
|
210 @return CRYPT_OK on success |
|
211 */ |
|
212 int (*muli)(void *a, unsigned long b, void *c); |
|
213 |
|
214 /** Square an integer |
|
215 @param a The integer to square |
|
216 @param b The destination |
|
217 @return CRYPT_OK on success |
|
218 */ |
|
219 int (*sqr)(void *a, void *b); |
|
220 |
|
221 /** Divide an integer |
|
222 @param a The dividend |
|
223 @param b The divisor |
|
224 @param c The quotient (can be NULL to signify don't care) |
|
225 @param d The remainder (can be NULL to signify don't care) |
|
226 @return CRYPT_OK on success |
|
227 */ |
|
228 int (*mpdiv)(void *a, void *b, void *c, void *d); |
|
229 |
|
230 /** divide by two |
|
231 @param a The integer to divide (shift right) |
|
232 @param b The destination |
|
233 @return CRYPT_OK on success |
|
234 */ |
|
235 int (*div_2)(void *a, void *b); |
|
236 |
|
237 /** Get remainder (small value) |
|
238 @param a The integer to reduce |
|
239 @param b The modulus (upto bits_per_digit in length) |
|
240 @param c The destination for the residue |
|
241 @return CRYPT_OK on success |
|
242 */ |
|
243 int (*modi)(void *a, unsigned long b, unsigned long *c); |
|
244 |
|
245 /** gcd |
|
246 @param a The first integer |
|
247 @param b The second integer |
|
248 @param c The destination for (a, b) |
|
249 @return CRYPT_OK on success |
|
250 */ |
|
251 int (*gcd)(void *a, void *b, void *c); |
|
252 |
|
253 /** lcm |
|
254 @param a The first integer |
|
255 @param b The second integer |
|
256 @param c The destination for [a, b] |
|
257 @return CRYPT_OK on success |
|
258 */ |
|
259 int (*lcm)(void *a, void *b, void *c); |
|
260 |
|
261 /** Modular multiplication |
|
262 @param a The first source |
|
263 @param b The second source |
|
264 @param c The modulus |
|
265 @param d The destination (a*b mod c) |
|
266 @return CRYPT_OK on success |
|
267 */ |
|
268 int (*mulmod)(void *a, void *b, void *c, void *d); |
|
269 |
|
270 /** Modular squaring |
|
271 @param a The first source |
|
272 @param b The modulus |
|
273 @param c The destination (a*a mod b) |
|
274 @return CRYPT_OK on success |
|
275 */ |
|
276 int (*sqrmod)(void *a, void *b, void *c); |
|
277 |
|
278 /** Modular inversion |
|
279 @param a The value to invert |
|
280 @param b The modulus |
|
281 @param c The destination (1/a mod b) |
|
282 @return CRYPT_OK on success |
|
283 */ |
|
284 int (*invmod)(void *, void *, void *); |
|
285 |
|
286 /* ---- reduction ---- */ |
|
287 |
|
288 /** setup montgomery |
|
289 @param a The modulus |
|
290 @param b The destination for the reduction digit |
|
291 @return CRYPT_OK on success |
|
292 */ |
|
293 int (*montgomery_setup)(void *a, void **b); |
|
294 |
|
295 /** get normalization value |
|
296 @param a The destination for the normalization value |
|
297 @param b The modulus |
|
298 @return CRYPT_OK on success |
|
299 */ |
|
300 int (*montgomery_normalization)(void *a, void *b); |
|
301 |
|
302 /** reduce a number |
|
303 @param a The number [and dest] to reduce |
|
304 @param b The modulus |
|
305 @param c The value "b" from montgomery_setup() |
|
306 @return CRYPT_OK on success |
|
307 */ |
|
308 int (*montgomery_reduce)(void *a, void *b, void *c); |
|
309 |
|
310 /** clean up (frees memory) |
|
311 @param a The value "b" from montgomery_setup() |
|
312 @return CRYPT_OK on success |
|
313 */ |
|
314 void (*montgomery_deinit)(void *a); |
|
315 |
|
316 /* ---- exponentiation ---- */ |
|
317 |
|
318 /** Modular exponentiation |
|
319 @param a The base integer |
|
320 @param b The power (can be negative) integer |
|
321 @param c The modulus integer |
|
322 @param d The destination |
|
323 @return CRYPT_OK on success |
|
324 */ |
|
325 int (*exptmod)(void *a, void *b, void *c, void *d); |
|
326 |
|
327 /** Primality testing |
|
328 @param a The integer to test |
|
329 @param b The destination of the result (FP_YES if prime) |
|
330 @return CRYPT_OK on success |
|
331 */ |
|
332 int (*isprime)(void *a, int *b); |
|
333 |
|
334 /* ---- (optional) ecc point math ---- */ |
|
335 |
|
336 /** ECC GF(p) point multiplication (from the NIST curves) |
|
337 @param k The integer to multiply the point by |
|
338 @param G The point to multiply |
|
339 @param R The destination for kG |
|
340 @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) |
|
342 @return CRYPT_OK on success |
|
343 */ |
|
344 int (*ecc_ptmul)(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); |
|
345 |
|
346 /** ECC GF(p) point addition |
|
347 @param P The first point |
|
348 @param Q The second point |
|
349 @param R The destination of P + Q |
|
350 @param modulus The modulus |
|
351 @param mp The "b" value from montgomery_setup() |
|
352 @return CRYPT_OK on success |
|
353 */ |
|
354 int (*ecc_ptadd)(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); |
|
355 |
|
356 /** ECC GF(p) point double |
|
357 @param P The first point |
|
358 @param R The destination of 2P |
|
359 @param modulus The modulus |
|
360 @param mp The "b" value from montgomery_setup() |
|
361 @return CRYPT_OK on success |
|
362 */ |
|
363 int (*ecc_ptdbl)(ecc_point *P, ecc_point *R, void *modulus, void *mp); |
|
364 |
|
365 /** ECC mapping from projective to affine, currently uses (x,y,z) => (x/z^2, y/z^3, 1) |
|
366 @param P The point to map |
|
367 @param modulus The modulus |
|
368 @param mp The "b" value from montgomery_setup() |
|
369 @return CRYPT_OK on success |
|
370 @remark The mapping can be different but keep in mind a ecc_point only has three |
|
371 integers (x,y,z) so if you use a different mapping you have to make it fit. |
|
372 */ |
|
373 int (*ecc_map)(ecc_point *P, void *modulus, void *mp); |
|
374 |
|
375 /** Computes kA*A + kB*B = C using Shamir's Trick |
|
376 @param A First point to multiply |
|
377 @param kA What to multiple A by |
|
378 @param B Second point to multiply |
|
379 @param kB What to multiple B by |
|
380 @param C [out] Destination point (can overlap with A or B |
|
381 @param modulus Modulus for curve |
|
382 @return CRYPT_OK on success |
|
383 */ |
|
384 int (*ecc_mul2add)(ecc_point *A, void *kA, |
|
385 ecc_point *B, void *kB, |
|
386 ecc_point *C, |
|
387 void *modulus); |
|
388 |
|
389 /* ---- (optional) rsa optimized math (for internal CRT) ---- */ |
|
390 |
|
391 /** RSA Key Generation |
|
392 @param prng An active PRNG state |
|
393 @param wprng The index of the PRNG desired |
|
394 @param size The size of the modulus (key size) desired (octets) |
|
395 @param e The "e" value (public key). e==65537 is a good choice |
|
396 @param key [out] Destination of a newly created private key pair |
|
397 @return CRYPT_OK if successful, upon error all allocated ram is freed |
|
398 */ |
|
399 int (*rsa_keygen)(prng_state *prng, int wprng, int size, long e, rsa_key *key); |
|
400 |
|
401 |
|
402 /** RSA exponentiation |
|
403 @param in The octet array representing the base |
|
404 @param inlen The length of the input |
|
405 @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) |
|
407 @param which PK_PUBLIC for public RSA and PK_PRIVATE for private RSA |
|
408 @param key The RSA key to use |
|
409 @return CRYPT_OK on success |
|
410 */ |
|
411 int (*rsa_me)(const unsigned char *in, unsigned long inlen, |
|
412 unsigned char *out, unsigned long *outlen, int which, |
|
413 rsa_key *key); |
|
414 } ltc_math_descriptor; |
|
415 |
|
416 extern ltc_math_descriptor ltc_mp; |
|
417 |
|
418 int ltc_init_multi(void **a, ...); |
|
419 void ltc_deinit_multi(void *a, ...); |
|
420 |
|
421 #ifdef LTM_DESC |
|
422 extern const ltc_math_descriptor ltm_desc; |
|
423 #endif |
|
424 |
|
425 #ifdef TFM_DESC |
|
426 extern const ltc_math_descriptor tfm_desc; |
|
427 #endif |
|
428 |
|
429 #ifdef GMP_DESC |
|
430 extern const ltc_math_descriptor gmp_desc; |
|
431 #endif |
|
432 |
|
433 #if !defined(DESC_DEF_ONLY) && defined(LTC_SOURCE) |
|
434 |
|
435 #define MP_DIGIT_BIT ltc_mp.bits_per_digit |
|
436 |
|
437 /* some handy macros */ |
|
438 #define mp_init(a) ltc_mp.init(a) |
|
439 #define mp_init_multi ltc_init_multi |
|
440 #define mp_clear(a) ltc_mp.deinit(a) |
|
441 #define mp_clear_multi ltc_deinit_multi |
|
442 #define mp_init_copy(a, b) ltc_mp.init_copy(a, b) |
|
443 |
|
444 #define mp_neg(a, b) ltc_mp.neg(a, b) |
|
445 #define mp_copy(a, b) ltc_mp.copy(a, b) |
|
446 |
|
447 #define mp_set(a, b) ltc_mp.set_int(a, b) |
|
448 #define mp_set_int(a, b) ltc_mp.set_int(a, b) |
|
449 #define mp_get_int(a) ltc_mp.get_int(a) |
|
450 #define mp_get_digit(a, n) ltc_mp.get_digit(a, n) |
|
451 #define mp_get_digit_count(a) ltc_mp.get_digit_count(a) |
|
452 #define mp_cmp(a, b) ltc_mp.compare(a, b) |
|
453 #define mp_cmp_d(a, b) ltc_mp.compare_d(a, b) |
|
454 #define mp_count_bits(a) ltc_mp.count_bits(a) |
|
455 #define mp_cnt_lsb(a) ltc_mp.count_lsb_bits(a) |
|
456 #define mp_2expt(a, b) ltc_mp.twoexpt(a, b) |
|
457 |
|
458 #define mp_read_radix(a, b, c) ltc_mp.read_radix(a, b, c) |
|
459 #define mp_toradix(a, b, c) ltc_mp.write_radix(a, b, c) |
|
460 #define mp_unsigned_bin_size(a) ltc_mp.unsigned_size(a) |
|
461 #define mp_to_unsigned_bin(a, b) ltc_mp.unsigned_write(a, b) |
|
462 #define mp_read_unsigned_bin(a, b, c) ltc_mp.unsigned_read(a, b, c) |
|
463 |
|
464 #define mp_add(a, b, c) ltc_mp.add(a, b, c) |
|
465 #define mp_add_d(a, b, c) ltc_mp.addi(a, b, c) |
|
466 #define mp_sub(a, b, c) ltc_mp.sub(a, b, c) |
|
467 #define mp_sub_d(a, b, c) ltc_mp.subi(a, b, c) |
|
468 #define mp_mul(a, b, c) ltc_mp.mul(a, b, c) |
|
469 #define mp_mul_d(a, b, c) ltc_mp.muli(a, b, c) |
|
470 #define mp_sqr(a, b) ltc_mp.sqr(a, b) |
|
471 #define mp_div(a, b, c, d) ltc_mp.mpdiv(a, b, c, d) |
|
472 #define mp_div_2(a, b) ltc_mp.div_2(a, b) |
|
473 #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) |
|
475 #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) |
|
477 |
|
478 #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) |
|
480 #define mp_invmod(a, b, c) ltc_mp.invmod(a, b, c) |
|
481 |
|
482 #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) |
|
484 #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) |
|
486 |
|
487 #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) |
|
489 |
|
490 #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) |
|
492 #define mp_exch(a, b) do { void *ABC__tmp = a; a = b; b = ABC__tmp; } while(0); |
|
493 |
|
494 #define mp_tohex(a, b) mp_toradix(a, b, 16) |
|
495 |
|
496 #endif |
|
497 |
|
498 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_math.h,v $ */ |
|
499 /* $Revision: 1.43 $ */ |
|
500 /* $Date: 2006/12/02 19:23:13 $ */ |