blautenb 2003/10/13 04:08:02
Modified: c/src/tools/cipher MerlinFiveInteropResolver.cpp
MerlinFiveInteropResolver.hpp cipher.cpp
c/src/tools/xtest xtest.cpp
Log:
Implementation of Symmetric Encryption in WinCAPI
Revision Changes Path
1.3 +47 -10
xml-security/c/src/tools/cipher/MerlinFiveInteropResolver.cpp
Index: MerlinFiveInteropResolver.cpp
===================================================================
RCS file:
/home/cvs/xml-security/c/src/tools/cipher/MerlinFiveInteropResolver.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- MerlinFiveInteropResolver.cpp 3 Oct 2003 09:52:02 -0000 1.2
+++ MerlinFiveInteropResolver.cpp 13 Oct 2003 11:08:02 -0000 1.3
@@ -76,7 +76,7 @@
#include <xsec/dsig/DSIGKeyInfoName.hpp>
#include <xsec/utils/XSECDOMUtils.hpp>
#include <xsec/enc/OpenSSL/OpenSSLCryptoSymmetricKey.hpp>
-
+#include <xsec/enc/WinCAPI/WinCAPICryptoSymmetricKey.hpp>
#include <xercesc/util/Janitor.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
@@ -84,7 +84,9 @@
#include <iostream>
-#if defined (HAVE_OPENSSL)
+#if !defined (HAVE_OPENSSL) && !defined (HAVE_WINCAPI)
+# error Require OpenSSL or Windows Crypto API for the Merlin Resolver
+#endif
//
--------------------------------------------------------------------------------
// Strings and keys
@@ -133,7 +135,33 @@
delete[]mp_baseURI;
}
+//
--------------------------------------------------------------------------------
+// Utility functions
+//
--------------------------------------------------------------------------------
+
+XSECCryptoSymmetricKey *
MerlinFiveInteropResolver::makeSymmetricKey(XSECCryptoSymmetricKey::SymmetricKeyType
type) {
+
+#if defined (HAVE_OPENSSL)
+
+ OpenSSLCryptoSymmetricKey * k;
+ k = new OpenSSLCryptoSymmetricKey(type);
+
+ return k;
+
+#else
+
+ WinCAPICryptoSymmetricKey * k;
+ k = new WinCAPICryptoSymmetricKey(0, type);
+
+ return k;
+
+#endif
+
+}
+//
--------------------------------------------------------------------------------
+// Resolver
+//
--------------------------------------------------------------------------------
XSECCryptoKey * MerlinFiveInteropResolver::resolveKey(DSIGKeyInfoList * lst)
{
@@ -152,15 +180,25 @@
// Check if this is a key we know
if (strEquals(s_bobName, name)) {
- OpenSSLCryptoSymmetricKey * k;
- k = new
OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
- k->setKey((unsigned char *) s_bobKey,
strlen(s_bobKey));
+ XSECCryptoSymmetricKey * k =
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+ try {
+ k->setKey((unsigned char *) s_bobKey,
strlen(s_bobKey));
+ } catch (...) {
+ delete k;
+ throw;
+ }
return k;
}
if (strEquals(s_jobName, name)) {
- OpenSSLCryptoSymmetricKey * k;
- k = new
OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
- k->setKey((unsigned char *) s_jobKey,
strlen(s_bobKey));
+ XSECCryptoSymmetricKey * k =
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+ try {
+ k->setKey((unsigned char *) s_jobKey,
strlen(s_jobKey));
+ } catch(...) {
+ delete k;
+ throw;
+ }
return k;
}
@@ -182,4 +220,3 @@
-#endif /* HAVE_OPENSSL */
1.2 +4 -5
xml-security/c/src/tools/cipher/MerlinFiveInteropResolver.hpp
Index: MerlinFiveInteropResolver.hpp
===================================================================
RCS file:
/home/cvs/xml-security/c/src/tools/cipher/MerlinFiveInteropResolver.hpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MerlinFiveInteropResolver.hpp 15 Sep 2003 11:55:55 -0000 1.1
+++ MerlinFiveInteropResolver.hpp 13 Oct 2003 11:08:02 -0000 1.2
@@ -73,6 +73,7 @@
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/enc/XSECKeyInfoResolver.hpp>
+#include <xsec/enc/XSECCryptoSymmetricKey.hpp>
#if defined (_WIN32)
# include <io.h>
@@ -80,9 +81,6 @@
# include <glob.h>
#endif
-#if defined (HAVE_OPENSSL)
-# include <openssl/x509.h>
-
class MerlinFiveInteropResolver : public XSECKeyInfoResolver {
public :
@@ -99,6 +97,8 @@
private:
+ XSECCryptoSymmetricKey *
makeSymmetricKey(XSECCryptoSymmetricKey::SymmetricKeyType);
+
XMLCh * mp_baseURI;
#if defined (_WIN32)
@@ -111,4 +111,3 @@
};
-#endif /* HAVE_OPENSSL */
1.4 +23 -10 xml-security/c/src/tools/cipher/cipher.cpp
Index: cipher.cpp
===================================================================
RCS file: /home/cvs/xml-security/c/src/tools/cipher/cipher.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- cipher.cpp 15 Sep 2003 11:55:55 -0000 1.3
+++ cipher.cpp 13 Oct 2003 11:08:02 -0000 1.4
@@ -137,6 +137,10 @@
#endif
+#if !defined (HAVE_OPENSSL) && !defined(HAVE_WINCAPI)
+# error No available cryptoAPI
+#endif
+
#if defined (HAVE_OPENSSL)
// OpenSSL
@@ -148,6 +152,7 @@
#if defined (HAVE_WINCAPI)
# include <xsec/enc/WinCAPI/WinCAPICryptoProvider.hpp>
+# include <xsec/enc/WinCAPI/WinCAPICryptoSymmetricKey.hpp>
# include <xsec/enc/WinCAPI/WinCAPICryptoKeyHMAC.hpp>
#endif
@@ -179,10 +184,8 @@
cerr << " Decrypt the first encrypted element found\n";
cerr << " --key/-k [key string]\n";
cerr << " Use the key provided in [key string] to
encrypt/decrypt\n";
-#if defined (HAVE_OPENSSL)
cerr << " --interop/-i\n";
cerr << " Use the interop resolver for Baltimore interop
examples\n";
-#endif
cerr << "\n Exits with codes :\n";
cerr << " 0 = Decrypt/Encrypt OK\n";
@@ -201,7 +204,11 @@
#if defined(_WIN32) && defined (HAVE_WINCAPI)
HCRYPTPROV win32DSSCSP = 0;
// Crypto Providers
- HCRYPTPROV win32RSACSP = 0;
+ HCRYPTPROV win32RSACSP = 0;
+
+ CryptAcquireContext(&win32DSSCSP, NULL, NULL, PROV_DSS,
CRYPT_VERIFYCONTEXT);
+ CryptAcquireContext(&win32RSACSP, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT);
+
#endif
if (argc < 2) {
@@ -219,13 +226,11 @@
paramCount++;
doDecryptElement = true;
}
-#if defined (HAVE_OPENSSL)
else if (stricmp(argv[paramCount], "--interop") == 0 ||
stricmp(argv[paramCount], "-i") == 0) {
// Use the interop key resolver
useInteropResolver = true;
paramCount++;
}
-#endif
else if (stricmp(argv[paramCount], "--key") == 0 ||
stricmp(argv[paramCount], "-k") == 0) {
// Have set a key string
@@ -308,21 +313,29 @@
try {
+#if defined (HAVE_OPENSSL)
OpenSSLCryptoSymmetricKey * k;
if (keyStr != NULL) {
k = new
OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
k->setKey((unsigned char *) keyStr, strlen(keyStr));
cipher->setKey(k);
}
+#else
+ WinCAPICryptoSymmetricKey * k;
+ if (keyStr != NULL) {
+ k = new WinCAPICryptoSymmetricKey(win32RSACSP,
XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+ k->setKey((unsigned char *) keyStr, strlen(keyStr));
+ cipher->setKey(k);
+ }
+#endif
-#if defined (HAVE_OPENSSL)
if (useInteropResolver == true) {
MerlinFiveInteropResolver ires(NULL);
cipher->setKeyInfoResolver(&ires);
}
-#endif
+
cipher->decryptElement(static_cast<DOMElement *>(n));
// Output the result
@@ -357,14 +370,14 @@
catch (XSECException &e) {
char * msg = XMLString::transcode(e.getMsg());
- cerr << "An error occured during signature verification\n
Message: "
+ cerr << "An error occured during encryption/decryption
operation\n Message: "
<< msg << endl;
delete [] msg;
errorsOccured = true;
return 2;
}
catch (XSECCryptoException &e) {
- cerr << "An error occured during signature verification\n
Message: "
+ cerr << "An error occured during encryption/decryption
operation\n Message: "
<< e.getMsg() << endl;
errorsOccured = true;
1.24 +12 -18 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.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- xtest.cpp 12 Oct 2003 06:23:40 -0000 1.23
+++ xtest.cpp 13 Oct 2003 11:08:02 -0000 1.24
@@ -125,9 +125,10 @@
#include <xsec/xenc/XENCCipher.hpp>
#include <xsec/xenc/XENCEncryptedData.hpp>
+#include <xsec/enc/XSECCryptoSymmetricKey.hpp>
+
#if defined (HAVE_OPENSSL)
# include <xsec/enc/OpenSSL/OpenSSLCryptoKeyHMAC.hpp>
-# include <xsec/enc/OpenSSL/OpenSSLCryptoSymmetricKey.hpp>
# include <openssl/rand.h>
#endif
#if defined (HAVE_WINCAPI)
@@ -780,19 +781,12 @@
// Generate a key
unsigned char randomBuffer[256];
-#if defined (HAVE_OPENSSL)
- if (RAND_status() != 1) {
-
- cerr << "Warning - OpenSSL random not properly
initialised" << endl;
-
- }
+ if
(XSECPlatformUtils::g_cryptoProvider->getRandom(randomBuffer, 256) != 256) {
- if (RAND_bytes(randomBuffer, 128) != 1) {
-
- cerr << "Error - OpenSSL random did not generate data"
<< endl;
+ cerr << "Unable to obtain enough random bytes from
Crypto Provider" << endl;
exit(1);
+
}
-#endif
static char keyStr[] = "abcdefghijklmnopqrstuvwx";
@@ -802,8 +796,8 @@
// Set a key
- OpenSSLCryptoSymmetricKey * k;
- k = new
OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+ XSECCryptoSymmetricKey * k =
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
k->setKey((unsigned char *) randomBuffer, 24);
cipher->setKey(k);
@@ -831,8 +825,8 @@
cerr << "Encrypting symmetric key ... " << endl;
- OpenSSLCryptoSymmetricKey * kek;
- kek = new
OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+ XSECCryptoSymmetricKey * kek =
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
kek->setKey((unsigned char *) keyStr, 16);
cipher->setKEK(kek);
@@ -851,8 +845,8 @@
XENCCipher * cipher2 = prov.newCipher(doc);
- OpenSSLCryptoSymmetricKey * k2;
- k2 = new
OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+ XSECCryptoSymmetricKey * k2 =
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
k2->setKey((unsigned char *) keyStr, 16);
cipher2->setKEK(k2);