blautenb    2003/10/15 00:54:54

  Modified:    c/src/enc/OpenSSL OpenSSLCryptoSymmetricKey.cpp
                        OpenSSLCryptoSymmetricKey.hpp
               c/src/enc/WinCAPI WinCAPICryptoSymmetricKey.cpp
                        WinCAPICryptoSymmetricKey.hpp
  Log:
  Clean up of OpenSSL code
  
  Revision  Changes    Path
  1.6       +46 -40    
xml-security/c/src/enc/OpenSSL/OpenSSLCryptoSymmetricKey.cpp
  
  Index: OpenSSLCryptoSymmetricKey.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoSymmetricKey.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- OpenSSLCryptoSymmetricKey.cpp     12 Oct 2003 01:29:46 -0000      1.5
  +++ OpenSSLCryptoSymmetricKey.cpp     15 Oct 2003 07:54:53 -0000      1.6
  @@ -175,15 +175,9 @@
                }
   
                EVP_DecryptInit_ex(&m_ctx, EVP_des_ede3_cbc(), NULL, 
m_keyBuf.rawBuffer(), iv);
  -             // Turn off padding
  -             EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
   
  -             // That means we have to handle padding, so we always hold back
  -             // 8 bytes of data.
                m_blockSize = 8;
  -             m_bytesInLastBlock = 0;
  -
  -             return 8;       // 3DEC_CBC uses a 64 bit IV
  +             m_ivSize = 8;
   
                break;
   
  @@ -197,17 +191,10 @@
   
                }
   
  -             EVP_CIPHER_CTX_init(&m_ctx);
                EVP_DecryptInit_ex(&m_ctx, EVP_aes_128_cbc(), NULL, 
m_keyBuf.rawBuffer(), iv);
  -             // Turn off padding
  -             EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
   
  -             // That means we have to handle padding, so we always hold back
  -             // 8 bytes of data.
  -             m_blockSize = 8;
  -             m_bytesInLastBlock = 0;
  -
  -             return 8;       // AES uses a 64 bit IV
  +             m_blockSize = 16;
  +             m_ivSize = 16;
   
                break;
   
  @@ -215,15 +202,10 @@
   
                // An AES key
   
  -             EVP_CIPHER_CTX_init(&m_ctx);
                EVP_DecryptInit_ex(&m_ctx, EVP_aes_128_ecb(), NULL, 
m_keyBuf.rawBuffer(), NULL);
  -             // Turn off padding
  -             EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
   
  -             m_blockSize = 0;
  -             m_bytesInLastBlock = 0;
  -
  -             return 0;       // ECB - no key
  +             m_blockSize = 16;
  +             m_ivSize = 0;
   
                break;
        
  @@ -235,7 +217,15 @@
   
        }
   
  -     return 0;
  +     // Reset some parameters
  +     m_initialised = true;
  +     m_bytesInLastBlock = 0;
  +
  +     // Disable OpenSSL padding - The interop samples have broken PKCS 
