diff --git a/src/ssl.c b/src/ssl.c index d79433309..ddb8fdc4f 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16215,6 +16215,36 @@ WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store, #ifndef NO_CERTS +int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509) +{ + WOLFSSL_ENTER("wolfSSL_i2d_X509_bio"); + + if (bio == NULL || x509 == NULL) { + return SSL_FAILURE; + } + + if (bio->mem != NULL) { + XFREE(bio->mem, NULL, DYNAMIC_TYPE_OPENSSL); + } + + if (x509->derCert != NULL) { + word32 len = x509->derCert->length; + byte* der = x509->derCert->buffer; + + bio->mem = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL); + if (bio->mem == NULL) { + WOLFSSL_MSG("Memory allocation error"); + return SSL_FAILURE; + } + bio->memLen = len; + XMEMCPY(bio->mem, der, len); + return SSL_SUCCESS; + } + + return SSL_FAILURE; +} + + WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509) { WOLFSSL_X509* localX509 = NULL; diff --git a/tests/api.c b/tests/api.c index f0f2ef7c4..0c3a36010 100644 --- a/tests/api.c +++ b/tests/api.c @@ -14604,6 +14604,32 @@ static void test_wolfSSL_ASN1_TIME_adj(void) #endif } + +static void test_wolfSSL_X509(void) +{ + #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) + X509* x509; + BIO* bio; + + printf(testingFmt, "wolfSSL_X509()"); + + AssertNotNull(x509 = X509_new()); + X509_free(x509); + + x509 = wolfSSL_X509_load_certificate_file(cliCertFile, SSL_FILETYPE_PEM); + + AssertNotNull(bio = BIO_new(BIO_s_mem())); + + AssertIntEQ(i2d_X509_bio(bio, x509), SSL_SUCCESS); + + BIO_free(bio); + X509_free(x509); + + printf(resultFmt, passed); + #endif +} + + /*----------------------------------------------------------------------------* | wolfCrypt ASN *----------------------------------------------------------------------------*/ @@ -15373,7 +15399,9 @@ void ApiTest(void) test_wolfSSL_X509_STORE_CTX(); test_wolfSSL_PEM_read_bio(); test_wolfSSL_BIO(); + test_wolfSSL_DES_ecb_encrypt(); test_wolfSSL_ASN1_STRING(); + test_wolfSSL_X509(); test_wolfSSL_DES_ecb_encrypt(); test_wolfSSL_set_tlsext_status_type(); test_wolfSSL_ASN1_TIME_adj(); diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index a810371ba..e9f1b090c 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -271,6 +271,7 @@ typedef WOLFSSL_X509_STORE_CTX X509_STORE_CTX; #define BIO_set_flags wolfSSL_BIO_set_flags #define OpenSSL_add_all_digests() +#define OpenSSL_add_all_ciphers() #define OpenSSL_add_all_algorithms wolfSSL_add_all_algorithms #define SSLeay_add_ssl_algorithms wolfSSL_add_all_algorithms #define SSLeay_add_all_algorithms wolfSSL_add_all_algorithms @@ -457,6 +458,7 @@ typedef WOLFSSL_X509_STORE_CTX X509_STORE_CTX; #define sk_value wolfSSL_sk_value #define sk_X509_pop wolfSSL_sk_X509_pop #define sk_X509_free wolfSSL_sk_X509_free +#define i2d_X509_bio wolfSSL_i2d_X509_bio #define d2i_X509_bio wolfSSL_d2i_X509_bio #define SSL_CTX_get_ex_data wolfSSL_CTX_get_ex_data diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index cf0f67580..8c46614ab 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -2345,7 +2345,9 @@ WOLFSSL_API int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses WOLFSSL_API void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str); -WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509); +WOLFSSL_API int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509); +WOLFSSL_API WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, + WOLFSSL_X509** x509); WOLFSSL_API WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx); WOLFSSL_API size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *b);