diff options
Diffstat (limited to 'src/lib/libcrypto/dsa/dsa_ossl.c')
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_ossl.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_ossl.c b/src/lib/libcrypto/dsa/dsa_ossl.c index a3ddd7d281..b3d78e524c 100644 --- a/src/lib/libcrypto/dsa/dsa_ossl.c +++ b/src/lib/libcrypto/dsa/dsa_ossl.c | |||
| @@ -136,6 +136,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 136 | BN_CTX *ctx=NULL; | 136 | BN_CTX *ctx=NULL; |
| 137 | int reason=ERR_R_BN_LIB; | 137 | int reason=ERR_R_BN_LIB; |
| 138 | DSA_SIG *ret=NULL; | 138 | DSA_SIG *ret=NULL; |
| 139 | int noredo = 0; | ||
| 139 | 140 | ||
| 140 | BN_init(&m); | 141 | BN_init(&m); |
| 141 | BN_init(&xr); | 142 | BN_init(&xr); |
| @@ -150,7 +151,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 150 | if (s == NULL) goto err; | 151 | if (s == NULL) goto err; |
| 151 | ctx=BN_CTX_new(); | 152 | ctx=BN_CTX_new(); |
| 152 | if (ctx == NULL) goto err; | 153 | if (ctx == NULL) goto err; |
| 153 | 154 | redo: | |
| 154 | if ((dsa->kinv == NULL) || (dsa->r == NULL)) | 155 | if ((dsa->kinv == NULL) || (dsa->r == NULL)) |
| 155 | { | 156 | { |
| 156 | if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err; | 157 | if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err; |
| @@ -161,6 +162,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 161 | dsa->kinv=NULL; | 162 | dsa->kinv=NULL; |
| 162 | r=dsa->r; | 163 | r=dsa->r; |
| 163 | dsa->r=NULL; | 164 | dsa->r=NULL; |
| 165 | noredo = 1; | ||
| 164 | } | 166 | } |
| 165 | 167 | ||
| 166 | 168 | ||
| @@ -181,6 +183,18 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) | |||
| 181 | 183 | ||
| 182 | ret=DSA_SIG_new(); | 184 | ret=DSA_SIG_new(); |
| 183 | if (ret == NULL) goto err; | 185 | if (ret == NULL) goto err; |
| 186 | /* Redo if r or s is zero as required by FIPS 186-3: this is | ||
| 187 | * very unlikely. | ||
| 188 | */ | ||
| 189 | if (BN_is_zero(r) || BN_is_zero(s)) | ||
| 190 | { | ||
| 191 | if (noredo) | ||
| 192 | { | ||
| 193 | reason = DSA_R_NEED_NEW_SETUP_VALUES; | ||
| 194 | goto err; | ||
| 195 | } | ||
| 196 | goto redo; | ||
| 197 | } | ||
| 184 | ret->r = r; | 198 | ret->r = r; |
| 185 | ret->s = s; | 199 | ret->s = s; |
| 186 | 200 | ||
