add ECDSA_size to ec_asn1.c

Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
Dr. Stephen Henson 2015-10-27 19:34:17 +00:00
parent c535979126
commit cf517a6d3d
2 changed files with 40 additions and 0 deletions

View File

@ -1319,3 +1319,37 @@ void ECDSA_SIG_get0(BIGNUM **pr, BIGNUM **ps, ECDSA_SIG *sig)
if (ps) if (ps)
*ps = sig->s; *ps = sig->s;
} }
int ECDSA_size(const EC_KEY *r)
{
int ret, i;
ASN1_INTEGER bs;
BIGNUM *order = NULL;
unsigned char buf[4];
const EC_GROUP *group;
if (r == NULL)
return 0;
group = EC_KEY_get0_group(r);
if (group == NULL)
return 0;
if ((order = BN_new()) == NULL)
return 0;
if (!EC_GROUP_get_order(group, order, NULL)) {
BN_clear_free(order);
return 0;
}
i = BN_num_bits(order);
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);
BN_clear_free(order);
return (ret);
}

View File

@ -1089,6 +1089,12 @@ int ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen,
int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, int ECDSA_verify(int type, const unsigned char *dgst, int dgstlen,
const unsigned char *sig, int siglen, EC_KEY *eckey); const unsigned char *sig, int siglen, EC_KEY *eckey);
/** Returns the maximum length of the DER encoded signature
* \param eckey EC_KEY object
* \return numbers of bytes required for the DER encoded signature
*/
int ECDSA_size(const EC_KEY *eckey);
# define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) # define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x)
# ifndef __cplusplus # ifndef __cplusplus