Merge pull request #2896 from embhorn/zd9916

Fix wc_KeyPemToDer with PKCS1 and empty key
This commit is contained in:
toddouska
2020-04-10 15:38:07 -07:00
committed by GitHub
2 changed files with 38 additions and 11 deletions

View File

@@ -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
}

View File

@@ -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) {