pem x509 read from bio and bio set fd

This commit is contained in:
Jacob Barthelmeh
2016-12-05 09:06:23 -07:00
parent 80efc366df
commit 2b3438e11b
4 changed files with 122 additions and 49 deletions

107
src/ssl.c
View File

@ -10099,7 +10099,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
long wolfSSL_BIO_set_ssl(WOLFSSL_BIO* b, WOLFSSL* ssl, int closeF)
{
WOLFSSL_ENTER("BIO_set_ssl");
WOLFSSL_ENTER("wolfSSL_BIO_set_ssl");
b->ssl = ssl;
b->close = (byte)closeF;
/* add to ssl for bio free if SSL_free called before/instead of free_all? */
@ -10108,6 +10108,16 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
}
long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int closeF)
{
WOLFSSL_ENTER("wolfSSL_BIO_set_fd");
b->fd = fd;
b->close = (byte)closeF;
return SSL_SUCCESS;
}
WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method)
{
WOLFSSL_BIO* bio = (WOLFSSL_BIO*) XMALLOC(sizeof(WOLFSSL_BIO), 0,
@ -20021,6 +20031,60 @@ void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
#ifdef OPENSSL_EXTRA /*Lighttp compatibility*/
WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
pem_password_cb *cb, void *u) {
WOLFSSL_X509* x509 = NULL;
const unsigned char* pem = NULL;
int pemSz;
WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
if (bp == NULL) {
WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
return NULL;
}
pemSz = wolfSSL_BIO_get_mem_data(bp, &pem);
if (pemSz <= 0 || pem == NULL) {
WOLFSSL_MSG("Issue getting WOLFSSL_BIO mem");
WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", pemSz);
return NULL;
}
x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
SSL_FILETYPE_PEM);
if (x != NULL) {
*x = x509;
}
(void)cb;
(void)u;
return x509;
}
/*
* bp : bio to read X509 from
* x : x509 to write to
* cb : password call back for reading PEM
* u : password
* _AUX is for working with a trusted X509 certificate
*/
WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp,
WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
/* AUX info is; trusted/rejected uses, friendly name, private key id,
* and potentially a stack of "other" info. wolfSSL does not store
* friendly name or private key id yet in WOLFSSL_X509 for human
* readibility and does not support extra trusted/rejected uses for
* root CA. */
return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
}
#if defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL)
unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n, unsigned char *md)
@ -20094,29 +20158,6 @@ void* wolfSSL_GetRsaDecCtx(WOLFSSL* ssl)
#endif /* HAVE_ECC */
WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
(void)bp;
(void)x;
(void)cb;
(void)u;
WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
WOLFSSL_STUB("wolfSSL_PEM_read_bio_X509");
return NULL;
}
/*** TBD ***/
WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u) {
(void)bp;
(void)x;
(void)cb;
(void)u;
WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
WOLFSSL_STUB("wolfSSL_PEM_read_bio_X509");
return NULL;
}
void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
(void)ctx;
(void)depth;
@ -20448,18 +20489,18 @@ WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x, pe
#if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \
|| defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
char * wolf_OBJ_nid2ln(int n) {
char * wolfSSL_OBJ_nid2ln(int n) {
(void)n;
WOLFSSL_ENTER("wolf_OBJ_nid2ln");
WOLFSSL_STUB("wolf_OBJ_nid2ln");
WOLFSSL_ENTER("wolfSSL_OBJ_nid2ln");
WOLFSSL_STUB("wolfSSL_OBJ_nid2ln");
return NULL;
}
int wolf_OBJ_txt2nid(const char* s) {
int wolfSSL_OBJ_txt2nid(const char* s) {
(void)s;
WOLFSSL_ENTER("wolf_OBJ_txt2nid");
WOLFSSL_STUB("wolf_OBJ_txt2nid");
WOLFSSL_ENTER("wolfSSL_OBJ_txt2nid");
WOLFSSL_STUB("wolfSSL_OBJ_txt2nid");
return 0;
}
@ -20489,11 +20530,11 @@ WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bp, WOLFSSL_DH **x, pem_p
}
int PEM_write_bio_WOLFSSL_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 *x) {
int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 *x) {
(void)bp;
(void)x;
WOLFSSL_ENTER("PEM_write_bio_WOLFSSL_X509");
WOLFSSL_STUB("PEM_write_bio_WOLFSSL_X509");
WOLFSSL_ENTER("wolfSSL_PEM_write_bio_X509");
WOLFSSL_STUB("wolfSSL_PEM_write_bio_X509");
return 0;
}

