diff options
author | beck <> | 2000-03-19 11:13:58 +0000 |
---|---|---|
committer | beck <> | 2000-03-19 11:13:58 +0000 |
commit | 796d609550df3a33fc11468741c5d2f6d3df4c11 (patch) | |
tree | 6c6d539061caa20372dad0ac4ddb1dfae2fbe7fe /src/lib/libcrypto/dsa/dsa_sign.c | |
parent | 5be3114c1fd7e0dfea1e38d3abb4cbba75244419 (diff) | |
download | openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.tar.gz openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.tar.bz2 openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.zip |
OpenSSL 0.9.5 merge
*warning* this bumps shared lib minors for libssl and libcrypto from 2.1 to 2.2
if you are using the ssl26 packages for ssh and other things to work you will
need to get new ones (see ~beck/libsslsnap/<arch>) on cvs or ~beck/src-patent.tar.gz on cvs
Diffstat (limited to 'src/lib/libcrypto/dsa/dsa_sign.c')
-rw-r--r-- | src/lib/libcrypto/dsa/dsa_sign.c | 123 |
1 files changed, 2 insertions, 121 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_sign.c b/src/lib/libcrypto/dsa/dsa_sign.c index 774c161964..89205026f0 100644 --- a/src/lib/libcrypto/dsa/dsa_sign.c +++ b/src/lib/libcrypto/dsa/dsa_sign.c | |||
@@ -67,73 +67,9 @@ | |||
67 | 67 | ||
68 | DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | 68 | DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) |
69 | { | 69 | { |
70 | BIGNUM *kinv=NULL,*r=NULL,*s=NULL; | 70 | return dsa->meth->dsa_do_sign(dgst, dlen, dsa); |
71 | BIGNUM m; | ||
72 | BIGNUM xr; | ||
73 | BN_CTX *ctx=NULL; | ||
74 | int i,reason=ERR_R_BN_LIB; | ||
75 | DSA_SIG *ret=NULL; | ||
76 | |||
77 | BN_init(&m); | ||
78 | BN_init(&xr); | ||
79 | s=BN_new(); | ||
80 | if (s == NULL) goto err; | ||
81 | |||
82 | i=BN_num_bytes(dsa->q); /* should be 20 */ | ||
83 | if ((dlen > i) || (dlen > 50)) | ||
84 | { | ||
85 | reason=DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE; | ||
86 | goto err; | ||
87 | } | ||
88 | |||
89 | ctx=BN_CTX_new(); | ||
90 | if (ctx == NULL) goto err; | ||
91 | |||
92 | if ((dsa->kinv == NULL) || (dsa->r == NULL)) | ||
93 | { | ||
94 | if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err; | ||
95 | } | ||
96 | else | ||
97 | { | ||
98 | kinv=dsa->kinv; | ||
99 | dsa->kinv=NULL; | ||
100 | r=dsa->r; | ||
101 | dsa->r=NULL; | ||
102 | } | ||
103 | |||
104 | if (BN_bin2bn(dgst,dlen,&m) == NULL) goto err; | ||
105 | |||
106 | /* Compute s = inv(k) (m + xr) mod q */ | ||
107 | if (!BN_mod_mul(&xr,dsa->priv_key,r,dsa->q,ctx)) goto err;/* s = xr */ | ||
108 | if (!BN_add(s, &xr, &m)) goto err; /* s = m + xr */ | ||
109 | if (BN_cmp(s,dsa->q) > 0) | ||
110 | BN_sub(s,s,dsa->q); | ||
111 | if (!BN_mod_mul(s,s,kinv,dsa->q,ctx)) goto err; | ||
112 | |||
113 | ret=DSA_SIG_new(); | ||
114 | if (ret == NULL) goto err; | ||
115 | ret->r = r; | ||
116 | ret->s = s; | ||
117 | |||
118 | err: | ||
119 | if (!ret) | ||
120 | { | ||
121 | DSAerr(DSA_F_DSA_DO_SIGN,reason); | ||
122 | BN_free(r); | ||
123 | BN_free(s); | ||
124 | } | ||
125 | if (ctx != NULL) BN_CTX_free(ctx); | ||
126 | BN_clear_free(&m); | ||
127 | BN_clear_free(&xr); | ||
128 | if (kinv != NULL) /* dsa->kinv is NULL now if we used it */ | ||
129 | BN_clear_free(kinv); | ||
130 | return(ret); | ||
131 | } | 71 | } |
132 | 72 | ||
133 | /* data has already been hashed (probably with SHA or SHA-1). */ | ||
134 | |||
135 | /* unsigned char *sig: out */ | ||
136 | /* unsigned int *siglen: out */ | ||
137 | int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | 73 | int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, |
138 | unsigned int *siglen, DSA *dsa) | 74 | unsigned int *siglen, DSA *dsa) |
139 | { | 75 | { |
@@ -151,61 +87,6 @@ int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig, | |||
151 | 87 | ||
152 | int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp) | 88 | int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp) |
153 | { | 89 | { |
154 | BN_CTX *ctx; | 90 | return dsa->meth->dsa_sign_setup(dsa, ctx_in, kinvp, rp); |
155 | BIGNUM k,*kinv=NULL,*r=NULL; | ||
156 | int ret=0; | ||
157 | |||
158 | if (ctx_in == NULL) | ||
159 | { | ||
160 | if ((ctx=BN_CTX_new()) == NULL) goto err; | ||
161 | } | ||
162 | else | ||
163 | ctx=ctx_in; | ||
164 | |||
165 | BN_init(&k); | ||
166 | if ((r=BN_new()) == NULL) goto err; | ||
167 | kinv=NULL; | ||
168 | |||
169 | /* Get random k */ | ||
170 | for (;;) | ||
171 | { | ||
172 | if (!BN_rand(&k, BN_num_bits(dsa->q), 1, 0)) goto err; | ||
173 | if (BN_cmp(&k,dsa->q) >= 0) | ||
174 | BN_sub(&k,&k,dsa->q); | ||
175 | if (!BN_is_zero(&k)) break; | ||
176 | } | ||
177 | |||
178 | if ((dsa->method_mont_p == NULL) && (dsa->flags & DSA_FLAG_CACHE_MONT_P)) | ||
179 | { | ||
180 | if ((dsa->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL) | ||
181 | if (!BN_MONT_CTX_set((BN_MONT_CTX *)dsa->method_mont_p, | ||
182 | dsa->p,ctx)) goto err; | ||
183 | } | ||
184 | |||
185 | /* Compute r = (g^k mod p) mod q */ | ||
186 | if (!BN_mod_exp_mont(r,dsa->g,&k,dsa->p,ctx, | ||
187 | (BN_MONT_CTX *)dsa->method_mont_p)) goto err; | ||
188 | if (!BN_mod(r,r,dsa->q,ctx)) goto err; | ||
189 | |||
190 | /* Compute part of 's = inv(k) (m + xr) mod q' */ | ||
191 | if ((kinv=BN_mod_inverse(NULL,&k,dsa->q,ctx)) == NULL) goto err; | ||
192 | |||
193 | if (*kinvp != NULL) BN_clear_free(*kinvp); | ||
194 | *kinvp=kinv; | ||
195 | kinv=NULL; | ||
196 | if (*rp != NULL) BN_clear_free(*rp); | ||
197 | *rp=r; | ||
198 | ret=1; | ||
199 | err: | ||
200 | if (!ret) | ||
201 | { | ||
202 | DSAerr(DSA_F_DSA_SIGN_SETUP,ERR_R_BN_LIB); | ||
203 | if (kinv != NULL) BN_clear_free(kinv); | ||
204 | if (r != NULL) BN_clear_free(r); | ||
205 | } | ||
206 | if (ctx_in == NULL) BN_CTX_free(ctx); | ||
207 | if (kinv != NULL) BN_clear_free(kinv); | ||
208 | BN_clear_free(&k); | ||
209 | return(ret); | ||
210 | } | 91 | } |
211 | 92 | ||