diff --git a/doc/dox_comments/header_files/ssl.h b/doc/dox_comments/header_files/ssl.h index 9bcb060d0..7ee40325d 100644 --- a/doc/dox_comments/header_files/ssl.h +++ b/doc/dox_comments/header_files/ssl.h @@ -13769,6 +13769,7 @@ WOLFSSL_API WOLFSSL_METHOD *wolfTLSv1_3_method(void); \param key key file path (if keySz == 0) or actual key buffer (PEM or ASN.1) \param keySz key size (should be 0 for "key" arg is file path) \param format WOLFSSL_FILETYPE_ASN1 or WOLFSSL_FILETYPE_PEM + \sa wolfSSL_CTX_get_ephemeral_key */ WOLFSSL_API int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, const char* key, unsigned int keySz, int format); @@ -13781,9 +13782,36 @@ WOLFSSL_API int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, con \param key key file path (if keySz == 0) or actual key buffer (PEM or ASN.1) \param keySz key size (should be 0 for "key" arg is file path) \param format WOLFSSL_FILETYPE_ASN1 or WOLFSSL_FILETYPE_PEM + \sa wolfSSL_get_ephemeral_key */ WOLFSSL_API int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo, const char* key, unsigned int keySz, int format); +/*! + \ingroup SSL + \brief This function returns pointer to loaded key as ASN.1/DER + \return 0 Key returned successfully + \param ctx A WOLFSSL_CTX context pointer + \param keyAlgo enum wc_PkType like WC_PK_TYPE_DH and WC_PK_TYPE_ECDH + \param key key buffer pointer + \param keySz key size pointer + \sa wolfSSL_CTX_set_ephemeral_key + */ +WOLFSSL_API int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, + const unsigned char** key, unsigned int* keySz); + +/*! + \ingroup SSL + \brief This function returns pointer to loaded key as ASN.1/DER + \return 0 Key returned successfully + \param ssl A WOLFSSL object pointer + \param keyAlgo enum wc_PkType like WC_PK_TYPE_DH and WC_PK_TYPE_ECDH + \param key key buffer pointer + \param keySz key size pointer + \sa wolfSSL_set_ephemeral_key + */ +WOLFSSL_API int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, + const unsigned char** key, unsigned int* keySz); + /*! \ingroup SSL \brief Sign a message with the chosen message digest, padding, and RSA key diff --git a/examples/server/server.c b/examples/server/server.c index 4f4a6b3af..020714f3c 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -1854,6 +1854,14 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) if (ret != 0) { err_sys_ex(runWithErrors, "error loading static ECDH key"); } + { + const byte* key = NULL; + word32 keySz = 0; + /* example for getting pointer to loaded static ephemeral key */ + wolfSSL_CTX_get_ephemeral_key(ctx, WC_PK_TYPE_ECDH, &key, &keySz); + (void)key; + (void)keySz; + } #endif #ifndef NO_DH ret = wolfSSL_CTX_set_ephemeral_key(ctx, WC_PK_TYPE_DH, diff --git a/src/ssl.c b/src/ssl.c index 49378cdf3..b84ed6a34 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -55171,7 +55171,6 @@ int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, return SetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz, format, ctx->heap, NULL); } - int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo, const char* key, unsigned int keySz, int format) { @@ -55183,6 +55182,65 @@ int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo, ssl->heap, ssl->ctx); } +static int GetStaticEphemeralKey(StaticKeyExchangeInfo_t* staticKE, int keyAlgo, + const unsigned char** key, unsigned int* keySz) +{ + int ret = 0; + DerBuffer* der = NULL; + + if (staticKE == NULL || key == NULL || keySz == NULL) { + return BAD_FUNC_ARG; + } + + *key = NULL; + *keySz = 0; + + switch (keyAlgo) { + #ifndef NO_DH + case WC_PK_TYPE_DH: + der = staticKE->dhKey; + break; + #endif + #ifdef HAVE_ECC + case WC_PK_TYPE_ECDH: + der = staticKE->ecKey; + break; + #endif + default: + /* not supported */ + ret = NOT_COMPILED_IN; + break; + } + + if (der) { + *key = der->buffer; + *keySz = der->length; + } + + return ret; +} + +/* returns pointer to currently loaded static ephemeral as ASN.1 */ +/* this can be converted to PEM using wc_DerToPem */ +int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, + const unsigned char** key, unsigned int* keySz) +{ + if (ctx == NULL) { + return BAD_FUNC_ARG; + } + + return GetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz); +} +int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, + const unsigned char** key, unsigned int* keySz) +{ + if (ssl == NULL) { + return BAD_FUNC_ARG; + } + + return GetStaticEphemeralKey(&ssl->staticKE, keyAlgo, key, keySz); +} + #endif /* WOLFSSL_STATIC_EPHEMERAL */ #if defined(OPENSSL_EXTRA) diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index de42e4c78..d1b3e9655 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -4234,6 +4234,12 @@ WOLFSSL_API int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, const char* key, unsigned int keySz, int format); WOLFSSL_API int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo, const char* key, unsigned int keySz, int format); + +/* returns pointer to loaded key as ASN.1/DER */ +WOLFSSL_API int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, + const unsigned char** key, unsigned int* keySz); +WOLFSSL_API int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, + const unsigned char** key, unsigned int* keySz); #endif