Use BN_bn2bin_padded rather than doing math to figure out leading zeros.
Saves doing it ad-hoc all the time. Change-Id: Ic1a1180f56eec37c19799649bb8f18237bd617f8 Reviewed-on: https://boringssl-review.googlesource.com/2241 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
committed by
Adam Langley
parent
b145c8140b
commit
f2f3cfedb7
+22
-31
@@ -81,7 +81,7 @@ static size_t ec_GFp_simple_point2oct(const EC_GROUP *group,
|
||||
BN_CTX *new_ctx = NULL;
|
||||
int used_ctx = 0;
|
||||
BIGNUM *x, *y;
|
||||
size_t field_len, i, skip;
|
||||
size_t field_len, i;
|
||||
|
||||
if ((form != POINT_CONVERSION_COMPRESSED) &&
|
||||
(form != POINT_CONVERSION_UNCOMPRESSED) &&
|
||||
@@ -117,58 +117,45 @@ static size_t ec_GFp_simple_point2oct(const EC_GROUP *group,
|
||||
|
||||
if (ctx == NULL) {
|
||||
ctx = new_ctx = BN_CTX_new();
|
||||
if (ctx == NULL)
|
||||
if (ctx == NULL) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
BN_CTX_start(ctx);
|
||||
used_ctx = 1;
|
||||
x = BN_CTX_get(ctx);
|
||||
y = BN_CTX_get(ctx);
|
||||
if (y == NULL)
|
||||
if (y == NULL) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx))
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if ((form == POINT_CONVERSION_COMPRESSED ||
|
||||
form == POINT_CONVERSION_HYBRID) &&
|
||||
BN_is_odd(y))
|
||||
BN_is_odd(y)) {
|
||||
buf[0] = form + 1;
|
||||
else
|
||||
} else {
|
||||
buf[0] = form;
|
||||
|
||||
}
|
||||
i = 1;
|
||||
|
||||
skip = field_len - BN_num_bytes(x);
|
||||
if (skip > field_len) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_simple_point2oct, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
while (skip > 0) {
|
||||
buf[i++] = 0;
|
||||
skip--;
|
||||
}
|
||||
skip = BN_bn2bin(x, buf + i);
|
||||
i += skip;
|
||||
if (i != 1 + field_len) {
|
||||
if (!BN_bn2bin_padded(buf + i, field_len, x)) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_simple_point2oct, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
i += field_len;
|
||||
|
||||
if (form == POINT_CONVERSION_UNCOMPRESSED ||
|
||||
form == POINT_CONVERSION_HYBRID) {
|
||||
skip = field_len - BN_num_bytes(y);
|
||||
if (skip > field_len) {
|
||||
if (!BN_bn2bin_padded(buf + i, field_len, y)) {
|
||||
OPENSSL_PUT_ERROR(EC, ec_GFp_simple_point2oct, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
while (skip > 0) {
|
||||
buf[i++] = 0;
|
||||
skip--;
|
||||
}
|
||||
skip = BN_bn2bin(y, buf + i);
|
||||
i += skip;
|
||||
i += field_len;
|
||||
}
|
||||
|
||||
if (i != ret) {
|
||||
@@ -177,17 +164,21 @@ static size_t ec_GFp_simple_point2oct(const EC_GROUP *group,
|
||||
}
|
||||
}
|
||||
|
||||
if (used_ctx)
|
||||
if (used_ctx) {
|
||||
BN_CTX_end(ctx);
|
||||
if (new_ctx != NULL)
|
||||
}
|
||||
if (new_ctx != NULL) {
|
||||
BN_CTX_free(new_ctx);
|
||||
}
|
||||
return ret;
|
||||
|
||||
err:
|
||||
if (used_ctx)
|
||||
if (used_ctx) {
|
||||
BN_CTX_end(ctx);
|
||||
if (new_ctx != NULL)
|
||||
}
|
||||
if (new_ctx != NULL) {
|
||||
BN_CTX_free(new_ctx);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+3
-9
@@ -81,7 +81,7 @@ int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
|
||||
const BIGNUM *priv;
|
||||
const EC_GROUP *group;
|
||||
int ret = -1;
|
||||
size_t buflen, len;
|
||||
size_t buflen;
|
||||
uint8_t *buf = NULL;
|
||||
|
||||
if ((ctx = BN_CTX_new()) == NULL) {
|
||||
@@ -116,20 +116,14 @@ int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
|
||||
}
|
||||
|
||||
buflen = (EC_GROUP_get_degree(group) + 7) / 8;
|
||||
len = BN_num_bytes(x);
|
||||
if (len > buflen) {
|
||||
OPENSSL_PUT_ERROR(ECDH, ECDH_compute_key, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
buf = OPENSSL_malloc(buflen);
|
||||
if (buf == NULL) {
|
||||
OPENSSL_PUT_ERROR(ECDH, ECDH_compute_key, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
memset(buf, 0, buflen - len);
|
||||
if (len != (size_t)BN_bn2bin(x, buf + buflen - len)) {
|
||||
OPENSSL_PUT_ERROR(ECDH, ECDH_compute_key, ERR_R_BN_LIB);
|
||||
if (!BN_bn2bin_padded(buf, buflen, x)) {
|
||||
OPENSSL_PUT_ERROR(ECDH, ECDH_compute_key, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
@@ -217,14 +217,15 @@ int test_builtin(BIO *out) {
|
||||
goto builtin_err;
|
||||
}
|
||||
buf_len = 2 * bn_len;
|
||||
raw_buf = OPENSSL_malloc(buf_len);
|
||||
raw_buf = OPENSSL_malloc(2 * bn_len);
|
||||
if (raw_buf == NULL) {
|
||||
goto builtin_err;
|
||||
}
|
||||
/* Pad the bignums with leading zeroes. */
|
||||
memset(raw_buf, 0, buf_len);
|
||||
BN_bn2bin(ecdsa_sig->r, raw_buf + bn_len - r_len);
|
||||
BN_bn2bin(ecdsa_sig->s, raw_buf + buf_len - s_len);
|
||||
if (!BN_bn2bin_padded(raw_buf, bn_len, ecdsa_sig->r) ||
|
||||
!BN_bn2bin_padded(raw_buf + bn_len, bn_len, ecdsa_sig->s)) {
|
||||
goto builtin_err;
|
||||
}
|
||||
|
||||
/* Modify a single byte in the buffer. */
|
||||
offset = raw_buf[10] % buf_len;
|
||||
|
||||
Reference in New Issue
Block a user