View File

@ -2617,11 +2617,11 @@ static void test_wolfSSL_CTX_add_extra_chain_cert(void)
x509 = wolfSSL_X509_load_certificate_file(caFile, SSL_FILETYPE_PEM);
AssertNotNull(x509);
AssertIntEQ((int)wolfSSL_CTX_add_extra_chain_cert(ctx, x509), SSL_SUCCESS);
AssertIntEQ((int)SSL_CTX_add_extra_chain_cert(ctx, x509), SSL_SUCCESS);
x509 = wolfSSL_X509_load_certificate_file(clientFile, SSL_FILETYPE_PEM);
AssertNotNull(x509);
AssertIntEQ((int)wolfSSL_CTX_add_extra_chain_cert(ctx, x509), SSL_SUCCESS);
AssertIntEQ((int)SSL_CTX_add_extra_chain_cert(ctx, x509), SSL_SUCCESS);
SSL_CTX_free(ctx);
printf(resultFmt, passed);
@ -2671,10 +2671,10 @@ static void test_wolfSSL_ERR_peek_last_error_line(void)
FreeTcpReady(&ready);
/* check that error code was stored */
AssertIntNE((int)wolfSSL_ERR_peek_last_error_line(NULL, NULL), 0);
wolfSSL_ERR_peek_last_error_line(NULL, &line);
AssertIntNE((int)ERR_peek_last_error_line(NULL, NULL), 0);
ERR_peek_last_error_line(NULL, &line);
AssertIntNE(line, 0);
wolfSSL_ERR_peek_last_error_line(&file, NULL);
ERR_peek_last_error_line(&file, NULL);
AssertNotNull(file);
#ifdef WOLFSSL_TIRTOS
@ -2796,6 +2796,36 @@ static void test_wolfSSL_set_options(void)
}
static void test_wolfSSL_PEM_read_bio(void)
{
#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
!defined(NO_FILESYSTEM) && !defined(NO_RSA)
byte buffer[5300];
FILE *f;
int bytes;
X509* x509;
BIO* bio = NULL;
printf(testingFmt, "wolfSSL_PEM_read_bio()");
AssertNotNull(f = fopen(cliCert, "rb"));
bytes = (int)fread(buffer, 1, sizeof(buffer), f);
fclose(f);
AssertNull(x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL));
AssertNotNull(bio = BIO_new_mem_buf((void*)buffer, bytes));
AssertNotNull(x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL));
AssertIntEQ((int)BIO_set_fd(bio, 0, BIO_NOCLOSE), 1);
BIO_free(bio);
X509_free(x509);
printf(resultFmt, passed);
#endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
!defined(NO_FILESYSTEM) && !defined(NO_RSA) */
}
/*----------------------------------------------------------------------------*
| Main
*----------------------------------------------------------------------------*/
@ -2852,6 +2882,7 @@ void ApiTest(void)
test_wolfSSL_X509_STORE_set_flags();
test_wolfSSL_BN();
test_wolfSSL_set_options();
test_wolfSSL_PEM_read_bio();
AssertIntEQ(test_wolfSSL_Cleanup(), SSL_SUCCESS);
printf(" End API Tests\n");

View File

