Mercurial > dropbear
comparison dh.c @ 143:5d99163f7e32 libtomcrypt-orig
import of libtomcrypt 0.99
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sun, 19 Dec 2004 11:34:45 +0000 |
parents | 7faae8f46238 |
children |
comparison
equal
deleted
inserted
replaced
15:6362d3854bb4 | 143:5d99163f7e32 |
---|---|
9 * Tom St Denis, [email protected], http://libtomcrypt.org | 9 * Tom St Denis, [email protected], http://libtomcrypt.org |
10 */ | 10 */ |
11 #include "mycrypt.h" | 11 #include "mycrypt.h" |
12 | 12 |
13 #ifdef MDH | 13 #ifdef MDH |
14 | |
15 /* max export size we'll encounter (smaller than this but lets round up a bit */ | |
16 #define DH_BUF_SIZE 1200 | |
14 | 17 |
15 /* This holds the key settings. ***MUST*** be organized by size from smallest to largest. */ | 18 /* This holds the key settings. ***MUST*** be organized by size from smallest to largest. */ |
16 static const struct { | 19 static const struct { |
17 int size; | 20 int size; |
18 char *name, *base, *prime; | 21 char *name, *base, *prime; |
224 } | 227 } |
225 } | 228 } |
226 | 229 |
227 int dh_make_key(prng_state *prng, int wprng, int keysize, dh_key *key) | 230 int dh_make_key(prng_state *prng, int wprng, int keysize, dh_key *key) |
228 { | 231 { |
229 unsigned char buf[512]; | 232 unsigned char *buf; |
230 unsigned long x; | 233 unsigned long x; |
231 mp_int p, g; | 234 mp_int p, g; |
232 int err; | 235 int err; |
233 | 236 |
234 _ARGCHK(key != NULL); | 237 _ARGCHK(key != NULL); |
249 if (sets[x].size == 0) { | 252 if (sets[x].size == 0) { |
250 return CRYPT_INVALID_KEYSIZE; | 253 return CRYPT_INVALID_KEYSIZE; |
251 } | 254 } |
252 key->idx = x; | 255 key->idx = x; |
253 | 256 |
257 /* allocate buffer */ | |
258 buf = XMALLOC(keysize); | |
259 if (buf == NULL) { | |
260 return CRYPT_MEM; | |
261 } | |
262 | |
254 /* make up random string */ | 263 /* make up random string */ |
255 if (prng_descriptor[wprng].read(buf, keysize, prng) != (unsigned long)keysize) { | 264 if (prng_descriptor[wprng].read(buf, keysize, prng) != (unsigned long)keysize) { |
256 return CRYPT_ERROR_READPRNG; | 265 err = CRYPT_ERROR_READPRNG; |
266 goto error2; | |
257 } | 267 } |
258 | 268 |
259 /* init parameters */ | 269 /* init parameters */ |
260 if ((err = mp_init_multi(&g, &p, &key->x, &key->y, NULL)) != MP_OKAY) { | 270 if ((err = mp_init_multi(&g, &p, &key->x, &key->y, NULL)) != MP_OKAY) { |
261 return mpi_to_ltc_error(err); | 271 goto error; |
262 } | 272 } |
263 if ((err = mp_read_radix(&g, sets[key->idx].base, 64)) != MP_OKAY) { goto error; } | 273 if ((err = mp_read_radix(&g, sets[key->idx].base, 64)) != MP_OKAY) { goto error; } |
264 if ((err = mp_read_radix(&p, sets[key->idx].prime, 64)) != MP_OKAY) { goto error; } | 274 if ((err = mp_read_radix(&p, sets[key->idx].prime, 64)) != MP_OKAY) { goto error; } |
265 | 275 |
266 /* load the x value */ | 276 /* load the x value */ |
274 /* free up ram */ | 284 /* free up ram */ |
275 err = CRYPT_OK; | 285 err = CRYPT_OK; |
276 goto done; | 286 goto done; |
277 error: | 287 error: |
278 err = mpi_to_ltc_error(err); | 288 err = mpi_to_ltc_error(err); |
289 error2: | |
279 mp_clear_multi(&key->x, &key->y, NULL); | 290 mp_clear_multi(&key->x, &key->y, NULL); |
280 done: | 291 done: |
292 #ifdef CLEAN_STACK | |
293 zeromem(buf, keysize); | |
294 #endif | |
281 mp_clear_multi(&p, &g, NULL); | 295 mp_clear_multi(&p, &g, NULL); |
282 zeromem(buf, sizeof(buf)); | 296 XFREE(buf); |
283 return err; | 297 return err; |
284 } | 298 } |
285 | 299 |
286 void dh_free(dh_key *key) | 300 void dh_free(dh_key *key) |
287 { | 301 { |