From 8db170250e3d91ee27e02f7504b3c33cbd832676 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Thu, 30 Mar 2017 13:25:00 -0600 Subject: [PATCH] add support for file type BIO to PEM read private key --- src/ssl.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/ssl.c b/src/ssl.c index d37bff6e0..ffa4f89e8 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -25918,6 +25918,43 @@ WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio, return NULL; } } + else if (bio->type == WOLFSSL_BIO_FILE) { + int sz = 100; /* read from file by 100 byte chuncks */ + int idx = 0; + char* tmp = (char*)XMALLOC(sz, bio->heap, DYNAMIC_TYPE_OPENSSL); + + memSz = 0; + if (tmp == NULL) { + WOLFSSL_MSG("Memory error"); + return NULL; + } + + while ((sz = wolfSSL_BIO_read(bio, tmp, sz)) > 0) { + if (memSz + sz < 0) { + /* sanity check */ + break; + } + mem = (char*)XREALLOC(mem, memSz + sz, bio->heap, + DYNAMIC_TYPE_OPENSSL); + if (mem == NULL) { + WOLFSSL_MSG("Memory error"); + XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL); + return NULL; + } + XMEMCPY(mem + idx, tmp, sz); + memSz += sz; + idx += sz; + sz = 100; /* read another 100 byte chunck from file */ + } + XFREE(tmp, bio->heap, DYNAMIC_TYPE_OPENSSL); + if (memSz <= 0) { + WOLFSSL_MSG("No data to read from bio"); + if (mem != NULL) { + XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL); + } + return NULL; + } + } else { WOLFSSL_MSG("No data to read from bio"); return NULL;