Skip to content

Commit 6c6984d

Browse files
committed
Initial commit to add some more openssl compatibility layer functions
1 parent 9d46b57 commit 6c6984d

10 files changed

Lines changed: 241 additions & 7 deletions

File tree

src/bio.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,6 +2077,30 @@ long wolfSSL_BIO_set_nbio(WOLFSSL_BIO* bio, long on)
20772077
return WOLFSSL_SUCCESS;
20782078
}
20792079

2080+
/* Returns a unique index for a new custom BIO type.
2081+
* In OpenSSL, custom BIO types start at BIO_TYPE_START (128|0x0200).
2082+
* wolfSSL uses a simpler scheme starting at 128.
2083+
*
2084+
* @return New unique BIO type index on success.
2085+
* @return -1 when the index space is exhausted.
2086+
*/
2087+
int wolfSSL_BIO_get_new_index(void)
2088+
{
2089+
static int bio_type_idx = WOLFSSL_BIO_TYPE_START;
2090+
int idx;
2091+
2092+
WOLFSSL_ENTER("wolfSSL_BIO_get_new_index");
2093+
2094+
idx = bio_type_idx;
2095+
if (idx > WOLFSSL_BIO_TYPE_MAX + WOLFSSL_BIO_TYPE_START) {
2096+
WOLFSSL_MSG("BIO type index space exhausted");
2097+
return -1;
2098+
}
2099+
bio_type_idx++;
2100+
2101+
return idx;
2102+
}
2103+
20802104
/* creates a new custom WOLFSSL_BIO_METHOD */
20812105
WOLFSSL_BIO_METHOD *wolfSSL_BIO_meth_new(int type, const char *name)
20822106
{

src/ssl.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10745,10 +10745,25 @@ const char* wolfSSL_lib_version(void)
1074510745

1074610746
#ifdef OPENSSL_EXTRA
1074710747
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
10748-
const char* wolfSSL_OpenSSL_version(int a)
10749-
{
10750-
(void)a;
10751-
return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
10748+
const char* wolfSSL_OpenSSL_version(int type)
10749+
{
10750+
WOLFSSL_ENTER("wolfSSL_OpenSSL_version");
10751+
switch (type) {
10752+
case OPENSSL_VERSION:
10753+
return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
10754+
case OPENSSL_CFLAGS:
10755+
return "compiler: information not available";
10756+
case OPENSSL_BUILT_ON:
10757+
return "built on: " __DATE__ " " __TIME__;
10758+
case OPENSSL_PLATFORM:
10759+
return "platform: information not available";
10760+
case OPENSSL_DIR:
10761+
return "OPENSSLDIR: \"\"";
10762+
case OPENSSL_ENGINES_DIR:
10763+
return "ENGINESDIR: N/A";
10764+
default:
10765+
return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
10766+
}
1075210767
}
1075310768
#else
1075410769
const char* wolfSSL_OpenSSL_version(void)

tests/api.c

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18653,6 +18653,70 @@ defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
1865318653
return EXPECT_RESULT();
1865418654
}
1865518655

18656+
static int test_wolfSSL_i2d_PUBKEY_bio(void)
18657+
{
18658+
EXPECT_DECLS;
18659+
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
18660+
BIO* bio = NULL;
18661+
EVP_PKEY* pkey = NULL;
18662+
EVP_PKEY* pkey2 = NULL;
18663+
18664+
/* NULL parameter tests */
18665+
ExpectIntEQ(wolfSSL_i2d_PUBKEY_bio(NULL, NULL), WOLFSSL_FAILURE);
18666+
18667+
#if defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA)
18668+
{
18669+
const unsigned char* p = client_keypub_der_2048;
18670+
/* Load an RSA public key from DER buffer */
18671+
ExpectNotNull(pkey = d2i_PUBKEY(NULL, &p,
18672+
sizeof_client_keypub_der_2048));
18673+
18674+
/* Write it to BIO */
18675+
ExpectNotNull(bio = BIO_new(BIO_s_mem()));
18676+
ExpectIntEQ(i2d_PUBKEY_bio(bio, pkey), WOLFSSL_SUCCESS);
18677+
18678+
/* Read it back and verify round-trip */
18679+
ExpectNotNull(pkey2 = d2i_PUBKEY_bio(bio, NULL));
18680+
18681+
EVP_PKEY_free(pkey2);
18682+
pkey2 = NULL;
18683+
EVP_PKEY_free(pkey);
18684+
pkey = NULL;
18685+
BIO_free(bio);
18686+
bio = NULL;
18687+
}
18688+
#endif
18689+
18690+
#if defined(USE_CERT_BUFFERS_256) && defined(HAVE_ECC)
18691+
{
18692+
const unsigned char* p = ecc_clikeypub_der_256;
18693+
/* Load an ECC public key from DER buffer */
18694+
ExpectNotNull(pkey = d2i_PUBKEY(NULL, &p,
18695+
sizeof_ecc_clikeypub_der_256));
18696+
18697+
/* Write it to BIO */
18698+
ExpectNotNull(bio = BIO_new(BIO_s_mem()));
18699+
ExpectIntEQ(i2d_PUBKEY_bio(bio, pkey), WOLFSSL_SUCCESS);
18700+
18701+
/* Read it back and verify round-trip */
18702+
ExpectNotNull(pkey2 = d2i_PUBKEY_bio(bio, NULL));
18703+
18704+
EVP_PKEY_free(pkey2);
18705+
pkey2 = NULL;
18706+
EVP_PKEY_free(pkey);
18707+
pkey = NULL;
18708+
BIO_free(bio);
18709+
bio = NULL;
18710+
}
18711+
#endif
18712+
18713+
(void)pkey;
18714+
(void)pkey2;
18715+
(void)bio;
18716+
#endif
18717+
return EXPECT_RESULT();
18718+
}
18719+
1865618720
#if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) && \
1865718721
!defined(NO_TLS)
1865818722
static int test_wolfSSL_d2i_PrivateKeys_bio(void)
@@ -27647,12 +27711,39 @@ static int test_wolfSSL_OpenSSL_version(void)
2764727711
const char* ver;
2764827712

2764927713
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
27650-
ExpectNotNull(ver = OpenSSL_version(0));
27714+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_VERSION));
27715+
ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING,
27716+
XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0);
27717+
27718+
/* Test OPENSSL_CFLAGS type */
27719+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_CFLAGS));
27720+
ExpectNotNull(XSTRSTR(ver, "compiler:"));
27721+
27722+
/* Test OPENSSL_BUILT_ON type */
27723+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_BUILT_ON));
27724+
ExpectNotNull(XSTRSTR(ver, "built on:"));
27725+
27726+
/* Test OPENSSL_PLATFORM type */
27727+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_PLATFORM));
27728+
ExpectNotNull(XSTRSTR(ver, "platform:"));
27729+
27730+
/* Test OPENSSL_DIR type */
27731+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_DIR));
27732+
ExpectNotNull(XSTRSTR(ver, "OPENSSLDIR:"));
27733+
27734+
/* Test OPENSSL_ENGINES_DIR type */
27735+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_ENGINES_DIR));
27736+
ExpectNotNull(XSTRSTR(ver, "ENGINESDIR:"));
27737+
27738+
/* Test unknown type falls back to version string */
27739+
ExpectNotNull(ver = OpenSSL_version(99));
27740+
ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING,
27741+
XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0);
2765127742
#else
2765227743
ExpectNotNull(ver = OpenSSL_version());
27653-
#endif
2765427744
ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING,
2765527745
XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0);
27746+
#endif
2765627747
#endif
2765727748
return EXPECT_RESULT();
2765827749
}
@@ -36206,6 +36297,7 @@ TEST_CASE testCases[] = {
3620636297
TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey_ecc),
3620736298
#ifndef NO_BIO
3620836299
TEST_DECL(test_wolfSSL_d2i_PUBKEY),
36300+
TEST_DECL(test_wolfSSL_i2d_PUBKEY_bio),
3620936301
#endif
3621036302
TEST_DECL(test_wolfSSL_d2i_and_i2d_DSAparams),
3621136303
TEST_DECL(test_wolfSSL_i2d_PrivateKey),

