summaryrefslogtreecommitdiff
path: root/dlltest.cpp
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2003-07-04 00:17:37 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2003-07-04 00:17:37 +0000
commit572fe07633123ce38abf28c6426356e37aef3a99 (patch)
tree0536d87e504a82920156c239bc5ae6aa43e70ebc /dlltest.cpp
parent3e8c979ddc194e043567c036321e67c89f847362 (diff)
downloadcryptopp-572fe07633123ce38abf28c6426356e37aef3a99.tar.gz
create DLL version, fix GetNextIV() bug in CTR and OFB modes
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@87 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'dlltest.cpp')
-rw-r--r--dlltest.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/dlltest.cpp b/dlltest.cpp
new file mode 100644
index 0000000..eb11feb
--- /dev/null
+++ b/dlltest.cpp
@@ -0,0 +1,178 @@
+#include "dll.h"
+#include <iostream>
+
+USING_NAMESPACE(CryptoPP)
+USING_NAMESPACE(std)
+
+void FIPS140_SampleApplication()
+{
+ if (!FIPS_140_2_ComplianceEnabled())
+ {
+ cerr << "FIPS-140-2 compliance was turned off at compile time.\n";
+ abort();
+ }
+
+ // check self test status
+ if (GetPowerUpSelfTestStatus() != POWER_UP_SELF_TEST_PASSED)
+ {
+ cerr << "Automatic power-up self test failed.\n";
+ abort();
+ }
+ cout << "0. Automatic power-up self test passed.\n";
+
+ // simulate a power-up self test error
+ SimulatePowerUpSelfTestFailure();
+ try
+ {
+ // trying to use a crypto algorithm after power-up self test error will result in an exception
+ DES::Encryption des;
+
+ // should not be here
+ cerr << "Use of DES failed to cause an exception after power-up self test error.\n";
+ abort();
+ }
+ catch (SelfTestFailure &e)
+ {
+ cout << "1. Caught expected exception when simulating self test failure. Exception message follows: ";
+ cout << e.what() << endl;
+ }
+
+ // clear the self test error state and redo power-up self test
+ DoDllPowerUpSelfTest();
+ if (GetPowerUpSelfTestStatus() != POWER_UP_SELF_TEST_PASSED)
+ {
+ cerr << "Re-do power-up self test failed.\n";
+ abort();
+ }
+ cout << "2. Re-do power-up self test passed.\n";
+
+ // encrypt and decrypt
+ const byte key[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
+ const byte iv[] = {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
+ const byte plaintext[] = { // "Now is the time for all " without tailing 0
+ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,
+ 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20,
+ 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20};
+ byte ciphertext[24];
+ byte decrypted[24];
+
+ CFB_Mode<DES>::Encryption encryption_DES_CBC;
+ encryption_DES_CBC.SetKeyWithIV(key, 8, iv);
+ encryption_DES_CBC.ProcessString(ciphertext, plaintext, 24);
+
+ CFB_Mode<DES>::Decryption decryption_DES_CBC;
+ decryption_DES_CBC.SetKeyWithIV(key, 8, iv);
+ decryption_DES_CBC.ProcessString(decrypted, ciphertext, 24);
+
+ if (memcmp(plaintext, decrypted, 24) != 0)
+ {
+ cerr << "DES-CBC Encryption/decryption failed.\n";
+ abort();
+ }
+ cout << "3. DES-CBC Encryption/decryption succeeded.\n";
+
+ // hash
+ const byte message[] = {'a', 'b', 'c'};
+ const byte expectedDigest[] = {0xA9,0x99,0x3E,0x36,0x47,0x06,0x81,0x6A,0xBA,0x3E,0x25,0x71,0x78,0x50,0xC2,0x6C,0x9C,0xD0,0xD8,0x9D};
+ byte digest[20];
+
+ SHA1 sha;
+ sha.Update(message, 3);
+ sha.Final(digest);
+
+ if (memcmp(digest, expectedDigest, 20) != 0)
+ {
+ cerr << "SHA-1 hash failed.\n";
+ abort();
+ }
+ cout << "4. SHA-1 hash succeeded.\n";
+
+ // create auto-seeded X9.17 RNG object, if available
+#ifdef OS_RNG_AVAILABLE
+ AutoSeededX917RNG<DES_EDE3> rng;
+#else
+ // this is used to allow this function to compile on platforms that don't have auto-seeded RNGs
+ RandomNumberGenerator &rng(NullRNG());
+#endif
+
+ // generate DSA key
+ DSA::PrivateKey dsaPrivateKey;
+ dsaPrivateKey.GenerateRandomWithKeySize(rng, 1024);
+ DSA::PublicKey dsaPublicKey;
+ dsaPublicKey.AssignFrom(dsaPrivateKey);
+ if (!dsaPrivateKey.Validate(rng, 3) || !dsaPublicKey.Validate(rng, 3))
+ {
+ cerr << "DSA key generation failed.\n";
+ abort();
+ }
+ cout << "5. DSA key generation succeeded.\n";
+
+ // encode DSA key
+ std::string encodedDsaPublicKey, encodedDsaPrivateKey;
+ dsaPublicKey.DEREncode(StringSink(encodedDsaPublicKey).Ref());
+ dsaPrivateKey.DEREncode(StringSink(encodedDsaPrivateKey).Ref());
+
+ // decode DSA key
+ DSA::PrivateKey decodedDsaPrivateKey;
+ decodedDsaPrivateKey.BERDecode(StringStore(encodedDsaPrivateKey).Ref());
+ DSA::PublicKey decodedDsaPublicKey;
+ decodedDsaPublicKey.BERDecode(StringStore(encodedDsaPublicKey).Ref());
+
+ if (!decodedDsaPrivateKey.Validate(rng, 3) || !decodedDsaPublicKey.Validate(rng, 3))
+ {
+ cerr << "DSA key encode/decode failed.\n";
+ abort();
+ }
+ cout << "6. DSA key encode/decode succeeded.\n";
+
+ // sign and verify
+ byte signature[40];
+ DSA::Signer signer(dsaPrivateKey);
+ assert(signer.SignatureLength() == 40);
+ signer.SignMessage(rng, message, 3, signature);
+
+ DSA::Verifier verifier(dsaPublicKey);
+ if (!verifier.VerifyMessage(message, 3, signature, sizeof(signature)))
+ {
+ cerr << "DSA signature and verification failed.\n";
+ abort();
+ }
+ cout << "7. DSA signature and verification succeeded.\n";
+
+
+ // try to verify an invalid signature
+ signature[0] ^= 1;
+ if (verifier.VerifyMessage(message, 3, signature, sizeof(signature)))
+ {
+ cerr << "DSA signature verification failed to detect bad signature.\n";
+ abort();
+ }
+ cout << "8. DSA signature verification successfully detected bad signature.\n";
+
+ // try to use an invalid key length
+ try
+ {
+ encryption_DES_CBC.SetKey(key, 5);
+
+ // should not be here
+ cerr << "DES implementation did not detect use of invalid key length.\n";
+ abort();
+ }
+ catch (InvalidArgument &e)
+ {
+ cout << "9. Caught expected exception when using invalid key length. Exception message follows: ";
+ cout << e.what() << endl;
+ }
+
+ cout << "\nFIPS 140-2 Sample Application completed normally.\n";
+}
+
+#ifdef CRYPTOPP_DLL_ONLY
+
+int __cdecl main()
+{
+ FIPS140_SampleApplication();
+ return 0;
+}
+
+#endif