Compare r and s sizes to the order, not the degree.
r and s are scalars, not EC coordinates. Change-Id: I46a20215d3c602559c18c74a1da9a91543ea73ca Reviewed-on: https://boringssl-review.googlesource.com/2240 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
1f10d9c8e1
commit
b145c8140b
@ -66,13 +66,14 @@ int test_builtin(BIO *out) {
|
|||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
EC_KEY *eckey = NULL, *wrong_eckey = NULL;
|
EC_KEY *eckey = NULL, *wrong_eckey = NULL;
|
||||||
EC_GROUP *group;
|
EC_GROUP *group;
|
||||||
|
BIGNUM *order = NULL;
|
||||||
ECDSA_SIG *ecdsa_sig = NULL;
|
ECDSA_SIG *ecdsa_sig = NULL;
|
||||||
unsigned char digest[20], wrong_digest[20];
|
unsigned char digest[20], wrong_digest[20];
|
||||||
unsigned char *signature = NULL;
|
unsigned char *signature = NULL;
|
||||||
const unsigned char *sig_ptr;
|
const unsigned char *sig_ptr;
|
||||||
unsigned char *sig_ptr2;
|
unsigned char *sig_ptr2;
|
||||||
unsigned char *raw_buf = NULL;
|
unsigned char *raw_buf = NULL;
|
||||||
unsigned int sig_len, degree, r_len, s_len, bn_len, buf_len;
|
unsigned int sig_len, r_len, s_len, bn_len, buf_len;
|
||||||
int nid, ret = 0;
|
int nid, ret = 0;
|
||||||
|
|
||||||
/* fill digest values with some random data */
|
/* fill digest values with some random data */
|
||||||
@ -81,6 +82,11 @@ int test_builtin(BIO *out) {
|
|||||||
goto builtin_err;
|
goto builtin_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
order = BN_new();
|
||||||
|
if (order == NULL) {
|
||||||
|
goto builtin_err;
|
||||||
|
}
|
||||||
|
|
||||||
/* create and verify a ecdsa signature with every availble curve
|
/* create and verify a ecdsa signature with every availble curve
|
||||||
* (with ) */
|
* (with ) */
|
||||||
BIO_printf(out,
|
BIO_printf(out,
|
||||||
@ -108,8 +114,10 @@ int test_builtin(BIO *out) {
|
|||||||
goto builtin_err;
|
goto builtin_err;
|
||||||
}
|
}
|
||||||
EC_GROUP_free(group);
|
EC_GROUP_free(group);
|
||||||
degree = EC_GROUP_get_degree(EC_KEY_get0_group(eckey));
|
if (!EC_GROUP_get_order(EC_KEY_get0_group(eckey), order, NULL)) {
|
||||||
if (degree < 160) {
|
goto builtin_err;
|
||||||
|
}
|
||||||
|
if (BN_num_bits(order) < 160) {
|
||||||
/* Too small to test. */
|
/* Too small to test. */
|
||||||
EC_KEY_free(eckey);
|
EC_KEY_free(eckey);
|
||||||
eckey = NULL;
|
eckey = NULL;
|
||||||
@ -203,7 +211,7 @@ int test_builtin(BIO *out) {
|
|||||||
/* Store the two BIGNUMs in raw_buf. */
|
/* Store the two BIGNUMs in raw_buf. */
|
||||||
r_len = BN_num_bytes(ecdsa_sig->r);
|
r_len = BN_num_bytes(ecdsa_sig->r);
|
||||||
s_len = BN_num_bytes(ecdsa_sig->s);
|
s_len = BN_num_bytes(ecdsa_sig->s);
|
||||||
bn_len = (degree + 7) / 8;
|
bn_len = BN_num_bytes(order);
|
||||||
if (r_len > bn_len || s_len > bn_len) {
|
if (r_len > bn_len || s_len > bn_len) {
|
||||||
BIO_printf(out, " failed\n");
|
BIO_printf(out, " failed\n");
|
||||||
goto builtin_err;
|
goto builtin_err;
|
||||||
@ -268,16 +276,24 @@ int test_builtin(BIO *out) {
|
|||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
builtin_err:
|
builtin_err:
|
||||||
if (eckey)
|
if (eckey) {
|
||||||
EC_KEY_free(eckey);
|
EC_KEY_free(eckey);
|
||||||
if (wrong_eckey)
|
}
|
||||||
|
if (order) {
|
||||||
|
BN_free(order);
|
||||||
|
}
|
||||||
|
if (wrong_eckey) {
|
||||||
EC_KEY_free(wrong_eckey);
|
EC_KEY_free(wrong_eckey);
|
||||||
if (ecdsa_sig)
|
}
|
||||||
|
if (ecdsa_sig) {
|
||||||
ECDSA_SIG_free(ecdsa_sig);
|
ECDSA_SIG_free(ecdsa_sig);
|
||||||
if (signature)
|
}
|
||||||
|
if (signature) {
|
||||||
OPENSSL_free(signature);
|
OPENSSL_free(signature);
|
||||||
if (raw_buf)
|
}
|
||||||
|
if (raw_buf) {
|
||||||
OPENSSL_free(raw_buf);
|
OPENSSL_free(raw_buf);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -123,8 +123,8 @@ OPENSSL_EXPORT int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b);
|
|||||||
* in |group| that specifies the generator for the group. */
|
* in |group| that specifies the generator for the group. */
|
||||||
OPENSSL_EXPORT const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group);
|
OPENSSL_EXPORT const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group);
|
||||||
|
|
||||||
/* EC_GROUP_get_order sets |*order| to the order of |group| using |ctx|, if
|
/* EC_GROUP_get_order sets |*order| to the order of |group|, if it's not
|
||||||
* it's not NULL. It returns one on success and zero otherwise. */
|
* NULL. It returns one on success and zero otherwise. |ctx| is ignored. */
|
||||||
OPENSSL_EXPORT int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order,
|
OPENSSL_EXPORT int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order,
|
||||||
BN_CTX *ctx);
|
BN_CTX *ctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user