diff --git a/src/x509.c b/src/x509.c index 0780601e4..a84ba4335 100644 --- a/src/x509.c +++ b/src/x509.c @@ -7460,6 +7460,7 @@ int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out) { const unsigned char* der; int derSz = 0; + int advance = 1; WOLFSSL_ENTER("wolfSSL_i2d_X509"); @@ -7480,10 +7481,14 @@ int wolfSSL_i2d_X509(WOLFSSL_X509* x509, unsigned char** out) WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E); return MEMORY_E; } + advance = 0; } - if (out != NULL) + if (out != NULL) { XMEMCPY(*out, der, derSz); + if (advance) + *out += derSz; + } WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz); return derSz; diff --git a/tests/api.c b/tests/api.c index a3759296c..9d0f35931 100644 --- a/tests/api.c +++ b/tests/api.c @@ -53016,6 +53016,31 @@ static int test_wolfSSL_X509_load_crl_file(void) return EXPECT_RESULT(); } +static int test_wolfSSL_i2d_X509(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA) + const unsigned char* cert_buf = server_cert_der_2048; + unsigned char* out = NULL; + unsigned char* tmp = NULL; + X509* cert = NULL; + + ExpectNotNull(d2i_X509(&cert, &cert_buf, sizeof_server_cert_der_2048)); + /* Pointer should be advanced */ + ExpectPtrGT(cert_buf, server_cert_der_2048); + ExpectIntGT(i2d_X509(cert, &out), 0); + ExpectNotNull(out); + tmp = out; + ExpectIntGT(i2d_X509(cert, &tmp), 0); + ExpectPtrGT(tmp, out); + + if (out != NULL) + XFREE(out, NULL, DYNAMIC_TYPE_OPENSSL); + X509_free(cert); +#endif + return EXPECT_RESULT(); +} + static int test_wolfSSL_d2i_X509_REQ(void) { EXPECT_DECLS; @@ -67715,6 +67740,7 @@ TEST_CASE testCases[] = { TEST_DECL(test_wolfSSL_X509_set_version), TEST_DECL(test_wolfSSL_X509_get_serialNumber), TEST_DECL(test_wolfSSL_X509_CRL), + TEST_DECL(test_wolfSSL_i2d_X509), TEST_DECL(test_wolfSSL_d2i_X509_REQ), TEST_DECL(test_wolfSSL_PEM_read_X509), TEST_DECL(test_wolfSSL_X509_check_ca),