padding - AARGHH
  +     EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
  +
  +     // Return number of bytes chewed up by IV
  +     return m_ivSize;
   }
   
   
  @@ -268,6 +258,11 @@
   
        int outl = maxOutLength;
   
  +     if (inLength - offset > maxOutLength) {
  +             throw XSECCryptoException(XSECCryptoException::SymmetricError,
  +                     "OpenSSLSymmetricKey::decrypt - Not enough space in 
output buffer");
  +     }
  +
        if (EVP_DecryptUpdate(&m_ctx, &plainBuf[m_bytesInLastBlock], &outl, 
&inBuf[offset], inLength - m_bytesInLastBlock - offset) == 0) {
   
                throw XSECCryptoException(XSECCryptoException::SymmetricError,
  @@ -332,6 +327,11 @@
   
        }
   
  +     if ((unsigned int) outl > maxOutLength) {
  +             throw XSECCryptoException(XSECCryptoException::SymmetricError,
  +                     "OpenSSLSymmetricKey::decryptFinish - **WARNING** - 
Plaintext output > maxOutLength!"); 
  +     }
  +
        return outl;
   
   }
  @@ -340,10 +340,12 @@
   //           Encrypt
   // 
--------------------------------------------------------------------------------
   
  -bool OpenSSLCryptoSymmetricKey::encryptInit(const unsigned char * iv) {
  +bool OpenSSLCryptoSymmetricKey::encryptInit(bool doPad, const unsigned char 
* iv) {
   
        if (m_initialised == true)
                return true;
  +
  +     m_doPad = doPad;
        
        if (m_keyLen == 0) {
   
  @@ -352,7 +354,9 @@
   
        }
   
  +     // Do some parameter initialisation
        m_initialised = true;
  +     m_bytesInLastBlock = 0;
   
        // Set up the context according to the required cipher type
   
  @@ -371,29 +375,22 @@
   
                if (iv == NULL) {
                        
  -                     bool res = ((RAND_status() == 1) && (RAND_bytes(genIV, 
256) == 1));
  +                     bool res = ((RAND_status() == 1) && (RAND_bytes(genIV, 
8) == 1));
                        if (res == false) {
                                throw 
XSECCryptoException(XSECCryptoException::SymmetricError,
                                        "OpenSSL:SymmetricKey - Error 
generating random IV");
                        }
   
                        usedIV = genIV;
  -                     //return 0;     // Cannot initialise without an IV
   
                }
                else
                        usedIV = iv;
   
                EVP_EncryptInit_ex(&m_ctx, EVP_des_ede3_cbc(), NULL, 
m_keyBuf.rawBuffer(), usedIV);
  -             // Turn off padding
  -             // EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
  -
  -             // That means we have to handle padding, so we always hold back
  -             // 8 bytes of data.
                m_blockSize = 8;
                m_ivSize = 8;
                memcpy(m_lastBlock, usedIV, m_ivSize);
  -             m_bytesInLastBlock = 0;
   
                break;
   
  @@ -403,14 +400,13 @@
   
                if (iv == NULL) {
                        
  -                     bool res = ((RAND_status() == 1) && (RAND_bytes(genIV, 
256) == 1));
  +                     bool res = ((RAND_status() == 1) && (RAND_bytes(genIV, 
16) == 1));
                        if (res == false) {
                                throw 
XSECCryptoException(XSECCryptoException::SymmetricError,
                                        "OpenSSL:SymmetricKey - Error 
generating random IV");
                        }
   
                        usedIV = genIV;
  -                     //return 0;     // Cannot initialise without an IV
   
                }
                else
  @@ -421,7 +417,6 @@
                m_blockSize = 16;
                m_ivSize = 16;
                memcpy(m_lastBlock, usedIV, m_ivSize);
  -             m_bytesInLastBlock = 0;
   
                break;
   
  @@ -430,11 +425,9 @@
                // An AES key
   
                EVP_EncryptInit_ex(&m_ctx, EVP_aes_128_ecb(), NULL, 
m_keyBuf.rawBuffer(), NULL);
  -             EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
   
                m_blockSize = 16;
                m_ivSize = 0;
  -             m_bytesInLastBlock = 0;
   
                break;
        
  @@ -446,6 +439,14 @@
   
        }
   
  +     // Setup padding
  +     if (m_doPad) {
  +             EVP_CIPHER_CTX_set_padding(&m_ctx, 1);
  +     }
  +     else {
  +             EVP_CIPHER_CTX_set_padding(&m_ctx, 0);
  +     }
  +
        return true;
   
   }
  @@ -502,8 +503,13 @@
        if (EVP_EncryptFinal_ex(&m_ctx, cipherBuf, &outl) == 0) {
   
                throw XSECCryptoException(XSECCryptoException::SymmetricError,
  -                     "OpenSSL:SymmetricKey - Error during OpenSSL decrypt 
finalisation"); 
  +                     "OpenSSLSymmetricKey::encryptFinish - Error during 
OpenSSL decrypt finalisation"); 
  +
  +     }
   
  +     if ((unsigned int) outl > maxOutLength) {
  +             throw XSECCryptoException(XSECCryptoException::SymmetricError,
  +                     "OpenSSLSymmetricKey::encryptFinish - **WARNING** - 
Cipheroutput > maxOutLength!"); 
        }
   
        return outl;
  
  
  
  1.5       +3 -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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- OpenSSLCryptoSymmetricKey.hpp     13 Oct 2003 11:07:17 -0000      1.4
  +++ OpenSSLCryptoSymmetricKey.hpp     15 Oct 2003 07:54:53 -0000      1.5
  @@ -244,12 +244,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);
  +     virtual bool encryptInit(bool doPad = true, const unsigned char * iv = 
NULL);
   
        /**
         * \brief Continue an encryption operation using this key.
  
  
  
  1.2       +15 -4     
xml-security/c/src/enc/WinCAPI/WinCAPICryptoSymmetricKey.cpp
  
  Index: WinCAPICryptoSymmetricKey.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-security/c/src/enc/WinCAPI/WinCAPICryptoSymmetricKey.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- WinCAPICryptoSymmetricKey.cpp     13 Oct 2003 11:07:42 -0000      1.1
  +++ WinCAPICryptoSymmetricKey.cpp     15 Oct 2003 07:54:54 -0000      1.2
  @@ -131,7 +131,10 @@
   
        if (m_k != 0) {
   
  -#if (_WIN32_WINNT >= 0x0400)
  +#if (_WIN32_WINNT > 0x0400)
  +
  +             // Only supported in Win2K and above
  +
                if (CryptDuplicateKey(m_k,
                                                          0,
                                                          0,
  @@ -142,8 +145,9 @@
   
                }
   #else
  -             throw XSECCryptoException(XSECCryptoException::SymmetricError,
  -                     "Unable to clone keys in Windows NT 4.0 and below");
  +
  +             ret->setKey(m_keyBuf.rawBuffer(), m_keyLen);
  +
   #endif
        }
        else
  @@ -583,6 +587,13 @@
        // Find out how long the output will be
        DWORD outl = 0;
        if (!CryptEncrypt(k, 0, TRUE, 0, 0, &outl, keyLen)) {
  +             DWORD error = GetLastError();
  +             if (error == NTE_BAD_KEY) {
  +                     // We throw either way, but this is *likely* to be an 
unsupported OS issue
  +                     throw 
XSECCryptoException(XSECCryptoException::SymmetricError,
  +                             "WinCAPI:SymmetricKey::createWindowsKey - Error 
encrypting a key - is this >= Windows 2000?");
  +             }
  +
                throw XSECCryptoException(XSECCryptoException::SymmetricError,
                        "WinCAPI:SymmetricKey - Unable to determine space 
required to encrypt key");
        }
  
  
  
  1.2       +3 -3      
xml-security/c/src/enc/WinCAPI/WinCAPICryptoSymmetricKey.hpp
  
  Index: WinCAPICryptoSymmetricKey.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-security/c/src/enc/WinCAPI/WinCAPICryptoSymmetricKey.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- WinCAPICryptoSymmetricKey.hpp     13 Oct 2003 11:07:42 -0000      1.1
  +++ WinCAPICryptoSymmetricKey.hpp     15 Oct 2003 07:54:54 -0000      1.2
  @@ -85,7 +85,7 @@
   
   #include <wincrypt.h>
   
  -#define MAX_BLOCK_SIZE               32
  +#define WINCAPI_MAX_BLOCK_SIZE               32
   
   /**
    * \ingroup wincapicrypto
  @@ -356,7 +356,7 @@
        bool                                                    m_initialised;
        bool                                                    m_doPad;
   
  -     unsigned char                                   
m_lastBlock[MAX_BLOCK_SIZE];
  +     unsigned char                                   
m_lastBlock[WINCAPI_MAX_BLOCK_SIZE];
        unsigned int                                    m_bytesInLastBlock;
        unsigned int                                    m_blockSize;
        unsigned int                                    m_ivSize;
  
  
  

Reply via email to