Skip to content

Commit f733fb2

Browse files
committed
Initial commit to add some more openssl compatibility layer functions
1 parent 6074a2d commit f733fb2

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
@@ -10749,10 +10749,25 @@ const char* wolfSSL_lib_version(void)
1074910749

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

tests/api.c

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18828,6 +18828,70 @@ defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA)
1882818828
return EXPECT_RESULT();
1882918829
}
1883018830

18831+
static int test_wolfSSL_i2d_PUBKEY_bio(void)
18832+
{
18833+
EXPECT_DECLS;
18834+
#if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
18835+
BIO* bio = NULL;
18836+
EVP_PKEY* pkey = NULL;
18837+
EVP_PKEY* pkey2 = NULL;
18838+
18839+
/* NULL parameter tests */
18840+
ExpectIntEQ(wolfSSL_i2d_PUBKEY_bio(NULL, NULL), WOLFSSL_FAILURE);
18841+
18842+
#if defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA)
18843+
{
18844+
const unsigned char* p = client_keypub_der_2048;
18845+
/* Load an RSA public key from DER buffer */
18846+
ExpectNotNull(pkey = d2i_PUBKEY(NULL, &p,
18847+
sizeof_client_keypub_der_2048));
18848+
18849+
/* Write it to BIO */
18850+
ExpectNotNull(bio = BIO_new(BIO_s_mem()));
18851+
ExpectIntEQ(i2d_PUBKEY_bio(bio, pkey), WOLFSSL_SUCCESS);
18852+
18853+
/* Read it back and verify round-trip */
18854+
ExpectNotNull(pkey2 = d2i_PUBKEY_bio(bio, NULL));
18855+
18856+
EVP_PKEY_free(pkey2);
18857+
pkey2 = NULL;
18858+
EVP_PKEY_free(pkey);
18859+
pkey = NULL;
18860+
BIO_free(bio);
18861+
bio = NULL;
18862+
}
18863+
#endif
18864+
18865+
#if defined(USE_CERT_BUFFERS_256) && defined(HAVE_ECC)
18866+
{
18867+
const unsigned char* p = ecc_clikeypub_der_256;
18868+
/* Load an ECC public key from DER buffer */
18869+
ExpectNotNull(pkey = d2i_PUBKEY(NULL, &p,
18870+
sizeof_ecc_clikeypub_der_256));
18871+
18872+
/* Write it to BIO */
18873+
ExpectNotNull(bio = BIO_new(BIO_s_mem()));
18874+
ExpectIntEQ(i2d_PUBKEY_bio(bio, pkey), WOLFSSL_SUCCESS);
18875+
18876+
/* Read it back and verify round-trip */
18877+
ExpectNotNull(pkey2 = d2i_PUBKEY_bio(bio, NULL));
18878+
18879+
EVP_PKEY_free(pkey2);
18880+
pkey2 = NULL;
18881+
EVP_PKEY_free(pkey);
18882+
pkey = NULL;
18883+
BIO_free(bio);
18884+
bio = NULL;
18885+
}
18886+
#endif
18887+
18888+
(void)pkey;
18889+
(void)pkey2;
18890+
(void)bio;
18891+
#endif
18892+
return EXPECT_RESULT();
18893+
}
18894+
1883118895
#if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) && \
1883218896
!defined(NO_TLS)
1883318897
static int test_wolfSSL_d2i_PrivateKeys_bio(void)
@@ -27831,12 +27895,39 @@ static int test_wolfSSL_OpenSSL_version(void)
2783127895
const char* ver;
2783227896

2783327897
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
27834-
ExpectNotNull(ver = OpenSSL_version(0));
27898+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_VERSION));
27899+
ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING,
27900+
XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0);
27901+
27902+
/* Test OPENSSL_CFLAGS type */
27903+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_CFLAGS));
27904+
ExpectNotNull(XSTRSTR(ver, "compiler:"));
27905+
27906+
/* Test OPENSSL_BUILT_ON type */
27907+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_BUILT_ON));
27908+
ExpectNotNull(XSTRSTR(ver, "built on:"));
27909+
27910+
/* Test OPENSSL_PLATFORM type */
27911+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_PLATFORM));
27912+
ExpectNotNull(XSTRSTR(ver, "platform:"));
27913+
27914+
/* Test OPENSSL_DIR type */
27915+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_DIR));
27916+
ExpectNotNull(XSTRSTR(ver, "OPENSSLDIR:"));
27917+
27918+
/* Test OPENSSL_ENGINES_DIR type */
27919+
ExpectNotNull(ver = OpenSSL_version(OPENSSL_ENGINES_DIR));
27920+
ExpectNotNull(XSTRSTR(ver, "ENGINESDIR:"));
27921+
27922+
/* Test unknown type falls back to version string */
27923+
ExpectNotNull(ver = OpenSSL_version(99));
27924+
ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING,
27925+
XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0);
2783527926
#else
2783627927
ExpectNotNull(ver = OpenSSL_version());
27837-
#endif
2783827928
ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING,
2783927929
XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0);
27930+
#endif
2784027931
#endif
2784127932
return EXPECT_RESULT();
2784227933
}
@@ -37088,6 +37179,7 @@ TEST_CASE testCases[] = {
3708837179
TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey_ecc),
3708937180
#ifndef NO_BIO
3709037181
TEST_DECL(test_wolfSSL_d2i_PUBKEY),
37182+
TEST_DECL(test_wolfSSL_i2d_PUBKEY_bio),
3709137183
#endif
3709237184
TEST_DECL(test_wolfSSL_d2i_and_i2d_DSAparams),
3709337185
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)