diff --git a/tests/api.c b/tests/api.c index 775ae238b..544e269ad 100644 --- a/tests/api.c +++ b/tests/api.c @@ -20051,7 +20051,7 @@ static void test_wc_PemToDer(void) printf(testingFmt, "wc_PemToDer()"); - memset(&info, 0, sizeof(info)); + XMEMSET(&info, 0, sizeof(info)); ret = load_file(ca_cert, &cert_buf, &cert_sz); if (ret == 0) { @@ -25670,6 +25670,27 @@ static void test_wolfSSL_RSA(void) AssertNull(RSA_generate_key(4097, 3, NULL, NULL)); /* RSA_MAX_SIZE + 1 */ AssertNull(RSA_generate_key(2048, 0, NULL, NULL)); + +#if !defined(NO_FILESYSTEM) && !defined(NO_ASN) + { + byte buff[FOURK_BUF]; + byte der[FOURK_BUF]; + const char PrivKeyPemFile[] = "certs/client-keyEnc.pem"; + + XFILE f; + int bytes; + + /* test loading encrypted RSA private pem w/o password */ + f = XFOPEN(PrivKeyPemFile, "rb"); + AssertTrue((f != XBADFILE)); + bytes = (int)XFREAD(buff, 1, sizeof(buff), f); + XFCLOSE(f); + XMEMSET(der, 0, sizeof(der)); + /* test that error value is returned with no password */ + AssertIntLT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), ""), 0); + } +#endif + printf(resultFmt, passed); #endif } diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index a2e2e5b5d..38425480c 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -10562,20 +10562,26 @@ int PemToDer(const unsigned char* buff, long longSz, int type, } /* decrypt the key */ else { - ret = wc_BufferKeyDecrypt(info, der->buffer, der->length, - (byte*)password, passwordSz, WC_MD5); + if (passwordSz == 0) { + /* The key is encrypted but does not have a password */ + WOLFSSL_MSG("No password for encrypted key"); + ret = NO_PASSWORD; + } + else { + ret = wc_BufferKeyDecrypt(info, der->buffer, der->length, + (byte*)password, passwordSz, WC_MD5); #ifndef NO_WOLFSSL_SKIP_TRAILING_PAD - #ifndef NO_DES3 - if (info->cipherType == WC_CIPHER_DES3) { - padVal = der->buffer[der->length-1]; - if (padVal <= DES_BLOCK_SIZE) { - der->length -= padVal; + #ifndef NO_DES3 + if (info->cipherType == WC_CIPHER_DES3) { + padVal = der->buffer[der->length-1]; + if (padVal <= DES_BLOCK_SIZE) { + der->length -= padVal; + } } - } - #endif /* !NO_DES3 */ + #endif /* !NO_DES3 */ #endif /* !NO_WOLFSSL_SKIP_TRAILING_PAD */ - + } } #ifdef OPENSSL_EXTRA if (ret) {