Move some DSA functions between files to make it possible to use the DSA
crypto without ASN1 dependency.
This commit is contained in:
@@ -66,14 +66,13 @@
|
|||||||
static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
|
static int sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||||
{
|
{
|
||||||
if(operation == ASN1_OP_NEW_PRE) {
|
if(operation == ASN1_OP_NEW_PRE) {
|
||||||
DSA_SIG *sig;
|
*pval = (ASN1_VALUE *)DSA_SIG_new();
|
||||||
sig = OPENSSL_malloc(sizeof(DSA_SIG));
|
if(*pval) return 2;
|
||||||
sig->r = NULL;
|
|
||||||
sig->s = NULL;
|
|
||||||
*pval = (ASN1_VALUE *)sig;
|
|
||||||
if(sig) return 2;
|
|
||||||
DSAerr(DSA_F_SIG_CB, ERR_R_MALLOC_FAILURE);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if(operation == ASN1_OP_FREE_PRE) {
|
||||||
|
DSA_SIG_free((DSA_SIG *)*pval);
|
||||||
|
*pval = NULL;
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -83,7 +82,7 @@ ASN1_SEQUENCE_cb(DSA_SIG, sig_cb) = {
|
|||||||
ASN1_SIMPLE(DSA_SIG, s, CBIGNUM)
|
ASN1_SIMPLE(DSA_SIG, s, CBIGNUM)
|
||||||
} ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG)
|
} ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG)
|
||||||
|
|
||||||
IMPLEMENT_ASN1_FUNCTIONS_const(DSA_SIG)
|
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA_SIG,DSA_SIG,DSA_SIG)
|
||||||
|
|
||||||
/* Override the default free and new methods */
|
/* Override the default free and new methods */
|
||||||
static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
|
static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||||
@@ -138,3 +137,61 @@ ASN1_CHOICE_cb(DSAPublicKey, dsa_cb) = {
|
|||||||
} ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params)
|
} ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params)
|
||||||
|
|
||||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey)
|
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey)
|
||||||
|
|
||||||
|
int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig,
|
||||||
|
unsigned int *siglen, DSA *dsa)
|
||||||
|
{
|
||||||
|
DSA_SIG *s;
|
||||||
|
s=DSA_do_sign(dgst,dlen,dsa);
|
||||||
|
if (s == NULL)
|
||||||
|
{
|
||||||
|
*siglen=0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
*siglen=i2d_DSA_SIG(s,&sig);
|
||||||
|
DSA_SIG_free(s);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* data has already been hashed (probably with SHA or SHA-1). */
|
||||||
|
/* returns
|
||||||
|
* 1: correct signature
|
||||||
|
* 0: incorrect signature
|
||||||
|
* -1: error
|
||||||
|
*/
|
||||||
|
int DSA_verify(int type, const unsigned char *dgst, int dgst_len,
|
||||||
|
const unsigned char *sigbuf, int siglen, DSA *dsa)
|
||||||
|
{
|
||||||
|
DSA_SIG *s;
|
||||||
|
int ret=-1;
|
||||||
|
|
||||||
|
s = DSA_SIG_new();
|
||||||
|
if (s == NULL) return(ret);
|
||||||
|
if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err;
|
||||||
|
ret=DSA_do_verify(dgst,dgst_len,s,dsa);
|
||||||
|
err:
|
||||||
|
DSA_SIG_free(s);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DSA_size(const DSA *r)
|
||||||
|
{
|
||||||
|
int ret,i;
|
||||||
|
ASN1_INTEGER bs;
|
||||||
|
unsigned char buf[4]; /* 4 bytes looks really small.
|
||||||
|
However, i2d_ASN1_INTEGER() will not look
|
||||||
|
beyond the first byte, as long as the second
|
||||||
|
parameter is NULL. */
|
||||||
|
|
||||||
|
i=BN_num_bits(r->q);
|
||||||
|
bs.length=(i+7)/8;
|
||||||
|
bs.data=buf;
|
||||||
|
bs.type=V_ASN1_INTEGER;
|
||||||
|
/* If the top bit is set the asn1 encoding is 1 larger. */
|
||||||
|
buf[0]=0xff;
|
||||||
|
|
||||||
|
i=i2d_ASN1_INTEGER(&bs,NULL);
|
||||||
|
i+=i; /* r and s */
|
||||||
|
ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|||||||
@@ -230,28 +230,6 @@ int DSA_up_ref(DSA *r)
|
|||||||
return ((i > 1) ? 1 : 0);
|
return ((i > 1) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DSA_size(const DSA *r)
|
|
||||||
{
|
|
||||||
int ret,i;
|
|
||||||
ASN1_INTEGER bs;
|
|
||||||
unsigned char buf[4]; /* 4 bytes looks really small.
|
|
||||||
However, i2d_ASN1_INTEGER() will not look
|
|
||||||
beyond the first byte, as long as the second
|
|
||||||
parameter is NULL. */
|
|
||||||
|
|
||||||
i=BN_num_bits(r->q);
|
|
||||||
bs.length=(i+7)/8;
|
|
||||||
bs.data=buf;
|
|
||||||
bs.type=V_ASN1_INTEGER;
|
|
||||||
/* If the top bit is set the asn1 encoding is 1 larger. */
|
|
||||||
buf[0]=0xff;
|
|
||||||
|
|
||||||
i=i2d_ASN1_INTEGER(&bs,NULL);
|
|
||||||
i+=i; /* r and s */
|
|
||||||
ret=ASN1_object_size(1,i,V_ASN1_SEQUENCE);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
|
int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
|
||||||
CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
|
CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
|
||||||
{
|
{
|
||||||
@@ -269,6 +247,29 @@ void *DSA_get_ex_data(DSA *d, int idx)
|
|||||||
return(CRYPTO_get_ex_data(&d->ex_data,idx));
|
return(CRYPTO_get_ex_data(&d->ex_data,idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DSA_SIG *DSA_SIG_new(void)
|
||||||
|
{
|
||||||
|
DSA_SIG *sig;
|
||||||
|
sig = OPENSSL_malloc(sizeof(DSA_SIG));
|
||||||
|
if (!sig)
|
||||||
|
return NULL;
|
||||||
|
sig->r = NULL;
|
||||||
|
sig->s = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSA_SIG_free(DSA_SIG *sig)
|
||||||
|
{
|
||||||
|
if (sig)
|
||||||
|
{
|
||||||
|
if (sig->r)
|
||||||
|
BN_free(sig->r);
|
||||||
|
if (sig->s)
|
||||||
|
BN_free(sig->s);
|
||||||
|
OPENSSL_free(sig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef OPENSSL_NO_DH
|
#ifndef OPENSSL_NO_DH
|
||||||
DH *DSA_dup_DH(const DSA *r)
|
DH *DSA_dup_DH(const DSA *r)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -79,21 +79,6 @@ DSA_SIG * DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
|||||||
return dsa->meth->dsa_do_sign(dgst, dlen, dsa);
|
return dsa->meth->dsa_do_sign(dgst, dlen, dsa);
|
||||||
}
|
}
|
||||||
|
|
||||||
int DSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char *sig,
|
|
||||||
unsigned int *siglen, DSA *dsa)
|
|
||||||
{
|
|
||||||
DSA_SIG *s;
|
|
||||||
s=DSA_do_sign(dgst,dlen,dsa);
|
|
||||||
if (s == NULL)
|
|
||||||
{
|
|
||||||
*siglen=0;
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
*siglen=i2d_DSA_SIG(s,&sig);
|
|
||||||
DSA_SIG_free(s);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
|
int DSA_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp)
|
||||||
{
|
{
|
||||||
#ifdef OPENSSL_FIPS
|
#ifdef OPENSSL_FIPS
|
||||||
|
|||||||
@@ -80,24 +80,3 @@ int DSA_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig,
|
|||||||
#endif
|
#endif
|
||||||
return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa);
|
return dsa->meth->dsa_do_verify(dgst, dgst_len, sig, dsa);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* data has already been hashed (probably with SHA or SHA-1). */
|
|
||||||
/* returns
|
|
||||||
* 1: correct signature
|
|
||||||
* 0: incorrect signature
|
|
||||||
* -1: error
|
|
||||||
*/
|
|
||||||
int DSA_verify(int type, const unsigned char *dgst, int dgst_len,
|
|
||||||
const unsigned char *sigbuf, int siglen, DSA *dsa)
|
|
||||||
{
|
|
||||||
DSA_SIG *s;
|
|
||||||
int ret=-1;
|
|
||||||
|
|
||||||
s = DSA_SIG_new();
|
|
||||||
if (s == NULL) return(ret);
|
|
||||||
if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err;
|
|
||||||
ret=DSA_do_verify(dgst,dgst_len,s,dsa);
|
|
||||||
err:
|
|
||||||
DSA_SIG_free(s);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user