tests/api/test_ossl_bio.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,5 +1803,42 @@ int test_wolfSSL_BIO_meth_type_large(void)
18031803
return EXPECT_RESULT();
18041804
}
18051805

1806+
int test_wolfSSL_BIO_get_new_index(void)
1807+
{
1808+
EXPECT_DECLS;
1809+
#if defined(OPENSSL_EXTRA)
1810+
int idx1, idx2, idx3;
1811+
BIO_METHOD* meth = NULL;
1812+
BIO* bio = NULL;
1813+
1814+
/* Get three consecutive indices - should be unique and >= 128 */
1815+
idx1 = BIO_get_new_index();
1816+
idx2 = BIO_get_new_index();
1817+
idx3 = BIO_get_new_index();
1818+
1819+
ExpectIntGE(idx1, BIO_TYPE_START);
1820+
ExpectIntGE(idx2, BIO_TYPE_START);
1821+
ExpectIntGE(idx3, BIO_TYPE_START);
1822+
1823+
/* Each index must be unique */
1824+
ExpectIntNE(idx1, idx2);
1825+
ExpectIntNE(idx2, idx3);
1826+
ExpectIntNE(idx1, idx3);
1827+
1828+
/* Indices should be sequential */
1829+
ExpectIntEQ(idx2, idx1 + 1);
1830+
ExpectIntEQ(idx3, idx2 + 1);
1831+
1832+
/* Use returned index with BIO_meth_new */
1833+
ExpectNotNull(meth = BIO_meth_new(idx1, "custom_test"));
1834+
ExpectNotNull(bio = BIO_new(meth));
1835+
ExpectIntEQ(BIO_method_type(bio), idx1);
1836+
1837+
BIO_free(bio);
1838+
BIO_meth_free(meth);
1839+
#endif
1840+
return EXPECT_RESULT();
1841+
}
1842+
18061843
#endif /* !NO_BIO */
18071844

