blautenb 2003/10/28 01:33:18
Modified: c/src/enc XSECCryptoSymmetricKey.hpp
c/src/enc/OpenSSL OpenSSLCryptoSymmetricKey.cpp
OpenSSLCryptoSymmetricKey.hpp
c/src/enc/WinCAPI WinCAPICryptoSymmetricKey.cpp
WinCAPICryptoSymmetricKey.hpp
c/src/tools/cipher MerlinFiveInteropResolver.cpp cipher.cpp
c/src/tools/xtest xtest.cpp
c/src/xenc/impl XENCAlgorithmHandlerDefault.cpp
Log:
Decouple symmetric mode from key type
Revision Changes Path
1.7 +23 -10 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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- XSECCryptoSymmetricKey.hpp 19 Oct 2003 12:50:35 -0000 1.6
+++ XSECCryptoSymmetricKey.hpp 28 Oct 2003 09:33:17 -0000 1.7
@@ -107,13 +107,18 @@
enum SymmetricKeyType {
KEY_NONE,
- KEY_3DES_CBC_192, /** 192 bit (3-Key)
3DES */
- KEY_AES_CBC_128, /** 128 bit AES in CBC
mode */
- KEY_AES_CBC_192, /** 192 bit AES in CBC
mode */
- KEY_AES_CBC_256, /** 256 bit AES in CBC
mode */
- KEY_AES_ECB_128, /** 128 bit AES in ECB
mode */
- KEY_AES_ECB_192, /** 192 bit AES in ECB
mode */
- KEY_AES_ECB_256 /** 256 bit AES in ECB
mode */
+ KEY_3DES_192, /** 192 bit (3-Key) 3DES */
+ KEY_AES_128, /** 128 bit AES */
+ KEY_AES_192, /** 192 bit AES */
+ KEY_AES_256 /** 256 bit AES */
+
+ };
+
+ enum SymmetricKeyMode {
+
+ MODE_NONE, /** An error
condition */
+ MODE_ECB, /** Electronic
Code Book */
+ MODE_CBC /** Cipher
Block Chaining */
};
@@ -201,12 +206,16 @@
* cipher text stream will in fact be the IV.
*
* @param doPad By default, we perform padding for last block
+ * @param mode mode selection (Currently ECB or CBC mode only).
+ * Default is CBC
* @param iv Initialisation Vector to be used. NULL if one is
* not required, or if IV will be set from data stream
* @returns true if the initialisation succeeded.
*/
- virtual bool decryptInit(bool doPad = true, const unsigned char * iv =
NULL) = 0;
+ virtual bool decryptInit(bool doPad = true,
+ SymmetricKeyMode mode
= MODE_CBC,
+ const unsigned char *
iv = NULL) = 0;
/**
* \brief Continue an decrypt operation using this key.
@@ -260,12 +269,16 @@
* implementations are required to generate one.
*
* @param doPad By default, we perform padding for last block
+ * @param mode What mode to handle blocks (Currently CBC or ECB)
+ * Default is CBC.
* @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(bool doPad = true, const unsigned char * iv =
NULL) = 0;
+ virtual bool encryptInit(bool doPad = true,
+ SymmetricKeyMode mode
= MODE_CBC,
+ const unsigned char *
iv = NULL) = 0;
/**
* \brief Continue an encryption operation using this key.
1.9 +144 -138
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.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- OpenSSLCryptoSymmetricKey.cpp 25 Oct 2003 10:31:49 -0000 1.8
+++ OpenSSLCryptoSymmetricKey.cpp 28 Oct 2003 09:33:17 -0000 1.9
@@ -86,6 +86,7 @@
OpenSSLCryptoSymmetricKey::OpenSSLCryptoSymmetricKey(XSECCryptoSymmetricKey::SymmetricKeyType
type) :
m_keyType(type),
+m_keyMode(MODE_CBC),
m_keyBuf(""),
m_keyLen(0),
m_initialised(false) {
@@ -123,6 +124,7 @@
OpenSSLCryptoSymmetricKey * ret;
XSECnew(ret, OpenSSLCryptoSymmetricKey(m_keyType));
+ ret->m_keyMode = m_keyMode;
ret->m_keyLen = m_keyLen;
ret->m_keyBuf = m_keyBuf;
@@ -164,104 +166,101 @@
switch (m_keyType) {
- case (XSECCryptoSymmetricKey::KEY_3DES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_3DES_192) :
// A 3DES key
- if (iv == NULL) {
+ if (m_keyMode == MODE_CBC) {
- return 0; // Cannot initialise without an IV
+ if (iv == NULL) {
+ return 0; // Cannot initialise without an
IV
+
+ }
+
+ EVP_DecryptInit_ex(&m_ctx, EVP_des_ede3_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
+ m_ivSize = 8;
+ }
+ else {
+ EVP_DecryptInit_ex(&m_ctx, EVP_des_ede3_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ m_ivSize = 0;
}
- EVP_DecryptInit_ex(&m_ctx, EVP_des_ede3_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
m_blockSize = 8;
- m_ivSize = 8;
-
break;
- case (XSECCryptoSymmetricKey::KEY_AES_CBC_128) :
+ case (XSECCryptoSymmetricKey::KEY_AES_128) :
// An AES key
- if (iv == NULL) {
+ if (m_keyMode == MODE_CBC) {
+
+ if (iv == NULL) {
- return 0; // Cannot initialise without an IV
+ return 0; // Cannot initialise without an
IV
+
+ }
+
+ EVP_DecryptInit_ex(&m_ctx, EVP_aes_128_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
}
+ else {
- EVP_DecryptInit_ex(&m_ctx, EVP_aes_128_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
+ EVP_DecryptInit_ex(&m_ctx, EVP_aes_128_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
- m_blockSize = 16;
- m_ivSize = 16;
+ }
+ m_blockSize = 16;
break;
- case (XSECCryptoSymmetricKey::KEY_AES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_AES_192) :
// An AES key
- if (iv == NULL) {
+ if (m_keyMode == MODE_CBC) {
- return 0; // Cannot initialise without an IV
+ if (iv == NULL) {
- }
-
- EVP_DecryptInit_ex(&m_ctx, EVP_aes_192_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
-
- m_blockSize = 16;
- m_ivSize = 16;
-
- break;
+ return 0; // Cannot initialise without an
IV
- case (XSECCryptoSymmetricKey::KEY_AES_CBC_256) :
+ }
- // An AES key
+ EVP_DecryptInit_ex(&m_ctx, EVP_aes_192_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
- if (iv == NULL) {
+ }
+ else {
- return 0; // Cannot initialise without an IV
+ EVP_DecryptInit_ex(&m_ctx, EVP_aes_192_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
}
- EVP_DecryptInit_ex(&m_ctx, EVP_aes_256_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
-
m_blockSize = 16;
- m_ivSize = 16;
-
break;
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_128) :
+ case (XSECCryptoSymmetricKey::KEY_AES_256) :
// An AES key
- EVP_DecryptInit_ex(&m_ctx, EVP_aes_128_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ if (m_keyMode == MODE_CBC) {
- m_blockSize = 16;
- m_ivSize = 0;
+ if (iv == NULL) {
- break;
-
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_192) :
+ return 0; // Cannot initialise without an
IV
- // An AES key
+ }
- EVP_DecryptInit_ex(&m_ctx, EVP_aes_192_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ EVP_DecryptInit_ex(&m_ctx, EVP_aes_256_cbc(), NULL,
m_keyBuf.rawBuffer(), iv);
- m_blockSize = 16;
- m_ivSize = 0;
+ }
+ else {
- break;
-
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_256) :
+ EVP_DecryptInit_ex(&m_ctx, EVP_aes_256_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
- // An AES key
+ }
- EVP_DecryptInit_ex(&m_ctx, EVP_aes_256_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
m_blockSize = 16;
- m_ivSize = 0;
break;
@@ -273,6 +272,9 @@
}
+ // Setup ivSize
+ m_ivSize = (m_keyMode == MODE_CBC ? m_blockSize : 0);
+
// Reset some parameters
m_initialised = true;
m_bytesInLastBlock = 0;
@@ -285,9 +287,12 @@
}
-bool OpenSSLCryptoSymmetricKey::decryptInit(bool doPad, const unsigned char
* iv) {
+bool OpenSSLCryptoSymmetricKey::decryptInit(bool doPad,
+
SymmetricKeyMode mode,
+
const unsigned char * iv) {
m_doPad = doPad;
+ m_keyMode = mode;
m_initialised = false;
decryptCtxInit(iv);
return true;
@@ -398,12 +403,15 @@
// Encrypt
//
--------------------------------------------------------------------------------
-bool OpenSSLCryptoSymmetricKey::encryptInit(bool doPad, const unsigned char
* iv) {
+bool OpenSSLCryptoSymmetricKey::encryptInit(bool doPad,
+
SymmetricKeyMode mode,
+
const unsigned char * iv) {
if (m_initialised == true)
return true;
m_doPad = doPad;
+ m_keyMode = mode;
if (m_keyLen == 0) {
@@ -427,149 +435,147 @@
switch (m_keyType) {
- case (XSECCryptoSymmetricKey::KEY_3DES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_3DES_192) :
// A 3DES key
- if (iv == NULL) {
-
- 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;
-
- }
- else
- usedIV = iv;
-
- EVP_EncryptInit_ex(&m_ctx, EVP_des_ede3_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
- m_blockSize = 8;
- m_ivSize = 8;
- memcpy(m_lastBlock, usedIV, m_ivSize);
-
- break;
+ if (m_keyMode == MODE_CBC) {
- case (XSECCryptoSymmetricKey::KEY_AES_CBC_128) :
+ if (iv == NULL) {
+
+ bool res = ((RAND_status() == 1) &&
(RAND_bytes(genIV, 8) == 1));
+ if (res == false) {
+ throw
XSECCryptoException(XSECCryptoException::SymmetricError,
+ "OpenSSL:SymmetricKey - Error
generating random IV");
+ }
- // An AES key
+ usedIV = genIV;
- if (iv == NULL) {
-
- bool res = ((RAND_status() == 1) && (RAND_bytes(genIV,
16) == 1));
- if (res == false) {
- throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "OpenSSL:SymmetricKey - Error
generating random IV");
}
+ else
+ usedIV = iv;
- usedIV = genIV;
+ EVP_EncryptInit_ex(&m_ctx, EVP_des_ede3_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
}
- else
- usedIV = iv;
+ else {
- EVP_EncryptInit_ex(&m_ctx, EVP_aes_128_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
+ EVP_EncryptInit_ex(&m_ctx, EVP_des_ede3_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ }
- m_blockSize = 16;
- m_ivSize = 16;
- memcpy(m_lastBlock, usedIV, m_ivSize);
+ m_blockSize = 8;
break;
- case (XSECCryptoSymmetricKey::KEY_AES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_AES_128) :
// An AES key
- if (iv == NULL) {
-
- bool res = ((RAND_status() == 1) && (RAND_bytes(genIV,
16) == 1));
- if (res == false) {
- throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "OpenSSL:SymmetricKey - Error
generating random IV");
- }
+ if (m_keyMode == MODE_CBC) {
+
+ if (iv == NULL) {
+
+ 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;
+ usedIV = genIV;
+ }
+ else
+ usedIV = iv;
+
+ EVP_EncryptInit_ex(&m_ctx, EVP_aes_128_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
}
- else
- usedIV = iv;
+ else {
- EVP_EncryptInit_ex(&m_ctx, EVP_aes_192_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
+ EVP_EncryptInit_ex(&m_ctx, EVP_aes_128_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
- m_blockSize = 16;
- m_ivSize = 16;
- memcpy(m_lastBlock, usedIV, m_ivSize);
+ }
+ m_blockSize = 16;
break;
- case (XSECCryptoSymmetricKey::KEY_AES_CBC_256) :
+ case (XSECCryptoSymmetricKey::KEY_AES_192) :
// An AES key
- if (iv == NULL) {
-
- bool res = ((RAND_status() == 1) && (RAND_bytes(genIV,
16) == 1));
- if (res == false) {
- throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "OpenSSL:SymmetricKey - Error
generating random IV");
+ if (m_keyMode == MODE_CBC) {
+
+ if (iv == NULL) {
+
+ 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;
+
}
+ else
+ usedIV = iv;
- usedIV = genIV;
+ EVP_EncryptInit_ex(&m_ctx, EVP_aes_192_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
}
- else
- usedIV = iv;
- EVP_EncryptInit_ex(&m_ctx, EVP_aes_256_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
+ else {
- m_blockSize = 16;
- m_ivSize = 16;
- memcpy(m_lastBlock, usedIV, m_ivSize);
+ EVP_EncryptInit_ex(&m_ctx, EVP_aes_192_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ }
+ m_blockSize = 16;
break;
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_128) :
+ case (XSECCryptoSymmetricKey::KEY_AES_256) :
// An AES key
- EVP_EncryptInit_ex(&m_ctx, EVP_aes_128_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
-
- m_blockSize = 16;
- m_ivSize = 0;
-
- break;
-
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_192) :
+ if (m_keyMode == MODE_CBC) {
+ if (iv == NULL) {
+
+ bool res = ((RAND_status() == 1) &&
(RAND_bytes(genIV, 16) == 1));
+ if (res == false) {
+ throw
XSECCryptoException(XSECCryptoException::SymmetricError,
+ "OpenSSL:SymmetricKey - Error
generating random IV");
+ }
- // An AES key
+ usedIV = genIV;
- EVP_EncryptInit_ex(&m_ctx, EVP_aes_192_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ }
+ else
+ usedIV = iv;
- m_blockSize = 16;
- m_ivSize = 0;
+ EVP_EncryptInit_ex(&m_ctx, EVP_aes_256_cbc(), NULL,
m_keyBuf.rawBuffer(), usedIV);
- break;
-
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_256) :
+ }
+ else {
- // An AES key
+ EVP_EncryptInit_ex(&m_ctx, EVP_aes_256_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
- EVP_EncryptInit_ex(&m_ctx, EVP_aes_256_ecb(), NULL,
m_keyBuf.rawBuffer(), NULL);
+ }
m_blockSize = 16;
- m_ivSize = 0;
-
break;
-
+
default :
- // Cannot do this without an IV
throw XSECCryptoException(XSECCryptoException::SymmetricError,
"OpenSSL:SymmetricKey - Unknown key type");
}
+
+ // Clear up any read padding
+
+ if (m_keyMode == MODE_CBC) {
+ m_ivSize = m_blockSize;
+ memcpy(m_lastBlock, usedIV, m_ivSize);
+ }
+ else
+ m_ivSize = 0;
// Setup padding
if (m_doPad) {
1.7 +14 -5
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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- OpenSSLCryptoSymmetricKey.hpp 19 Oct 2003 10:57:54 -0000 1.6
+++ OpenSSLCryptoSymmetricKey.hpp 28 Oct 2003 09:33:17 -0000 1.7
@@ -175,15 +175,20 @@
*
* Setup the key to get ready for a decryption session.
* Callers can pass in an IV. If one is not provided,
- * then it is assumed that the algorithm will not require one.
+ * but the algorithm requires one (e.g. 3DES_CBC), then
+ * implementations should assume that the start of the
+ * cipher text stream will in fact be the IV.
*
* @param doPad By default, we perform padding for last block
+ * @param mode mode selection (Currently ECB or CBC mode only)
* @param iv Initialisation Vector to be used. NULL if one is
- * not required.
+ * not required, or if IV will be set from data stream
* @returns true if the initialisation succeeded.
*/
- virtual bool decryptInit(bool doPad = true, const unsigned char * iv =
NULL);
+ virtual bool decryptInit(bool doPad = true,
+ SymmetricKeyMode mode
= MODE_CBC,
+ const unsigned char *
iv = NULL);
/**
* \brief Continue an decrypt operation using this key.
@@ -245,12 +250,15 @@
* implementations are required to generate one.
*
* @param doPad By default, we perform padding for last block
+ * @param mode What mode to handle blocks (Currently CBC or ECB)
* @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(bool doPad = true, const unsigned char * iv =
NULL);
+ virtual bool encryptInit(bool doPad = true,
+ SymmetricKeyMode mode
= MODE_CBC,
+ const unsigned char *
iv = NULL);
/**
* \brief Continue an encryption operation using this key.
@@ -316,6 +324,7 @@
// Private variables
SymmetricKeyType m_keyType;
+ SymmetricKeyMode m_keyMode;
EVP_CIPHER_CTX m_ctx;
// OpenSSL Cipher Context structure
safeBuffer m_keyBuf;
// Holder of the key
unsigned int m_keyLen;
1.3 +58 -39
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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- WinCAPICryptoSymmetricKey.cpp 15 Oct 2003 07:54:54 -0000 1.2
+++ WinCAPICryptoSymmetricKey.cpp 28 Oct 2003 09:33:18 -0000 1.3
@@ -88,6 +88,7 @@
HCRYPTPROV prov,
XSECCryptoSymmetricKey::SymmetricKeyType type) :
m_keyType(type),
+m_keyMode(MODE_ECB),
m_keyBuf(""),
m_initialised(false),
m_doPad(true),
@@ -192,45 +193,55 @@
}
+ int ret = 0;
+
// Set up the context according to the required cipher type
DWORD cryptMode;
switch (m_keyType) {
- case (XSECCryptoSymmetricKey::KEY_3DES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_3DES_192) :
// A 3DES CBC key
- if (iv == NULL) {
+ if (m_keyMode == MODE_CBC) {
+
+ if (iv == NULL) {
- return 0; // Cannot initialise without an IV
+ return 0; // Cannot initialise without an
IV
- }
+ }
- if (!CryptSetKeyParam(m_k, KP_IV, (unsigned char *) iv, 0)) {
+ if (!CryptSetKeyParam(m_k, KP_IV, (unsigned char *) iv,
0)) {
- throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "WinCAPI:SymmetricKey - Error setting IV");
+ throw
XSECCryptoException(XSECCryptoException::SymmetricError,
+ "WinCAPI:SymmetricKey - Error setting IV");
+ }
+
+ ret = 8;
}
m_blockSize = 8;
m_bytesInLastBlock = 0;
m_initialised = true;
- return 8; // 3DEC_CBC uses a 64 bit IV
-
break;
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_128) :
+ case (XSECCryptoSymmetricKey::KEY_AES_128) :
- // An 128bit AES key in ECB mode
+ // An 128bit AES key
- cryptMode = CRYPT_MODE_ECB;
+ if (m_keyMode == MODE_ECB)
+ cryptMode = CRYPT_MODE_ECB;
+ else {
+ cryptMode = CRYPT_MODE_CBC;
+ ret = 16;
+ }
if (!CryptSetKeyParam(m_k, KP_MODE, (BYTE *) (&cryptMode), 0)) {
throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "WinCAPI:SymmetricKey - Error setting IV");
+ "WinCAPI:SymmetricKey - Error setting cipher mode");
}
@@ -238,8 +249,6 @@
m_bytesInLastBlock = 0;
m_initialised = true;
- return 8; // 3DEC_CBC uses a 64 bit IV
-
break;
default :
@@ -250,14 +259,17 @@
}
- return 0;
+ return ret;
}
-bool WinCAPICryptoSymmetricKey::decryptInit(bool doPad, const unsigned char
* iv) {
+bool WinCAPICryptoSymmetricKey::decryptInit(bool doPad,
+
SymmetricKeyMode mode,
+
const unsigned char * iv) {
m_initialised = false;
m_doPad = doPad;
+ m_keyMode = mode;
decryptCtxInit(iv);
return true;
@@ -376,30 +388,34 @@
switch (m_keyType) {
- case (XSECCryptoSymmetricKey::KEY_3DES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_3DES_192) :
// A 3DES key
- if (iv == NULL) {
-
- BOOL res = CryptGenRandom(m_p, 256, genIV);
- if (res == FALSE) {
- throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "WinCAPI:SymmetricKey - Error
generating random IV");
- }
+ if (m_keyMode == MODE_CBC) {
- usedIV = genIV;
- //return 0; // Cannot initialise without an IV
+ if (iv == NULL) {
+
+ BOOL res = CryptGenRandom(m_p, 256, genIV);
+ if (res == FALSE) {
+ throw
XSECCryptoException(XSECCryptoException::SymmetricError,
+ "WinCAPI:SymmetricKey - Error
generating random IV");
+ }
- }
- else
- usedIV = iv;
+ usedIV = genIV;
+ //return 0; // Cannot initialise without an
IV
- // Set the IV parameter
- if (!CryptSetKeyParam(m_k, KP_IV, (unsigned char *) usedIV, 0))
{
+ }
+ else
+ usedIV = iv;
- throw
XSECCryptoException(XSECCryptoException::SymmetricError,
- "WinCAPI:SymmetricKey - Error setting IV");
+ // Set the IV parameter
+ if (!CryptSetKeyParam(m_k, KP_IV, (unsigned char *)
usedIV, 0)) {
+
+ throw
XSECCryptoException(XSECCryptoException::SymmetricError,
+ "WinCAPI:SymmetricKey - Error setting IV");
+
+ }
}
@@ -410,7 +426,7 @@
break;
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_128) :
+ case (XSECCryptoSymmetricKey::KEY_AES_128) :
// An AES key
@@ -429,9 +445,12 @@
}
}
-bool WinCAPICryptoSymmetricKey::encryptInit(bool doPad, const unsigned char
* iv) {
+bool WinCAPICryptoSymmetricKey::encryptInit(bool doPad,
+
SymmetricKeyMode mode,
+
const unsigned char * iv) {
m_doPad = doPad;
+ m_keyMode = mode;
m_initialised = false;
encryptCtxInit(iv);
return true;
@@ -629,11 +648,11 @@
switch (type) {
- case (XSECCryptoSymmetricKey::KEY_3DES_CBC_192) :
+ case (XSECCryptoSymmetricKey::KEY_3DES_192) :
blobHeader->aiKeyAlg = CALG_3DES;
expectedLength = 24;
break;
- case (XSECCryptoSymmetricKey::KEY_AES_ECB_128) :
+ case (XSECCryptoSymmetricKey::KEY_AES_128) :
blobHeader->aiKeyAlg = CALG_AES_128;
expectedLength = 16;
break;
1.3 +14 -5
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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- WinCAPICryptoSymmetricKey.hpp 15 Oct 2003 07:54:54 -0000 1.2
+++ WinCAPICryptoSymmetricKey.hpp 28 Oct 2003 09:33:18 -0000 1.3
@@ -182,15 +182,20 @@
*
* Setup the key to get ready for a decryption session.
* Callers can pass in an IV. If one is not provided,
- * then it is assumed that the algorithm will not require one.
+ * but the algorithm requires one (e.g. 3DES_CBC), then
+ * implementations should assume that the start of the
+ * cipher text stream will in fact be the IV.
*
* @param doPad By default, we perform padding for last block
+ * @param mode mode selection (Currently ECB or CBC mode only)
* @param iv Initialisation Vector to be used. NULL if one is
- * not required.
+ * not required, or if IV will be set from data stream
* @returns true if the initialisation succeeded.
*/
- virtual bool decryptInit(bool doPad = true, const unsigned char * iv =
NULL);
+ virtual bool decryptInit(bool doPad = true,
+ SymmetricKeyMode mode
= MODE_CBC,
+ const unsigned char *
iv = NULL);
/**
* \brief Continue an decrypt operation using this key.
@@ -252,12 +257,15 @@
* implementations are required to generate one.
*
* @param doPad By default, we perform padding for last block
+ * @param mode What mode to handle blocks (Currently CBC or ECB)
* @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(bool doPad = true, const unsigned char * iv =
NULL);
+ virtual bool encryptInit(bool doPad = true,
+ SymmetricKeyMode mode
= MODE_CBC,
+ const unsigned char *
iv = NULL);
/**
* \brief Continue an encryption operation using this key.
@@ -351,6 +359,7 @@
// Private variables
SymmetricKeyType m_keyType;
+ SymmetricKeyMode m_keyMode;
// ECB or CBC
safeBuffer m_keyBuf;
// Holder of the key
unsigned int m_keyLen;
bool m_initialised;
1.6 +5 -5
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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MerlinFiveInteropResolver.cpp 20 Oct 2003 11:05:37 -0000 1.5
+++ MerlinFiveInteropResolver.cpp 28 Oct 2003 09:33:18 -0000 1.6
@@ -252,7 +252,7 @@
if (strEquals(s_bobName, name)) {
XSECCryptoSymmetricKey * k =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_192);
try {
k->setKey((unsigned char *) s_bobKey,
strlen(s_bobKey));
} catch (...) {
@@ -263,7 +263,7 @@
}
if (strEquals(s_jobName, name)) {
XSECCryptoSymmetricKey * k =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_128);
try {
k->setKey((unsigned char *) s_jobKey,
strlen(s_jobKey));
} catch(...) {
@@ -274,7 +274,7 @@
}
if (strEquals(s_jebName, name)) {
XSECCryptoSymmetricKey * k =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_192);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_192);
try {
k->setKey((unsigned char *) s_jebKey,
strlen(s_jebKey));
} catch(...) {
@@ -285,7 +285,7 @@
}
if (strEquals(s_jedName, name)) {
XSECCryptoSymmetricKey * k =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_256);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_256);
try {
k->setKey((unsigned char *) s_jedKey,
strlen(s_jedKey));
} catch(...) {
1.9 +6 -9 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.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- cipher.cpp 25 Oct 2003 10:51:22 -0000 1.8
+++ cipher.cpp 28 Oct 2003 09:33:18 -0000 1.9
@@ -336,39 +336,36 @@
switch(argv[paramCount][4]) {
case '\0' :
keyLen = 24;
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_3DES_CBC_192;
+ loadKeyAs =
XSECCryptoSymmetricKey::KEY_3DES_192;
keyAlg = ENCRYPT_3DES_CBC;
break;
case '2' :
keyLen = 16;
+ loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_128;
if (isKEK) {
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_ECB_128;
kekAlg = ENCRYPT_KW_AES128;
}
else {
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_CBC_128;
keyAlg = ENCRYPT_AES128_CBC;
}
break;
case '9' :
keyLen = 24;
+ loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_192;
if (isKEK) {
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_ECB_192;
kekAlg = ENCRYPT_KW_AES192;
}
else {
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_CBC_192;
keyAlg = ENCRYPT_AES192_CBC;
}
break;
case '5' :
keyLen = 32;
+ loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_256;
if (isKEK) {
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_ECB_256;
kekAlg = ENCRYPT_KW_AES256;
}
else {
- loadKeyAs =
XSECCryptoSymmetricKey::KEY_AES_CBC_256;
keyAlg = ENCRYPT_AES256_CBC;
}
break;
@@ -682,7 +679,7 @@
if (kek != NULL && key == NULL) {
XSECPlatformUtils::g_cryptoProvider->getRandom(keyBuf, 24);
XSECCryptoSymmetricKey * k =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_192);
k->setKey(keyBuf, 24);
cipher->setKey(k);
keyAlg = ENCRYPT_3DES_CBC;
1.27 +7 -7 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.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- xtest.cpp 26 Oct 2003 11:33:13 -0000 1.26
+++ xtest.cpp 28 Oct 2003 09:33:18 -0000 1.27
@@ -913,21 +913,21 @@
cerr << "AES 128 key wrap... ";
XSECCryptoSymmetricKey * ks =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_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 =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_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 =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_256);
ks->setKey((unsigned char *) s_keyStr, 32);
unitTestKeyEncrypt(impl, ks, ENCRYPT_KW_AES256);
@@ -980,7 +980,7 @@
// Set a key
XSECCryptoSymmetricKey * k =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_192);
k->setKey((unsigned char *) randomBuffer, 24);
cipher->setKey(k);
@@ -1015,7 +1015,7 @@
cerr << "Encrypting symmetric key ... " << endl;
XSECCryptoSymmetricKey * kek =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_128);
kek->setKey((unsigned char *) s_keyStr, 16);
cipher->setKEK(kek);
@@ -1035,7 +1035,7 @@
XENCCipher * cipher2 = prov.newCipher(doc);
XSECCryptoSymmetricKey * k2 =
-
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_ECB_128);
+
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_128);
k2->setKey((unsigned char *) s_keyStr, 16);
cipher2->setKEK(k2);
1.6 +17 -20
xml-security/c/src/xenc/impl/XENCAlgorithmHandlerDefault.cpp
Index: XENCAlgorithmHandlerDefault.cpp
===================================================================
RCS file:
/home/cvs/xml-security/c/src/xenc/impl/XENCAlgorithmHandlerDefault.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XENCAlgorithmHandlerDefault.cpp 19 Oct 2003 12:50:35 -0000 1.5
+++ XENCAlgorithmHandlerDefault.cpp 28 Oct 2003 09:33:18 -0000 1.6
@@ -151,21 +151,18 @@
switch (skt) {
- case XSECCryptoSymmetricKey::KEY_3DES_CBC_192 :
+ case XSECCryptoSymmetricKey::KEY_3DES_192 :
keyOK = strEquals(uri,
DSIGConstants::s_unicodeStrURI3DES_CBC);
break;
- case XSECCryptoSymmetricKey::KEY_AES_ECB_128 :
- case XSECCryptoSymmetricKey::KEY_AES_CBC_128 :
+ case XSECCryptoSymmetricKey::KEY_AES_128 :
isSymmetricKeyWrap = strEquals(uri,
DSIGConstants::s_unicodeStrURIKW_AES128);
keyOK = isSymmetricKeyWrap || strEquals(uri,
DSIGConstants::s_unicodeStrURIAES128_CBC);
break;
- case XSECCryptoSymmetricKey::KEY_AES_ECB_192 :
- case XSECCryptoSymmetricKey::KEY_AES_CBC_192 :
+ case XSECCryptoSymmetricKey::KEY_AES_192 :
isSymmetricKeyWrap = strEquals(uri,
DSIGConstants::s_unicodeStrURIKW_AES192);
keyOK = isSymmetricKeyWrap || strEquals(uri,
DSIGConstants::s_unicodeStrURIAES192_CBC);
break;
- case XSECCryptoSymmetricKey::KEY_AES_ECB_256 :
- case XSECCryptoSymmetricKey::KEY_AES_CBC_256 :
+ case XSECCryptoSymmetricKey::KEY_AES_256 :
isSymmetricKeyWrap = strEquals(uri,
DSIGConstants::s_unicodeStrURIKW_AES256);
keyOK = isSymmetricKeyWrap || strEquals(uri,
DSIGConstants::s_unicodeStrURIAES256_CBC);
break;
@@ -236,7 +233,7 @@
aesBuf[7] ^= ((n * j) + i);
// do decrypt
- sk->decryptInit(false); // No padding
+ sk->decryptInit(false,
XSECCryptoSymmetricKey::MODE_ECB); // No padding
int sz = sk->decrypt(aesBuf, aesOutBuf, 16, 16);
sz += sk->decryptFinish(&aesOutBuf[sz], 16 - sz);
@@ -312,7 +309,7 @@
memcpy(&aesBuf[8], &buf[8 * i], 8);
// do encrypt
- sk->encryptInit(false);
+ sk->encryptInit(false,
XSECCryptoSymmetricKey::MODE_ECB);
int sz = sk->encrypt(aesBuf, aesOutBuf, 16, 32);
sz += sk->encryptFinish(&aesOutBuf[sz], 32 - sz);
@@ -557,9 +554,9 @@
if (isKeyWrap == true) {
- if (skt == XSECCryptoSymmetricKey::KEY_AES_ECB_128 ||
- skt == XSECCryptoSymmetricKey::KEY_AES_ECB_192 ||
- skt == XSECCryptoSymmetricKey::KEY_AES_ECB_256) {
+ if (skt == XSECCryptoSymmetricKey::KEY_AES_128 ||
+ skt == XSECCryptoSymmetricKey::KEY_AES_192 ||
+ skt == XSECCryptoSymmetricKey::KEY_AES_256) {
return unwrapKeyAES(cipherText, key, result);
@@ -716,9 +713,9 @@
if (isKeyWrap == true) {
- if (skt == XSECCryptoSymmetricKey::KEY_AES_ECB_128 ||
- skt == XSECCryptoSymmetricKey::KEY_AES_ECB_192 ||
- skt == XSECCryptoSymmetricKey::KEY_AES_ECB_256) {
+ if (skt == XSECCryptoSymmetricKey::KEY_AES_128 ||
+ skt == XSECCryptoSymmetricKey::KEY_AES_192 ||
+ skt == XSECCryptoSymmetricKey::KEY_AES_256) {
return wrapKeyAES(plainText, key, result);
@@ -763,16 +760,16 @@
XSECCryptoSymmetricKey * sk = NULL;
if (strEquals(uri, DSIGConstants::s_unicodeStrURI3DES_CBC)) {
- sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_CBC_192);
+ sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_192);
}
else if (strEquals(uri, DSIGConstants::s_unicodeStrURIAES128_CBC)) {
- sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_CBC_128);
+ sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_128);
}
else if (strEquals(uri, DSIGConstants::s_unicodeStrURIAES192_CBC)) {
- sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_CBC_192);
+ sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_192);
}
else if (strEquals(uri, DSIGConstants::s_unicodeStrURIAES256_CBC)) {
- sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_CBC_256);
+ sk =
XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_AES_256);
}
if (sk != NULL) {