You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by bl...@apache.org on 2003/11/04 06:22:17 UTC

cvs commit: xml-security/c/src/xenc/impl XENCAlgorithmHandlerDefault.cpp XENCCipherImpl.cpp XENCEncryptedTypeImpl.cpp XENCEncryptionMethodImpl.cpp XENCEncryptionMethodImpl.hpp

blautenb    2003/11/03 21:22:17

  Modified:    c/src/dsig DSIGConstants.cpp DSIGConstants.hpp
               c/src/enc XSECCryptoBase64.hpp XSECCryptoException.hpp
                        XSECCryptoKeyRSA.hpp
               c/src/enc/OpenSSL OpenSSLCryptoBase64.cpp
                        OpenSSLCryptoBase64.hpp OpenSSLCryptoKeyRSA.cpp
                        OpenSSLCryptoKeyRSA.hpp OpenSSLCryptoProvider.cpp
               c/src/enc/WinCAPI WinCAPICryptoKeyRSA.cpp
                        WinCAPICryptoKeyRSA.hpp
               c/src/enc/XSCrypt XSCryptCryptoBase64.cpp
                        XSCryptCryptoBase64.hpp
               c/src/tools/cipher MerlinFiveInteropResolver.cpp cipher.cpp
               c/src/tools/xtest xtest.cpp
               c/src/xenc XENCEncryptionMethod.hpp
               c/src/xenc/impl XENCAlgorithmHandlerDefault.cpp
                        XENCCipherImpl.cpp XENCEncryptedTypeImpl.cpp
                        XENCEncryptionMethodImpl.cpp
                        XENCEncryptionMethodImpl.hpp
  Log:
  Support for OAEP and OAEP with params
  
  Revision  Changes    Path
  1.17      +5 -2      xml-security/c/src/dsig/DSIGConstants.cpp
  
  Index: DSIGConstants.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGConstants.cpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- DSIGConstants.cpp	2 Nov 2003 23:11:30 -0000	1.16
  +++ DSIGConstants.cpp	4 Nov 2003 05:22:16 -0000	1.17
  @@ -100,6 +100,7 @@
   const XMLCh * DSIGConstants::s_unicodeStrURIHMAC_SHA1;
   const XMLCh * DSIGConstants::s_unicodeStrURIXMLNS;
   const XMLCh * DSIGConstants::s_unicodeStrURIMANIFEST;
  +
   const XMLCh * DSIGConstants::s_unicodeStrURI3DES_CBC;
   const XMLCh * DSIGConstants::s_unicodeStrURIAES128_CBC;
   const XMLCh * DSIGConstants::s_unicodeStrURIAES192_CBC;
  @@ -109,6 +110,7 @@
   const XMLCh * DSIGConstants::s_unicodeStrURIKW_AES256;
   const XMLCh * DSIGConstants::s_unicodeStrURIKW_3DES;
   const XMLCh * DSIGConstants::s_unicodeStrURIRSA_1_5;
  +const XMLCh * DSIGConstants::s_unicodeStrURIRSA_OAEP_MGFP1;
   
   const XMLCh * DSIGConstants::s_unicodeStrURIXENC_ELEMENT;
   const XMLCh * DSIGConstants::s_unicodeStrURIXENC_CONTENT;
  @@ -160,6 +162,7 @@
   	s_unicodeStrURIKW_AES256 = XMLString::transcode(URI_ID_KW_AES256);
   	s_unicodeStrURIKW_3DES = XMLString::transcode(URI_ID_KW_3DES);
   	s_unicodeStrURIRSA_1_5 = XMLString::transcode(URI_ID_RSA_1_5);
  +	s_unicodeStrURIRSA_OAEP_MGFP1 = XMLString::transcode(URI_ID_RSA_OAEP_MGFP1);
   
   	s_unicodeStrURIXENC_ELEMENT = XMLString::transcode(URI_ID_XENC_ELEMENT);
   	s_unicodeStrURIXENC_CONTENT = XMLString::transcode(URI_ID_XENC_CONTENT);
  @@ -209,7 +212,7 @@
   	delete[] (XMLCh *) s_unicodeStrURIKW_AES256;
   	delete[] (XMLCh *) s_unicodeStrURIKW_3DES;
   	delete[] (XMLCh *) s_unicodeStrURIRSA_1_5;
  -
  +	delete[] (XMLCh *) s_unicodeStrURIRSA_OAEP_MGFP1;
   	delete[] (XMLCh *) s_unicodeStrURIXENC_ELEMENT;
   	delete[] (XMLCh *) s_unicodeStrURIXENC_CONTENT;
   
  
  
  
  1.19      +11 -3     xml-security/c/src/dsig/DSIGConstants.hpp
  
  Index: DSIGConstants.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/dsig/DSIGConstants.hpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- DSIGConstants.hpp	2 Nov 2003 23:11:30 -0000	1.18
  +++ DSIGConstants.hpp	4 Nov 2003 05:22:16 -0000	1.19
  @@ -104,7 +104,8 @@
   #define URI_ID_KW_3DES		"http://www.w3.org/2001/04/xmlenc#kw-tripledes"
   
   // Key Transport algorithms
  -#define URI_ID_RSA_1_5		"http://www.w3.org/2001/04/xmlenc#rsa-1_5" 
  +#define URI_ID_RSA_1_5			"http://www.w3.org/2001/04/xmlenc#rsa-1_5"
  +#define URI_ID_RSA_OAEP_MGFP1	"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"
   
   // Transforms
   
  @@ -205,7 +206,8 @@
   	ENCRYPT_KW_AES192		= 6,				// KeyWrap - AES192
   	ENCRYPT_KW_AES256		= 7,				// KeyWrap - AES256
   	ENCRYPT_KW_3DES			= 8,
  -	ENCRYPT_RSA_15			= 9					// RSA with PKCS 1.5 padding
  +	ENCRYPT_RSA_15			= 9,				// RSA with PKCS 1.5 padding
  +	ENCRYPT_RSA_OAEP_MGFP1	= 10				// RSA with OAEP
   
   };
   
  @@ -369,6 +371,11 @@
   		uri = URI_ID_RSA_1_5;
   		break;
   		
  +	case (ENCRYPT_RSA_OAEP_MGFP1) :
  +
  +		uri = URI_ID_RSA_OAEP_MGFP1;
  +		break;
  +	
   	default:
   
   		return false;
  @@ -429,6 +436,7 @@
   	static const XMLCh * s_unicodeStrURIKW_AES256;
   	static const XMLCh * s_unicodeStrURIKW_3DES;
   	static const XMLCh * s_unicodeStrURIRSA_1_5;
  +	static const XMLCh * s_unicodeStrURIRSA_OAEP_MGFP1;
   
   	static const XMLCh * s_unicodeStrURIXENC_ELEMENT;
   	static const XMLCh * s_unicodeStrURIXENC_CONTENT;
  
  
  
  1.6       +3 -3      xml-security/c/src/enc/XSECCryptoBase64.hpp
  
  Index: XSECCryptoBase64.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/XSECCryptoBase64.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XSECCryptoBase64.hpp	5 Jul 2003 10:30:32 -0000	1.5
  +++ XSECCryptoBase64.hpp	4 Nov 2003 05:22:16 -0000	1.6
  @@ -139,7 +139,7 @@
   	 * @returns The number of bytes placed in the outData buffer.
   	 */
   
  -	virtual unsigned int decode(unsigned char * inData, 
  +	virtual unsigned int decode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength) = 0;
  @@ -196,7 +196,7 @@
   	 */
   
   
  -	virtual unsigned int encode(unsigned char * inData, 
  +	virtual unsigned int encode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength) = 0;
  
  
  
  1.8       +3 -2      xml-security/c/src/enc/XSECCryptoException.hpp
  
  Index: XSECCryptoException.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/XSECCryptoException.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XSECCryptoException.hpp	31 Aug 2003 12:48:50 -0000	1.7
  +++ XSECCryptoException.hpp	4 Nov 2003 05:22:16 -0000	1.8
  @@ -129,7 +129,8 @@
   		DSAError					= 6,		// DSA Error
   		RSAError					= 7,		// RSA Error
   		SymmetricError				= 8,
  -		UnknownError				= 9			// Must be last!
  +		UnsupportedError			= 9,		// Called function is not supported
  +		UnknownError				= 10		// Must be last!
   
   	};
   
  
  
  
  1.7       +40 -13    xml-security/c/src/enc/XSECCryptoKeyRSA.hpp
  
  Index: XSECCryptoKeyRSA.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/XSECCryptoKeyRSA.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSECCryptoKeyRSA.hpp	19 Oct 2003 10:57:54 -0000	1.6
  +++ XSECCryptoKeyRSA.hpp	4 Nov 2003 05:22:16 -0000	1.7
  @@ -99,7 +99,7 @@
   
   		PAD_NONE		= 0,		/** No padding (Illegal for all enc ops) */
   		PAD_PKCS_1_5	= 1,		/** PKCS 1.5 padding */
  -		PAD_OAEP		= 2			/** OAEP */
  +		PAD_OAEP_MGFP1	= 2			/** OAEP using MGFP1 as mask function */
   
   	};
   
  @@ -138,6 +138,38 @@
   	//@{
   
   	/**
  +	 * \brief Set the OAEPparams string
  +	 *
  +	 * By default, the library expects crypto implementations to perform
  +	 * OAEP padding with no params.  This call allows the library (or user)
  +	 * to set a params value prior to an encrypt/decrypt operation.
  +	 *
  +	 * @param params buffer containing the params data.  Pass in NULL to clear any
  +	 * old paramters.
  +	 * @param paramsLen number of bytes in buffer to use.  Pass in 0 to clear any
  +	 * old parameters.
  +	 */
  +
  +	virtual void setOAEPparams(unsigned char * params, unsigned int paramsLen) = 0;
  +
  +	/**
  +	 * \brief Get OAEPparams Length
  +	 *
  +	 * @returns the number of bytes of the OAEPparams buffer (assuming it has been set)
  +	 */
  +
  +	virtual unsigned int getOAEPparamsLen(void) = 0;
  +
  +	/**
  +	 * \brief Get the OAEPparams
  +	 *
  +	 * @returns a pointer to the (crypto object owned) buffer holding the OAEPparams
  +	 * or NULL if no params are held
  +	 */
  +
  +	virtual const unsigned char * getOAEPparams(void) = 0;
  +
  +	/**
   	 * \brief Verify a SHA1 PKCS1 encoded signature
   	 *
   	 * The library will call this function to validate an RSA signature
  @@ -190,9 +222,8 @@
   	 * @param inLength bytes of cipher text to decrypt
   	 * @param maxOutLength size of outputBuffer
   	 * @param padding Type of padding (PKCS 1.5 or OAEP)
  -	 * @param hm Hash Method for OAEP encryption
  -	 * @param OAEPParam OAEP Parameter String (NULL if none)
  -	 * @param OEAPParamLen Length of OAEPParam string
  +	 * @param hm Hash Method for OAEP encryption (OAEPParams should be
  +	 * set using setOAEPparams()
   	 */
   
   	virtual unsigned int privateDecrypt(const unsigned char * inBuf,
  @@ -200,9 +231,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen) = 0;
  +								 hashMethod hm) = 0;
   
   	/**
   	 * \brief Encrypt using a public key
  @@ -216,8 +245,8 @@
   	 * @param maxOutLength size of outputBuffer
   	 * @param padding Type of padding (PKCS 1.5 or OAEP)
   	 * @param hm Hash Method for OAEP encryption
  -	 * @param OAEPParam OAEP Parameter String (NULL if none)
  -	 * @param OEAPParamLen Length of OAEPParam string
  +	 * @param hm Hash Method for OAEP encryption (OAEPParams should be
  +	 * set using setOAEPparams()
   	 */
   
   	virtual unsigned int publicEncrypt(const unsigned char * inBuf,
  @@ -225,9 +254,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen) = 0;
  +								 hashMethod hm) = 0;
   
   	/**
   	 * \brief Obtain the length of an RSA key
  
  
  
  1.5       +4 -4      xml-security/c/src/enc/OpenSSL/OpenSSLCryptoBase64.cpp
  
  Index: OpenSSLCryptoBase64.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoBase64.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- OpenSSLCryptoBase64.cpp	5 Jul 2003 10:30:33 -0000	1.4
  +++ OpenSSLCryptoBase64.cpp	4 Nov 2003 05:22:16 -0000	1.5
  @@ -88,7 +88,7 @@
   
   }
   
  -unsigned int OpenSSLCryptoBase64::decode(unsigned char * inData, 
  +unsigned int OpenSSLCryptoBase64::decode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength) {
  @@ -106,7 +106,7 @@
   	rc = EVP_DecodeUpdate(&m_dctx, 
   						  outData, 
   						  &outLen, 
  -						  inData, 
  +						  (unsigned char *) inData, 
   						  inLength);
   
   	if (rc < 0) {
  @@ -149,7 +149,7 @@
   }
   
   
  -unsigned int OpenSSLCryptoBase64::encode(unsigned char * inData, 
  +unsigned int OpenSSLCryptoBase64::encode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength) {
  @@ -166,7 +166,7 @@
   	EVP_EncodeUpdate(&m_ectx, 
   					  outData, 
   					  &outLen, 
  -					  inData, 
  +					  (unsigned char *) inData, 
   					  inLength);
   
   	if (outLen > (int) outLength) {
  
  
  
  1.6       +3 -3      xml-security/c/src/enc/OpenSSL/OpenSSLCryptoBase64.hpp
  
  Index: OpenSSLCryptoBase64.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoBase64.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- OpenSSLCryptoBase64.hpp	5 Jul 2003 10:30:33 -0000	1.5
  +++ OpenSSLCryptoBase64.hpp	4 Nov 2003 05:22:16 -0000	1.6
  @@ -140,7 +140,7 @@
   	 * @returns The number of bytes placed in the outData buffer.
   	 */
   
  -	virtual unsigned int decode(unsigned char * inData, 
  +	virtual unsigned int decode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength);
  @@ -190,7 +190,7 @@
   	 * @returns The number of bytes placed in the outData buffer.
   	 */
   
  -	virtual unsigned int encode(unsigned char * inData, 
  +	virtual unsigned int encode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength);
  
  
  
  1.10      +139 -9    xml-security/c/src/enc/OpenSSL/OpenSSLCryptoKeyRSA.cpp
  
  Index: OpenSSLCryptoKeyRSA.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoKeyRSA.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- OpenSSLCryptoKeyRSA.cpp	3 Nov 2003 06:55:45 -0000	1.9
  +++ OpenSSLCryptoKeyRSA.cpp	4 Nov 2003 05:22:16 -0000	1.10
  @@ -92,7 +92,9 @@
   
   int sha1OIDLen = 15;
   
  -OpenSSLCryptoKeyRSA::OpenSSLCryptoKeyRSA() {
  +OpenSSLCryptoKeyRSA::OpenSSLCryptoKeyRSA() :
  +mp_oaepParams(NULL),
  +m_oaepParamsLen(0) {
   
   	// Create a new key to be loaded as we go
   
  @@ -107,8 +109,39 @@
   	if (mp_rsaKey)
   		RSA_free(mp_rsaKey);
   
  +	if (mp_oaepParams != NULL)
  +		delete[] mp_oaepParams;
  +
   };
   
  +void OpenSSLCryptoKeyRSA::setOAEPparams(unsigned char * params, unsigned int paramsLen) {
  +
  +	if (mp_oaepParams != NULL) {
  +		delete[] mp_oaepParams;
  +	}
  +
  +	m_oaepParamsLen = paramsLen;
  +	if (params != NULL) {
  +		XSECnew(mp_oaepParams, unsigned char[paramsLen]);
  +		memcpy(mp_oaepParams, params, paramsLen);
  +	}
  +	else
  +		mp_oaepParams = NULL;
  +
  +}
  +
  +unsigned int OpenSSLCryptoKeyRSA::getOAEPparamsLen(void) {
  +
  +	return m_oaepParamsLen;
  +
  +}
  +
  +const unsigned char * OpenSSLCryptoKeyRSA::getOAEPparams(void) {
  +
  +	return mp_oaepParams;
  +
  +}
  +
   // Generic key functions
   
   XSECCryptoKey::KeyType OpenSSLCryptoKeyRSA::getKeyType() {
  @@ -154,6 +187,9 @@
   
   	// Create a new key to be loaded as we go
   
  +	mp_oaepParams = NULL;
  +	m_oaepParamsLen = 0;
  +
   	mp_rsaKey = RSA_new();
   	
   	if (k == NULL || k->type != EVP_PKEY_RSA)
  @@ -370,9 +406,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen) {
  +								 hashMethod hm) {
   
   	// Perform a decrypt
   	if (mp_rsaKey == NULL) {
  @@ -402,6 +436,49 @@
   
   		break;
   
  +	case XSECCryptoKeyRSA::PAD_OAEP_MGFP1 :
  +		{
  +
  +			unsigned char * tBuf;
  +			int num = RSA_size(mp_rsaKey);
  +			XSECnew(tBuf, unsigned char[inLength]);
  +			ArrayJanitor<unsigned char> j_tBuf(tBuf);
  +
  +			decryptSize = RSA_private_decrypt(inLength,
  +								inBuf,
  +								tBuf,
  +								mp_rsaKey,
  +								RSA_NO_PADDING);
  +			if (decryptSize < 0) {
  +
  +				throw XSECCryptoException(XSECCryptoException::RSAError,
  +					"OpenSSL:RSA privateKeyDecrypt - Error doing raw decrypt of RSA encrypted data");
  +
  +			}
  +
  +			// Clear out the "0"s at the front
  +			int i;
  +			for (i = 0; i < num && tBuf[i] == 0; ++i)
  +				--decryptSize;
  +
  +			decryptSize = RSA_padding_check_PKCS1_OAEP(plainBuf,
  +													   maxOutLength,
  +													   &tBuf[i],
  +													   decryptSize,
  +													   num,
  +													   mp_oaepParams,
  +													   m_oaepParamsLen);
  +
  +			if (decryptSize < 0) {
  +
  +				throw XSECCryptoException(XSECCryptoException::RSAError,
  +					"OpenSSL:RSA privateKeyDecrypt - Error removing OAEPadding");
  +
  +			}
  +
  +		}
  +		break;
  +
   	default :
   
   		throw XSECCryptoException(XSECCryptoException::RSAError,
  @@ -423,9 +500,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen) {
  +								 hashMethod hm) {
   
   	// Perform an encrypt
   	if (mp_rsaKey == NULL) {
  @@ -449,12 +524,57 @@
   		if (encryptSize < 0) {
   
   			throw XSECCryptoException(XSECCryptoException::RSAError,
  -				"OpenSSL:RSA publicKeyDecrypt - Error performing PKCS1_5 padded RSA encrypt");
  +				"OpenSSL:RSA publicKeyEncrypt - Error performing PKCS1_5 padded RSA encrypt");
   
   		}
   
   		break;
   
  +	case XSECCryptoKeyRSA::PAD_OAEP_MGFP1 :
  +		{
  +
  +			unsigned char * tBuf;
  +			unsigned int num = RSA_size(mp_rsaKey);
  +			if (maxOutLength < num) {
  +				throw XSECCryptoException(XSECCryptoException::RSAError,
  +					"OpenSSL:RSA publicKeyEncrypt - Not enough space in cipherBuf");
  +			}
  +
  +			XSECnew(tBuf, unsigned char[num]);
  +			ArrayJanitor<unsigned char> j_tBuf(tBuf);
  +
  +			// First add the padding
  +
  +			encryptSize = RSA_padding_add_PKCS1_OAEP(tBuf,
  +													 num,
  +													 inBuf,
  +													 inLength,
  +													 mp_oaepParams,
  +													 m_oaepParamsLen);
  +
  +			if (encryptSize <= 0) {
  +
  +				throw XSECCryptoException(XSECCryptoException::RSAError,
  +					"OpenSSL:RSA publicKeyEncrypt - Error adding OAEPadding");
  +
  +			}
  +
  +			encryptSize = RSA_public_encrypt(num,
  +								tBuf,
  +								cipherBuf,
  +								mp_rsaKey,
  +								RSA_NO_PADDING);
  +			
  +
  +			if (encryptSize < 0) {
  +
  +				throw XSECCryptoException(XSECCryptoException::RSAError,
  +					"OpenSSL:RSA publicKeyEncrypt - Error encrypting padded data");
  +
  +			}
  +		}
  +		break;
  +
   	default :
   
   		throw XSECCryptoException(XSECCryptoException::RSAError,
  @@ -492,6 +612,16 @@
   
   	ret->m_keyType = m_keyType;
   	ret->mp_rsaKey = RSA_new();
  +
  +	if (mp_oaepParams != NULL) {
  +		XSECnew(ret->mp_oaepParams, unsigned char[m_oaepParamsLen]);
  +		memcpy(ret->mp_oaepParams, mp_oaepParams, m_oaepParamsLen);
  +		ret->m_oaepParamsLen = m_oaepParamsLen;
  +	}
  +	else {
  +		ret->mp_oaepParams = NULL;
  +		ret->m_oaepParamsLen = 0;
  +	}
   
   	// Duplicate parameters 
   
  
  
  
  1.8       +45 -13    xml-security/c/src/enc/OpenSSL/OpenSSLCryptoKeyRSA.hpp
  
  Index: OpenSSLCryptoKeyRSA.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoKeyRSA.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- OpenSSLCryptoKeyRSA.hpp	19 Oct 2003 10:57:54 -0000	1.7
  +++ OpenSSLCryptoKeyRSA.hpp	4 Nov 2003 05:22:16 -0000	1.8
  @@ -132,6 +132,38 @@
   	//@{
   
   	/**
  +	 * \brief Set the OAEPparams string
  +	 *
  +	 * By default, the library expects crypto implementations to perform
  +	 * OAEP padding with no params.  This call allows the library (or user)
  +	 * to set a params value prior to an encrypt/decrypt operation.
  +	 *
  +	 * @param params buffer containing the params data.  Pass in NULL to clear any
  +	 * old paramters.
  +	 * @param paramsLen number of bytes in buffer to use.  Pass in 0 to clear any
  +	 * old parameters.
  +	 */
  +
  +	virtual void setOAEPparams(unsigned char * params, unsigned int paramsLen);
  +
  +	/**
  +	 * \brief Get OAEPparams Length
  +	 *
  +	 * @returns the number of bytes of the OAEPparams buffer (assuming it has been set)
  +	 */
  +
  +	virtual unsigned int getOAEPparamsLen(void);
  +
  +	/**
  +	 * \brief Get the OAEPparams
  +	 *
  +	 * @returns a pointer to the (crypto object owned) buffer holding the OAEPparams
  +	 * or NULL if no params are held
  +	 */
  +
  +	virtual const unsigned char * getOAEPparams(void);
  +
  +	/**
   	 * \brief Verify a SHA1 PKCS1 encoded signature
   	 *
   	 * The library will call this function to validate an RSA signature
  @@ -181,9 +213,8 @@
   	 * @param inLength bytes of cipher text to decrypt
   	 * @param maxOutLength size of outputBuffer
   	 * @param padding Type of padding (PKCS 1.5 or OAEP)
  -	 * @param hm Hash Method for OAEP encryption
  -	 * @param OAEPParam OAEP Parameter String (NULL if none)
  -	 * @param OEAPParamLen Length of OAEPParam string
  +	 * @param hm Hash Method for OAEP encryption (OAEPParams should be
  +	 * set using setOAEPparams()
   	 */
   
   	virtual unsigned int privateDecrypt(const unsigned char * inBuf,
  @@ -191,9 +222,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen);
  +								 hashMethod hm);
   
   
   	/**
  @@ -207,9 +236,8 @@
   	 * @param inLength bytes of plain text to encrypt
   	 * @param maxOutLength size of outputBuffer
   	 * @param padding Type of padding (PKCS 1.5 or OAEP)
  -	 * @param hm Hash Method for OAEP encryption
  -	 * @param OAEPParam OAEP Parameter String (NULL if none)
  -	 * @param OEAPParamLen Length of OAEPParam string
  +	 * @param hm Hash Method for OAEP encryption (OAEPParams should be
  +	 * set using setOAEPparams()
   	 */
   
   	virtual unsigned int publicEncrypt(const unsigned char * inBuf,
  @@ -217,9 +245,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen);
  +								 hashMethod hm);
   
   	/**
   	 * \brief Obtain the length of an RSA key
  @@ -268,6 +294,10 @@
   	/**
   	 * \brief Constructor to create the object around an existing OpenSSL RSA
   	 * key
  +	 *
  +	 * @param k The key to copy
  +	 * @note The object takes a copy of the original key, and will not delete k on
  +	 * completion.  This must be done by the caller.
   	 */
   
   	OpenSSLCryptoKeyRSA(EVP_PKEY *k);
  @@ -278,6 +308,8 @@
   
   	XSECCryptoKey::KeyType			m_keyType;
   	RSA								* mp_rsaKey;
  +	unsigned char					* mp_oaepParams;
  +	unsigned int					m_oaepParamsLen;
   
   };
   
  
  
  
  1.10      +12 -3     xml-security/c/src/enc/OpenSSL/OpenSSLCryptoProvider.cpp
  
  Index: OpenSSLCryptoProvider.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/OpenSSL/OpenSSLCryptoProvider.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- OpenSSLCryptoProvider.cpp	3 Nov 2003 06:55:45 -0000	1.9
  +++ OpenSSLCryptoProvider.cpp	4 Nov 2003 05:22:16 -0000	1.10
  @@ -85,16 +85,25 @@
   #include <xsec/enc/XSECCryptoException.hpp>
   
   #include <openssl/rand.h>
  +#include <openssl/err.h>
   
   OpenSSLCryptoProvider::OpenSSLCryptoProvider() {
   
   	OpenSSL_add_all_digests();		// Initialise Openssl
  -	SSLeay_add_all_algorithms();
  +	ERR_load_crypto_strings();
  +
  +	//SSLeay_add_all_algorithms();
   
   }
   
   
  -OpenSSLCryptoProvider::~OpenSSLCryptoProvider() {}
  +OpenSSLCryptoProvider::~OpenSSLCryptoProvider() {
  +
  +	EVP_cleanup();
  +	ERR_free_strings();
  +
  +}
  +
   
   const XMLCh * OpenSSLCryptoProvider::getProviderName() {
   
  
  
  
  1.6       +73 -7     xml-security/c/src/enc/WinCAPI/WinCAPICryptoKeyRSA.cpp
  
  Index: WinCAPICryptoKeyRSA.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/WinCAPI/WinCAPICryptoKeyRSA.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- WinCAPICryptoKeyRSA.cpp	3 Nov 2003 06:55:45 -0000	1.5
  +++ WinCAPICryptoKeyRSA.cpp	4 Nov 2003 05:22:17 -0000	1.6
  @@ -78,6 +78,10 @@
   
   XSEC_USING_XERCES(ArrayJanitor);
   
  +#if !defined (CRYPT_OAEP)
  +#	define CRYPT_OAEP              0x00000040
  +#	define KP_OAEP_PARAMS          36
  +#endif
   
   WinCAPICryptoKeyRSA::WinCAPICryptoKeyRSA(HCRYPTPROV prov) {
   
  @@ -173,6 +177,32 @@
   }
   
   // --------------------------------------------------------------------------------
  +//           OAEP parameters handling
  +// --------------------------------------------------------------------------------
  +
  +
  +void WinCAPICryptoKeyRSA::setOAEPparams(unsigned char * params, unsigned int paramsLen) {
  +
  +	if (params != NULL && paramsLen != 0)
  +		throw XSECCryptoException(XSECCryptoException::UnsupportedError,
  +			"WinCAPI::setOAEPParams - OAEP parameters are not supported by Windows Crypto API");
  +
  +}
  +
  +unsigned int WinCAPICryptoKeyRSA::getOAEPparamsLen(void) {
  +
  +	return 0;
  +
  +}
  +
  +const unsigned char * WinCAPICryptoKeyRSA::getOAEPparams(void) {
  +
  +	return NULL;
  +
  +}
  +
  +
  +// --------------------------------------------------------------------------------
   //           Load key from parameters
   // --------------------------------------------------------------------------------
   
  @@ -509,9 +539,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen) {
  +								 hashMethod hm) {
   
   	// Perform a decrypt
   	if (m_key == 0) {
  @@ -541,6 +569,23 @@
   
   		break;
   
  +	case XSECCryptoKeyRSA::PAD_OAEP_MGFP1 :
  +
  +		if (!CryptDecrypt(m_key,
  +						 0,
  +						 TRUE,
  +						 CRYPT_OAEP,
  +						 plainBuf,
  +						 &decryptSize)) {
  +
  +			throw XSECCryptoException(XSECCryptoException::RSAError,
  +				"WinCAPI:RSA privateKeyDecrypt - Error Decrypting PKCS1_5 padded RSA encrypt");
  +
  +		}
  +
  +		break;
  +
  +
   	default :
   
   		throw XSECCryptoException(XSECCryptoException::RSAError,
  @@ -562,9 +607,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen) {
  +								 hashMethod hm) {
   
   	// Perform an encrypt
   	if (m_key == 0) {
  @@ -596,6 +639,29 @@
   
   			throw XSECCryptoException(XSECCryptoException::RSAError,
   				"WinCAPI:RSA publicKeyEncrypt - Error performing PKCS1_5 padded RSA encrypt");
  +
  +		}
  +
  +		break;
  +
  +	case XSECCryptoKeyRSA::PAD_OAEP_MGFP1 :
  +
  +		if (!CryptEncrypt(m_key,
  +						  0,			/* No Hash */
  +						  TRUE,			/* Is Final */
  +						  CRYPT_OAEP,
  +						  cipherBuf,
  +						  &encryptSize,
  +						  maxOutLength)) {
  +
  +			throw XSECCryptoException(XSECCryptoException::RSAError,
  +				"WinCAPI:RSA publicKeyEncrypt - Error performing encrypt");
  +		}
  +
  +		if (encryptSize <= 0) {
  +
  +			throw XSECCryptoException(XSECCryptoException::RSAError,
  +				"WinCAPI:RSA publicKeyEncrypt - Error performing OAEP RSA encrypt");
   
   		}
   
  
  
  
  1.7       +47 -13    xml-security/c/src/enc/WinCAPI/WinCAPICryptoKeyRSA.hpp
  
  Index: WinCAPICryptoKeyRSA.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/WinCAPI/WinCAPICryptoKeyRSA.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- WinCAPICryptoKeyRSA.hpp	3 Nov 2003 06:55:45 -0000	1.6
  +++ WinCAPICryptoKeyRSA.hpp	4 Nov 2003 05:22:17 -0000	1.7
  @@ -175,6 +175,46 @@
   	//@{
   
   	/**
  +	 * \brief Set the OAEPparams string
  +	 *
  +	 * By default, the library expects crypto implementations to perform
  +	 * OAEP padding with no params.  This call allows the library (or user)
  +	 * to set a params value prior to an encrypt/decrypt operation.
  +	 *
  +	 * @param params buffer containing the params data.  Pass in NULL to clear any
  +	 * old paramters.
  +	 * @param paramsLen number of bytes in buffer to use.  Pass in 0 to clear any
  +	 * old parameters.
  +	 * @note The Microsoft Crypto RSA_AES and RSA_FULL providers do not support
  +	 * the ability to set OAEP parameters, so this will throw an 
  +	 * XSECCryptoException::UnsupportedError, unless the passed in paramters
  +	 * are NULL and 0 (to clear).
  +	 */
  +
  +	virtual void setOAEPparams(unsigned char * params, unsigned int paramsLen);
  +
  +	/**
  +	 * \brief Get OAEPparams Length
  +	 *
  +	 * @returns the number of bytes of the OAEPparams buffer (assuming it has been set)
  +	 * @note The Microsoft Crypto RSA_AES and RSA_FULL providers do not support
  +	 * the ability to set OAEP parameters, so this will always return 0
  +	 */
  +
  +	virtual unsigned int getOAEPparamsLen(void);
  +
  +	/**
  +	 * \brief Get the OAEPparams
  +	 *
  +	 * @returns a pointer to the (crypto object owned) buffer holding the OAEPparams
  +	 * or NULL if no params are held
  +	 * @note The Microsoft Crypto RSA_AES and RSA_FULL providers do not support
  +	 * the ability to set OAEP parameters, so this will always return NULL
  +	 */
  +
  +	virtual const unsigned char * getOAEPparams(void);
  +
  +	/**
   	 * \brief Verify a SHA1 PKCS1 encoded signature
   	 *
   	 * The library will call this function to validate an RSA signature
  @@ -224,9 +264,8 @@
   	 * @param inLength bytes of cipher text to decrypt
   	 * @param maxOutLength size of outputBuffer
   	 * @param padding Type of padding (PKCS 1.5 or OAEP)
  -	 * @param hm Hash Method for OAEP encryption
  -	 * @param OAEPParam OAEP Parameter String (NULL if none)
  -	 * @param OEAPParamLen Length of OAEPParam string
  +	 * @param hm Hash Method for OAEP encryption (OAEPParams should be
  +	 * set using setOAEPparams()
   	 */
   
   	virtual unsigned int privateDecrypt(const unsigned char * inBuf,
  @@ -234,9 +273,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen);
  +								 hashMethod hm);
   
   	/**
   	 * \brief Encrypt using a public key
  @@ -249,9 +286,8 @@
   	 * @param inLength bytes of plain text to encrypt
   	 * @param maxOutLength size of outputBuffer
   	 * @param padding Type of padding (PKCS 1.5 or OAEP)
  -	 * @param hm Hash Method for OAEP encryption
  -	 * @param OAEPParam OAEP Parameter String (NULL if none)
  -	 * @param OEAPParamLen Length of OAEPParam string
  +	 * @param hm Hash Method for OAEP encryption (OAEPParams should be
  +	 * set using setOAEPparams()
   	 */
   
   	virtual unsigned int publicEncrypt(const unsigned char * inBuf,
  @@ -259,9 +295,7 @@
   								 unsigned int inLength,
   								 unsigned int maxOutLength,
   								 PaddingType padding,
  -								 hashMethod hm,
  -								 const unsigned char * OEAPParam,
  -								 unsigned int OAPEParamLen);
  +								 hashMethod hm);
   
   	/**
   	 * \brief Obtain the length of an RSA key
  
  
  
  1.3       +4 -4      xml-security/c/src/enc/XSCrypt/XSCryptCryptoBase64.cpp
  
  Index: XSCryptCryptoBase64.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/XSCrypt/XSCryptCryptoBase64.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XSCryptCryptoBase64.cpp	5 Jul 2003 10:30:34 -0000	1.2
  +++ XSCryptCryptoBase64.cpp	4 Nov 2003 05:22:17 -0000	1.3
  @@ -118,7 +118,7 @@
   
   }
   
  -void XSCryptCryptoBase64::canonicaliseInput(unsigned char *inData, 
  +void XSCryptCryptoBase64::canonicaliseInput(const unsigned char *inData, 
   											unsigned int inLength) {
   
   	// Canonicalise the input buffer into m_inputBuffer
  @@ -159,7 +159,7 @@
   
   }
   
  -unsigned int XSCryptCryptoBase64::decode(unsigned char * inData, 
  +unsigned int XSCryptCryptoBase64::decode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength) {
  @@ -335,7 +335,7 @@
   }
   
   
  -unsigned int XSCryptCryptoBase64::encode(unsigned char * inData, 
  +unsigned int XSCryptCryptoBase64::encode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength) {
  
  
  
  1.4       +4 -4      xml-security/c/src/enc/XSCrypt/XSCryptCryptoBase64.hpp
  
  Index: XSCryptCryptoBase64.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/enc/XSCrypt/XSCryptCryptoBase64.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XSCryptCryptoBase64.hpp	5 Jul 2003 10:30:34 -0000	1.3
  +++ XSCryptCryptoBase64.hpp	4 Nov 2003 05:22:17 -0000	1.4
  @@ -122,7 +122,7 @@
   	 * @returns The number of bytes placed in the outData buffer.
   	 */
   	
  -	virtual unsigned int decode(unsigned char * inData, 
  +	virtual unsigned int decode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength);
  @@ -166,7 +166,7 @@
   	 * @returns The number of bytes placed in the outData buffer.
   	 */
   
  -	virtual unsigned int encode(unsigned char * inData, 
  +	virtual unsigned int encode(const unsigned char * inData, 
   						 	    unsigned int inLength,
   								unsigned char * outData,
   								unsigned int outLength);
  @@ -210,7 +210,7 @@
   	unsigned int			m_charCount;		// How many characters in current line?
   
   	// Private functions
  -	void canonicaliseInput(unsigned char *inData, unsigned int inLength);
  +	void canonicaliseInput(const unsigned char *inData, unsigned int inLength);
   
   };
   
  
  
  
  1.8       +3 -1      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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- MerlinFiveInteropResolver.cpp	3 Nov 2003 06:55:45 -0000	1.7
  +++ MerlinFiveInteropResolver.cpp	4 Nov 2003 05:22:17 -0000	1.8
  @@ -326,6 +326,8 @@
   
   					EVP_PKEY * pk = EVP_PKCS82PKEY(p8inf);
   					OpenSSLCryptoKeyRSA * k = new OpenSSLCryptoKeyRSA(pk);
  +					PKCS8_PRIV_KEY_INFO_free(p8inf);
  +					BIO_free_all(rsaFile);
   					return k;
   						//d2i_PKCS8PrivateKey_bio(rsaFile, NULL, NULL, NULL);
   
  
  
  
  1.10      +9 -3      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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- cipher.cpp	28 Oct 2003 09:33:18 -0000	1.9
  +++ cipher.cpp	4 Nov 2003 05:22:17 -0000	1.10
  @@ -661,6 +661,7 @@
   			}
   			else {
   				XSECBinTXFMInputStream * bis = cipher->decryptToBinInputStream(static_cast<DOMElement *>(n));
  +				Janitor<XSECBinTXFMInputStream> j_bis(bis);
   	
   				XMLByte buf[1024];			
   				unsigned int read = bis->readBytes(buf, 1023);
  @@ -668,7 +669,6 @@
   					formatTarget->writeChars(buf, read, NULL);
   					read = bis->readBytes(buf, 1023);
   				}
  -				delete bis;
   			}
   		}
   		else {
  @@ -728,6 +728,7 @@
   
   			DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(core);
   			DOMWriter         *theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();
  +			Janitor<DOMWriter> j_theSerializer(theSerializer);
   
   			theSerializer->setEncoding(MAKE_UNICODE_STRING("UTF-8"));
   			if (theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false))
  @@ -737,7 +738,6 @@
   			
   			cout << endl;
   
  -			delete theSerializer;
   		}
   	}
   
  @@ -747,12 +747,18 @@
   		<< msg << endl;
   		delete [] msg;
   		errorsOccured = true;
  +		if (formatTarget != NULL)
  +			delete formatTarget;
  +		doc->release();
   		return 2;
   	}
   	catch (XSECCryptoException &e) {
   		cerr << "An error occured during encryption/decryption operation\n   Message: "
   		<< e.getMsg() << endl;
   		errorsOccured = true;
  +		if (formatTarget != NULL)
  +			delete formatTarget;
  +		doc->release();
   
   #if defined (HAVE_OPENSSL)
   		ERR_load_crypto_strings();
  
  
  
  1.31      +21 -3     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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- xtest.cpp	3 Nov 2003 07:00:50 -0000	1.30
  +++ xtest.cpp	4 Nov 2003 05:22:17 -0000	1.31
  @@ -269,6 +269,8 @@
   	chForwardSlash, chLatin_p, chLatin_n, chLatin_g, chNull
   };
   
  +unsigned char s_tstOAEPparams[] = "12345678";
  +
   // --------------------------------------------------------------------------------
   //           Some test keys
   // --------------------------------------------------------------------------------
  @@ -932,11 +934,21 @@
   
   		OpenSSLCryptoKeyRSA * k = new OpenSSLCryptoKeyRSA(pk);
   
  +		unitTestKeyEncrypt(impl, k, ENCRYPT_RSA_15);
  +
  +		cerr << "RSA OAEP key wrap... ";
  +		k = new OpenSSLCryptoKeyRSA(pk);
  +		unitTestKeyEncrypt(impl, k, ENCRYPT_RSA_OAEP_MGFP1);
  +
  +		cerr << "RSA OAEP key wrap + params... ";
  +		k = new OpenSSLCryptoKeyRSA(pk);
  +		k->setOAEPparams(s_tstOAEPparams, strlen((char *) s_tstOAEPparams));
  +
  +		unitTestKeyEncrypt(impl, k, ENCRYPT_RSA_OAEP_MGFP1);
  +
   		BIO_free(bioMem);
   		EVP_PKEY_free(pk);
   
  -		unitTestKeyEncrypt(impl, k, ENCRYPT_RSA_15);
  -
   #endif
   
   #if defined (HAVE_OPENSSL) && defined (HAVE_WINCAPI)
  @@ -948,8 +960,14 @@
   		// Use the internal key
   		WinCAPICryptoProvider *cp = dynamic_cast<WinCAPICryptoProvider *>(XSECPlatformUtils::g_cryptoProvider);
   		HCRYPTPROV p = cp->getApacheKeyStore();
  +		
   		WinCAPICryptoKeyRSA * rsaKey = new WinCAPICryptoKeyRSA(p, AT_KEYEXCHANGE, true);
   		unitTestKeyEncrypt(impl, rsaKey, ENCRYPT_RSA_15);
  +
  +		cerr << "RSA OAEP key wrap... ";
  +		rsaKey = new WinCAPICryptoKeyRSA(p, AT_KEYEXCHANGE, true);
  +		unitTestKeyEncrypt(impl, rsaKey, ENCRYPT_RSA_OAEP_MGFP1);
  +
   
   #endif
   
  
  
  
  1.4       +50 -1     xml-security/c/src/xenc/XENCEncryptionMethod.hpp
  
  Index: XENCEncryptionMethod.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/xenc/XENCEncryptionMethod.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XENCEncryptionMethod.hpp	17 Sep 2003 10:10:21 -0000	1.3
  +++ XENCEncryptionMethod.hpp	4 Nov 2003 05:22:17 -0000	1.4
  @@ -115,6 +115,28 @@
   	virtual const XMLCh * getAlgorithm(void) = 0;
   
   	/**
  +	 * \brief Get the digest method URI
  +	 *
  +	 * Return the Algorithm URI represtenting the Digest Method for those
  +	 * encryption algorithms that require it (such as RSA with OAEP padding)
  +	 *
  +	 * @returns the URI representing the digest method algorithm
  +	 */
  +
  +	virtual const XMLCh * getDigestMethod(void) = 0;
  +
  +	/**
  +	 * \brief Get the value of the OAEPparams string
  +	 *
  +	 * The OAEP RSA padding method allows a user to set an optional
  +	 * params string (that will be used as input to the Digest algorithm).
  +	 *
  +	 * @returns The string (base64 encoded value) representing the OAEP params
  +	 */
  +
  +	virtual const XMLCh * getOAEPparams(void) = 0;
  +
  +	/**
   	 * \brief Get the DOM Node of this structure
   	 *
   	 * @returns the DOM Node representing the <EncryptionMethod> element
  @@ -124,6 +146,33 @@
   
   
   	//@}
  +
  +	/** @name Setter Methods */
  +	//@{
  +
  +	/**
  +	 * \brief Set the value of the DigestMethod
  +	 *
  +	 * Sets the DigestMethod element's Algorithm attribute to the passed in
  +	 * value - should be a URI string
  +	 *
  +	 * @param method String to set in the Algorithm attribute.  Will create a
  +	 * \<DigestMethod\> element if one does not already exist
  +	 */
  +
  +	virtual void setDigestMethod(const XMLCh * method) = 0;
  +
  +	/**
  +	 * \brief Set the value of the OAEPparams string
  +	 *
  +	 * Sets the OAEPparams element's Text node child to the passed in
  +	 * value - should be a base64 encoded value
  +	 *
  +	 * @param params String to set in the OAEPparams text node.  Will create a
  +	 * \<OAEPparams\> element if one does not already exist
  +	 */
  +
  +	virtual void setOAEPparams(const XMLCh * params) = 0;
   
   private:
   
  
  
  
  1.8       +102 -11   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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XENCAlgorithmHandlerDefault.cpp	2 Nov 2003 23:11:30 -0000	1.7
  +++ XENCAlgorithmHandlerDefault.cpp	4 Nov 2003 05:22:17 -0000	1.8
  @@ -140,7 +140,8 @@
   	case XSECCryptoKey::KEY_RSA_PAIR :
   	case XSECCryptoKey::KEY_RSA_PRIVATE :
   
  -		keyOK = strEquals(uri, DSIGConstants::s_unicodeStrURIRSA_1_5);
  +		keyOK = strEquals(uri, DSIGConstants::s_unicodeStrURIRSA_1_5) ||
  +			strEquals(uri, DSIGConstants::s_unicodeStrURIRSA_OAEP_MGFP1);
   		break;
   
   	case XSECCryptoKey::KEY_SYMMETRIC :
  @@ -613,17 +614,66 @@
   		bytesRead = b->readBytes(buf, 1024);
   	}
   
  +	unsigned int decryptLen;
   
  -	// Do decrypt
  -	unsigned int decryptLen = rsa->privateDecrypt(cipherSB.rawBuffer(), 
  +	// Now we find out what kind of padding
  +	if (strEquals(encryptionMethod->getAlgorithm(), DSIGConstants::s_unicodeStrURIRSA_1_5)) {
  +
  +		// Do decrypt
  +		decryptLen = rsa->privateDecrypt(cipherSB.rawBuffer(), 
   												  decBuf, 
   												  offset, 
   												  rsa->getLength(), 
   												  XSECCryptoKeyRSA::PAD_PKCS_1_5, 
  -												  HASH_NONE, 
  -												  NULL, 
  -												  0);
  +												  HASH_NONE);
  +	}
  +	else if (strEquals(encryptionMethod->getAlgorithm(), DSIGConstants::s_unicodeStrURIRSA_OAEP_MGFP1)) {
   
  +		if (!strEquals(encryptionMethod->getDigestMethod(), DSIGConstants::s_unicodeStrURISHA1)) {
  +			throw XSECException(XSECException::CipherError, 
  +				"XENCAlgorithmHandlerDefault::doRSADecryptToSafeBuffer - Currently only SHA-1 is supported for OAEP");
  +		}
  +
  +		// Read out any OAEP params
  +		unsigned char * oaepParamsBuf = NULL;
  +		const XMLCh * oaepParams = encryptionMethod->getOAEPparams();
  +		unsigned int sz = 0;
  +		if (oaepParams != NULL) {
  +
  +			char * oaepParamsStr = XMLString::transcode(oaepParams);
  +			ArrayJanitor<char> j_oaepParamsStr(oaepParamsStr);
  +
  +			unsigned int bufLen = strlen(oaepParamsStr);
  +			oaepParamsBuf = new unsigned char[bufLen];
  +			ArrayJanitor<unsigned char> j_oaepParamsBuf(oaepParamsBuf);
  +
  +			XSECCryptoBase64 * b64 = 
  +				XSECPlatformUtils::g_cryptoProvider->base64();
  +			Janitor<XSECCryptoBase64> j_b64(b64);
  +
  +			b64->decodeInit();
  +			sz = b64->decode((unsigned char *) oaepParamsStr, bufLen, oaepParamsBuf, bufLen);
  +			sz += b64->decodeFinish(&oaepParamsBuf[sz], bufLen - sz);
  +
  +			rsa->setOAEPparams(oaepParamsBuf, sz);
  +
  +		}
  +		else
  +			rsa->setOAEPparams(NULL, 0);
  +
  +		decryptLen = rsa->privateDecrypt(cipherSB.rawBuffer(), 
  +												  decBuf, 
  +												  offset, 
  +												  rsa->getLength(), 
  +												  XSECCryptoKeyRSA::PAD_OAEP_MGFP1, 
  +												  HASH_SHA1);
  +
  +	}
  +
  +	else {
  +		throw XSECException(XSECException::CipherError, 
  +			"XENCAlgorithmHandlerDefault::doRSADecryptToSafeBuffer - Unknown padding type");
  +	}
   	// Copy to output
   	result.sbMemcpyIn(decBuf, decryptLen);
   	
  @@ -767,16 +817,57 @@
   		bytesRead = b->readBytes(buf, 1024);
   	}
   
  +	unsigned int encryptLen;
   
   	// Do decrypt
  -	unsigned int encryptLen = rsa->publicEncrypt(plainSB.rawBuffer(), 
  +	if (strEquals(encryptionMethod->getAlgorithm(), DSIGConstants::s_unicodeStrURIRSA_1_5)) {
  +		encryptLen = rsa->publicEncrypt(plainSB.rawBuffer(), 
   												  encBuf, 
   												  offset, 
   												  rsa->getLength(), 
   												  XSECCryptoKeyRSA::PAD_PKCS_1_5, 
  -												  HASH_NONE, 
  -												  NULL, 
  -												  0);
  +												  HASH_NONE);
  +	}
  +
  +	else if (strEquals(encryptionMethod->getAlgorithm(), DSIGConstants::s_unicodeStrURIRSA_OAEP_MGFP1)) {
  +
  +		encryptionMethod->setDigestMethod(DSIGConstants::s_unicodeStrURISHA1);
  +
  +		// Check for OAEP params
  +		int oaepParamsLen = rsa->getOAEPparamsLen();
  +		if (oaepParamsLen > 0) {
  +			unsigned char * oaepParamsB64;
  +			XSECnew(oaepParamsB64, unsigned char[oaepParamsLen * 2]);
  +			ArrayJanitor<unsigned char> j_oaepParamsB64(oaepParamsB64);
  +
  +			XSECCryptoBase64 * b64 = 
  +				XSECPlatformUtils::g_cryptoProvider->base64();
  +			Janitor<XSECCryptoBase64> j_b64(b64);
  +
  +			b64->encodeInit();
  +			int sz = b64->encode(rsa->getOAEPparams(), oaepParamsLen, oaepParamsB64, oaepParamsLen *2);
  +			sz += b64->encodeFinish(&oaepParamsB64[sz], (oaepParamsLen * 2)  - sz);
  +			oaepParamsB64[sz] = '\0';
  +
  +			XMLCh * xBuf = XMLString::transcode((char *) oaepParamsB64);
  +			ArrayJanitor<XMLCh> j_xBuf(xBuf);
  +
  +			encryptionMethod->setOAEPparams(xBuf);
  +
  +		}
  +
  +		encryptLen = rsa->publicEncrypt(plainSB.rawBuffer(), 
  +										  encBuf, 
  +										  offset, 
  +										  rsa->getLength(), 
  +										  XSECCryptoKeyRSA::PAD_OAEP_MGFP1, 
  +										  HASH_SHA1);
  +
  +	}
  +	else {
  +		throw XSECException(XSECException::CipherError, 
  +			"XENCAlgorithmHandlerDefault::doRSAEncryptToSafeBuffer - Unknown padding type");
  +	}
   
   	// Now need to base64 encode
   	XSECCryptoBase64 * b64 = 
  
  
  
  1.13      +2 -1      xml-security/c/src/xenc/impl/XENCCipherImpl.cpp
  
  Index: XENCCipherImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCCipherImpl.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XENCCipherImpl.cpp	2 Nov 2003 23:11:30 -0000	1.12
  +++ XENCCipherImpl.cpp	4 Nov 2003 05:22:17 -0000	1.13
  @@ -193,6 +193,7 @@
   	XSECPlatformUtils::registerAlgorithmHandler(DSIGConstants::s_unicodeStrURIKW_AES256, def);
   	XSECPlatformUtils::registerAlgorithmHandler(DSIGConstants::s_unicodeStrURIKW_3DES, def);
   	XSECPlatformUtils::registerAlgorithmHandler(DSIGConstants::s_unicodeStrURIRSA_1_5, def);
  +	XSECPlatformUtils::registerAlgorithmHandler(DSIGConstants::s_unicodeStrURIRSA_OAEP_MGFP1, def);
   
   }
   
  
  
  
  1.10      +2 -2      xml-security/c/src/xenc/impl/XENCEncryptedTypeImpl.cpp
  
  Index: XENCEncryptedTypeImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptedTypeImpl.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XENCEncryptedTypeImpl.cpp	26 Oct 2003 11:33:13 -0000	1.9
  +++ XENCEncryptedTypeImpl.cpp	4 Nov 2003 05:22:17 -0000	1.10
  @@ -337,7 +337,7 @@
   
   		XSECnew(mp_encryptionMethod, XENCEncryptionMethodImpl(mp_env));
   		DOMNode * encryptionMethodNode = 
  -			mp_encryptionMethod->createBlankEncryptedType(algorithm);
  +			mp_encryptionMethod->createBlankEncryptedMethod(algorithm);
   
   		ret->appendChild(encryptionMethodNode);
   
  
  
  
  1.2       +203 -4    xml-security/c/src/xenc/impl/XENCEncryptionMethodImpl.cpp
  
  Index: XENCEncryptionMethodImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptionMethodImpl.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XENCEncryptionMethodImpl.cpp	15 Sep 2003 11:52:35 -0000	1.1
  +++ XENCEncryptionMethodImpl.cpp	4 Nov 2003 05:22:17 -0000	1.2
  @@ -103,6 +103,38 @@
   	chNull,
   };
   
  +static XMLCh s_DigestMethod[] = {
  +
  +	chLatin_D,
  +	chLatin_i,
  +	chLatin_g,
  +	chLatin_e,
  +	chLatin_s,
  +	chLatin_t,
  +	chLatin_M,
  +	chLatin_e,
  +	chLatin_t,
  +	chLatin_h,
  +	chLatin_o,
  +	chLatin_d,
  +	chNull
  +};
  +
  +static XMLCh s_OAEPparams [] = {
  +
  +	chLatin_O,
  +	chLatin_A,
  +	chLatin_E,
  +	chLatin_P,
  +	chLatin_p,
  +	chLatin_a,
  +	chLatin_r,
  +	chLatin_a,
  +	chLatin_m,
  +	chLatin_s,
  +	chNull
  +};
  +
   // --------------------------------------------------------------------------------
   //			Constructors and Destructors
   // --------------------------------------------------------------------------------
  @@ -110,7 +142,9 @@
   XENCEncryptionMethodImpl::XENCEncryptionMethodImpl(const XSECEnv * env) :
   mp_env(env),
   mp_encryptionMethodNode(NULL),
  -mp_algorithm(NULL) {
  +mp_algorithm(NULL),
  +mp_digestAlgorithmAttributeNode(NULL),
  +mp_oaepParamsTextNode(NULL) {
   
   }
   
  @@ -119,7 +153,9 @@
   		DOMNode * node) :
   mp_env(env),
   mp_encryptionMethodNode(node),
  -mp_algorithm(NULL) {
  +mp_algorithm(NULL),
  +mp_digestAlgorithmAttributeNode(NULL),
  +mp_oaepParamsTextNode(NULL) {
   
   }
   
  @@ -173,13 +209,48 @@
   
   	}
   
  +	// Check for known children
  +	DOMNode * c = findFirstChildOfType(mp_encryptionMethodNode, DOMNode::ELEMENT_NODE);
  +
  +	while (c != NULL) {
  +
  +		if (strEquals(getDSIGLocalName(c), s_DigestMethod)) {
  +
  +			mp_digestAlgorithmAttributeNode = NULL;
  +			tmpAtts = c->getAttributes();
  +
  +			if (tmpAtts != NULL)
  +				mp_digestAlgorithmAttributeNode = tmpAtts->getNamedItem(DSIGConstants::s_unicodeStrAlgorithm);
  +
  +			if (mp_digestAlgorithmAttributeNode == NULL) {
  +				throw XSECException(XSECException::EncryptionMethodError,
  +					"XENCEncryptionMethod::load - Cannot find Algorithm Attribute in DigestMethod element");
  +			}
  +		}
  +
  +		else if (strEquals(getXENCLocalName(c), s_OAEPparams)) {
  +
  +			mp_oaepParamsTextNode = NULL;
  +			mp_oaepParamsTextNode = findFirstChildOfType(c, DOMNode::TEXT_NODE);
  +
  +			if (mp_oaepParamsTextNode == NULL) {
  +				throw XSECException(XSECException::EncryptionMethodError,
  +					"XENCEncryptionMethod::load - Cannot find text value of OAEPparams node");
  +			}
  +
  +		}
  +
  +		do {
  +			c = c->getNextSibling();
  +		} while (c != NULL && c->getNodeType() != DOMNode::ELEMENT_NODE);
  +	}
   }
   
   // --------------------------------------------------------------------------------
   //			Create from scratch
   // --------------------------------------------------------------------------------
   
  -DOMElement * XENCEncryptionMethodImpl::createBlankEncryptedType(const XMLCh * algorithm) {
  +DOMElement * XENCEncryptionMethodImpl::createBlankEncryptedMethod(const XMLCh * algorithm) {
   
   	// Reset
   	if (mp_algorithm != NULL) {
  @@ -210,3 +281,131 @@
   	return ret;
   
   }
  +// --------------------------------------------------------------------------------
  +//			Getter functions
  +// --------------------------------------------------------------------------------
  +
  +const XMLCh * XENCEncryptionMethodImpl::getDigestMethod(void) {
  +
  +	if (mp_digestAlgorithmAttributeNode != NULL)
  +		return mp_digestAlgorithmAttributeNode->getNodeValue();
  +
  +	return NULL;
  +
  +}
  +
  +const XMLCh * XENCEncryptionMethodImpl::getOAEPparams(void) {
  +
  +	if (mp_oaepParamsTextNode != NULL) {
  +		return mp_oaepParamsTextNode->getNodeValue();
  +	}
  +
  +	return NULL;
  +
  +}
  +
  +// --------------------------------------------------------------------------------
  +//			Setter functions
  +// --------------------------------------------------------------------------------
  +
  +void XENCEncryptionMethodImpl::setDigestMethod(const XMLCh * method) {
  +
  +	if (mp_digestAlgorithmAttributeNode == NULL) {
  +
  +		// Need to create
  +		if (mp_oaepParamsTextNode == NULL) {
  +			mp_env->doPrettyPrint(mp_encryptionMethodNode);
  +		}
  +
  +		// Get some setup values
  +		safeBuffer str;
  +		DOMDocument *doc = mp_env->getParentDocument();
  +		const XMLCh * prefix = mp_env->getDSIGNSPrefix();
  +
  +		makeQName(str, prefix, s_DigestMethod);
  +
  +		DOMElement *e = doc->createElementNS(DSIGConstants::s_unicodeStrURIDSIG, str.rawXMLChBuffer());
  +		if (mp_oaepParamsTextNode != NULL) {
  +			mp_encryptionMethodNode->insertBefore(e, mp_oaepParamsTextNode->getParentNode());
  +			if (mp_env->getPrettyPrintFlag())
  +				mp_encryptionMethodNode->insertBefore(doc->createTextNode(DSIGConstants::s_unicodeStrNL), mp_oaepParamsTextNode->getParentNode());
  +		}
  +		else {
  +			mp_encryptionMethodNode->appendChild(e);
  +			mp_env->doPrettyPrint(mp_encryptionMethodNode);
  +		}
  +
  +		e->setAttributeNS(DSIGConstants::s_unicodeStrURIDSIG,
  +							DSIGConstants::s_unicodeStrAlgorithm,
  +							method);
  +
  +		// Set namespace
  +		if (prefix[0] == XERCES_CPP_NAMESPACE::chNull) {
  +			str.sbTranscodeIn("xmlns");
  +		}
  +		else {
  +			str.sbTranscodeIn("xmlns:");
  +			str.sbXMLChCat(prefix);
  +		}
  +
  +		e->setAttributeNS(DSIGConstants::s_unicodeStrURIXMLNS, 
  +								str.rawXMLChBuffer(), 
  +								DSIGConstants::s_unicodeStrURIXENC);
  +
  +		// Now retrieve for later use
  +		DOMNamedNodeMap * tmpAtts = e->getAttributes();
  +
  +		if (tmpAtts != NULL) {
  +
  +			mp_digestAlgorithmAttributeNode = tmpAtts->getNamedItem(DSIGConstants::s_unicodeStrAlgorithm);
  +
  +		}
  +
  +		if (mp_digestAlgorithmAttributeNode == NULL) {
  +
  +			throw XSECException(XSECException::EncryptionMethodError,
  +				"XENCEncryptionMethod::setDigestMethod - Error creating Algorithm Attribute");
  +		}
  +	} 
  +	
  +	else {
  +
  +		mp_digestAlgorithmAttributeNode->setNodeValue(method);
  +
  +	}
  +
  +}
  +
  +void XENCEncryptionMethodImpl::setOAEPparams(const XMLCh * params) {
  +
  +	if (mp_oaepParamsTextNode == NULL) {
  +
  +		// Need to create
  +		if (mp_digestAlgorithmAttributeNode == NULL) {
  +			mp_env->doPrettyPrint(mp_encryptionMethodNode);
  +		}
  +
  +		// Get some setup values
  +		safeBuffer str;
  +		DOMDocument *doc = mp_env->getParentDocument();
  +		const XMLCh * prefix = mp_env->getXENCNSPrefix();
  +
  +		makeQName(str, prefix, s_OAEPparams);
  +
  +		DOMElement *e = doc->createElementNS(DSIGConstants::s_unicodeStrURIXENC, str.rawXMLChBuffer());
  +		mp_encryptionMethodNode->appendChild(e);
  +		mp_env->doPrettyPrint(mp_encryptionMethodNode);
  +
  +		mp_oaepParamsTextNode = doc->createTextNode(params);
  +		e->appendChild(mp_oaepParamsTextNode);
  +
  +	} 
  +	
  +	else {
  +
  +		mp_oaepParamsTextNode->setNodeValue(params);
  +
  +	}
  +
  +}
  +
  
  
  
  1.3       +12 -3     xml-security/c/src/xenc/impl/XENCEncryptionMethodImpl.hpp
  
  Index: XENCEncryptionMethodImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-security/c/src/xenc/impl/XENCEncryptionMethodImpl.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XENCEncryptionMethodImpl.hpp	17 Sep 2003 10:10:22 -0000	1.2
  +++ XENCEncryptionMethodImpl.hpp	4 Nov 2003 05:22:17 -0000	1.3
  @@ -93,13 +93,19 @@
   	void load();
   
   	// Create from scratch
  -	XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * createBlankEncryptedType(
  +	XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * createBlankEncryptedMethod(
   						const XMLCh * algorithm);
   
   	// Interface
   	const XMLCh * getAlgorithm(void) {return mp_algorithm;}
   	virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * getDOMNode(void)
   		{return mp_encryptionMethodNode;}
  +	virtual const XMLCh * getDigestMethod(void);
  +	virtual const XMLCh * getOAEPparams(void);
  +	virtual void setDigestMethod(const XMLCh * method);
  +	virtual void setOAEPparams(const XMLCh * params);
  +
  +
   
   private:
   
  @@ -112,7 +118,10 @@
   	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode					
   								* mp_encryptionMethodNode;	// Node at head of structure
   	XMLCh						* mp_algorithm;
  -
  +	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode					
  +								* mp_digestAlgorithmAttributeNode;
  +	XERCES_CPP_NAMESPACE_QUALIFIER DOMNode					
  +								* mp_oaepParamsTextNode;
   };
   
   #endif /* XENCENCRYPTIONMETHODIMPL_INCLUDE */