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 {