diff --git a/src/ssl.c b/src/ssl.c index cade505f7..61235df8c 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -42164,6 +42164,31 @@ int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey) return WOLFSSL_FAILURE; } + switch (pkey->type) { +#if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(NO_RSA) + case EVP_PKEY_RSA: + WOLFSSL_MSG("populating RSA key"); + if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) + return WOLFSSL_FAILURE; + break; +#endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */ +#if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \ + defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA) + case EVP_PKEY_DSA: + break; +#endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */ +#ifdef HAVE_ECC + case EVP_PKEY_EC: + WOLFSSL_MSG("populating ECC key"); + if (ECC_populate_EVP_PKEY(pkey, (ecc_key*)pkey->ecc->internal) + != WOLFSSL_SUCCESS) + return WOLFSSL_FAILURE; + break; +#endif + default: + return WOLFSSL_FAILURE; + } + if (pkey->pkey.ptr != NULL) { /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */ return wolfSSL_CTX_use_PrivateKey_buffer(ctx, diff --git a/src/wolfio.c b/src/wolfio.c index 131e74122..5be99ed0a 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -167,6 +167,12 @@ int BioReceive(WOLFSSL* ssl, char* buf, int sz, void* ctx) if (recvd <= 0) { if (wolfSSL_BIO_supports_pending(ssl->biord) && wolfSSL_BIO_ctrl_pending(ssl->biord) == 0) { + if (ssl->biowr->type == WOLFSSL_BIO_BIO && + ssl->biowr->wrIdx != 0) { + /* Let's signal to the app layer that we have + * data pending that needs to be sent. */ + return WOLFSSL_CBIO_ERR_WANT_WRITE; + } return WOLFSSL_CBIO_ERR_WANT_READ; } else if (ssl->biord->type == WOLFSSL_BIO_SOCKET) { @@ -224,6 +230,12 @@ int BioSend(WOLFSSL* ssl, char *buf, int sz, void *ctx) #endif return sent; } + else if (ssl->biowr->type == WOLFSSL_BIO_BIO) { + if (sent == WOLFSSL_BIO_ERROR) { + WOLFSSL_MSG("\tWould Block"); + return WOLFSSL_CBIO_ERR_WANT_WRITE; + } + } /* If retry and write flags are set, return WANT_WRITE */ if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_WRITE) && diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index c7631828f..55c3cd2fe 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -6593,6 +6593,7 @@ static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key) if (!pkey || !ecc) return WOLFSSL_FAILURE; if (ecc->type == ECC_PRIVATEKEY || ecc->type == ECC_PRIVATEKEY_ONLY) { +#ifdef HAVE_PKCS8 if (wc_EccKeyToPKCS8(ecc, NULL, &derSz) == LENGTH_ONLY_E) { derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL); if (derBuf != NULL) { @@ -6603,6 +6604,19 @@ static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key) } } } +#else + derSz = (word32)wc_EccKeyDerSize(ecc, 1); + if (derSz > 0) { + derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL); + if (derBuf != NULL) { + if (wc_EccKeyToDer(ecc, derBuf, derSz) < 0) { + XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL); + derBuf = NULL; + } + } + } + +#endif /* HAVE_PKCS8 */ } <<<<<<< master else {