tests/api/test_ossl_bio.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ int test_wolfSSL_BIO_custom_method(void);
4646
int test_wolfSSL_BIO_set_conn_hostname(void);
4747
int test_wolfSSL_BIO_ctrl_pending_chain(void);
4848
int test_wolfSSL_BIO_meth_type_large(void);
49+
int test_wolfSSL_BIO_get_new_index(void);
4950

5051
#define TEST_OSSL_BIO_DECLS \
5152
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_gets), \
@@ -64,7 +65,8 @@ int test_wolfSSL_BIO_meth_type_large(void);
6465
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_custom_method), \
6566
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_set_conn_hostname), \
6667
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_ctrl_pending_chain), \
67-
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_meth_type_large)
68+
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_meth_type_large), \
69+
TEST_DECL_GROUP("ossl_bio", test_wolfSSL_BIO_get_new_index)
6870

6971
#define TEST_OSSL_BIO_TLS_DECLS \
7072
TEST_DECL_GROUP("ossl_bio_tls", test_wolfSSL_BIO_connect), \

wolfcrypt/src/evp_pk.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,6 +1905,45 @@ int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
19051905
{
19061906
return wolfSSL_i2d_PublicKey(key, der);
19071907
}
1908+
1909+
#ifndef NO_BIO
1910+
/* Encode public key as DER data and write to BIO.
1911+
*
1912+
* @param [in] bio BIO to write data to.
1913+
* @param [in] key Public key to encode.
1914+
* @return WOLFSSL_SUCCESS on success.
1915+
* @return WOLFSSL_FAILURE on failure.
1916+
*/
1917+
int wolfSSL_i2d_PUBKEY_bio(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key)
1918+
{
1919+
int ret = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
1920+
int derSz = 0;
1921+
byte* der = NULL;
1922+
1923+
WOLFSSL_ENTER("wolfSSL_i2d_PUBKEY_bio");
1924+
1925+
if (bio == NULL || key == NULL) {
1926+
return WOLFSSL_FAILURE;
1927+
}
1928+
1929+
derSz = wolfSSL_i2d_PUBKEY(key, &der);
1930+
if (derSz <= 0) {
1931+
WOLFSSL_MSG("wolfSSL_i2d_PUBKEY failed");
1932+
return WOLFSSL_FAILURE;
1933+
}
1934+
1935+
if (wolfSSL_BIO_write(bio, der, derSz) != derSz) {
1936+
goto cleanup;
1937+
}
1938+
1939+
ret = WOLFSSL_SUCCESS;
1940+
1941+
cleanup:
1942+
XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
1943+
return ret;
1944+
}
1945+
#endif /* !NO_BIO */
1946+
19081947
#endif /* !NO_ASN && !NO_PWDBASED */
19091948

19101949
#endif /* OPENSSL_EXTRA */

