comparison libtomcrypt/src/headers/tomcrypt_math.h @ 382:0cbe8f6dbf9e

propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head 2af22fb4e878750b88f80f90d439b316d229796f) to branch 'au.asn.ucc.matt.dropbear' (head 02c413252c90e9de8e03d91e9939dde3029f5c0a)
author Matt Johnston <matt@ucc.asn.au>
date Thu, 11 Jan 2007 02:41:05 +0000
parents
children a05fb340a95d
comparison
equal deleted inserted replaced
379:b66a00272a90 382:0cbe8f6dbf9e
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 $ */