blautenb 2003/10/19 04:01:01
Modified: c/src/tools/xtest xtest.cpp
Log:
Unit tests for encrypt/decrypt - RSA/AES key wraps
Revision Changes Path
1.25 +199 -5 xml-security/c/src/tools/xtest/xtest.cpp
Index: xtest.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/tools/xtest/xtest.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- xtest.cpp 13 Oct 2003 11:08:02 -0000 1.24
+++ xtest.cpp 19 Oct 2003 11:01:01 -0000 1.25
@@ -88,6 +88,7 @@
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/XMLException.hpp>
+#include <xercesc/util/Janitor.hpp>
#include <xsec/transformers/TXFMOutputFile.hpp>
#include <xsec/dsig/DSIGTransformXPath.hpp>
@@ -124,12 +125,16 @@
#include <xsec/dsig/DSIGKeyInfoMgmtData.hpp>
#include <xsec/xenc/XENCCipher.hpp>
#include <xsec/xenc/XENCEncryptedData.hpp>
+#include <xsec/xenc/XENCEncryptedKey.hpp>
#include <xsec/enc/XSECCryptoSymmetricKey.hpp>
#if defined (HAVE_OPENSSL)
# include <xsec/enc/OpenSSL/OpenSSLCryptoKeyHMAC.hpp>
+# include <xsec/enc/OpenSSL/OpenSSLCryptoKeyRSA.hpp>
# include <openssl/rand.h>
+# include <openssl/evp.h>
+# include <openssl/pem.h>
#endif
#if defined (HAVE_WINCAPI)
# include <xsec/enc/WinCAPI/WinCAPICryptoKeyHMAC.hpp>
@@ -252,6 +257,32 @@
};
//
--------------------------------------------------------------------------------
+// Some test keys
+//
--------------------------------------------------------------------------------
+
+// A PKCS8 PEM encoded PrivateKey structure (not Encrypted)
+
+char s_tstRSAPrivateKey[] = "\n\
+-----BEGIN RSA PRIVATE KEY-----\n\
+MIICXAIBAAKBgQDQj3pktZckAzwshRnfvLhz3daNU6xpAzoHo3qjCftxDwH1RynP\n\
+A5eycJVkV8mwH2C1PFktpjtQTZ2CvPjuKmUV5zEvmYzuIo6SWYaVZN/PJjzsEZMa\n\
+VA+U8GhfX1YF/rsuFzXCi8r6FVd3LN//pXHEwoDGdJUdlpdVEuX1iFKlNQIDAQAB\n\
+AoGAYQ7Uc7e6Xa0PvNw4XVHzOSC870pISxqQT+u5b9R+anAEhkQW5dsTJpyUOX1N\n\
+RCRmGhG6oq7gnY9xRN1yr0uVfJNtc9/HnzJL7L1jeJC8Ub+zbEBvNuPDL2P21ArW\n\
+tcXRycUlfRCRBLop7rfOYPXsjtboAGnQY/6hK4rOF4XGrQUCQQD3Euj+0mZqRRZ4\n\
+M1yN2wVP0mKOMg2i/HZXaNeVd9X/wyBgK6b7BxHf6onf/mIBWnJnRBlvdCrSdhuT\n\
+lPKEoSgvAkEA2BhfWwQihqD4qJcV65nfosjzOZG41rHX69nIqHI7Ejx5ZgeQByH9\n\
+Ym96yXoSpZj9ZlFsJYNogTBBnUBjs+jL2wJAFjpVS9eR7y2X/+hfA0QZDj1XMIPA\n\
+RlGANAzymDfXwNLFLuG+fAb+zK5FCSnRl12TvUabIzPIRnbptDVKPDRjcQJBALn8\n\
+0CVv+59P8HR6BR3QRBDBT8Xey+3NB4Aw42lHV9wsPHg6ThY1hPYx6MZ70IzCjmZ/\n\
+8cqfvVRjijWj86wm0z0CQFKfRfBRraOZqfmOiAB4+ILhbJwKBBO6avX9TPgMYkyN\n\
+mWKCxS+9fPiy1iI+G+B9xkw2gJ9i8P81t7fsOvdTDFA=\n\
+-----END RSA PRIVATE KEY-----";
+
+static char s_keyStr[] = "abcdefghijklmnopqrstuvwxyzabcdef";
+
+
+//
--------------------------------------------------------------------------------
// Find a node
//
--------------------------------------------------------------------------------
@@ -749,6 +780,151 @@
}
//
--------------------------------------------------------------------------------
+// Unit tests for test encrypt/Decrypt
+//
--------------------------------------------------------------------------------
+
+void unitTestKeyEncrypt(DOMImplementation *impl, XSECCryptoKey * k,
encryptionMethod em) {
+
+ // Create a document that we will embed the encrypted key in
+ DOMDocument *doc = impl->createDocument(
+ 0, // root element namespace
URI.
+ MAKE_UNICODE_STRING("ADoc"), // root
element name
+ NULL);// DOMDocumentType()); // document type
object (DTD).
+
+ DOMElement *rootElem = doc->getDocumentElement();
+
+ // Use key k to wrap a test key, decrypt it and make sure it is still OK
+ XSECProvider prov;
+ XENCCipher * cipher;
+
+ try {
+
+ // Encrypt a dummy key
+
+ cerr << "encrypt ... ";
+
+ static unsigned char toEncryptStr[] = "A test key to use for
da";
+
+ cipher = prov.newCipher(doc);
+ cipher->setXENCNSPrefix(MAKE_UNICODE_STRING("xenc"));
+ cipher->setPrettyPrint(true);
+
+ // Set a key
+
+ cipher->setKEK(k);
+
+ XENCEncryptedKey * encryptedKey;
+ encryptedKey = cipher->encryptKey(toEncryptStr, strlen((char *)
toEncryptStr), em);
+ Janitor<XENCEncryptedKey> j_encryptedKey(encryptedKey);
+
+ rootElem->appendChild(encryptedKey->getDOMNode());
+
+ // Decrypt
+ cerr << "decrypt ... ";
+
+ XMLByte decBuf[64];
+ cipher->decryptKey(encryptedKey, decBuf, 64);
+
+ // Check
+ cerr << "comparing ... ";
+ if (memcmp(decBuf, toEncryptStr, strlen((char *) toEncryptStr))
== 0) {
+ cerr << "OK ... ";
+ }
+ else {
+ cerr << "different = failed!" << endl;
+ exit(2);
+ }
+
+ cerr << "decrypt from DOM ... ";
+ // Decrypt from DOM
+ DOMNode * keyNode = findXENCNode(doc, "EncryptedKey");
+ if (keyNode == NULL) {
+ cerr << "no key - failed!" << endl;
+ exit(2);
+ }
+ memset(decBuf, 0, 64);
+ cipher->decryptKey((DOMElement *) keyNode, decBuf, 64);
+
+ cerr << "comparing ... ";
+ if (memcmp(decBuf, toEncryptStr, strlen((char *) toEncryptStr))
== 0) {
+ cerr << "OK" << endl;
+ }
+ else {
+ cerr << "different = failed!" << endl;
+ exit(2);
+ }
+
+ }
+
+ catch (XSECException &e)
+ {
+ cerr << "failed\n";
+ cerr << "An error occured during signature processing\n
Message: ";
+ char * ce = XMLString::transcode(e.getMsg());
+ cerr << ce << endl;
+ delete ce;
+ exit(1);
+
+ }
+ catch (XSECCryptoException &e)
+ {
+ cerr << "failed\n";
+ cerr << "A cryptographic error occured during signature
processing\n Message: "
+ << e.getMsg() << endl;
+ exit(1);
+ }
+
+ outputDoc(impl, doc);
+ doc->release();
+
+}
+
+
+
+void unitTestEncrypt(DOMImplementation *impl) {
+
+ // Key wraps
+ cerr << "RSA key wrap... ";
+
+#if defined (HAVE_OPENSSL)
+ // Load the key
+ BIO * bioMem = BIO_new(BIO_s_mem());
+ BIO_puts(bioMem, s_tstRSAPrivateKey);
+ EVP_PKEY * pk = PEM_read_bio_PrivateKey(bioMem, NULL, NULL, NULL);
+
+ OpenSSLCryptoKeyRSA * k = new OpenSSLCryptoKeyRSA(pk);
+
+ BIO_free(bioMem);
+ EVP_PKEY_free(pk);
+
+ unitTestKeyEncrypt(impl, k, ENCRYPT_RSA_15);
+
+#endif
+
+ cerr << "AES 128 key wrap... ";
+
+ XSECCryptoSymmetricKey * ks =
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+ ks->setKey((unsigned char *) s_keyStr, 16);
+
+ unitTestKeyEncrypt(impl, ks, ENCRYPT_KW_AES128);
+
+ cerr << "AES 192 key wrap... ";
+
+ ks =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_192);
+ ks->setKey((unsigned char *) s_keyStr, 24);
+
+ unitTestKeyEncrypt(impl, ks, ENCRYPT_KW_AES192);
+
+ cerr << "AES 256 key wrap... ";
+
+ ks =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_256);
+ ks->setKey((unsigned char *) s_keyStr, 32);
+
+ unitTestKeyEncrypt(impl, ks, ENCRYPT_KW_AES256);
+
+}
+//
--------------------------------------------------------------------------------
// Test encrypt/Decrypt
//
--------------------------------------------------------------------------------
@@ -788,8 +964,6 @@
}
- static char keyStr[] = "abcdefghijklmnopqrstuvwx";
-
cipher = prov.newCipher(doc);
cipher->setXENCNSPrefix(MAKE_UNICODE_STRING("xenc"));
cipher->setPrettyPrint(true);
@@ -827,7 +1001,7 @@
XSECCryptoSymmetricKey * kek =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
- kek->setKey((unsigned char *) keyStr, 16);
+ kek->setKey((unsigned char *) s_keyStr, 16);
cipher->setKEK(kek);
XENCEncryptedKey * encryptedKey;
@@ -847,7 +1021,7 @@
XSECCryptoSymmetricKey * k2 =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
- k2->setKey((unsigned char *) keyStr, 16);
+ k2->setKey((unsigned char *) s_keyStr, 16);
cipher2->setKEK(k2);
cerr << "Decrypting ... ";
@@ -941,6 +1115,8 @@
cerr << " Only run signature tests\n\n";
cerr << " --encryption-only/-e\n";
cerr << " Only run encryption tests\n\n";
+ cerr << " --encryption-unit-only/-u\n";
+ cerr << " Only run encryption unit tests\n\n";
}
//
--------------------------------------------------------------------------------
@@ -957,6 +1133,7 @@
// Check parameters
bool doEncryptionTest = true;
+ bool doEncryptionUnitTests = true;
bool doSignatureTest = true;
int paramCount = 1;
@@ -973,10 +1150,17 @@
}
else if (stricmp(argv[paramCount], "--signature-only") == 0 ||
stricmp(argv[paramCount], "-s") == 0) {
doEncryptionTest = false;
+ doEncryptionUnitTests = false;
paramCount++;
}
else if (stricmp(argv[paramCount], "--encryption-only") == 0 ||
stricmp(argv[paramCount], "-e") == 0) {
doSignatureTest = false;
+ doEncryptionUnitTests = false;
+ paramCount++;
+ }
+ else if (stricmp(argv[paramCount], "--encryption-unit-only") ==
0 || stricmp(argv[paramCount], "-u") == 0) {
+ doEncryptionTest = false;
+ doSignatureTest = false;
paramCount++;
}
else {
@@ -1045,6 +1229,16 @@
cerr << endl << endl;
testEncrypt(impl);
+ }
+
+ // Running Encryption Unit test
+ if (doEncryptionUnitTests) {
+ cerr << endl << "====================================";
+ cerr << endl << "Performing Encryption Unit Tests";
+ cerr << endl << "====================================";
+ cerr << endl << endl;
+
+ unitTestEncrypt(impl);
}
cerr << endl << "All tests passed" << endl;