comparison libtomcrypt/src/pk/dsa/dsa_sign_hash.c @ 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 1b9e69c058d2
children f849a5ca2efc
comparison
equal deleted inserted replaced
379:b66a00272a90 382:0cbe8f6dbf9e
4 * algorithms in a highly modular and flexible manner. 4 * algorithms in a highly modular and flexible manner.
5 * 5 *
6 * The library is free for all purposes without any express 6 * The library is free for all purposes without any express
7 * guarantee it works. 7 * guarantee it works.
8 * 8 *
9 * Tom St Denis, [email protected], http://libtomcrypt.org 9 * Tom St Denis, [email protected], http://libtomcrypt.com
10 */ 10 */
11 #include "tomcrypt.h" 11 #include "tomcrypt.h"
12 12
13 /** 13 /**
14 @file dsa_sign_hash.c 14 @file dsa_sign_hash.c
27 @param wprng The index of the PRNG desired 27 @param wprng The index of the PRNG desired
28 @param key A private DSA key 28 @param key A private DSA key
29 @return CRYPT_OK if successful 29 @return CRYPT_OK if successful
30 */ 30 */
31 int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen, 31 int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen,
32 mp_int *r, mp_int *s, 32 void *r, void *s,
33 prng_state *prng, int wprng, dsa_key *key) 33 prng_state *prng, int wprng, dsa_key *key)
34 { 34 {
35 mp_int k, kinv, tmp; 35 void *k, *kinv, *tmp;
36 unsigned char *buf; 36 unsigned char *buf;
37 int err; 37 int err;
38 38
39 LTC_ARGCHK(in != NULL); 39 LTC_ARGCHK(in != NULL);
40 LTC_ARGCHK(r != NULL); 40 LTC_ARGCHK(r != NULL);
57 if (buf == NULL) { 57 if (buf == NULL) {
58 return CRYPT_MEM; 58 return CRYPT_MEM;
59 } 59 }
60 60
61 /* Init our temps */ 61 /* Init our temps */
62 if ((err = mp_init_multi(&k, &kinv, &tmp, NULL)) != MP_OKAY) { goto error; } 62 if ((err = mp_init_multi(&k, &kinv, &tmp, NULL)) != CRYPT_OK) { goto ERRBUF; }
63 63
64 retry: 64 retry:
65 65
66 do { 66 do {
67 /* gen random k */ 67 /* gen random k */
68 if (prng_descriptor[wprng].read(buf, key->qord, prng) != (unsigned long)key->qord) { 68 if (prng_descriptor[wprng].read(buf, key->qord, prng) != (unsigned long)key->qord) {
69 err = CRYPT_ERROR_READPRNG; 69 err = CRYPT_ERROR_READPRNG;
70 goto LBL_ERR; 70 goto error;
71 } 71 }
72 72
73 /* read k */ 73 /* read k */
74 if ((err = mp_read_unsigned_bin(&k, buf, key->qord)) != MP_OKAY) { goto error; } 74 if ((err = mp_read_unsigned_bin(k, buf, key->qord)) != CRYPT_OK) { goto error; }
75 75
76 /* k > 1 ? */ 76 /* k > 1 ? */
77 if (mp_cmp_d(&k, 1) != MP_GT) { goto retry; } 77 if (mp_cmp_d(k, 1) != LTC_MP_GT) { goto retry; }
78 78
79 /* test gcd */ 79 /* test gcd */
80 if ((err = mp_gcd(&k, &key->q, &tmp)) != MP_OKAY) { goto error; } 80 if ((err = mp_gcd(k, key->q, tmp)) != CRYPT_OK) { goto error; }
81 } while (mp_cmp_d(&tmp, 1) != MP_EQ); 81 } while (mp_cmp_d(tmp, 1) != LTC_MP_EQ);
82 82
83 /* now find 1/k mod q */ 83 /* now find 1/k mod q */
84 if ((err = mp_invmod(&k, &key->q, &kinv)) != MP_OKAY) { goto error; } 84 if ((err = mp_invmod(k, key->q, kinv)) != CRYPT_OK) { goto error; }
85 85
86 /* now find r = g^k mod p mod q */ 86 /* now find r = g^k mod p mod q */
87 if ((err = mp_exptmod(&key->g, &k, &key->p, r)) != MP_OKAY) { goto error; } 87 if ((err = mp_exptmod(key->g, k, key->p, r)) != CRYPT_OK) { goto error; }
88 if ((err = mp_mod(r, &key->q, r)) != MP_OKAY) { goto error; } 88 if ((err = mp_mod(r, key->q, r)) != CRYPT_OK) { goto error; }
89 89
90 if (mp_iszero(r) == MP_YES) { goto retry; } 90 if (mp_iszero(r) == LTC_MP_YES) { goto retry; }
91 91
92 /* now find s = (in + xr)/k mod q */ 92 /* now find s = (in + xr)/k mod q */
93 if ((err = mp_read_unsigned_bin(&tmp, (unsigned char *)in, inlen)) != MP_OKAY) { goto error; } 93 if ((err = mp_read_unsigned_bin(tmp, (unsigned char *)in, inlen)) != CRYPT_OK) { goto error; }
94 if ((err = mp_mul(&key->x, r, s)) != MP_OKAY) { goto error; } 94 if ((err = mp_mul(key->x, r, s)) != CRYPT_OK) { goto error; }
95 if ((err = mp_add(s, &tmp, s)) != MP_OKAY) { goto error; } 95 if ((err = mp_add(s, tmp, s)) != CRYPT_OK) { goto error; }
96 if ((err = mp_mulmod(s, &kinv, &key->q, s)) != MP_OKAY) { goto error; } 96 if ((err = mp_mulmod(s, kinv, key->q, s)) != CRYPT_OK) { goto error; }
97 97
98 if (mp_iszero(s) == MP_YES) { goto retry; } 98 if (mp_iszero(s) == LTC_MP_YES) { goto retry; }
99 99
100 err = CRYPT_OK; 100 err = CRYPT_OK;
101 goto LBL_ERR;
102
103 error: 101 error:
104 err = mpi_to_ltc_error(err); 102 mp_clear_multi(k, kinv, tmp, NULL);
105 LBL_ERR: 103 ERRBUF:
106 mp_clear_multi(&k, &kinv, &tmp, NULL);
107 #ifdef LTC_CLEAN_STACK 104 #ifdef LTC_CLEAN_STACK
108 zeromem(buf, MDSA_MAX_GROUP); 105 zeromem(buf, MDSA_MAX_GROUP);
109 #endif 106 #endif
110 XFREE(buf); 107 XFREE(buf);
111 return err; 108 return err;
124 */ 121 */
125 int dsa_sign_hash(const unsigned char *in, unsigned long inlen, 122 int dsa_sign_hash(const unsigned char *in, unsigned long inlen,
126 unsigned char *out, unsigned long *outlen, 123 unsigned char *out, unsigned long *outlen,
127 prng_state *prng, int wprng, dsa_key *key) 124 prng_state *prng, int wprng, dsa_key *key)
128 { 125 {
129 mp_int r, s; 126 void *r, *s;
130 int err; 127 int err;
131 128
132 LTC_ARGCHK(in != NULL); 129 LTC_ARGCHK(in != NULL);
133 LTC_ARGCHK(out != NULL); 130 LTC_ARGCHK(out != NULL);
134 LTC_ARGCHK(outlen != NULL); 131 LTC_ARGCHK(outlen != NULL);
135 LTC_ARGCHK(key != NULL); 132 LTC_ARGCHK(key != NULL);
136 133
137 if (mp_init_multi(&r, &s, NULL) != MP_OKAY) { 134 if (mp_init_multi(&r, &s, NULL) != CRYPT_OK) {
138 return CRYPT_MEM; 135 return CRYPT_MEM;
139 } 136 }
140 137
141 if ((err = dsa_sign_hash_raw(in, inlen, &r, &s, prng, wprng, key)) != CRYPT_OK) { 138 if ((err = dsa_sign_hash_raw(in, inlen, r, s, prng, wprng, key)) != CRYPT_OK) {
142 goto LBL_ERR; 139 goto error;
143 } 140 }
144 141
145 err = der_encode_sequence_multi(out, outlen, 142 err = der_encode_sequence_multi(out, outlen,
146 LTC_ASN1_INTEGER, 1UL, &r, 143 LTC_ASN1_INTEGER, 1UL, r,
147 LTC_ASN1_INTEGER, 1UL, &s, 144 LTC_ASN1_INTEGER, 1UL, s,
148 LTC_ASN1_EOL, 0UL, NULL); 145 LTC_ASN1_EOL, 0UL, NULL);
149 146
150 LBL_ERR: 147 error:
151 mp_clear_multi(&r, &s, NULL); 148 mp_clear_multi(r, s, NULL);
152 return err; 149 return err;
153 } 150 }
154 151
155 #endif 152 #endif
156 153
157 /* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_sign_hash.c,v $ */ 154 /* $Source: /cvs/libtom/libtomcrypt/src/pk/dsa/dsa_sign_hash.c,v $ */
158 /* $Revision: 1.6 $ */ 155 /* $Revision: 1.12 $ */
159 /* $Date: 2005/05/15 21:48:59 $ */ 156 /* $Date: 2006/12/04 22:27:56 $ */