blautenb    2003/10/13 04:07:17

  Modified:    c/src/enc XSECCryptoSymmetricKey.hpp
               c/src/enc/OpenSSL OpenSSLCryptoSymmetricKey.hpp
               c/src/enc/WinCAPI WinCAPICryptoProvider.cpp
                        WinCAPICryptoProvider.hpp
  Log:
  Implementation of Symmetric Encryption in WinCAPI
  
  Revision  Changes    Path
  1.4       +3 -2      xml-security/c/src/enc/XSECCryptoSymmetricKey.hpp
  
  Index: XSECCryptoSymmetricKey.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/XSECCryptoSymmetricKey.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XSECCryptoSymmetricKey.hpp        3 Oct 2003 09:54:46 -0000       1.3
  +++ XSECCryptoSymmetricKey.hpp        13 Oct 2003 11:07:17 -0000      1.4
  @@ -254,12 +254,13 @@
         * but the algorithm requires one (e.g. 3DES_CBC), then
         * implementations are required to generate one.
         *
  +      * @param doPad By default, we perform padding for last block
         * @param iv Initialisation Vector to be used.  NULL if one is
         * not required, or if IV is to be generated
         * @returns true if the initialisation succeeded.
         */
   
  -     virtual bool encryptInit(const unsigned char * iv = NULL) = 0;
  +     virtual bool encryptInit(bool doPad = true, const unsigned char * iv = 
NULL) = 0;
   
        /**
         * \brief Continue an encryption operation using this key.
  
  
  
  1.4       +4 -2      
xml-security/c/src/enc/OpenSSL/OpenSSLCryptoSymmetricKey.hpp
  
  Index: OpenSSLCryptoSymmetricKey.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoSymmetricKey.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- OpenSSLCryptoSymmetricKey.hpp     3 Oct 2003 09:54:46 -0000       1.3
  +++ OpenSSLCryptoSymmetricKey.hpp     13 Oct 2003 11:07:17 -0000      1.4
  @@ -77,6 +77,8 @@
   #include <xsec/framework/XSECDefs.hpp>
   #include <xsec/enc/XSECCryptoSymmetricKey.hpp>
   
  +#if defined (HAVE_OPENSSL)
  +
   // OpenSSL Includes
   
   #include <openssl/evp.h>
  @@ -325,5 +327,5 @@
        bool                                                    m_doPad;        
        // Do we pad last block?
   };
   
  -
  +#endif /* HAVE_OPENSSL */
   #endif /* OPENSSLCRYPTOSYMMETRICKEY_INCLUDE */
  
  
  
  1.9       +77 -8     xml-security/c/src/enc/WinCAPI/WinCAPICryptoProvider.cpp
  
  Index: WinCAPICryptoProvider.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/WinCAPI/WinCAPICryptoProvider.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- WinCAPICryptoProvider.cpp 12 Oct 2003 06:23:17 -0000      1.8
  +++ WinCAPICryptoProvider.cpp 13 Oct 2003 11:07:17 -0000      1.9
  @@ -77,6 +77,7 @@
   #include <xsec/enc/WinCAPI/WinCAPICryptoKeyRSA.hpp>
   #include <xsec/enc/WinCAPI/WinCAPICryptoHash.hpp>
   #include <xsec/enc/WinCAPI/WinCAPICryptoHashHMAC.hpp>
  +#include <xsec/enc/WinCAPI/WinCAPICryptoSymmetricKey.hpp>
   #include <xsec/enc/XSCrypt/XSCryptCryptoBase64.hpp>
   #include <xsec/enc/XSECCryptoException.hpp>
   
  @@ -84,6 +85,8 @@
   
   XSEC_USING_XERCES(ArrayJanitor);
   
  +static char s_xsecKeyStoreName[] = "ApacheXML-SecurityKeyStore";
  +
   WinCAPICryptoProvider::WinCAPICryptoProvider(
                                                LPCSTR provDSSName, 
                                                LPCSTR provRSAName) {
  @@ -101,11 +104,70 @@
        if (!CryptAcquireContext(&m_provRSA,
                NULL,
                provRSAName,
  -             PROV_RSA_FULL,
  +             PROV_RSA_AES,
                CRYPT_VERIFYCONTEXT)) 
        {
  -             throw XSECException(XSECException::InternalError,
  -                     "WinCAPICryptoProvider() - Error obtaining default 
PROV_RSA_FULL");
  +             // Check of we maybe don't understand AES
  +
  +             DWORD error = GetLastError();
  +             if (error == NTE_PROV_TYPE_NOT_DEF) {
  +
  +                     // This system does not have AES!
  +                     m_haveAES = false;
  +                     m_provRSAType = PROV_RSA_FULL;
  +
  +                     if (!CryptAcquireContext(&m_provRSA,
  +                             NULL,
  +                             provRSAName,
  +                             PROV_RSA_FULL,
  +                             CRYPT_VERIFYCONTEXT)) 
  +                     {
  +
  +                             throw 
XSECException(XSECException::InternalError,
  +                                     "WinCAPICryptoProvider() - Error 
obtaining default PROV_RSA_FULL");
  +                     }
  +
  +             }
  +             
  +             else {
  +
  +                     throw XSECException(XSECException::InternalError,
  +                             "WinCAPICryptoProvider() - Error obtaining 
default PROV_RSA_AES");
  +             }
  +     }
  +
  +     else {
  +             m_haveAES = true;
  +             m_provRSAType = PROV_RSA_AES;
  +     }
  +
  +     // Now obtain our internal (library) key store
  +
  +     if (!CryptAcquireContext(&m_provApacheKeyStore,
  +             s_xsecKeyStoreName,
  +             provRSAName,
  +             m_provRSAType,
  +             CRYPT_MACHINE_KEYSET)) 
  +     {
  +
  +             // Try to create
  +             if (!CryptAcquireContext(&m_provApacheKeyStore,
  +                     s_xsecKeyStoreName,
  +                     provRSAName,
  +                     PROV_RSA_FULL,
  +                     CRYPT_MACHINE_KEYSET | CRYPT_NEWKEYSET)) {
  +
  +                     throw XSECException(XSECException::InternalError,
  +                             "WinCAPICryptoProvider() - Error obtaining 
generating internal key store for PROV_RSA_FULL");
  +             }
  +             else {
  +                     HCRYPTKEY k;
  +                     if (!CryptGenKey(m_provApacheKeyStore, AT_KEYEXCHANGE, 
CRYPT_EXPORTABLE, &k)) {
  +                             throw 
XSECException(XSECException::InternalError,
  +                                     "WinCAPICryptoProvider() - Error 
generating internal key set for PROV_RSA_FULL");
  +                     }
  +                     CryptDestroyKey(k);
  +             }
        }
   
        // Copy parameters for later use
  @@ -127,6 +189,7 @@
   
        CryptReleaseContext(m_provRSA, 0);
        CryptReleaseContext(m_provDSS, 0);
  +     CryptReleaseContext(m_provApacheKeyStore, 0);
   
   }
   
  @@ -220,16 +283,22 @@
   
        // Only temporary
   
  -     throw XSECException(XSECException::InternalError,
  -             "WinCAPICryptoProvider() - SymmetricKeys not yet supported");
  +     WinCAPICryptoSymmetricKey * ret;
  +     
  +     XSECnew(ret, WinCAPICryptoSymmetricKey(m_provApacheKeyStore, alg));
  +
  +     return ret;
   
   }
   
   unsigned int WinCAPICryptoProvider::getRandom(unsigned char * buffer, 
unsigned int numOctets) {
   
  -     throw XSECException(XSECException::InternalError,
  -             "WinCAPICryptoProvider() - Random generation not yet 
supported");
  +     if (!CryptGenRandom(m_provApacheKeyStore, numOctets, buffer)) {
  +             throw XSECException(XSECException::InternalError,
  +                     "WinCAPICryptoProvider() - Error generating Random 
data");
  +     }
   
  +     return numOctets;
   }
   
   
  
  
  
  1.9       +22 -1     xml-security/c/src/enc/WinCAPI/WinCAPICryptoProvider.hpp
  
  Index: WinCAPICryptoProvider.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/WinCAPI/WinCAPICryptoProvider.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- WinCAPICryptoProvider.hpp 12 Oct 2003 01:29:46 -0000      1.8
  +++ WinCAPICryptoProvider.hpp 13 Oct 2003 11:07:17 -0000      1.9
  @@ -77,6 +77,18 @@
   #define _WIN32_WINNT 0x0400
   #include <wincrypt.h>
   
  +// For older versions of wincrypt.h
  +
  +#if !defined (PROV_RSA_AES)
  +#    define PROV_RSA_AES                             24
  +#    define ALG_SID_AES_128                  14
  +#    define ALG_SID_AES_192                  15
  +#    define ALG_SID_AES_256          16
  +#    define ALG_SID_AES              17
  +#    define CALG_AES_128                             
(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_128)
  +#    define CALG_AES_192                             
(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_192)
  +#    define CALG_AES_256                             
(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_256)
  +#endif
   
   #define WINCAPI_BLOBHEADERLEN        0x08
   #define WINCAPI_DSSPUBKEYLEN 0x08
  @@ -269,6 +281,12 @@
        HCRYPTPROV getProviderRSA(void) {return m_provRSA;}
   
        /**
  +      * \brief Return the internal key store provider
  +      */
  +
  +     HCRYPTPROV getApacheKeyStore(void) {return m_provApacheKeyStore;}
  +
  +     /**
         * \brief Translate B64 I2OS integer to a WinCAPI int.
         *
         * Decodes a Base64 (ds:CryptoBinary) integer and reverses the order to 
  @@ -329,8 +347,11 @@
   
        HCRYPTPROV              m_provDSS;
        HCRYPTPROV              m_provRSA;
  +     HCRYPTPROV              m_provApacheKeyStore;
        LPCSTR                  m_provDSSName;
        LPCSTR                  m_provRSAName;
  +     bool                    m_haveAES;
  +     DWORD                   m_provRSAType;
   
   };
   
  
  
  

Reply via email to