Adding BIO and EVP api

This commit is contained in:
Eric Blankenhorn
2020-01-08 16:52:50 -06:00
parent 49a9239cf2
commit ba25161f6c
5 changed files with 415 additions and 10 deletions

View File

@@ -3868,6 +3868,29 @@ WOLFSSL_API int wolfSSL_BIO_get_mem_data(WOLFSSL_BIO* bio,void* p);
*/
WOLFSSL_API long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int flag);
/*!
\ingroup IO
\brief Sets the close flag, used to indicate that the i/o stream should be
closed when the BIO is freed
\return SSL_SUCCESS(1) upon success.
\param bio WOLFSSL_BIO structure.
\param flag flag for behavior when closing i/o stream.
_Example_
\code
WOLFSSL_BIO* bio;
// setup bio
wolfSSL_BIO_set_close(bio, BIO_NOCLOSE);
\endcode
\sa wolfSSL_BIO_new
\sa wolfSSL_BIO_free
*/
WOLFSSL_API int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag);
/*!
\ingroup IO

342
src/ssl.c
View File

@@ -4073,6 +4073,64 @@ const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbynid(int id)
static char *EVP_AES_256_CBC;
#endif
#endif /* HAVE_AES_CBC */
#ifdef HAVE_AES_OFB
#ifdef WOLFSSL_AES_128
static char *EVP_AES_128_OFB;
#endif
#ifdef WOLFSSL_AES_192
static char *EVP_AES_192_OFB;
#endif
#ifdef WOLFSSL_AES_256
static char *EVP_AES_256_OFB;
#endif
#endif /* HAVE_AES_OFB */
#ifdef HAVE_AES_XTS
#ifdef WOLFSSL_AES_128
static char *EVP_AES_128_XTS;
#endif
#ifdef WOLFSSL_AES_256
static char *EVP_AES_256_XTS;
#endif
#endif /* HAVE_AES_XTS */
#ifdef HAVE_AES_CFB1
#ifdef WOLFSSL_AES_128
static char *EVP_AES_128_CFB1;
#endif
#ifdef WOLFSSL_AES_192
static char *EVP_AES_192_CFB1;
#endif
#ifdef WOLFSSL_AES_256
static char *EVP_AES_256_CFB1;
#endif
#endif /* HAVE_AES_CFB1 */
#ifdef HAVE_AES_CFB8
#ifdef WOLFSSL_AES_128
static char *EVP_AES_128_CFB8;
#endif
#ifdef WOLFSSL_AES_192
static char *EVP_AES_192_CFB8;
#endif
#ifdef WOLFSSL_AES_256
static char *EVP_AES_256_CFB8;
#endif
#endif /* HAVE_AES_CFB8 */
#ifdef HAVE_AES_CFB128
#ifdef WOLFSSL_AES_128
static char *EVP_AES_128_CFB128;
#endif
#ifdef WOLFSSL_AES_192
static char *EVP_AES_192_CFB128;
#endif
#ifdef WOLFSSL_AES_256
static char *EVP_AES_256_CFB128;
#endif
#endif /* HAVE_AES_CFB128 */
#if defined(OPENSSL_EXTRA)
#ifdef HAVE_AESGCM
#ifdef WOLFSSL_AES_128
@@ -4144,6 +4202,72 @@ void wolfSSL_EVP_init(void)
#endif
#endif /* HAVE_AES_CBC */
#ifdef HAVE_AES_CFB1
#ifdef WOLFSSL_AES_128
EVP_AES_128_CFB1 = (char *)EVP_get_cipherbyname("AES-128-CFB1");
#endif
#ifdef WOLFSSL_AES_192
EVP_AES_192_CFB1 = (char *)EVP_get_cipherbyname("AES-192-CFB1");
#endif
#ifdef WOLFSSL_AES_256
EVP_AES_256_CFB1 = (char *)EVP_get_cipherbyname("AES-256-CFB1");
#endif
#endif /* HAVE_AES_CFB1 */
#ifdef HAVE_AES_CFB8
#ifdef WOLFSSL_AES_128
EVP_AES_128_CFB8 = (char *)EVP_get_cipherbyname("AES-128-CFB8");
#endif
#ifdef WOLFSSL_AES_192
EVP_AES_192_CFB8 = (char *)EVP_get_cipherbyname("AES-192-CFB8");
#endif
#ifdef WOLFSSL_AES_256
EVP_AES_256_CFB8 = (char *)EVP_get_cipherbyname("AES-256-CFB8");
#endif
#endif /* HAVE_AES_CFB8 */
#ifdef HAVE_AES_CFB12828
#ifdef WOLFSSL_AES_128
EVP_AES_128_CFB128 = (char *)EVP_get_cipherbyname("AES-128-CFB128");
#endif
#ifdef WOLFSSL_AES_192
EVP_AES_192_CFB128 = (char *)EVP_get_cipherbyname("AES-192-CFB128");
#endif
#ifdef WOLFSSL_AES_256
EVP_AES_256_CFB128 = (char *)EVP_get_cipherbyname("AES-256-CFB128");
#endif
#endif /* HAVE_AES_CFB128 */
#ifdef HAVE_AES_OFB
#ifdef WOLFSSL_AES_128
EVP_AES_128_OFB = (char *)EVP_get_cipherbyname("AES-128-OFB");
#endif
#ifdef WOLFSSL_AES_192
EVP_AES_192_OFB = (char *)EVP_get_cipherbyname("AES-192-OFB");
#endif
#ifdef WOLFSSL_AES_256
EVP_AES_256_OFB = (char *)EVP_get_cipherbyname("AES-256-OFB");
#endif
#endif /* HAVE_AES_OFB */
#ifdef HAVE_AES_XTS
#ifdef WOLFSSL_AES_128
EVP_AES_128_XTS = (char *)EVP_get_cipherbyname("AES-128-XTS");
#endif
#ifdef WOLFSSL_AES_256
EVP_AES_256_XTS = (char *)EVP_get_cipherbyname("AES-256-XTS");
#endif
#endif /* HAVE_AES_XTS */
#if defined(OPENSSL_EXTRA)
#ifdef HAVE_AESGCM
#ifdef WOLFSSL_AES_128
@@ -4176,7 +4300,7 @@ void wolfSSL_EVP_init(void)
EVP_AES_256_ECB = (char *)EVP_get_cipherbyname("AES-256-ECB");
#endif
#endif
#endif
#endif /* ifndef NO_AES*/
#ifndef NO_DES3
EVP_DES_CBC = (char *)EVP_get_cipherbyname("DES-CBC");
@@ -14981,6 +15105,30 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
#endif /* !NO_CERTS */
WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
{
static WOLFSSL_BIO_METHOD meth;
WOLFSSL_ENTER("wolfSSL_BIO_f_md");
meth.type = WOLFSSL_BIO_MD;
return &meth;
}
/* return the context and initialize the BIO state */
int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio, WOLFSSL_EVP_MD_CTX **mdcp)
{
int ret = WOLFSSL_FAILURE;
if ((bio != NULL) && (mdcp != NULL)) {
*mdcp = bio->ptr;
/* TODO: reset bio */
}
return ret;
}
WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
{
static WOLFSSL_BIO_METHOD meth;
@@ -15065,7 +15213,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
{
WOLFSSL_ENTER("BIO_eof");
if (b->eof)
if ((b != NULL) && (b->eof))
return 1;
return 0;
@@ -15099,6 +15247,18 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
}
#endif
/* Sets the close flag */
int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag)
{
WOLFSSL_ENTER("wolfSSL_BIO_set_close");
if (b != NULL) {
b->shutdown = (byte)flag;
}
return WOLFSSL_SUCCESS;
}
WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
{
WOLFSSL_BIO* bio;
@@ -16327,6 +16487,156 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
#endif /* WOLFSSL_AES_256 */
#endif /* HAVE_AES_CBC */
#ifdef HAVE_AES_CFB1
#ifdef WOLFSSL_AES_128
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb1");
if (EVP_AES_128_CFB1 == NULL)
wolfSSL_EVP_init();
return EVP_AES_128_CFB1;
}
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_192
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb1");
if (EVP_AES_192_CFB1 == NULL)
wolfSSL_EVP_init();
return EVP_AES_192_CFB1;
}
#endif /* WOLFSSL_AES_192 */
#ifdef WOLFSSL_AES_256
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb1");
if (EVP_AES_256_CFB1 == NULL)
wolfSSL_EVP_init();
return EVP_AES_256_CFB1;
}
#endif /* WOLFSSL_AES_256 */
#endif /* HAVE_AES_CFB1 */
#ifdef HAVE_AES_CFB8
#ifdef WOLFSSL_AES_128
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb8");
if (EVP_AES_128_CFB8 == NULL)
wolfSSL_EVP_init();
return EVP_AES_128_CFB8;
}
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_192
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb8");
if (EVP_AES_192_CFB8 == NULL)
wolfSSL_EVP_init();
return EVP_AES_192_CFB8;
}
#endif /* WOLFSSL_AES_192 */
#ifdef WOLFSSL_AES_256
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb8");
if (EVP_AES_256_CFB8 == NULL)
wolfSSL_EVP_init();
return EVP_AES_256_CFB8;
}
#endif /* WOLFSSL_AES_256 */
#endif /* HAVE_AES_CFB8 */
#ifdef HAVE_AES_CFB12828
#ifdef WOLFSSL_AES_128
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_128_cfb128");
if (EVP_AES_128_CFB128 == NULL)
wolfSSL_EVP_init();
return EVP_AES_128_CFB128;
}
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_192
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_192_cfb128");
if (EVP_AES_192_CFB128 == NULL)
wolfSSL_EVP_init();
return EVP_AES_192_CFB128;
}
#endif /* WOLFSSL_AES_192 */
#ifdef WOLFSSL_AES_256
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_256_cfb128");
if (EVP_AES_256_CFB128 == NULL)
wolfSSL_EVP_init();
return EVP_AES_256_CFB128;
}
#endif /* WOLFSSL_AES_256 */
#endif /* HAVE_AES_CFB128 */
#ifdef HAVE_AES_OFB
#ifdef WOLFSSL_AES_128
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_128_ofb");
if (EVP_AES_128_OFB == NULL)
wolfSSL_EVP_init();
return EVP_AES_128_OFB;
}
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_192
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_192_ofb");
if (EVP_AES_192_OFB == NULL)
wolfSSL_EVP_init();
return EVP_AES_192_OFB;
}
#endif /* WOLFSSL_AES_192 */
#ifdef WOLFSSL_AES_256
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_256_ofb");
if (EVP_AES_256_OFB == NULL)
wolfSSL_EVP_init();
return EVP_AES_256_OFB;
}
#endif /* WOLFSSL_AES_256 */
#endif /* HAVE_AES_OFB */
#ifdef HAVE_AES_XTS
#ifdef WOLFSSL_AES_128
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_128_xts");
if (EVP_AES_128_XTS == NULL)
wolfSSL_EVP_init();
return EVP_AES_128_XTS;
}
#endif /* WOLFSSL_AES_128 */
#ifdef WOLFSSL_AES_256
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void)
{
WOLFSSL_ENTER("wolfSSL_EVP_aes_256_xts");
if (EVP_AES_256_XTS == NULL)
wolfSSL_EVP_init();
return EVP_AES_256_XTS;
}
#endif /* WOLFSSL_AES_256 */
#endif /* HAVE_AES_XTS */
#ifdef HAVE_AESGCM
#ifdef WOLFSSL_AES_128
const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void)
@@ -27922,15 +28232,13 @@ void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out,
#ifndef NO_FILESYSTEM
/* returns amount printed on success, negative in fail case */
int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format, va_list args)
{
int ret = -1;
va_list args;
if (bio == NULL)
return WOLFSSL_FATAL_ERROR;
va_start(args, format);
switch (bio->type) {
case WOLFSSL_BIO_FILE:
if (bio->ptr == NULL)
@@ -27971,10 +28279,24 @@ int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
WOLFSSL_MSG("Unsupported WOLFSSL_BIO type for wolfSSL_BIO_printf");
break;
}
return ret;
}
/* returns amount printed on success, negative in fail case */
int wolfSSL_BIO_printf(WOLFSSL_BIO* bio, const char* format, ...)
{
int ret;
va_list args;
va_start(args, format);
ret = wolfSSL_BIO_vprintf(bio, format, args);
va_end(args);
return ret;
}
#endif
#if !defined(NO_FILESYSTEM) && defined(__clang__)
@@ -48608,6 +48930,16 @@ void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio)
bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY);
}
int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio)
{
int ret = 0;
if (bio != NULL) {
ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_RETRY);
}
return ret;
}
/* DER data is PKCS#8 encrypted. */
WOLFSSL_EVP_PKEY* wolfSSL_d2i_PKCS8PrivateKey_bio(WOLFSSL_BIO* bio,
WOLFSSL_EVP_PKEY** pkey,

View File

@@ -52,8 +52,8 @@
#define BIO_s_bio wolfSSL_BIO_s_bio
#define BIO_s_socket wolfSSL_BIO_s_socket
#define BIO_set_fd wolfSSL_BIO_set_fd
#define BIO_set_close wolfSSL_BIO_set_close
#define BIO_ctrl_reset_read_request wolfSSL_BIO_ctrl_reset_read_request
#define BIO_set_write_buf_size wolfSSL_BIO_set_write_buf_size
#define BIO_make_bio_pair wolfSSL_BIO_make_bio_pair
@@ -68,7 +68,7 @@
#define BIO_gets wolfSSL_BIO_gets
#define BIO_puts wolfSSL_BIO_puts
#define BIO_should_retry(...) 1
#define BIO_should_retry wolfSSL_BIO_should_retry
#define BIO_TYPE_FILE WOLFSSL_BIO_FILE
#define BIO_TYPE_BIO WOLFSSL_BIO_BIO

View File

@@ -94,6 +94,32 @@ WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void);
#endif
#ifndef NO_AES
#ifdef HAVE_AES_CFB1
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb1(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb1(void);
#endif
#ifdef HAVE_AES_CFB8
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb8(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb8(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb8(void);
#endif
#ifdef HAVE_AES_CFB128
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb128(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cfb128(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cfb128(void);
#endif
#ifdef HAVE_AES_OFB
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ofb(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ofb(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ofb(void);
#endif
#ifdef HAVE_AES_XTS
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_xts(void);
#endif
#endif /* NO_AES */
#if !defined(NO_AES) && defined(HAVE_AESGCM)
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_gcm(void);
WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_gcm(void);
@@ -571,6 +597,20 @@ typedef WOLFSSL_EVP_CIPHER_CTX EVP_CIPHER_CTX;
#define EVP_aes_128_cbc wolfSSL_EVP_aes_128_cbc
#define EVP_aes_192_cbc wolfSSL_EVP_aes_192_cbc
#define EVP_aes_256_cbc wolfSSL_EVP_aes_256_cbc
#define EVP_aes_128_cfb1 wolfSSL_EVP_aes_128_cfb1
#define EVP_aes_192_cfb1 wolfSSL_EVP_aes_192_cfb1
#define EVP_aes_256_cfb1 wolfSSL_EVP_aes_256_cfb1
#define EVP_aes_128_cfb8 wolfSSL_EVP_aes_128_cfb8
#define EVP_aes_192_cfb8 wolfSSL_EVP_aes_192_cfb8
#define EVP_aes_256_cfb8 wolfSSL_EVP_aes_256_cfb8
#define EVP_aes_128_cfb128 wolfSSL_EVP_aes_128_cfb128
#define EVP_aes_192_cfb128 wolfSSL_EVP_aes_192_cfb128
#define EVP_aes_256_cfb128 wolfSSL_EVP_aes_256_cfb128
#define EVP_aes_128_ofb wolfSSL_EVP_aes_128_ofb
#define EVP_aes_192_ofb wolfSSL_EVP_aes_192_ofb
#define EVP_aes_256_ofb wolfSSL_EVP_aes_256_ofb
#define EVP_aes_128_xts wolfSSL_EVP_aes_128_xts
#define EVP_aes_256_xts wolfSSL_EVP_aes_256_xts
#define EVP_aes_128_gcm wolfSSL_EVP_aes_128_gcm
#define EVP_aes_192_gcm wolfSSL_EVP_aes_192_gcm
#define EVP_aes_256_gcm wolfSSL_EVP_aes_256_gcm

View File

@@ -348,6 +348,7 @@ struct WOLFSSL_EVP_PKEY {
#endif
};
typedef struct WOLFSSL_EVP_PKEY WOLFSSL_PKCS8_PRIV_KEY_INFO;
typedef struct WOLFSSL_EVP_MD_CTX WOLFSSL_EVP_MD_CTX;
#ifndef WOLFSSL_EVP_TYPE_DEFINED /* guard on redeclaration */
typedef struct WOLFSSL_EVP_PKEY WOLFSSL_EVP_PKEY;
@@ -396,7 +397,8 @@ enum BIO_TYPE {
WOLFSSL_BIO_MEMORY = 4,
WOLFSSL_BIO_BIO = 5,
WOLFSSL_BIO_FILE = 6,
WOLFSSL_BIO_BASE64 = 7
WOLFSSL_BIO_BASE64 = 7,
WOLFSSL_BIO_MD = 8
};
enum BIO_FLAGS {
@@ -463,7 +465,7 @@ struct WOLFSSL_BIO {
WOLFSSL_BIO* next; /* next in chain */
WOLFSSL_BIO* pair; /* BIO paired with */
void* heap; /* user heap hint */
void* ptr; /* WOLFSSL, file descriptor or memory buffer */
void* ptr; /* WOLFSSL, file descriptor, MD, or mem buf */
void* usrCtx; /* user set pointer */
char* infoArg; /* BIO callback argument */
wolf_bio_info_cb infoCb; /* BIO callback */
@@ -1191,6 +1193,10 @@ WOLFSSL_API wolf_bio_info_cb wolfSSL_BIO_get_callback(WOLFSSL_BIO *bio);
WOLFSSL_API void wolfSSL_BIO_set_callback_arg(WOLFSSL_BIO *bio, char *arg);
WOLFSSL_API char* wolfSSL_BIO_get_callback_arg(const WOLFSSL_BIO *bio);
WOLFSSL_API WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void);
WOLFSSL_API int wolfSSL_BIO_get_md_ctx(WOLFSSL_BIO *bio,
WOLFSSL_EVP_MD_CTX **mdcp);
WOLFSSL_API WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void);
WOLFSSL_API long wolfSSL_BIO_set_write_buffer_size(WOLFSSL_BIO*, long size);
WOLFSSL_API WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void);
@@ -1213,6 +1219,7 @@ WOLFSSL_API void* wolfSSL_BIO_get_data(WOLFSSL_BIO*);
WOLFSSL_API void wolfSSL_BIO_set_shutdown(WOLFSSL_BIO*, int);
WOLFSSL_API int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO*);
WOLFSSL_API void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO*);
WOLFSSL_API int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio);
WOLFSSL_API WOLFSSL_BIO_METHOD *wolfSSL_BIO_meth_new(int, const char*);
WOLFSSL_API void wolfSSL_BIO_meth_free(WOLFSSL_BIO_METHOD*);
@@ -1229,6 +1236,7 @@ WOLFSSL_API long wolfSSL_BIO_set_ssl(WOLFSSL_BIO*, WOLFSSL*, int flag);
#ifndef NO_FILESYSTEM
WOLFSSL_API long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int flag);
#endif
WOLFSSL_API int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag);
WOLFSSL_API void wolfSSL_set_bio(WOLFSSL*, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr);
#ifndef NO_FILESYSTEM
@@ -1999,6 +2007,8 @@ WOLFSSL_API int wolfSSL_want(WOLFSSL*);
WOLFSSL_API int wolfSSL_want_read(WOLFSSL*);
WOLFSSL_API int wolfSSL_want_write(WOLFSSL*);
WOLFSSL_API int wolfSSL_BIO_vprintf(WOLFSSL_BIO* bio, const char* format,
va_list args);
WOLFSSL_API int wolfSSL_BIO_printf(WOLFSSL_BIO*, const char*, ...);
WOLFSSL_API int wolfSSL_BIO_dump(WOLFSSL_BIO *bio, const char*, int);
WOLFSSL_API int wolfSSL_ASN1_UTCTIME_print(WOLFSSL_BIO*,