@ -447,6 +447,8 @@ typedef WOLFSSL_X509_STORE_CTX X509_STORE_CTX;
#define SSL_SESSION_get_timeout wolfSSL_SESSION_get_timeout
#define SSL_SESSION_get_time wolfSSL_SESSION_get_time
#define SSL_CTX_get_ex_new_index wolfSSL_CTX_get_ex_new_index
#define PEM_read_bio_X509 wolfSSL_PEM_read_bio_X509
#define PEM_read_bio_X509_AUX wolfSSL_PEM_read_bio_X509_AUX
/*#if OPENSSL_API_COMPAT < 0x10100000L*/
#define CONF_modules_free()
@ -478,8 +480,6 @@ typedef WOLFSSL_X509_NAME_ENTRY X509_NAME_ENTRY;
#define OBJ_nid2sn wolfSSL_OBJ_nid2sn
#define OBJ_obj2nid wolfSSL_OBJ_obj2nid
#define OBJ_sn2nid wolfSSL_OBJ_sn2nid
#define PEM_read_bio_X509 wolfSSL_PEM_read_bio_X509
#define PEM_read_bio_X509_AUX wolfSSL_PEM_read_bio_X509_AUX
#define SSL_CTX_set_verify_depth wolfSSL_CTX_set_verify_depth
#define SSL_get_app_data wolfSSL_get_app_data
#define SSL_set_app_data wolfSSL_set_app_data
@ -501,8 +501,8 @@ typedef WOLFSSL_X509_NAME_ENTRY X509_NAME_ENTRY;
#if defined(HAVE_STUNNEL) || defined(HAVE_LIGHTY) \
|| defined(WOLFSSL_MYSQL_COMPATIBLE)
#define OBJ_nid2ln wolf_OBJ_nid2ln
#define OBJ_txt2nid wolf_OBJ_txt2nid
#define OBJ_nid2ln wolfSSL_OBJ_nid2ln
#define OBJ_txt2nid wolfSSL_OBJ_txt2nid
#define PEM_read_bio_DHparams wolfSSL_PEM_read_bio_DHparams
#define PEM_read_bio_DSAparams wolfSSL_PEM_read_bio_DSAparams
#define PEM_write_bio_X509 PEM_write_bio_WOLFSSL_X509
@ -517,7 +517,7 @@ typedef WOLFSSL_X509_NAME_ENTRY X509_NAME_ENTRY;
#define BIO_int_ctrl wolfSSL_BIO_int_ctrl
#define BIO_reset wolfSSL_BIO_reset
#define BIO_s_socket wolfSSL_BIO_s_socket
#define BIO_set_fd wolfSSL_BBIO_set_fd
#define BIO_set_fd wolfSSL_BIO_set_fd
#define BIO_set_write_buf_size wolfSSL_BIO_set_write_buf_size
#define BIO_make_bio_pair wolfSSL_BIO_make_bio_pair

View File

@ -515,6 +515,7 @@ WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new_mem_buf(void* buf, int len);
WOLFSSL_API long wolfSSL_BIO_set_ssl(WOLFSSL_BIO*, WOLFSSL*, int flag);
WOLFSSL_API long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int flag);
WOLFSSL_API void wolfSSL_set_bio(WOLFSSL*, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr);
WOLFSSL_API int wolfSSL_add_all_algorithms(void);
@ -1945,6 +1946,9 @@ WOLFSSL_API size_t wolfSSL_get_client_random(const WOLFSSL* ssl,
WOLFSSL_API pem_password_cb wolfSSL_CTX_get_default_passwd_cb(WOLFSSL_CTX *ctx);
WOLFSSL_API void *wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx);
WOLFSSL_API int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey);
WOLFSSL_API WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u);
WOLFSSL_API WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX
(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u);
/*lighttp compatibility */
@ -1966,9 +1970,6 @@ WOLFSSL_API WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void);
WOLFSSL_API const char * wolfSSL_OBJ_nid2sn(int n);
WOLFSSL_API int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o);
WOLFSSL_API int wolfSSL_OBJ_sn2nid(const char *sn);
WOLFSSL_API WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u);
WOLFSSL_API WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX
(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, pem_password_cb *cb, void *u);
WOLFSSL_API void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx,int depth);
WOLFSSL_API void* wolfSSL_get_app_data( const WOLFSSL *ssl);
WOLFSSL_API void wolfSSL_set_app_data(WOLFSSL *ssl, void *arg);
@ -1987,15 +1988,15 @@ WOLFSSL_API STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list( STACK_OF(WOLFSSL_X
|| defined(WOLFSSL_MYSQL_COMPATIBLE) \
|| defined(OPENSSL_EXTRA)
WOLFSSL_API char * wolf_OBJ_nid2ln(int n);
WOLFSSL_API int wolf_OBJ_txt2nid(const char *sn);
WOLFSSL_API char* wolfSSL_OBJ_nid2ln(int n);
WOLFSSL_API int wolfSSL_OBJ_txt2nid(const char *sn);
WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new_file(const char *filename, const char *mode);
WOLFSSL_API long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX*, WOLFSSL_DH*);
WOLFSSL_API WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bp,
WOLFSSL_DH **x, pem_password_cb *cb, void *u);
WOLFSSL_API WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp,
WOLFSSL_DSA **x, pem_password_cb *cb, void *u);
WOLFSSL_API int PEM_write_bio_WOLFSSL_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 *x);
WOLFSSL_API int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 *x);
WOLFSSL_API long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx);