diff --git a/src/ssl.c b/src/ssl.c index 34b407e90..d64ec5dc1 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -37063,6 +37063,37 @@ WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void) return sig; } +void wolfSSL_ECDSA_SIG_get0(const WOLFSSL_ECDSA_SIG* sig, + const WOLFSSL_BIGNUM** r, const WOLFSSL_BIGNUM** s) +{ + if (sig == NULL) { + return; + } + + if (r != NULL) { + *r = sig->r; + } + if (s != NULL) { + *s = sig->s; + } +} + +int wolfSSL_ECDSA_SIG_set0(WOLFSSL_ECDSA_SIG* sig, WOLFSSL_BIGNUM* r, + WOLFSSL_BIGNUM* s) +{ + if (sig == NULL || r == NULL || s == NULL) { + return WOLFSSL_FAILURE; + } + + wolfSSL_BN_free(sig->r); + wolfSSL_BN_free(sig->s); + + sig->r = r; + sig->s = s; + + return WOLFSSL_SUCCESS; +} + /* return signature structure on success, NULL otherwise */ WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *d, int dlen, WOLFSSL_EC_KEY *key) diff --git a/wolfssl/openssl/ecdsa.h b/wolfssl/openssl/ecdsa.h index 8e5c873ca..9b0e8c7fa 100644 --- a/wolfssl/openssl/ecdsa.h +++ b/wolfssl/openssl/ecdsa.h @@ -46,6 +46,10 @@ struct WOLFSSL_ECDSA_SIG { WOLFSSL_API void wolfSSL_ECDSA_SIG_free(WOLFSSL_ECDSA_SIG *sig); WOLFSSL_API WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_SIG_new(void); +WOLFSSL_API void wolfSSL_ECDSA_SIG_get0(const WOLFSSL_ECDSA_SIG*, + const WOLFSSL_BIGNUM**, const WOLFSSL_BIGNUM**); +WOLFSSL_API int wolfSSL_ECDSA_SIG_set0(WOLFSSL_ECDSA_SIG*, WOLFSSL_BIGNUM*, + WOLFSSL_BIGNUM*); WOLFSSL_API WOLFSSL_ECDSA_SIG *wolfSSL_ECDSA_do_sign(const unsigned char *dgst, int dgst_len, WOLFSSL_EC_KEY *eckey); @@ -62,6 +66,8 @@ WOLFSSL_API int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, #define ECDSA_SIG_free wolfSSL_ECDSA_SIG_free #define ECDSA_SIG_new wolfSSL_ECDSA_SIG_new +#define ECDSA_SIG_get0 wolfSSL_ECDSA_SIG_get0 +#define ECDSA_SIG_set0 wolfSSL_ECDSA_SIG_set0 #define ECDSA_do_sign wolfSSL_ECDSA_do_sign #define ECDSA_do_verify wolfSSL_ECDSA_do_verify #define d2i_ECDSA_SIG wolfSSL_d2i_ECDSA_SIG