Skip to content

Commit 31b359a

Browse files
author
Golikov Pavel Evgenevich
committed
Fix RSA encrypt-decrypt tests
1 parent 73e5fe2 commit 31b359a

File tree

2 files changed

+77
-11
lines changed

2 files changed

+77
-11
lines changed

src/lib/crypto/test/RSATests.cpp

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,9 @@ void RSATests::testEncryptDecrypt()
601601
{
602602
AsymmetricKeyPair* kp;
603603
RSAParameters p;
604-
604+
char TestLabel[] = "THIS IS A GOOD DAY";
605+
char InvalidLabel[] = "ALWAYS BAD";
606+
605607
// Public exponents to test
606608
std::vector<ByteString> exponents;
607609
exponents.push_back("010001");
@@ -614,14 +616,24 @@ void RSATests::testEncryptDecrypt()
614616
keySizes.push_back(1024);
615617
keySizes.push_back(1280);
616618
keySizes.push_back(2048);
617-
//keySizes.push_back(4096);
619+
keySizes.push_back(4096);
618620

619621
// Paddings to test
620622
std::vector<AsymMech::Type> paddings;
621623
paddings.push_back(AsymMech::RSA_PKCS);
622-
paddings.push_back(AsymMech::RSA_PKCS_OAEP);
624+
//paddings.push_back(AsymMech::RSA_PKCS_OAEP);
623625
paddings.push_back(AsymMech::RSA);
624626

627+
//OAEP parameters for test
628+
std::vector<RSA_PKCS_OAEP_PARAMS> oaep_parameters;
629+
oaep_parameters.push_back({HashAlgo::SHA1,AsymRSAMGF::MGF1_SHA1, NULL,0});
630+
oaep_parameters.push_back({HashAlgo::SHA256,AsymRSAMGF::MGF1_SHA256, NULL,0});
631+
oaep_parameters.push_back({HashAlgo::SHA384,AsymRSAMGF::MGF1_SHA384, NULL,0});
632+
oaep_parameters.push_back({HashAlgo::SHA512,AsymRSAMGF::MGF1_SHA512, NULL,0});
633+
oaep_parameters.push_back({HashAlgo::SHA1,AsymRSAMGF::MGF1_SHA256, NULL,0});
634+
oaep_parameters.push_back({HashAlgo::SHA512,AsymRSAMGF::MGF1_SHA224, TestLabel ,strlen(TestLabel)});
635+
oaep_parameters.push_back({HashAlgo::SHA1,AsymRSAMGF::MGF1_SHA256, TestLabel ,strlen(TestLabel)});
636+
625637
for (std::vector<ByteString>::iterator e = exponents.begin(); e != exponents.end(); e++)
626638
{
627639
for (std::vector<size_t>::iterator k = keySizes.begin(); k != keySizes.end(); k++)
@@ -638,15 +650,14 @@ void RSATests::testEncryptDecrypt()
638650
{
639651
// Generate some test data to encrypt based on the selected padding
640652
ByteString testData;
653+
void *parameters = NULL;
654+
size_t paramLen = 0;
641655

642656
if (*pad == AsymMech::RSA_PKCS)
643657
{
644658
CPPUNIT_ASSERT(rng->generateRandom(testData, (*k >> 3) - 12));
645659
}
646-
else if (*pad == AsymMech::RSA_PKCS_OAEP)
647-
{
648-
CPPUNIT_ASSERT(rng->generateRandom(testData, (*k >> 3) - 42));
649-
}
660+
650661
else if (*pad == AsymMech::RSA)
651662
{
652663
CPPUNIT_ASSERT(rng->generateRandom(testData, *k >> 3));
@@ -659,20 +670,74 @@ void RSATests::testEncryptDecrypt()
659670

660671
// Encrypt the data
661672
ByteString encryptedData;
673+
CPPUNIT_ASSERT(rsa->encrypt(kp->getPublicKey(), testData, encryptedData, *pad, parameters, paramLen));
674+
// The encrypted data length should equal the modulus length
675+
CPPUNIT_ASSERT(encryptedData.size() == (*k >> 3));
676+
CPPUNIT_ASSERT(encryptedData != testData);
677+
678+
// Now decrypt the data
679+
ByteString decryptedData;
662680

663-
CPPUNIT_ASSERT(rsa->encrypt(kp->getPublicKey(), testData, encryptedData, *pad));
681+
CPPUNIT_ASSERT(rsa->decrypt(kp->getPrivateKey(), encryptedData, decryptedData, *pad, parameters, paramLen));
664682

683+
// Check that the data was properly decrypted
684+
CPPUNIT_ASSERT(decryptedData == testData);
685+
}
686+
// OAEP encryption test
687+
for (std::vector<RSA_PKCS_OAEP_PARAMS>::iterator par = oaep_parameters.begin(); par != oaep_parameters.end(); par++)
688+
{
689+
// Generate some test data to encrypt based on the selected padding
690+
ByteString testData;
691+
692+
void *parameters = &(par->hashAlg);
693+
size_t paramLen = sizeof(RSA_PKCS_OAEP_PARAMS);
694+
size_t hashLen = 0;
695+
switch (par->hashAlg)
696+
{
697+
case HashAlgo::SHA1:
698+
hashLen = 20;
699+
break;
700+
case HashAlgo::SHA224:
701+
hashLen = 28;
702+
break;
703+
case HashAlgo::SHA256:
704+
hashLen = 32;
705+
break;
706+
case HashAlgo::SHA384:
707+
hashLen = 48;
708+
break;
709+
case HashAlgo::SHA512:
710+
hashLen = 64;
711+
break;
712+
default:
713+
CPPUNIT_ASSERT(true == false);
714+
}
715+
if ((*k >> 3) <= (hashLen*2)+2)
716+
continue; //skip test - hash too long for key size
717+
CPPUNIT_ASSERT(rng->generateRandom(testData, (*k >> 3) - 2 - hashLen*2));
718+
// Encrypt the data
719+
ByteString encryptedData;
720+
CPPUNIT_ASSERT(rsa->encrypt(kp->getPublicKey(), testData, encryptedData, AsymMech::RSA_PKCS_OAEP, parameters, paramLen));
665721
// The encrypted data length should equal the modulus length
666722
CPPUNIT_ASSERT(encryptedData.size() == (*k >> 3));
667723
CPPUNIT_ASSERT(encryptedData != testData);
668724

669725
// Now decrypt the data
670726
ByteString decryptedData;
671727

672-
CPPUNIT_ASSERT(rsa->decrypt(kp->getPrivateKey(), encryptedData, decryptedData, *pad));
728+
CPPUNIT_ASSERT(rsa->decrypt(kp->getPrivateKey(), encryptedData, decryptedData, AsymMech::RSA_PKCS_OAEP, parameters, paramLen));
673729

674730
// Check that the data was properly decrypted
675731
CPPUNIT_ASSERT(decryptedData == testData);
732+
733+
// Now decrypt the data with invalid label
734+
ByteString decryptedData1;
735+
RSA_PKCS_OAEP_PARAMS param1;
736+
param1.hashAlg = par->hashAlg;
737+
param1.mgf = par->mgf;
738+
param1.sourceData = InvalidLabel;
739+
param1.sourceDataLen = strlen(InvalidLabel);
740+
CPPUNIT_ASSERT(rsa->decrypt(kp->getPrivateKey(), encryptedData, decryptedData1, AsymMech::RSA_PKCS_OAEP, &param1, paramLen) == false);
676741
}
677742

678743
rsa->recycleKeyPair(kp);

src/lib/test/AsymEncryptDecryptTests.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,11 @@ void AsymEncryptDecryptTests::rsaOAEPParams(CK_SESSION_HANDLE hSession, CK_OBJEC
137137
rv = CRYPTOKI_F_PTR( C_EncryptInit(hSession,&mechanism,hPublicKey) );
138138
CPPUNIT_ASSERT(rv==CKR_ARGUMENTS_BAD);
139139

140-
oaepParams.hashAlg = CKM_SHA_1;
140+
// This parameter is valid
141+
/*oaepParams.hashAlg = CKM_SHA_1;
141142
oaepParams.mgf = CKG_MGF1_SHA256;
142143
rv = CRYPTOKI_F_PTR( C_EncryptInit(hSession,&mechanism,hPublicKey) );
143-
CPPUNIT_ASSERT(rv==CKR_ARGUMENTS_BAD);
144+
CPPUNIT_ASSERT(rv==CKR_ARGUMENTS_BAD);*/
144145

145146
oaepParams.mgf = CKG_MGF1_SHA1;
146147
oaepParams.source = CKZ_DATA_SPECIFIED - 1;

0 commit comments

Comments
 (0)