recalculate DSA signature if r or s is zero (FIPS 186-3 requirement)
This commit is contained in:
parent
d3203b931e
commit
c31945e682
3 changed files with 17 additions and 1 deletions
|
@ -298,6 +298,7 @@ void ERR_load_DSA_strings(void);
|
||||||
#define DSA_R_INVALID_DIGEST_TYPE 106
|
#define DSA_R_INVALID_DIGEST_TYPE 106
|
||||||
#define DSA_R_MISSING_PARAMETERS 101
|
#define DSA_R_MISSING_PARAMETERS 101
|
||||||
#define DSA_R_MODULUS_TOO_LARGE 103
|
#define DSA_R_MODULUS_TOO_LARGE 103
|
||||||
|
#define DSA_R_NEED_NEW_SETUP_VALUES 110
|
||||||
#define DSA_R_NO_PARAMETERS_SET 107
|
#define DSA_R_NO_PARAMETERS_SET 107
|
||||||
#define DSA_R_PARAMETER_ENCODING_ERROR 105
|
#define DSA_R_PARAMETER_ENCODING_ERROR 105
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,7 @@ static ERR_STRING_DATA DSA_str_reasons[]=
|
||||||
{ERR_REASON(DSA_R_INVALID_DIGEST_TYPE) ,"invalid digest type"},
|
{ERR_REASON(DSA_R_INVALID_DIGEST_TYPE) ,"invalid digest type"},
|
||||||
{ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"},
|
{ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"},
|
||||||
{ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"},
|
{ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"},
|
||||||
|
{ERR_REASON(DSA_R_NEED_NEW_SETUP_VALUES) ,"need new setup values"},
|
||||||
{ERR_REASON(DSA_R_NO_PARAMETERS_SET) ,"no parameters set"},
|
{ERR_REASON(DSA_R_NO_PARAMETERS_SET) ,"no parameters set"},
|
||||||
{ERR_REASON(DSA_R_PARAMETER_ENCODING_ERROR),"parameter encoding error"},
|
{ERR_REASON(DSA_R_PARAMETER_ENCODING_ERROR),"parameter encoding error"},
|
||||||
{0,NULL}
|
{0,NULL}
|
||||||
|
|
|
@ -136,6 +136,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
||||||
BN_CTX *ctx=NULL;
|
BN_CTX *ctx=NULL;
|
||||||
int reason=ERR_R_BN_LIB;
|
int reason=ERR_R_BN_LIB;
|
||||||
DSA_SIG *ret=NULL;
|
DSA_SIG *ret=NULL;
|
||||||
|
int noredo = 0;
|
||||||
|
|
||||||
BN_init(&m);
|
BN_init(&m);
|
||||||
BN_init(&xr);
|
BN_init(&xr);
|
||||||
|
@ -159,7 +160,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
||||||
|
|
||||||
ctx=BN_CTX_new();
|
ctx=BN_CTX_new();
|
||||||
if (ctx == NULL) goto err;
|
if (ctx == NULL) goto err;
|
||||||
|
redo:
|
||||||
if ((dsa->kinv == NULL) || (dsa->r == NULL))
|
if ((dsa->kinv == NULL) || (dsa->r == NULL))
|
||||||
{
|
{
|
||||||
if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err;
|
if (!DSA_sign_setup(dsa,ctx,&kinv,&r)) goto err;
|
||||||
|
@ -170,6 +171,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
||||||
dsa->kinv=NULL;
|
dsa->kinv=NULL;
|
||||||
r=dsa->r;
|
r=dsa->r;
|
||||||
dsa->r=NULL;
|
dsa->r=NULL;
|
||||||
|
noredo = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -190,6 +192,18 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
||||||
|
|
||||||
ret=DSA_SIG_new();
|
ret=DSA_SIG_new();
|
||||||
if (ret == NULL) goto err;
|
if (ret == NULL) goto err;
|
||||||
|
/* Redo if r or s is zero as required by FIPS 186-3: this is
|
||||||
|
* very unlikely.
|
||||||
|
*/
|
||||||
|
if (BN_is_zero(r) || BN_is_zero(s))
|
||||||
|
{
|
||||||
|
if (noredo)
|
||||||
|
{
|
||||||
|
reason = DSA_R_NEED_NEW_SETUP_VALUES;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
goto redo;
|
||||||
|
}
|
||||||
ret->r = r;
|
ret->r = r;
|
||||||
ret->s = s;
|
ret->s = s;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue