/**
 * 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
 *
 * XKMSRSAKeyPair := Interface for RSAKeyPair elements
 *
 * $Id:$
 *
 */

#ifndef XKMSRSAKEYPAIR_INCLUDE
#define XKMSRSAKEYPAIR_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>

#ifdef XSEC_XKMS_ENABLED

/**
 * @ingroup xkms
 */

/**
 * @brief Interface definition for the RSAKeyPair
 *
 * The \<RSAKeyPair\> is one of the few XKMS elements that is not
 * directly part of an XKMS Message.  It is sent in RegisterResult
 * and RecoverResult messages as a CipherData.
 *
 * This element allows the service to provide back to the user
 * a complete RSA key - including the private components.  The various
 * components that make up an RSA key are all provided in Base64 format
 * (CryptoBinary type)
 *
 * The schema definition for RSAKeyPair is as follows :
 *
 * \verbatim
   <!-- RSAKeyPair -->
   <element name="RSAKeyPair" type="xkms:RSAKeyPairType"/>
   <complexType name="RSAKeyPairType">
      <sequence>
         <element ref="xkms:Modulus"/>
         <element ref="xkms:Exponent"/>
         <element ref="xkms:P"/>
         <element ref="xkms:Q"/>
         <element ref="xkms:DP"/>
         <element ref="xkms:DQ"/>
         <element ref="xkms:InverseQ"/>
         <element ref="xkms:D"/>
      </sequence>
   </complexType>
   <element name="Modulus" type="ds:CryptoBinary"/>
   <element name="Exponent" type="ds:CryptoBinary"/>
   <element name="P" type="ds:CryptoBinary"/>
   <element name="Q" type="ds:CryptoBinary"/>
   <element name="DP" type="ds:CryptoBinary"/>
   <element name="DQ" type="ds:CryptoBinary"/>
   <element name="InverseQ" type="ds:CryptoBinary"/>
   <element name="D" type="ds:CryptoBinary"/>
   <!-- /RSAKeyPair -->
\endverbatim
 *
 * @note There are no "set" methods for this class.  It is designed
 * to be created "atomically" via the XKMSMessageFactory class and not
 * altered.
 */


class XSEC_EXPORT XKMSRSAKeyPair {

public:

	/** @name Constructors and Destructors */
	//@{

protected:

	XKMSRSAKeyPair() {};

public:

	virtual ~XKMSRSAKeyPair() {};

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

	/**
	 * \brief Get the Modulus of the key pair
	 *
	 * @returns The Modulus in base64 encoding
	 */

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

	/**
	 * \brief Get the Exponent of the key pair
	 *
	 * @returns The Exponent in base64 encoding
	 */

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

	/**
	 * \brief Get the P of the key pair
	 *
	 * @returns The P in base64 encoding
	 */

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

	/**
	 * \brief Get the Q of the key pair
	 *
	 * @returns The Q in base64 encoding
	 */

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

	/**
	 * \brief Get the DP of the key pair
	 *
	 * @returns The DP in base64 encoding
	 */

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

	/**
	 * \brief Get the DQ of the key pair
	 *
	 * @returns The DQ in base64 encoding
	 */

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

	/**
	 * \brief Get the InverseQ of the key pair
	 *
	 * @returns The InverseQ in base64 encoding
	 */

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

	/**
	 * \brief Get the D of the key pair
	 *
	 * @returns The D in base64 encoding
	 */

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


	//@}

private:

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

};

#endif /* XSEC_XKMS_ENABLED */

#endif /* XKMSRSAKEYPAIR_INCLUDE */