wolfssl/openssl/bio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@
138138
#define BIO_TYPE_BIO WOLFSSL_BIO_BIO
139139
#define BIO_TYPE_MEM WOLFSSL_BIO_MEMORY
140140
#define BIO_TYPE_BASE64 WOLFSSL_BIO_BASE64
141+
#define BIO_TYPE_START WOLFSSL_BIO_TYPE_START
142+
#define BIO_get_new_index wolfSSL_BIO_get_new_index
141143

142144
#define BIO_vprintf wolfSSL_BIO_vprintf
143145
#define BIO_printf wolfSSL_BIO_printf

wolfssl/openssl/opensslv.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@
6868
#ifndef OPENSSL_VERSION
6969
#define OPENSSL_VERSION 0
7070
#endif
71+
#ifndef OPENSSL_CFLAGS
72+
#define OPENSSL_CFLAGS 1
73+
#endif
74+
#ifndef OPENSSL_BUILT_ON
75+
#define OPENSSL_BUILT_ON 2
76+
#endif
77+
#ifndef OPENSSL_PLATFORM
78+
#define OPENSSL_PLATFORM 3
79+
#endif
80+
#ifndef OPENSSL_DIR
81+
#define OPENSSL_DIR 4
82+
#endif
83+
#ifndef OPENSSL_ENGINES_DIR
84+
#define OPENSSL_ENGINES_DIR 5
85+
#endif
7186

7287
#ifndef OPENSSL_IS_WOLFSSL
7388
#define OPENSSL_IS_WOLFSSL

wolfssl/openssl/ssl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;
273273
#define SSL_CTX_set_ecdh_auto wolfSSL_CTX_set_ecdh_auto
274274

275275
#define i2d_PUBKEY wolfSSL_i2d_PUBKEY
276+
#define i2d_PUBKEY_bio wolfSSL_i2d_PUBKEY_bio
276277
#define i2d_X509_PUBKEY wolfSSL_i2d_X509_PUBKEY
277278
#define d2i_PUBKEY wolfSSL_d2i_PUBKEY
278279
#define d2i_PUBKEY_bio wolfSSL_d2i_PUBKEY_bio

wolfssl/ssl.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,11 @@ enum BIO_TYPE {
748748
WOLFSSL_BIO_NULL = 10
749749
};
750750

751+
/* Starting index for custom BIO types returned by wolfSSL_BIO_get_new_index.
752+
* Matches OpenSSL BIO_TYPE_START (128). */
753+
#define WOLFSSL_BIO_TYPE_START 128
754+
#define WOLFSSL_BIO_TYPE_MAX 255
755+
751756
enum BIO_FLAGS {
752757
WOLFSSL_BIO_FLAG_BASE64_NO_NL = 0x01,
753758
WOLFSSL_BIO_FLAG_READ = 0x02,
@@ -2129,6 +2134,7 @@ WOLFSSL_API int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio);
21292134
WOLFSSL_API int wolfSSL_BIO_should_read(WOLFSSL_BIO *bio);
21302135
WOLFSSL_API int wolfSSL_BIO_should_write(WOLFSSL_BIO *bio);
21312136

2137+
WOLFSSL_API int wolfSSL_BIO_get_new_index(void);
21322138
WOLFSSL_API WOLFSSL_BIO_METHOD *wolfSSL_BIO_meth_new(int type, const char* name);
21332139
WOLFSSL_API void wolfSSL_BIO_meth_free(WOLFSSL_BIO_METHOD* biom);
21342140
WOLFSSL_API int wolfSSL_BIO_meth_set_write(WOLFSSL_BIO_METHOD* biom, wolfSSL_BIO_meth_write_cb biom_write);
@@ -2421,6 +2427,7 @@ WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY_bio(WOLFSSL_BIO* bio,
24212427
WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PUBKEY(WOLFSSL_EVP_PKEY** key,
24222428
const unsigned char** in, long inSz);
24232429
WOLFSSL_API int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der);
2430+
WOLFSSL_API int wolfSSL_i2d_PUBKEY_bio(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key);
24242431
WOLFSSL_API int wolfSSL_i2d_X509_PUBKEY(WOLFSSL_X509_PUBKEY* x509_PubKey,
24252432
unsigned char** der);
24262433
WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_d2i_PublicKey(int type, WOLFSSL_EVP_PKEY** pkey,

0 commit comments

Comments
 (0)