@@ -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, ¶m1, paramLen) == false );
676741 }
677742
678743 rsa->recycleKeyPair (kp);
0 commit comments