/*
 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
 * 
 * The contents of this file constitute Original Code as defined in and are
 * subject to the Apple Public Source License Version 1.2 (the 'License').
 * You may not use this file except in compliance with the License. Please obtain
 * a copy of the License at http://www.apple.com/publicsource and read it before
 * using this file.
 * 
 * This Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
 * specific language governing rights and limitations under the License.
 */


/*
 * FEEKeys.h - FEE-related asymmetric key pair classes. 
 *
 * Created 2/21/2001 by dmitch.
 */

#ifdef	CRYPTKIT_CSP_ENABLE

#ifndef	_FEE_KEYS_H_
#define _FEE_KEYS_H_

#include "AppleCSPContext.h"
#include "AppleCSPSession.h"
#include <CryptKitCSP/cryptkitcsp.h>
#include <CryptKit/feeTypes.h>

namespace CryptKit {

/*
 * FEE version of a BinaryKey.
 */
class FEEBinaryKey : public BinaryKey {
public:
	FEEBinaryKey(feePubKey feeKey = NULL);
	~FEEBinaryKey();
	void generateKeyBlob(
		CssmAllocator 		&allocator,
		CssmData			&blob,
		CSSM_KEYBLOB_FORMAT	&format);

	feePubKey				feeKey() { return mFeeKey; }
private:
	feePubKey				mFeeKey;
};

class FEEKeyPairGenContext : 
	public AppleCSPContext, private AppleKeyPairGenContext  {
public:
	FEEKeyPairGenContext(
		AppleCSPSession &session,
		const Context &) :
			AppleCSPContext(session) {}

	~FEEKeyPairGenContext() { }
	
	/* no init functionality, but we need to implement it */
	void init(
		const Context &, 
		bool) { }
		
	// this one is specified in, and called from, CSPFullPluginSession
	void generate(
		const Context 	&context, 
		CssmKey 		&pubKey, 
		CssmKey 		&privKey);
		
	// this one is specified in, and called from, AppleKeyPairGenContext
	void generate(
		const Context 	&context,
		BinaryKey		&pubBinKey,	
		BinaryKey		&privBinKey,
		uint32			&keySize);
	
};	/* KeyPairGenContext */

/*
 * CSPKeyInfoProvider for FEE keys
 */
class FEEKeyInfoProvider : public CSPKeyInfoProvider 
{
private:
	FEEKeyInfoProvider(
		const CssmKey		&cssmKey);
public:
	static CSPKeyInfoProvider *provider(
		const CssmKey &cssmKey);
	~FEEKeyInfoProvider() { }
	void CssmKeyToBinary(
		BinaryKey			**binKey);	// RETURNED
	void QueryKeySizeInBits(
		CSSM_KEY_SIZE		&keySize);	// RETURNED
};

} /* namespace CryptKit */

#endif	/* _FEE_KEYS_H_ */
#endif	/* CRYPTKIT_CSP_ENABLE */
