bool ValidateGCM() { std::cout << "\nAES/GCM validation suite running...\n"; std::cout << "\n2K tables:"; bool pass = RunTestDataFile("TestVectors/gcm.txt", MakeParameters(Name::TableSize(), (int)2048)); std::cout << "\n64K tables:"; return RunTestDataFile("TestVectors/gcm.txt", MakeParameters(Name::TableSize(), (int)64*1024)) && pass; }
bool ValidateWhirlpool() { cout << "\nWhirlpool Hash Function validation suite running...\n"; #ifdef WORD64_AVAILABLE return RunTestDataFile("TestVectors/whrlpool.txt"); #else cout << "word64 not available, skipping Whirlpool validation." << endl; return true; #endif }
bool ValidateRijndael() { std::cout << "\nRijndael (AES) validation suite running...\n\n"; FileSource valdata("TestData/rijndael.dat", true, new HexDecoder); bool pass = true; pass = BlockTransformationTest(FixedRoundsCipherFactory<RijndaelEncryption, RijndaelDecryption>(16), valdata, 4) && pass; pass = BlockTransformationTest(FixedRoundsCipherFactory<RijndaelEncryption, RijndaelDecryption>(24), valdata, 3) && pass; pass = BlockTransformationTest(FixedRoundsCipherFactory<RijndaelEncryption, RijndaelDecryption>(32), valdata, 2) && pass; pass = RunTestDataFile("TestVectors/aes.txt") && pass; return pass; }
bool ValidateDSA(bool thorough) { cout << "\nDSA validation suite running...\n\n"; bool pass = true; FileSource fs1("TestData/dsa1024.dat", true, new HexDecoder()); DSA::Signer priv(fs1); DSA::Verifier pub(priv); FileSource fs2("TestData/dsa1024b.dat", true, new HexDecoder()); DSA::Verifier pub1(fs2); CRYPTOPP_ASSERT(pub.GetKey() == pub1.GetKey()); pass = SignatureValidate(priv, pub, thorough) && pass; pass = RunTestDataFile("TestVectors/dsa.txt", g_nullNameValuePairs, thorough) && pass; return pass; }
bool ValidateSHA2() { cout << "\nSHA validation suite running...\n\n"; return RunTestDataFile("TestVectors/sha.txt"); }
bool ValidatePanama() { cout << "\nPanama validation suite running...\n"; return RunTestDataFile("TestVectors/panama.txt"); }
bool ValidateHMAC() { return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/hmac.txt"); }
bool ValidateWhirlpool() { return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/whrlpool.txt"); }
bool ValidateHMAC() { return RunTestDataFile("TestVectors/hmac.txt"); }
int main(int argc, char *argv[]) #endif { #ifdef _CRTDBG_LEAK_CHECK_DF // Turn on leak-checking int tempflag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); tempflag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag( tempflag ); #endif #if defined(__MWERKS__) && defined(macintosh) argc = ccommand(&argv); #endif try { std::string command, executableName, edcFilename; if (argc < 2) command = 'h'; else command = argv[1]; if (FIPS_140_2_ComplianceEnabled()) { edcFilename = "edc.dat"; #ifdef CRYPTOPP_WIN32_AVAILABLE TCHAR filename[MAX_PATH]; GetModuleFileName(GetModuleHandle(NULL), filename, sizeof(filename)); executableName = filename; std::string::size_type pos = executableName.rfind('\\'); if (pos != std::string::npos) edcFilename = executableName.substr(0, pos+1) + edcFilename; #else executableName = argv[0]; #endif if (command.substr(0, 4) != "fips") { byte expectedModuleDigest[SHA1::DIGESTSIZE]; FileSource(edcFilename.c_str(), true, new HexDecoder(new ArraySink(expectedModuleDigest, sizeof(expectedModuleDigest)))); DoPowerUpSelfTest(executableName.c_str(), expectedModuleDigest); } } switch (command[0]) { case 'g': { char seed[1024], privFilename[128], pubFilename[128]; unsigned int keyLength; cout << "Key length in bits: "; cin >> keyLength; cout << "\nSave private key to file: "; cin >> privFilename; cout << "\nSave public key to file: "; cin >> pubFilename; cout << "\nRandom Seed: "; ws(cin); cin.getline(seed, 1024); GenerateRSAKey(keyLength, privFilename, pubFilename, seed); return 0; } case 'r': { switch (argv[1][1]) { case 's': RSASignFile(argv[2], argv[3], argv[4]); return 0; case 'v': { bool verified = RSAVerifyFile(argv[2], argv[3], argv[4]); cout << (verified ? "valid signature" : "invalid signature") << endl; return 0; } default: { char privFilename[128], pubFilename[128]; char seed[1024], message[1024]; cout << "Private key file: "; cin >> privFilename; cout << "\nPublic key file: "; cin >> pubFilename; cout << "\nRandom Seed: "; ws(cin); cin.getline(seed, 1024); cout << "\nMessage: "; cin.getline(message, 1024); string ciphertext = RSAEncryptString(pubFilename, seed, message); cout << "\nCiphertext: " << ciphertext << endl; string decrypted = RSADecryptString(privFilename, ciphertext.c_str()); cout << "\nDecrypted: " << decrypted << endl; return 0; } } } case 'm': DigestFile(argv[2]); return 0; case 't': { if (command == "tv") { return !RunTestDataFile(argv[2]); } // VC60 workaround: use char array instead of std::string to workaround MSVC's getline bug char passPhrase[MAX_PHRASE_LENGTH], plaintext[1024]; cout << "Passphrase: "; cin.getline(passPhrase, MAX_PHRASE_LENGTH); cout << "\nPlaintext: "; cin.getline(plaintext, 1024); string ciphertext = EncryptString(plaintext, passPhrase); cout << "\nCiphertext: " << ciphertext << endl; string decrypted = DecryptString(ciphertext.c_str(), passPhrase); cout << "\nDecrypted: " << decrypted << endl; return 0; } case 'e': case 'd': if (command == "e64") Base64Encode(argv[2], argv[3]); else if (command == "d64") Base64Decode(argv[2], argv[3]); else if (command == "e16") HexEncode(argv[2], argv[3]); else if (command == "d16") HexDecode(argv[2], argv[3]); else { char passPhrase[MAX_PHRASE_LENGTH]; cout << "Passphrase: "; cin.getline(passPhrase, MAX_PHRASE_LENGTH); if (command == "e") EncryptFile(argv[2], argv[3], passPhrase); else DecryptFile(argv[2], argv[3], passPhrase); } return 0; case 's': if (argv[1][1] == 's') { char seed[1024]; cout << "\nRandom Seed: "; ws(cin); cin.getline(seed, 1024); SecretShareFile(atoi(argv[2]), atoi(argv[3]), argv[4], seed); } else SecretRecoverFile(argc-3, argv[2], argv+3); return 0; case 'i': if (argv[1][1] == 'd') InformationDisperseFile(atoi(argv[2]), atoi(argv[3]), argv[4]); else InformationRecoverFile(argc-3, argv[2], argv+3); return 0; case 'v': return !Validate(argc>2 ? atoi(argv[2]) : 0, argv[1][1] == 'v', argc>3 ? argv[3] : NULL); case 'b': if (argc<3) BenchMarkAll(); else BenchMarkAll((float)atof(argv[2])); return 0; case 'z': GzipFile(argv[3], argv[4], argv[2][0]-'0'); return 0; case 'u': GunzipFile(argv[2], argv[3]); return 0; case 'f': if (command == "fips") FIPS140_SampleApplication(executableName.c_str(), edcFilename.c_str()); else if (command == "fips-rand") FIPS140_GenerateRandomFiles(); else if (command == "ft") ForwardTcpPort(argv[2], argv[3], argv[4]); return 0; case 'a': if (AdhocTest) return (*AdhocTest)(argc, argv); else return 0; default: FileSource usage("usage.dat", true, new FileSink(cout)); return 1; } } catch(CryptoPP::Exception &e) { cout << "\nCryptoPP::Exception caught: " << e.what() << endl; return -1; } catch(std::exception &e) { cout << "\nstd::exception caught: " << e.what() << endl; return -2; } }
bool ValidateVMAC() { cout << "\nVMAC validation suite running...\n"; return RunTestDataFile("TestVectors/vmac.txt"); }
bool ValidateSosemanuk() { cout << "\nSosemanuk validation suite running...\n"; return RunTestDataFile("TestVectors/sosemanuk.txt"); }
bool ValidateSalsa() { cout << "\nSalsa validation suite running...\n"; return RunTestDataFile("TestVectors/salsa.txt"); }
bool ValidateAll(bool thorough) { bool pass=TestSettings(); pass=TestRotate() && pass; pass=TestConversion() && pass; pass=TestOS_RNG() && pass; pass=ValidateCRC32() && pass; pass=ValidateAdler32() && pass; pass=ValidateMD2() && pass; pass=ValidateMD5() && pass; pass=ValidateSHA() && pass; pass=RunTestDataFile("TestVectors/sha3.txt") && pass; pass=ValidateTiger() && pass; pass=ValidateRIPEMD() && pass; pass=ValidatePanama() && pass; pass=ValidateWhirlpool() && pass; pass=ValidateHMAC() && pass; pass=ValidateTTMAC() && pass; pass=ValidatePBKDF() && pass; pass=ValidateHKDF() && pass; pass=ValidateDES() && pass; pass=ValidateCipherModes() && pass; pass=ValidateIDEA() && pass; pass=ValidateSAFER() && pass; pass=ValidateRC2() && pass; pass=ValidateARC4() && pass; pass=ValidateRC5() && pass; pass=ValidateBlowfish() && pass; pass=ValidateThreeWay() && pass; pass=ValidateGOST() && pass; pass=ValidateSHARK() && pass; pass=ValidateCAST() && pass; pass=ValidateSquare() && pass; pass=ValidateSKIPJACK() && pass; pass=ValidateSEAL() && pass; pass=ValidateRC6() && pass; pass=ValidateMARS() && pass; pass=ValidateRijndael() && pass; pass=ValidateTwofish() && pass; pass=ValidateSerpent() && pass; pass=ValidateSHACAL2() && pass; pass=ValidateCamellia() && pass; pass=ValidateSalsa() && pass; pass=ValidateSosemanuk() && pass; pass=ValidateVMAC() && pass; pass=ValidateCCM() && pass; pass=ValidateGCM() && pass; pass=ValidateCMAC() && pass; pass=RunTestDataFile("TestVectors/eax.txt") && pass; pass=RunTestDataFile("TestVectors/seed.txt") && pass; pass=ValidateBBS() && pass; pass=ValidateDH() && pass; pass=ValidateMQV() && pass; pass=ValidateRSA() && pass; pass=ValidateElGamal() && pass; pass=ValidateDLIES() && pass; pass=ValidateNR() && pass; pass=ValidateDSA(thorough) && pass; pass=ValidateLUC() && pass; pass=ValidateLUC_DH() && pass; pass=ValidateLUC_DL() && pass; pass=ValidateXTR_DH() && pass; pass=ValidateRabin() && pass; pass=ValidateRW() && pass; // pass=ValidateBlumGoldwasser() && pass; pass=ValidateECP() && pass; pass=ValidateEC2N() && pass; pass=ValidateECDSA() && pass; pass=ValidateESIGN() && pass; if (pass) std::cout << "\nAll tests passed!\n"; else std::cout << "\nOops! Not all tests passed.\n"; return pass; }
bool ValidateCMAC() { std::cout << "\nCMAC validation suite running...\n"; return RunTestDataFile("TestVectors/cmac.txt"); }
bool ValidatePanama() { return RunTestDataFile("TestVectors/panama.txt"); }
bool ValidateWhirlpool() { return RunTestDataFile("TestVectors/whrlpool.txt"); }
bool ValidateSHA() { cout << "\nSHA validation suite running...\n\n"; return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/sha.txt"); }
bool ValidatePanama() { return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/panama.txt"); }
bool ValidateCCM() { std::cout << "\nAES/CCM validation suite running...\n"; return RunTestDataFile("TestVectors/ccm.txt"); }