adapt ossl_ecdsa.c to crypto/ec
Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
714b2abb29
commit
6a47db4502
@ -1,4 +1,4 @@
|
|||||||
/* crypto/ecdsa/ecs_ossl.c */
|
/* crypto/ec/ecdsa_ossl.c */
|
||||||
/*
|
/*
|
||||||
* Written by Nils Larsch for the OpenSSL project
|
* Written by Nils Larsch for the OpenSSL project
|
||||||
*/
|
*/
|
||||||
@ -56,42 +56,12 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ecs_locl.h"
|
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/obj_mac.h>
|
#include <openssl/obj_mac.h>
|
||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
#include <openssl/rand.h>
|
#include <openssl/rand.h>
|
||||||
|
#include <openssl/ec.h>
|
||||||
static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dlen,
|
#include "ec_lcl.h"
|
||||||
const BIGNUM *, const BIGNUM *,
|
|
||||||
EC_KEY *eckey);
|
|
||||||
static int ecdsa_sign_setup_no_digest(EC_KEY *eckey, BN_CTX *ctx_in,
|
|
||||||
BIGNUM **kinvp, BIGNUM **rp);
|
|
||||||
static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
|
|
||||||
BIGNUM **rp, const unsigned char *dgst, int dlen);
|
|
||||||
static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
|
|
||||||
const ECDSA_SIG *sig, EC_KEY *eckey);
|
|
||||||
|
|
||||||
static ECDSA_METHOD openssl_ecdsa_meth = {
|
|
||||||
"OpenSSL ECDSA method",
|
|
||||||
ecdsa_do_sign,
|
|
||||||
ecdsa_sign_setup_no_digest,
|
|
||||||
ecdsa_do_verify,
|
|
||||||
ECDSA_FLAG_FIPS_METHOD, /* flags */
|
|
||||||
NULL /* app_data */
|
|
||||||
};
|
|
||||||
|
|
||||||
const ECDSA_METHOD *ECDSA_OpenSSL(void)
|
|
||||||
{
|
|
||||||
return &openssl_ecdsa_meth;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ecdsa_sign_setup_no_digest(EC_KEY *eckey,
|
|
||||||
BN_CTX *ctx_in, BIGNUM **kinvp,
|
|
||||||
BIGNUM **rp)
|
|
||||||
{
|
|
||||||
return ecdsa_sign_setup(eckey, ctx_in, kinvp, rp, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
||||||
BIGNUM **kinvp, BIGNUM **rp,
|
BIGNUM **kinvp, BIGNUM **rp,
|
||||||
@ -104,13 +74,13 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (eckey == NULL || (group = EC_KEY_get0_group(eckey)) == NULL) {
|
if (eckey == NULL || (group = EC_KEY_get0_group(eckey)) == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_PASSED_NULL_PARAMETER);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_PASSED_NULL_PARAMETER);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx_in == NULL) {
|
if (ctx_in == NULL) {
|
||||||
if ((ctx = BN_CTX_new()) == NULL) {
|
if ((ctx = BN_CTX_new()) == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_MALLOC_FAILURE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -121,15 +91,15 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
order = BN_new();
|
order = BN_new();
|
||||||
X = BN_new();
|
X = BN_new();
|
||||||
if (k == NULL || r == NULL || order == NULL || X == NULL) {
|
if (k == NULL || r == NULL || order == NULL || X == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_MALLOC_FAILURE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if ((tmp_point = EC_POINT_new(group)) == NULL) {
|
if ((tmp_point = EC_POINT_new(group)) == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!EC_GROUP_get_order(group, order, ctx)) {
|
if (!EC_GROUP_get_order(group, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,14 +110,14 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
if (!BN_generate_dsa_nonce
|
if (!BN_generate_dsa_nonce
|
||||||
(k, order, EC_KEY_get0_private_key(eckey), dgst, dlen,
|
(k, order, EC_KEY_get0_private_key(eckey), dgst, dlen,
|
||||||
ctx)) {
|
ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP,
|
ECerr(EC_F_ECDSA_SIGN_SETUP,
|
||||||
ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED);
|
EC_R_RANDOM_NUMBER_GENERATION_FAILED);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!BN_rand_range(k, order)) {
|
if (!BN_rand_range(k, order)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP,
|
ECerr(EC_F_ECDSA_SIGN_SETUP,
|
||||||
ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED);
|
EC_R_RANDOM_NUMBER_GENERATION_FAILED);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,14 +136,14 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
|
|
||||||
/* compute r the x-coordinate of generator * k */
|
/* compute r the x-coordinate of generator * k */
|
||||||
if (!EC_POINT_mul(group, tmp_point, k, NULL, NULL, ctx)) {
|
if (!EC_POINT_mul(group, tmp_point, k, NULL, NULL, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
||||||
NID_X9_62_prime_field) {
|
NID_X9_62_prime_field) {
|
||||||
if (!EC_POINT_get_affine_coordinates_GFp
|
if (!EC_POINT_get_affine_coordinates_GFp
|
||||||
(group, tmp_point, X, NULL, ctx)) {
|
(group, tmp_point, X, NULL, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -183,13 +153,13 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
if (!EC_POINT_get_affine_coordinates_GF2m(group,
|
if (!EC_POINT_get_affine_coordinates_GF2m(group,
|
||||||
tmp_point, X, NULL,
|
tmp_point, X, NULL,
|
||||||
ctx)) {
|
ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!BN_nnmod(r, X, order, ctx)) {
|
if (!BN_nnmod(r, X, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,22 +172,22 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
* order must be prime and use Fermats Little Theorem instead.
|
* order must be prime and use Fermats Little Theorem instead.
|
||||||
*/
|
*/
|
||||||
if (!BN_set_word(X, 2)) {
|
if (!BN_set_word(X, 2)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!BN_mod_sub(X, order, X, order, ctx)) {
|
if (!BN_mod_sub(X, order, X, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
BN_set_flags(X, BN_FLG_CONSTTIME);
|
BN_set_flags(X, BN_FLG_CONSTTIME);
|
||||||
if (!BN_mod_exp_mont_consttime
|
if (!BN_mod_exp_mont_consttime
|
||||||
(k, k, X, order, ctx, EC_GROUP_get_mont_data(group))) {
|
(k, k, X, order, ctx, EC_GROUP_get_mont_data(group))) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!BN_mod_inverse(k, k, order, ctx)) {
|
if (!BN_mod_inverse(k, k, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
ECerr(EC_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -242,9 +212,15 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dgst_len,
|
int ossl_ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||||
const BIGNUM *in_kinv, const BIGNUM *in_r,
|
BIGNUM **rp)
|
||||||
EC_KEY *eckey)
|
{
|
||||||
|
return ecdsa_sign_setup(eckey, ctx_in, kinvp, rp, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
||||||
|
const BIGNUM *in_kinv, const BIGNUM *in_r,
|
||||||
|
EC_KEY *eckey)
|
||||||
{
|
{
|
||||||
int ok = 0, i;
|
int ok = 0, i;
|
||||||
BIGNUM *kinv = NULL, *s, *m = NULL, *tmp = NULL, *order = NULL;
|
BIGNUM *kinv = NULL, *s, *m = NULL, *tmp = NULL, *order = NULL;
|
||||||
@ -252,33 +228,31 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dgst_len,
|
|||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
ECDSA_SIG *ret;
|
ECDSA_SIG *ret;
|
||||||
ECDSA_DATA *ecdsa;
|
|
||||||
const BIGNUM *priv_key;
|
const BIGNUM *priv_key;
|
||||||
|
|
||||||
ecdsa = ecdsa_check(eckey);
|
|
||||||
group = EC_KEY_get0_group(eckey);
|
group = EC_KEY_get0_group(eckey);
|
||||||
priv_key = EC_KEY_get0_private_key(eckey);
|
priv_key = EC_KEY_get0_private_key(eckey);
|
||||||
|
|
||||||
if (group == NULL || priv_key == NULL || ecdsa == NULL) {
|
if (group == NULL || priv_key == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_PASSED_NULL_PARAMETER);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_PASSED_NULL_PARAMETER);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ECDSA_SIG_new();
|
ret = ECDSA_SIG_new();
|
||||||
if (ret == NULL) {
|
if (ret == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
s = ret->s;
|
s = ret->s;
|
||||||
|
|
||||||
if ((ctx = BN_CTX_new()) == NULL || (order = BN_new()) == NULL ||
|
if ((ctx = BN_CTX_new()) == NULL || (order = BN_new()) == NULL ||
|
||||||
(tmp = BN_new()) == NULL || (m = BN_new()) == NULL) {
|
(tmp = BN_new()) == NULL || (m = BN_new()) == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(group, order, ctx)) {
|
if (!EC_GROUP_get_order(group, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
i = BN_num_bits(order);
|
i = BN_num_bits(order);
|
||||||
@ -288,39 +262,39 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dgst_len,
|
|||||||
if (8 * dgst_len > i)
|
if (8 * dgst_len > i)
|
||||||
dgst_len = (i + 7) / 8;
|
dgst_len = (i + 7) / 8;
|
||||||
if (!BN_bin2bn(dgst, dgst_len, m)) {
|
if (!BN_bin2bn(dgst, dgst_len, m)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* If still too long truncate remaining bits with a shift */
|
/* If still too long truncate remaining bits with a shift */
|
||||||
if ((8 * dgst_len > i) && !BN_rshift(m, m, 8 - (i & 0x7))) {
|
if ((8 * dgst_len > i) && !BN_rshift(m, m, 8 - (i & 0x7))) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
if (in_kinv == NULL || in_r == NULL) {
|
if (in_kinv == NULL || in_r == NULL) {
|
||||||
if (!ecdsa_sign_setup(eckey, ctx, &kinv, &ret->r, dgst, dgst_len)) {
|
if (!ecdsa_sign_setup(eckey, ctx, &kinv, &ret->r, dgst, dgst_len)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_ECDSA_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_ECDSA_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
ckinv = kinv;
|
ckinv = kinv;
|
||||||
} else {
|
} else {
|
||||||
ckinv = in_kinv;
|
ckinv = in_kinv;
|
||||||
if (BN_copy(ret->r, in_r) == NULL) {
|
if (BN_copy(ret->r, in_r) == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!BN_mod_mul(tmp, priv_key, ret->r, order, ctx)) {
|
if (!BN_mod_mul(tmp, priv_key, ret->r, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!BN_mod_add_quick(s, tmp, m, order)) {
|
if (!BN_mod_add_quick(s, tmp, m, order)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!BN_mod_mul(s, s, ckinv, order, ctx)) {
|
if (!BN_mod_mul(s, s, ckinv, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (BN_is_zero(s)) {
|
if (BN_is_zero(s)) {
|
||||||
@ -329,8 +303,7 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dgst_len,
|
|||||||
* generate new kinv and r values
|
* generate new kinv and r values
|
||||||
*/
|
*/
|
||||||
if (in_kinv != NULL && in_r != NULL) {
|
if (in_kinv != NULL && in_r != NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_SIGN,
|
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, EC_R_NEED_NEW_SETUP_VALUES);
|
||||||
ECDSA_R_NEED_NEW_SETUP_VALUES);
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -353,8 +326,8 @@ static ECDSA_SIG *ecdsa_do_sign(const unsigned char *dgst, int dgst_len,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
|
int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
|
||||||
const ECDSA_SIG *sig, EC_KEY *eckey)
|
const ECDSA_SIG *sig, EC_KEY *eckey)
|
||||||
{
|
{
|
||||||
int ret = -1, i;
|
int ret = -1, i;
|
||||||
BN_CTX *ctx;
|
BN_CTX *ctx;
|
||||||
@ -366,13 +339,13 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
|
|||||||
/* check input values */
|
/* check input values */
|
||||||
if (eckey == NULL || (group = EC_KEY_get0_group(eckey)) == NULL ||
|
if (eckey == NULL || (group = EC_KEY_get0_group(eckey)) == NULL ||
|
||||||
(pub_key = EC_KEY_get0_public_key(eckey)) == NULL || sig == NULL) {
|
(pub_key = EC_KEY_get0_public_key(eckey)) == NULL || sig == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ECDSA_R_MISSING_PARAMETERS);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, EC_R_MISSING_PARAMETERS);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx = BN_CTX_new();
|
ctx = BN_CTX_new();
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_MALLOC_FAILURE);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
@ -382,25 +355,25 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
|
|||||||
m = BN_CTX_get(ctx);
|
m = BN_CTX_get(ctx);
|
||||||
X = BN_CTX_get(ctx);
|
X = BN_CTX_get(ctx);
|
||||||
if (!X) {
|
if (!X) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EC_GROUP_get_order(group, order, ctx)) {
|
if (!EC_GROUP_get_order(group, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BN_is_zero(sig->r) || BN_is_negative(sig->r) ||
|
if (BN_is_zero(sig->r) || BN_is_negative(sig->r) ||
|
||||||
BN_ucmp(sig->r, order) >= 0 || BN_is_zero(sig->s) ||
|
BN_ucmp(sig->r, order) >= 0 || BN_is_zero(sig->s) ||
|
||||||
BN_is_negative(sig->s) || BN_ucmp(sig->s, order) >= 0) {
|
BN_is_negative(sig->s) || BN_ucmp(sig->s, order) >= 0) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ECDSA_R_BAD_SIGNATURE);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, EC_R_BAD_SIGNATURE);
|
||||||
ret = 0; /* signature is invalid */
|
ret = 0; /* signature is invalid */
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* calculate tmp1 = inv(S) mod order */
|
/* calculate tmp1 = inv(S) mod order */
|
||||||
if (!BN_mod_inverse(u2, sig->s, order, ctx)) {
|
if (!BN_mod_inverse(u2, sig->s, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* digest -> m */
|
/* digest -> m */
|
||||||
@ -411,37 +384,37 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
|
|||||||
if (8 * dgst_len > i)
|
if (8 * dgst_len > i)
|
||||||
dgst_len = (i + 7) / 8;
|
dgst_len = (i + 7) / 8;
|
||||||
if (!BN_bin2bn(dgst, dgst_len, m)) {
|
if (!BN_bin2bn(dgst, dgst_len, m)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* If still too long truncate remaining bits with a shift */
|
/* If still too long truncate remaining bits with a shift */
|
||||||
if ((8 * dgst_len > i) && !BN_rshift(m, m, 8 - (i & 0x7))) {
|
if ((8 * dgst_len > i) && !BN_rshift(m, m, 8 - (i & 0x7))) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* u1 = m * tmp mod order */
|
/* u1 = m * tmp mod order */
|
||||||
if (!BN_mod_mul(u1, m, u2, order, ctx)) {
|
if (!BN_mod_mul(u1, m, u2, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* u2 = r * w mod q */
|
/* u2 = r * w mod q */
|
||||||
if (!BN_mod_mul(u2, sig->r, u2, order, ctx)) {
|
if (!BN_mod_mul(u2, sig->r, u2, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((point = EC_POINT_new(group)) == NULL) {
|
if ((point = EC_POINT_new(group)) == NULL) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_MALLOC_FAILURE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!EC_POINT_mul(group, point, u1, pub_key, u2, ctx)) {
|
if (!EC_POINT_mul(group, point, u1, pub_key, u2, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
|
||||||
NID_X9_62_prime_field) {
|
NID_X9_62_prime_field) {
|
||||||
if (!EC_POINT_get_affine_coordinates_GFp(group, point, X, NULL, ctx)) {
|
if (!EC_POINT_get_affine_coordinates_GFp(group, point, X, NULL, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -449,13 +422,13 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
|
|||||||
else { /* NID_X9_62_characteristic_two_field */
|
else { /* NID_X9_62_characteristic_two_field */
|
||||||
|
|
||||||
if (!EC_POINT_get_affine_coordinates_GF2m(group, point, X, NULL, ctx)) {
|
if (!EC_POINT_get_affine_coordinates_GF2m(group, point, X, NULL, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_EC_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_EC_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!BN_nnmod(u1, X, order, ctx)) {
|
if (!BN_nnmod(u1, X, order, ctx)) {
|
||||||
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);
|
ECerr(EC_F_OSSL_ECDSA_VERIFY_SIG, ERR_R_BN_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* if the signature is correct u1 is equal to sig->r */
|
/* if the signature is correct u1 is equal to sig->r */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user