/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/*
 * XSEC
 *
 * XENCEncryptionMethod := Interface definition for EncryptionMethod element
 *
 * $Id$
 *
 */

#ifndef XENCENCRYPTIONMETHOD_INCLUDE
#define XENCENCRYPTIONMETHOD_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>

class XSECEnv;

/**
 * @ingroup xenc
 */

/**
 * @brief Interface definition for the EncryptionMethod object
 *
 * The \<EncryptionMethod\> element holds information about the 
 * encryption algorithm being used.
 *
 * This element is optional within an EncryptedType derivative,
 * but applications not making use of this need to know the 
 * this information, otherwise the library will not be able to
 * decrypt the data.
 *
 * It is defined as :
 * \verbatim
  <complexType name='EncryptionMethodType' mixed='true'>
    <sequence>
      <element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
      <element name='OAEPparams' minOccurs='0' type='base64Binary'/>
      <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
    </sequence>
    <attribute name='Algorithm' type='anyURI' use='required'/>
  </complexType>
  \endverbatim
 */


class XSEC_EXPORT XENCEncryptionMethod {

public:

	XENCEncryptionMethod() {};

	virtual ~XENCEncryptionMethod() {};

	
	/**
	* \brief Create a new object.
	*
	* Create a new object.
	* 
	* @param env environment instance
	* @param algorithm algorithm to use
	*
	* @returns the new object
	*/
	static XENCEncryptionMethod* create(const XSECEnv* env, const XMLCh* algorithm);

	/** @name Getter Methods */
	//@{

	/**
	 * \brief Get the algorithm
	 *
	 * Return the Algorithm URI representing the encryption type for this
	 * encrypted data
	 *
	 * @returns the URI representing the algorithm
	 */

	virtual const XMLCh * getAlgorithm(void) const = 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) const = 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) const = 0;

	/**
	 * \brief Get the MGF URI
	 *
	 * Return the Algorithm URI represtenting the Mask Generation Function for those
	 * encryption algorithms that require it (such as RSA with OAEP padding)
	 *
	 * @returns the URI representing the mask generation function
	 */

	virtual const XMLCh * getMGF(void) const = 0;

	/**
	 * \brief Get the KeySize that was set in this EncryptionMethod.
	 *
	 * This field would not normally be used for the encryption algorithms
	 * explicitly referenced in the XML Encryption standard.  It is provided
	 * mainly for stream ciphers that have a variable key length
	 */

	virtual int getKeySize(void) const = 0;

	/**
	 * \brief Get the DOM Element Node of this structure
	 *
	 * @returns the DOM Element Node representing the \<EncryptionMethod\> element
	 */

	virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * getElement(void) const = 0;


	//@}

	/** @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;

	/**
	 * \brief Set the value of the MGF
	 *
	 * Sets the MGF 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
	 * \<xenc11:MGF\> element if one does not already exist
	 */

	virtual void setMGF(const XMLCh * mgf) = 0;

	/**
	 * \brief Set the KeySize that in this EncryptionMethod.
	 *
	 * This field would not normally be used for the encryption algorithms
	 * explicitly referenced in the XML Encryption standard.  It is provided
	 * mainly for stream ciphers that have a variable key length
	 */

	virtual void setKeySize(int size) = 0;

	//@}

private:

	// Unimplemented
	XENCEncryptionMethod(const XENCEncryptionMethod &);
	XENCEncryptionMethod & operator = (const XENCEncryptionMethod &);

};

#endif /* XENCENCRYPTIONMETHOD_INCLUDE */
