/**
 * 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
 *
 * XSECCryptoKey := Container class to hold cryptographic keys
 *					Should be re-implemented by all providers as the base class
 *                  for all keys
 *
 * Author(s): Berin Lautenbach
 *
 * $Id$
 *
 */



#ifndef XSECCRYPTOKEY_INCLUDE
#define XSECCRYPTOKEY_INCLUDE

#include <xsec/framework/XSECDefs.hpp>

/**
 * \ingroup crypto
 */

/**
 * \brief Base interface class for key material.
 *
 * All keys used for signing and encrypting are derived from this
 * base interface class.  There are no methods for performing
 * cryptographic functions, as this is a base class used to allow
 * the library to pass key material to various objects without
 * knowing how to directly use it.
 */

class XSEC_EXPORT XSECCryptoKey {

public :

	/**
	 * \brief Key types understood by the library
	 *
	 * This type defines the list of key types that the library
	 * understands.
	 */

	enum KeyType {

		KEY_NONE,
		KEY_DSA_PUBLIC,
		KEY_DSA_PRIVATE,
		KEY_DSA_PAIR,
		KEY_RSA_PUBLIC,
		KEY_RSA_PRIVATE,
		KEY_RSA_PAIR,
		KEY_HMAC,
		KEY_SYMMETRIC,
		KEY_EC_PUBLIC,
		KEY_EC_PRIVATE,
		KEY_EC_PAIR
	
	};


	/** @name Constructors and Destructors */
	//@{
	
	/**
	 * \brief Constructor
	 **/

	XSECCryptoKey() {};

	/**
	 * \brief Destructor 
	 *
	 * Implementations must ensure that the held key is properly destroyed
	 * (overwritten) when key objects are deleted.
	 */

	virtual ~XSECCryptoKey() {};

	//@}

	/** @name Interface classes */
	//@{

	/**
	 * \brief Returns the type of this key.
	 */

	virtual KeyType getKeyType() const {return KEY_NONE;}

	/**
	 * \brief Returns a string that identifies the crypto owner of this library.
	 */

	virtual const XMLCh * getProviderName() const = 0;

	/**
	 * \brief Clone the key
	 *
	 * All keys need to be able to copy themselves and return
	 * a pointer to the copy.  This allows the library to 
	 * duplicate keys.
	 */

	virtual XSECCryptoKey * clone() const = 0;

  //@}

};


#endif /* XSECCRYPTOKEY_INCLUDE */
