diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-07 10:40:37 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-07 10:41:04 +0200 |
commit | 115f165b6e3bb74f45e13a65c5f4f82f28664a2c (patch) | |
tree | ec55b63c736b5bef6061202c8bd31b08796fa2dc /libtomcrypt/pk/dsa/dsa_make_key.c | |
parent | 58a20b797e5a987fc8f7c5bea3be24d754908bf5 (diff) | |
download | cryptodev-linux-115f165b6e3bb74f45e13a65c5f4f82f28664a2c.tar.gz cryptodev-linux-115f165b6e3bb74f45e13a65c5f4f82f28664a2c.tar.xz cryptodev-linux-115f165b6e3bb74f45e13a65c5f4f82f28664a2c.zip |
Added a modified libtomcrypt with DSA and RSA algorithms.
Diffstat (limited to 'libtomcrypt/pk/dsa/dsa_make_key.c')
-rw-r--r-- | libtomcrypt/pk/dsa/dsa_make_key.c | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/libtomcrypt/pk/dsa/dsa_make_key.c b/libtomcrypt/pk/dsa/dsa_make_key.c index ee33be0..7a6b516 100644 --- a/libtomcrypt/pk/dsa/dsa_make_key.c +++ b/libtomcrypt/pk/dsa/dsa_make_key.c @@ -26,12 +26,11 @@ */ int dsa_make_key(int group_size, int modulus_size, dsa_key *key) { - void *tmp, *tmp2; + mp_int tmp, tmp2; int err, res; unsigned char *buf; LTC_ARGCHK(key != NULL); - LTC_ARGCHK(ltc_mp.name != NULL); /* check size */ if (group_size >= LTC_MDSA_MAX_GROUP || group_size <= 15 || @@ -52,10 +51,10 @@ int dsa_make_key(int group_size, int modulus_size, dsa_key *key) } /* make our prime q */ - if ((err = rand_prime(key->q, group_size)) != CRYPT_OK) { goto error; } + if ((err = rand_prime(&key->q, group_size)) != CRYPT_OK) { goto error; } /* double q */ - if ((err = mp_add(key->q, key->q, tmp)) != CRYPT_OK) { goto error; } + if ((err = mp_add(&key->q, &key->q, &tmp)) != CRYPT_OK) { goto error; } /* now make a random string and multply it against q */ get_random_bytes(buf+1, modulus_size - group_size); @@ -66,30 +65,30 @@ int dsa_make_key(int group_size, int modulus_size, dsa_key *key) /* force even */ buf[modulus_size - group_size - 1] &= ~1; - if ((err = mp_read_unsigned_bin(tmp2, buf, modulus_size - group_size)) != CRYPT_OK) { goto error; } - if ((err = mp_mul(key->q, tmp2, key->p)) != CRYPT_OK) { goto error; } - if ((err = mp_add_d(key->p, 1, key->p)) != CRYPT_OK) { goto error; } + if ((err = mp_read_unsigned_bin(&tmp2, buf, modulus_size - group_size)) != CRYPT_OK) { goto error; } + if ((err = mp_mul(&key->q, &tmp2, &key->p)) != CRYPT_OK) { goto error; } + if ((err = mp_add_d(&key->p, 1, &key->p)) != CRYPT_OK) { goto error; } /* now loop until p is prime */ for (;;) { - if ((err = mp_prime_is_prime(key->p, 8, &res)) != CRYPT_OK) { goto error; } + if ((err = mp_prime_is_prime(&key->p, 8, &res)) != CRYPT_OK) { goto error; } if (res == LTC_MP_YES) break; /* add 2q to p and 2 to tmp2 */ - if ((err = mp_add(tmp, key->p, key->p)) != CRYPT_OK) { goto error; } - if ((err = mp_add_d(tmp2, 2, tmp2)) != CRYPT_OK) { goto error; } + if ((err = mp_add(&tmp, &key->p, &key->p)) != CRYPT_OK) { goto error; } + if ((err = mp_add_d(&tmp2, 2, &tmp2)) != CRYPT_OK) { goto error; } } /* now p = (q * tmp2) + 1 is prime, find a value g for which g^tmp2 != 1 */ - mp_set(key->g, 1); + mp_set(&key->g, 1); do { - if ((err = mp_add_d(key->g, 1, key->g)) != CRYPT_OK) { goto error; } - if ((err = mp_exptmod(key->g, tmp2, key->p, tmp)) != CRYPT_OK) { goto error; } - } while (mp_cmp_d(tmp, 1) == LTC_MP_EQ); + if ((err = mp_add_d(&key->g, 1, &key->g)) != CRYPT_OK) { goto error; } + if ((err = mp_exptmod(&key->g, &tmp2, &key->p, &tmp)) != CRYPT_OK) { goto error; } + } while (mp_cmp_d(&tmp, 1) == LTC_MP_EQ); /* at this point tmp generates a group of order q mod p */ - mp_exch(tmp, key->g); + mp_exch(&tmp, &key->g); /* so now we have our DH structure, generator g, order q, modulus p Now we need a random exponent [mod q] and it's power g^x mod p @@ -97,9 +96,9 @@ int dsa_make_key(int group_size, int modulus_size, dsa_key *key) do { get_random_bytes(buf, group_size); - if ((err = mp_read_unsigned_bin(key->x, buf, group_size)) != CRYPT_OK) { goto error; } - } while (mp_cmp_d(key->x, 1) != LTC_MP_GT); - if ((err = mp_exptmod(key->g, key->x, key->p, key->y)) != CRYPT_OK) { goto error; } + if ((err = mp_read_unsigned_bin(&key->x, buf, group_size)) != CRYPT_OK) { goto error; } + } while (mp_cmp_d(&key->x, 1) != LTC_MP_GT); + if ((err = mp_exptmod(&key->g, &key->x, &key->p, &key->y)) != CRYPT_OK) { goto error; } key->type = PK_PRIVATE; key->qord = group_size; @@ -111,9 +110,9 @@ int dsa_make_key(int group_size, int modulus_size, dsa_key *key) err = CRYPT_OK; goto done; error: - mp_clear_multi(key->g, key->q, key->p, key->x, key->y, NULL); + mp_clear_multi(&key->g, &key->q, &key->p, &key->x, &key->y, NULL); done: - mp_clear_multi(tmp, tmp2, NULL); + mp_clear_multi(&tmp, &tmp2, NULL); XFREE(buf); return err; } |