openssl: Update ECDSA API to OpenSSL 1.1.0
This commit is contained in:
@@ -28,6 +28,10 @@
|
|||||||
#include <openssl/ecdsa.h>
|
#include <openssl/ecdsa.h>
|
||||||
#include <openssl/x509.h>
|
#include <openssl/x509.h>
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
OPENSSL_KEY_FALLBACK(ECDSA_SIG, r, s)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct private_openssl_ec_private_key_t private_openssl_ec_private_key_t;
|
typedef struct private_openssl_ec_private_key_t private_openssl_ec_private_key_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,15 +63,17 @@ bool openssl_ec_fingerprint(EC_KEY *ec, cred_encoding_type_t type, chunk_t *fp);
|
|||||||
static bool build_signature(private_openssl_ec_private_key_t *this,
|
static bool build_signature(private_openssl_ec_private_key_t *this,
|
||||||
chunk_t hash, chunk_t *signature)
|
chunk_t hash, chunk_t *signature)
|
||||||
{
|
{
|
||||||
bool built = FALSE;
|
const BIGNUM *r, *s;
|
||||||
ECDSA_SIG *sig;
|
ECDSA_SIG *sig;
|
||||||
|
bool built = FALSE;
|
||||||
|
|
||||||
sig = ECDSA_do_sign(hash.ptr, hash.len, this->ec);
|
sig = ECDSA_do_sign(hash.ptr, hash.len, this->ec);
|
||||||
if (sig)
|
if (sig)
|
||||||
{
|
{
|
||||||
|
ECDSA_SIG_get0(sig, &r, &s);
|
||||||
/* concatenate BNs r/s to a signature chunk */
|
/* concatenate BNs r/s to a signature chunk */
|
||||||
built = openssl_bn_cat(EC_FIELD_ELEMENT_LEN(EC_KEY_get0_group(this->ec)),
|
built = openssl_bn_cat(EC_FIELD_ELEMENT_LEN(EC_KEY_get0_group(this->ec)),
|
||||||
sig->r, sig->s, signature);
|
r, s, signature);
|
||||||
ECDSA_SIG_free(sig);
|
ECDSA_SIG_free(sig);
|
||||||
}
|
}
|
||||||
return built;
|
return built;
|
||||||
|
|||||||
@@ -27,6 +27,10 @@
|
|||||||
#include <openssl/ecdsa.h>
|
#include <openssl/ecdsa.h>
|
||||||
#include <openssl/x509.h>
|
#include <openssl/x509.h>
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
OPENSSL_KEY_FALLBACK(ECDSA_SIG, r, s)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct private_openssl_ec_public_key_t private_openssl_ec_public_key_t;
|
typedef struct private_openssl_ec_public_key_t private_openssl_ec_public_key_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,14 +59,23 @@ struct private_openssl_ec_public_key_t {
|
|||||||
static bool verify_signature(private_openssl_ec_public_key_t *this,
|
static bool verify_signature(private_openssl_ec_public_key_t *this,
|
||||||
chunk_t hash, chunk_t signature)
|
chunk_t hash, chunk_t signature)
|
||||||
{
|
{
|
||||||
bool valid = FALSE;
|
BIGNUM *r, *s;
|
||||||
ECDSA_SIG *sig;
|
ECDSA_SIG *sig;
|
||||||
|
bool valid = FALSE;
|
||||||
|
|
||||||
sig = ECDSA_SIG_new();
|
sig = ECDSA_SIG_new();
|
||||||
if (sig)
|
if (sig)
|
||||||
{
|
{
|
||||||
/* split the signature chunk in r and s */
|
r = BN_new();
|
||||||
if (openssl_bn_split(signature, sig->r, sig->s))
|
s = BN_new();
|
||||||
|
if (!openssl_bn_split(signature, r, s))
|
||||||
|
{
|
||||||
|
BN_free(r);
|
||||||
|
BN_free(s);
|
||||||
|
ECDSA_SIG_free(sig);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (ECDSA_SIG_set0(sig, r, s))
|
||||||
{
|
{
|
||||||
valid = (ECDSA_do_verify(hash.ptr, hash.len, sig, this->ec) == 1);
|
valid = (ECDSA_do_verify(hash.ptr, hash.len, sig, this->ec) == 1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user