summaryrefslogtreecommitdiffstats
path: root/libtomcrypt/pk/dsa
diff options
context:
space:
mode:
Diffstat (limited to 'libtomcrypt/pk/dsa')
-rw-r--r--libtomcrypt/pk/dsa/dsa_decrypt_key.c139
-rw-r--r--libtomcrypt/pk/dsa/dsa_encrypt_key.c125
-rw-r--r--libtomcrypt/pk/dsa/dsa_free.c2
-rw-r--r--libtomcrypt/pk/dsa/dsa_import.c7
-rw-r--r--libtomcrypt/pk/dsa/dsa_make_key.c39
-rw-r--r--libtomcrypt/pk/dsa/dsa_shared_secret.c72
-rw-r--r--libtomcrypt/pk/dsa/dsa_sign_hash.c38
-rw-r--r--libtomcrypt/pk/dsa/dsa_verify_hash.c36
-rw-r--r--libtomcrypt/pk/dsa/dsa_verify_key.c28
9 files changed, 74 insertions, 412 deletions
diff --git a/libtomcrypt/pk/dsa/dsa_decrypt_key.c b/libtomcrypt/pk/dsa/dsa_decrypt_key.c
deleted file mode 100644
index 0e193a6..0000000
--- a/libtomcrypt/pk/dsa/dsa_decrypt_key.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/* LibTomCrypt, modular cryptographic library -- Tom St Denis
- *
- * LibTomCrypt is a library that provides various cryptographic
- * algorithms in a highly modular and flexible manner.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- *
- * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
- */
-#include "tomcrypt.h"
-
-/**
- @file dsa_decrypt_key.c
- DSA Crypto, Tom St Denis
-*/
-
-#ifdef LTC_MDSA
-
-/**
- Decrypt an DSA encrypted key
- @param in The ciphertext
- @param inlen The length of the ciphertext (octets)
- @param out [out] The plaintext
- @param outlen [in/out] The max size and resulting size of the plaintext
- @param key The corresponding private DSA key
- @return CRYPT_OK if successful
-*/
-int dsa_decrypt_key(const unsigned char *in, unsigned long inlen,
- unsigned char *out, unsigned long *outlen,
- dsa_key *key)
-{
- unsigned char *skey, *expt;
- void *g_pub;
- unsigned long x, y, hashOID[32];
- int hash, err;
- ltc_asn1_list decode[3];
-
- LTC_ARGCHK(in != NULL);
- LTC_ARGCHK(out != NULL);
- LTC_ARGCHK(outlen != NULL);
- LTC_ARGCHK(key != NULL);
-
- /* right key type? */
- if (key->type != PK_PRIVATE) {
- return CRYPT_PK_NOT_PRIVATE;
- }
-
- /* decode to find out hash */
- LTC_SET_ASN1(decode, 0, LTC_ASN1_OBJECT_IDENTIFIER, hashOID, sizeof(hashOID)/sizeof(hashOID[0]));
-
- if ((err = der_decode_sequence(in, inlen, decode, 1)) != CRYPT_OK) {
- return err;
- }
-
- hash = find_hash_oid(hashOID, decode[0].size);
- if (hash_is_valid(hash) != CRYPT_OK) {
- return CRYPT_INVALID_PACKET;
- }
-
- /* we now have the hash! */
-
- if ((err = mp_init(&g_pub)) != CRYPT_OK) {
- return err;
- }
-
- /* allocate memory */
- expt = XMALLOC(mp_unsigned_bin_size(key->p) + 1);
- skey = XMALLOC(MAXBLOCKSIZE);
- if (expt == NULL || skey == NULL) {
- if (expt != NULL) {
- XFREE(expt);
- }
- if (skey != NULL) {
- XFREE(skey);
- }
- mp_clear(g_pub);
- return CRYPT_MEM;
- }
-
- LTC_SET_ASN1(decode, 1, LTC_ASN1_INTEGER, g_pub, 1UL);
- LTC_SET_ASN1(decode, 2, LTC_ASN1_OCTET_STRING, skey, MAXBLOCKSIZE);
-
- /* read the structure in now */
- if ((err = der_decode_sequence(in, inlen, decode, 3)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- /* make shared key */
- x = mp_unsigned_bin_size(key->p) + 1;
- if ((err = dsa_shared_secret(key->x, g_pub, key, expt, &x)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- y = MIN(mp_unsigned_bin_size(key->p) + 1, MAXBLOCKSIZE);
- if ((err = hash_memory(hash, expt, x, expt, &y)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- /* ensure the hash of the shared secret is at least as big as the encrypt itself */
- if (decode[2].size > y) {
- err = CRYPT_INVALID_PACKET;
- goto LBL_ERR;
- }
-
- /* avoid buffer overflow */
- if (*outlen < decode[2].size) {
- *outlen = decode[2].size;
- err = CRYPT_BUFFER_OVERFLOW;
- goto LBL_ERR;
- }
-
- /* Decrypt the key */
- for (x = 0; x < decode[2].size; x++) {
- out[x] = expt[x] ^ skey[x];
- }
- *outlen = x;
-
- err = CRYPT_OK;
-LBL_ERR:
-#ifdef LTC_CLEAN_STACK
- zeromem(expt, mp_unsigned_bin_size(key->p) + 1);
- zeromem(skey, MAXBLOCKSIZE);
-#endif
-
- XFREE(expt);
- XFREE(skey);
-
- mp_clear(g_pub);
-
- return err;
-}
-
-#endif
-
-/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_decrypt_key.c,v $ */
-/* $Revision: 1.11 $ */
-/* $Date: 2007/05/12 14:32:35 $ */
-
diff --git a/libtomcrypt/pk/dsa/dsa_encrypt_key.c b/libtomcrypt/pk/dsa/dsa_encrypt_key.c
deleted file mode 100644
index e369f62..0000000
--- a/libtomcrypt/pk/dsa/dsa_encrypt_key.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* LibTomCrypt, modular cryptographic library -- Tom St Denis
- *
- * LibTomCrypt is a library that provides various cryptographic
- * algorithms in a highly modular and flexible manner.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- *
- * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
- */
-#include "tomcrypt.h"
-
-/**
- @file dsa_encrypt_key.c
- DSA Crypto, Tom St Denis
-*/
-
-#ifdef LTC_MDSA
-
-/**
- Encrypt a symmetric key with DSA
- @param in The symmetric key you want to encrypt
- @param inlen The length of the key to encrypt (octets)
- @param out [out] The destination for the ciphertext
- @param outlen [in/out] The max size and resulting size of the ciphertext
- @param hash The index of the hash you want to use
- @param key The DSA key you want to encrypt to
- @return CRYPT_OK if successful
-*/
-int dsa_encrypt_key(const unsigned char *in, unsigned long inlen,
- unsigned char *out, unsigned long *outlen,
- int hash,
- dsa_key *key)
-{
- unsigned char *expt, *skey;
- void *g_pub, *g_priv;
- unsigned long x, y;
- int err;
-
- LTC_ARGCHK(in != NULL);
- LTC_ARGCHK(out != NULL);
- LTC_ARGCHK(outlen != NULL);
- LTC_ARGCHK(key != NULL);
-
- if ((err = hash_is_valid(hash)) != CRYPT_OK) {
- return err;
- }
-
- if (inlen > hash_descriptor[hash].hashsize) {
- return CRYPT_INVALID_HASH;
- }
-
- /* make a random key and export the public copy */
- if ((err = mp_init_multi(&g_pub, &g_priv, NULL)) != CRYPT_OK) {
- return err;
- }
-
- expt = XMALLOC(mp_unsigned_bin_size(key->p) + 1);
- skey = XMALLOC(MAXBLOCKSIZE);
- if (expt == NULL || skey == NULL) {
- if (expt != NULL) {
- XFREE(expt);
- }
- if (skey != NULL) {
- XFREE(skey);
- }
- mp_clear_multi(g_pub, g_priv, NULL);
- return CRYPT_MEM;
- }
-
- /* make a random x, g^x pair */
- x = mp_unsigned_bin_size(key->q);
- get_random_bytes( expt, x);
-
- /* load x */
- if ((err = mp_read_unsigned_bin(g_priv, expt, x)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- /* compute y */
- if ((err = mp_exptmod(key->g, g_priv, key->p, g_pub)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- /* make random key */
- x = mp_unsigned_bin_size(key->p) + 1;
- if ((err = dsa_shared_secret(g_priv, key->y, key, expt, &x)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- y = MAXBLOCKSIZE;
- if ((err = hash_memory(hash, expt, x, skey, &y)) != CRYPT_OK) {
- goto LBL_ERR;
- }
-
- /* Encrypt key */
- for (x = 0; x < inlen; x++) {
- skey[x] ^= in[x];
- }
-
- err = der_encode_sequence_multi(out, outlen,
- LTC_ASN1_OBJECT_IDENTIFIER, hash_descriptor[hash].OIDlen, hash_descriptor[hash].OID,
- LTC_ASN1_INTEGER, 1UL, g_pub,
- LTC_ASN1_OCTET_STRING, inlen, skey,
- LTC_ASN1_EOL, 0UL, NULL);
-
-LBL_ERR:
-#ifdef LTC_CLEAN_STACK
- /* clean up */
- zeromem(expt, mp_unsigned_bin_size(key->p) + 1);
- zeromem(skey, MAXBLOCKSIZE);
-#endif
-
- XFREE(skey);
- XFREE(expt);
-
- mp_clear_multi(g_pub, g_priv, NULL);
- return err;
-}
-
-#endif
-/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_encrypt_key.c,v $ */
-/* $Revision: 1.9 $ */
-/* $Date: 2007/05/12 14:32:35 $ */
-
diff --git a/libtomcrypt/pk/dsa/dsa_free.c b/libtomcrypt/pk/dsa/dsa_free.c
index a589d16..37a330d 100644
--- a/libtomcrypt/pk/dsa/dsa_free.c
+++ b/libtomcrypt/pk/dsa/dsa_free.c
@@ -24,7 +24,7 @@
void dsa_free(dsa_key *key)
{
LTC_ARGCHKVD(key != NULL);
- 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);
}
#endif
diff --git a/libtomcrypt/pk/dsa/dsa_import.c b/libtomcrypt/pk/dsa/dsa_import.c
index 6f6db8c..f6c07f1 100644
--- a/libtomcrypt/pk/dsa/dsa_import.c
+++ b/libtomcrypt/pk/dsa/dsa_import.c
@@ -31,7 +31,6 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
LTC_ARGCHK(in != NULL);
LTC_ARGCHK(key != NULL);
- LTC_ARGCHK(ltc_mp.name != NULL);
/* init key */
if (mp_init_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL) != CRYPT_OK) {
@@ -69,17 +68,17 @@ int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
}
key->type = PK_PUBLIC;
}
- key->qord = mp_unsigned_bin_size(key->q);
+ key->qord = mp_unsigned_bin_size(&key->q);
if (key->qord >= LTC_MDSA_MAX_GROUP || key->qord <= 15 ||
- (unsigned long)key->qord >= mp_unsigned_bin_size(key->p) || (mp_unsigned_bin_size(key->p) - key->qord) >= LTC_MDSA_DELTA) {
+ (unsigned long)key->qord >= mp_unsigned_bin_size(&key->p) || (mp_unsigned_bin_size(&key->p) - key->qord) >= LTC_MDSA_DELTA) {
err = CRYPT_INVALID_PACKET;
goto error;
}
return CRYPT_OK;
error:
- mp_clear_multi(key->p, key->g, key->q, key->x, key->y, NULL);
+ mp_clear_multi(&key->p, &key->g, &key->q, &key->x, &key->y, NULL);
return err;
}
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;
}
diff --git a/libtomcrypt/pk/dsa/dsa_shared_secret.c b/libtomcrypt/pk/dsa/dsa_shared_secret.c
deleted file mode 100644
index ba7170f..0000000
--- a/libtomcrypt/pk/dsa/dsa_shared_secret.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* LibTomCrypt, modular cryptographic library -- Tom St Denis
- *
- * LibTomCrypt is a library that provides various cryptographic
- * algorithms in a highly modular and flexible manner.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- *
- * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
- */
-#include "tomcrypt.h"
-
-/**
- @file dsa_shared_secret.c
- DSA Crypto, Tom St Denis
-*/
-
-#ifdef LTC_MDSA
-
-/**
- Create a DSA shared secret between two keys
- @param private_key The private DSA key (the exponent)
- @param base The base of the exponentiation (allows this to be used for both encrypt and decrypt)
- @param public_key The public key
- @param out [out] Destination of the shared secret
- @param outlen [in/out] The max size and resulting size of the shared secret
- @return CRYPT_OK if successful
-*/
-int dsa_shared_secret(void *private_key, void *base,
- dsa_key *public_key,
- unsigned char *out, unsigned long *outlen)
-{
- unsigned long x;
- void *res;
- int err;
-
- LTC_ARGCHK(private_key != NULL);
- LTC_ARGCHK(public_key != NULL);
- LTC_ARGCHK(out != NULL);
- LTC_ARGCHK(outlen != NULL);
-
- /* make new point */
- if ((err = mp_init(&res)) != CRYPT_OK) {
- return err;
- }
-
- if ((err = mp_exptmod(base, private_key, public_key->p, res)) != CRYPT_OK) {
- mp_clear(res);
- return err;
- }
-
- x = (unsigned long)mp_unsigned_bin_size(res);
- if (*outlen < x) {
- *outlen = x;
- err = CRYPT_BUFFER_OVERFLOW;
- goto done;
- }
- zeromem(out, x);
- if ((err = mp_to_unsigned_bin(res, out + (x - mp_unsigned_bin_size(res)))) != CRYPT_OK) { goto done; }
-
- err = CRYPT_OK;
- *outlen = x;
-done:
- mp_clear(res);
- return err;
-}
-
-#endif
-/* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_shared_secret.c,v $ */
-/* $Revision: 1.9 $ */
-/* $Date: 2007/05/12 14:32:35 $ */
-
diff --git a/libtomcrypt/pk/dsa/dsa_sign_hash.c b/libtomcrypt/pk/dsa/dsa_sign_hash.c
index d24bdab..0b542a4 100644
--- a/libtomcrypt/pk/dsa/dsa_sign_hash.c
+++ b/libtomcrypt/pk/dsa/dsa_sign_hash.c
@@ -27,10 +27,10 @@
@return CRYPT_OK if successful
*/
int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen,
- void *r, void *s,
+ mp_int_t r, mp_int_t s,
dsa_key *key)
{
- void *k, *kinv, *tmp;
+ mp_int k, kinv, tmp;
unsigned char *buf;
int err;
@@ -63,35 +63,35 @@ retry:
get_random_bytes(buf, key->qord);
/* read k */
- if ((err = mp_read_unsigned_bin(k, buf, key->qord)) != CRYPT_OK) { goto error; }
+ if ((err = mp_read_unsigned_bin(&k, buf, key->qord)) != CRYPT_OK) { goto error; }
/* k > 1 ? */
- if (mp_cmp_d(k, 1) != LTC_MP_GT) { goto retry; }
+ if (mp_cmp_d(&k, 1) != LTC_MP_GT) { goto retry; }
/* test gcd */
- if ((err = mp_gcd(k, key->q, tmp)) != CRYPT_OK) { goto error; }
- } while (mp_cmp_d(tmp, 1) != LTC_MP_EQ);
+ if ((err = mp_gcd(&k, &key->q, &tmp)) != CRYPT_OK) { goto error; }
+ } while (mp_cmp_d(&tmp, 1) != LTC_MP_EQ);
/* now find 1/k mod q */
- if ((err = mp_invmod(k, key->q, kinv)) != CRYPT_OK) { goto error; }
+ if ((err = mp_invmod(&k, &key->q, &kinv)) != CRYPT_OK) { goto error; }
/* now find r = g^k mod p mod q */
- if ((err = mp_exptmod(key->g, k, key->p, r)) != CRYPT_OK) { goto error; }
- if ((err = mp_mod(r, key->q, r)) != CRYPT_OK) { goto error; }
+ if ((err = mp_exptmod(&key->g, &k, &key->p, r)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mod(r, &key->q, r)) != CRYPT_OK) { goto error; }
if (mp_iszero(r) == LTC_MP_YES) { goto retry; }
/* now find s = (in + xr)/k mod q */
- if ((err = mp_read_unsigned_bin(tmp, (unsigned char *)in, inlen)) != CRYPT_OK) { goto error; }
- if ((err = mp_mul(key->x, r, s)) != CRYPT_OK) { goto error; }
- if ((err = mp_add(s, tmp, s)) != CRYPT_OK) { goto error; }
- if ((err = mp_mulmod(s, kinv, key->q, s)) != CRYPT_OK) { goto error; }
+ if ((err = mp_read_unsigned_bin(&tmp, (unsigned char *)in, inlen)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mul(&key->x, r, s)) != CRYPT_OK) { goto error; }
+ if ((err = mp_add(s, &tmp, s)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mulmod(s, &kinv, &key->q, s)) != CRYPT_OK) { goto error; }
if (mp_iszero(s) == LTC_MP_YES) { goto retry; }
err = CRYPT_OK;
error:
- mp_clear_multi(k, kinv, tmp, NULL);
+ mp_clear_multi(&k, &kinv, &tmp, NULL);
ERRBUF:
#ifdef LTC_CLEAN_STACK
zeromem(buf, LTC_MDSA_MAX_GROUP);
@@ -113,7 +113,7 @@ int dsa_sign_hash(const unsigned char *in, unsigned long inlen,
unsigned char *out, unsigned long *outlen,
dsa_key *key)
{
- void *r, *s;
+ mp_int r, s;
int err;
LTC_ARGCHK(in != NULL);
@@ -125,17 +125,17 @@ int dsa_sign_hash(const unsigned char *in, unsigned long inlen,
return CRYPT_MEM;
}
- if ((err = dsa_sign_hash_raw(in, inlen, r, s, key)) != CRYPT_OK) {
+ if ((err = dsa_sign_hash_raw(in, inlen, &r, &s, key)) != CRYPT_OK) {
goto error;
}
err = der_encode_sequence_multi(out, outlen,
- LTC_ASN1_INTEGER, 1UL, r,
- LTC_ASN1_INTEGER, 1UL, s,
+ LTC_ASN1_INTEGER, 1UL, &r,
+ LTC_ASN1_INTEGER, 1UL, &s,
LTC_ASN1_EOL, 0UL, NULL);
error:
- mp_clear_multi(r, s, NULL);
+ mp_clear_multi(&r, &s, NULL);
return err;
}
diff --git a/libtomcrypt/pk/dsa/dsa_verify_hash.c b/libtomcrypt/pk/dsa/dsa_verify_hash.c
index 9014823..3a82d1b 100644
--- a/libtomcrypt/pk/dsa/dsa_verify_hash.c
+++ b/libtomcrypt/pk/dsa/dsa_verify_hash.c
@@ -28,11 +28,11 @@
@param key The corresponding public DH key
@return CRYPT_OK if successful (even if the signature is invalid)
*/
-int dsa_verify_hash_raw( void *r, void *s,
+int dsa_verify_hash_raw( mp_int_t r, mp_int_t s,
const unsigned char *hash, unsigned long hashlen,
int *stat, dsa_key *key)
{
- void *w, *v, *u1, *u2;
+ mp_int w, v, u1, u2;
int err;
LTC_ARGCHK(r != NULL);
@@ -49,35 +49,35 @@ int dsa_verify_hash_raw( void *r, void *s,
}
/* neither r or s can be null or >q*/
- if (mp_iszero(r) == LTC_MP_YES || mp_iszero(s) == LTC_MP_YES || mp_cmp(r, key->q) != LTC_MP_LT || mp_cmp(s, key->q) != LTC_MP_LT) {
+ if (mp_iszero(r) == LTC_MP_YES || mp_iszero(s) == LTC_MP_YES || mp_cmp(r, &key->q) != LTC_MP_LT || mp_cmp(s, &key->q) != LTC_MP_LT) {
err = CRYPT_INVALID_PACKET;
goto error;
}
/* w = 1/s mod q */
- if ((err = mp_invmod(s, key->q, w)) != CRYPT_OK) { goto error; }
+ if ((err = mp_invmod(s, &key->q, &w)) != CRYPT_OK) { goto error; }
/* u1 = m * w mod q */
- if ((err = mp_read_unsigned_bin(u1, (unsigned char *)hash, hashlen)) != CRYPT_OK) { goto error; }
- if ((err = mp_mulmod(u1, w, key->q, u1)) != CRYPT_OK) { goto error; }
+ if ((err = mp_read_unsigned_bin(&u1, (unsigned char *)hash, hashlen)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mulmod(&u1, &w, &key->q, &u1)) != CRYPT_OK) { goto error; }
/* u2 = r*w mod q */
- if ((err = mp_mulmod(r, w, key->q, u2)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mulmod(r, &w, &key->q, &u2)) != CRYPT_OK) { goto error; }
/* v = g^u1 * y^u2 mod p mod q */
- if ((err = mp_exptmod(key->g, u1, key->p, u1)) != CRYPT_OK) { goto error; }
- if ((err = mp_exptmod(key->y, u2, key->p, u2)) != CRYPT_OK) { goto error; }
- if ((err = mp_mulmod(u1, u2, key->p, v)) != CRYPT_OK) { goto error; }
- if ((err = mp_mod(v, key->q, v)) != CRYPT_OK) { goto error; }
+ if ((err = mp_exptmod(&key->g, &u1, &key->p, &u1)) != CRYPT_OK) { goto error; }
+ if ((err = mp_exptmod(&key->y, &u2, &key->p, &u2)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mulmod(&u1, &u2, &key->p, &v)) != CRYPT_OK) { goto error; }
+ if ((err = mp_mod(&v, &key->q, &v)) != CRYPT_OK) { goto error; }
/* if r = v then we're set */
- if (mp_cmp(r, v) == LTC_MP_EQ) {
+ if (mp_cmp(r, &v) == LTC_MP_EQ) {
*stat = 1;
}
err = CRYPT_OK;
error:
- mp_clear_multi(w, v, u1, u2, NULL);
+ mp_clear_multi(&w, &v, &u1, &u2, NULL);
return err;
}
@@ -96,7 +96,7 @@ int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
int *stat, dsa_key *key)
{
int err;
- void *r, *s;
+ mp_int r, s;
if ((err = mp_init_multi(&r, &s, NULL)) != CRYPT_OK) {
return CRYPT_MEM;
@@ -104,17 +104,17 @@ int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
/* decode the sequence */
if ((err = der_decode_sequence_multi(sig, siglen,
- LTC_ASN1_INTEGER, 1UL, r,
- LTC_ASN1_INTEGER, 1UL, s,
+ LTC_ASN1_INTEGER, 1UL, &r,
+ LTC_ASN1_INTEGER, 1UL, &s,
LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) {
goto LBL_ERR;
}
/* do the op */
- err = dsa_verify_hash_raw(r, s, hash, hashlen, stat, key);
+ err = dsa_verify_hash_raw(&r, &s, hash, hashlen, stat, key);
LBL_ERR:
- mp_clear_multi(r, s, NULL);
+ mp_clear_multi(&r, &s, NULL);
return err;
}
diff --git a/libtomcrypt/pk/dsa/dsa_verify_key.c b/libtomcrypt/pk/dsa/dsa_verify_key.c
index e80ced5..71635d2 100644
--- a/libtomcrypt/pk/dsa/dsa_verify_key.c
+++ b/libtomcrypt/pk/dsa/dsa_verify_key.c
@@ -25,7 +25,7 @@
*/
int dsa_verify_key(dsa_key *key, int *stat)
{
- void *tmp, *tmp2;
+ mp_int tmp, tmp2;
int res, err;
LTC_ARGCHK(key != NULL);
@@ -35,14 +35,14 @@ int dsa_verify_key(dsa_key *key, int *stat)
*stat = 0;
/* first make sure key->q and key->p are prime */
- if ((err = mp_prime_is_prime(key->q, 8, &res)) != CRYPT_OK) {
+ if ((err = mp_prime_is_prime(&key->q, 8, &res)) != CRYPT_OK) {
return err;
}
if (res == 0) {
return CRYPT_OK;
}
- if ((err = mp_prime_is_prime(key->p, 8, &res)) != CRYPT_OK) {
+ if ((err = mp_prime_is_prime(&key->p, 8, &res)) != CRYPT_OK) {
return err;
}
if (res == 0) {
@@ -50,38 +50,38 @@ int dsa_verify_key(dsa_key *key, int *stat)
}
/* now make sure that g is not -1, 0 or 1 and <p */
- if (mp_cmp_d(key->g, 0) == LTC_MP_EQ || mp_cmp_d(key->g, 1) == LTC_MP_EQ) {
+ if (mp_cmp_d(&key->g, 0) == LTC_MP_EQ || mp_cmp_d(&key->g, 1) == LTC_MP_EQ) {
return CRYPT_OK;
}
if ((err = mp_init_multi(&tmp, &tmp2, NULL)) != CRYPT_OK) { return err; }
- if ((err = mp_sub_d(key->p, 1, tmp)) != CRYPT_OK) { goto error; }
- if (mp_cmp(tmp, key->g) == LTC_MP_EQ || mp_cmp(key->g, key->p) != LTC_MP_LT) {
+ if ((err = mp_sub_d(&key->p, 1, &tmp)) != CRYPT_OK) { goto error; }
+ if (mp_cmp(&tmp, &key->g) == LTC_MP_EQ || mp_cmp(&key->g, &key->p) != LTC_MP_LT) {
err = CRYPT_OK;
goto error;
}
/* 1 < y < p-1 */
- if (!(mp_cmp_d(key->y, 1) == LTC_MP_GT && mp_cmp(key->y, tmp) == LTC_MP_LT)) {
+ if (!(mp_cmp_d(&key->y, 1) == LTC_MP_GT && mp_cmp(&key->y, &tmp) == LTC_MP_LT)) {
err = CRYPT_OK;
goto error;
}
/* now we have to make sure that g^q = 1, and that p-1/q gives 0 remainder */
- if ((err = mp_div(tmp, key->q, tmp, tmp2)) != CRYPT_OK) { goto error; }
- if (mp_iszero(tmp2) != LTC_MP_YES) {
+ if ((err = mp_div(&tmp, &key->q, &tmp, &tmp2)) != CRYPT_OK) { goto error; }
+ if (mp_iszero(&tmp2) != LTC_MP_YES) {
err = CRYPT_OK;
goto error;
}
- if ((err = mp_exptmod(key->g, key->q, key->p, tmp)) != CRYPT_OK) { goto error; }
- if (mp_cmp_d(tmp, 1) != LTC_MP_EQ) {
+ if ((err = mp_exptmod(&key->g, &key->q, &key->p, &tmp)) != CRYPT_OK) { goto error; }
+ if (mp_cmp_d(&tmp, 1) != LTC_MP_EQ) {
err = CRYPT_OK;
goto error;
}
/* now we have to make sure that y^q = 1, this makes sure y \in g^x mod p */
- if ((err = mp_exptmod(key->y, key->q, key->p, tmp)) != CRYPT_OK) { goto error; }
- if (mp_cmp_d(tmp, 1) != LTC_MP_EQ) {
+ if ((err = mp_exptmod(&key->y, &key->q, &key->p, &tmp)) != CRYPT_OK) { goto error; }
+ if (mp_cmp_d(&tmp, 1) != LTC_MP_EQ) {
err = CRYPT_OK;
goto error;
}
@@ -90,7 +90,7 @@ int dsa_verify_key(dsa_key *key, int *stat)
err = CRYPT_OK;
*stat = 1;
error:
- mp_clear_multi(tmp, tmp2, NULL);
+ mp_clear_multi(&tmp, &tmp2, NULL);
return err;
}
#endif