feePublicKey.h   [plain text]


/* Copyright (c) 1998,2011-2012,2014 Apple Inc.  All Rights Reserved.
 *
 * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT
 * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE
 * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE
 * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE,
 * INC.  ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL
 * EXPOSE YOU TO LIABILITY.
 ***************************************************************************
 *
 * feePublicKey.h
 *
 * Revision History
 * ----------------
 * 23 Mar 98 at Apple
 *	Added blob support.
 * 17 Jul 97 at Apple
 *	Added ECDSA signature routines.
 * 20 Aug 96 at NeXT
 *	Created.
 */

#ifndef	_CK_FEEPUBLICKEY_H_
#define _CK_FEEPUBLICKEY_H_

#include "ckconfig.h"

#include <sys/types.h>		/* size_t */

#if	!defined(__MACH__)
#include <feeTypes.h>
#else
#include <security_cryptkit/feeTypes.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Obatin a newly allocated feePubKey.
 */
feePubKey feePubKeyAlloc(void);

void feePubKeyFree(feePubKey pubKey);

/*
 * Init feePubKey from private "password" data. Incoming password data will
 * be processed with digests before use if hashPrivData is true, otherwise
 * it'll be used as is. In the 'as is' case, the privData must be at least 
 * as large as the key being created. 
 *
 * Currently two versions - one in which the size of the key is specified as
 * a feeDepth; one for key size in bits and optional primeType and curveType. 
 */
feeReturn feePubKeyInitFromPrivDataDepth(feePubKey pubKey,
	const unsigned char *privData,
	unsigned privDataLen,
	feeDepth depth,
	char hashPrivData);
	
feeReturn feePubKeyInitFromPrivDataKeyBits(feePubKey pubKey,
	const unsigned char *privData,
	unsigned privDataLen,
	unsigned keyBits,			/* key size in bits */
	feePrimeType primeType,		/* FPT_Fefault means "best one" */
	feeCurveType curveType,		/* FCT_Default means "best one" */
	char hashPrivData);

/*
 * Init feePubKey from private "password" and from data curve parameters
 * matching existing oldKey. Incoming password data will
 * be processed with digests before use if hashPrivData is true, otherwise
 * it'll be used as is. In the 'as is' case, the privData must be at least 
 * as large as the key being created. 

 */
feeReturn feePubKeyInitFromKey(feePubKey pubKey,
	const unsigned char *privData,
	unsigned privDataLen,
	feePubKey oldKey,
	char hashPrivData);

/***
 *** Exportable key blob support.
 ***
 *** Currently there are three different ways of representing a feePubKey in
 *** an exportable format. 
 ***
 *** Raw blob:  basic native blob format. 
 *** DER blob:  DER-encoded. Currently not available in ANSI C version of 
 ***            CryptKit library without additional porting; the OS X version of 
 ***            Apple implements this functionality via SNACC-generated C++ classes.
 *** KeyString: NULL-terminated ASCII C string, suitable for application such as
 ***            distributing one's public key via email. Only public keys (not
 ***            private) can be exported and imported via KeyStrings. 
 ***/
 
/*
 * Obtain portable public and private key blobs from a key.
 */
feeReturn feePubKeyCreatePubBlob(feePubKey pubKey,
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED

feeReturn feePubKeyCreatePrivBlob(feePubKey pubKey,
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED

/*
 * Init an empty feePubKey from a blob, public and private key versions. 
 */
feeReturn feePubKeyInitFromPubBlob(feePubKey pubKey,
	unsigned char *keyBlob,
	unsigned keyBlobLen);
feeReturn feePubKeyInitFromPrivBlob(feePubKey pubKey,
	unsigned char *keyBlob,
	unsigned keyBlobLen);

/*
 * Create a public key in the form of a null-terminated C string.
 */
feeReturn feePubKeyCreateKeyString(feePubKey pubKey,
	char **pubKeyString,		/* fmalloc'd & RETURNED */
	unsigned *pubKeyStringLen);	/* RETURNED */

/*
 * Init feePubKey from a public key string.
 */
feeReturn feePubKeyInitFromKeyString(feePubKey pubKey,
	const char *keyStr,
	unsigned keyStrLen);

#if CRYPTKIT_DER_ENABLE

/* 
 * DER format support. 
 * Obtain portable public and private DER-encoded key blobs from a key.
 */
feeReturn feePubKeyCreateDERPubBlob(feePubKey pubKey,
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED

feeReturn feePubKeyCreateDERPrivBlob(feePubKey pubKey,
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED
	
/*
 * Init an empty feePubKey from a DER-encoded blob, public and private key versions. 
 */
feeReturn feePubKeyInitFromDERPubBlob(feePubKey pubKey,
	unsigned char *keyBlob,
	size_t keyBlobLen);
feeReturn feePubKeyInitFromDERPrivBlob(feePubKey pubKey,
	unsigned char *keyBlob,
	size_t keyBlobLen);

/* 
 * X509 (public) and PKCS8 (private) key formatting.
 */
feeReturn feePubKeyCreateX509Blob(
	feePubKey pubKey,			// public key
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED
	
feeReturn feePubKeyCreatePKCS8Blob(
	feePubKey pubKey,			// private key
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED

feeReturn feePubKeyInitFromX509Blob(
	feePubKey pubKey,			// public key 
	unsigned char *keyBlob,
	size_t keyBlobLen);

feeReturn feePubKeyInitFromPKCS8Blob(
	feePubKey pubKey,			// private key 
	unsigned char *keyBlob,
	size_t keyBlobLen);

/*
 * The native OpenSSL ECDSA key format contains both the private and public
 * components in one blob. This throws a bit of a monkey wrench into the API
 * here, as we only have one encoder - which requires a private key - and one
 * decoder, which can result in the decoding of either a public or a private
 * key.
 */
feeReturn feePubKeyCreateOpenSSLBlob(
	feePubKey pubKey,			// private key
	unsigned char **keyBlob,	// mallocd and RETURNED
	unsigned *keyBlobLen);		// RETURNED

feeReturn feePubKeyInitFromOpenSSLBlob(
	feePubKey pubKey,			// private or public key 
	int pubOnly,
	unsigned char *keyBlob,
	size_t keyBlobLen);

#endif	/* CRYPTKIT_DER_ENABLE */

/*
 * ANSI X9.62/Certicom key support.
 * Public key is 04 || x || y
 * Private key is privData per Certicom SEC1 C.4.
 */
feeReturn feeCreateECDSAPubBlob(feePubKey pubKey,
	unsigned char **keyBlob,
	unsigned *keyBlobLen);

feeReturn feeCreateECDSAPrivBlob(feePubKey pubKey,
	unsigned char **keyBlob,
	unsigned *keyBlobLen);

/* Caller determines depth from other sources (e.g. AlgId.Params) */
feeReturn feePubKeyInitFromECDSAPubBlob(feePubKey pubKey,
	const unsigned char *keyBlob,
	unsigned keyBlobLen,
	feeDepth depth);

feeReturn feePubKeyInitFromECDSAPrivBlob(feePubKey pubKey,
	const unsigned char *keyBlob,
	unsigned keyBlobLen,
	feeDepth depth);


/***
 *** Miscellaneous feePubKey functions.
 ***/
 
/* 
 * Given private-capable privKey, initialize pubKey to be its corresponding 
 * public key.
 */
feeReturn feePubKeyInitPubKeyFromPriv(feePubKey privKey,
	feePubKey pubKey);
	
/*
 * Returns non-zero if two keys are equivalent.
 */
int feePubKeyIsEqual(feePubKey key1,
	feePubKey key2);

/*
 * Returns non-zero if key is private-capable (i.e., capable of signing
 * and decrypting).
 */
int feePubKeyIsPrivate(feePubKey key);

#if	CRYPTKIT_KEY_EXCHANGE

/*
 * Generate a pad, for use with symmetric encryption, derived from two keys.
 * 'myKey' must be created with private data (via feePubKeyInitFromPrivData()
 * or feePubKeyInitFromKey().
 */
feeReturn feePubKeyCreatePad(feePubKey myKey,
	feePubKey theirKey,
	unsigned char **padData,	/* fmalloc'd & RETURNED */
	unsigned *padDataLen);		/* RETURNED padData length in bytes */

#endif	/* CRYPTKIT_KEY_EXCHANGE */

#if	CRYPTKIT_HIGH_LEVEL_SIG

/*
 * The following two routines are implemented using primitives in the
 * feeHash and feeDigitalSignature objects.
 *
 * Generate digital signature, ElGamal style.
 */
feeReturn feePubKeyCreateSignature(feePubKey pubKey,
	const unsigned char *data,
	unsigned dataLen,
	unsigned char **signature,	/* fmalloc'd and RETURNED */
	unsigned *signatureLen);	/* RETURNED */

/*
 * Verify digital signature, ElGamal style.
 */
feeReturn feePubKeyVerifySignature(feePubKey pubKey,
	const unsigned char *data,
	unsigned dataLen,
	const unsigned char *signature,
	unsigned signatureLen);
	
#if CRYPTKIT_ECDSA_ENABLE
    
/*
 * The following two routines are implemented using primitives in the
 * feeHash and feeECDSA objects.
 *
 * Generate digital signature, ECDSA style.
 */
feeReturn feePubKeyCreateECDSASignature(feePubKey pubKey,
	const unsigned char *data,
	unsigned dataLen,
	unsigned char **signature,		/* fmalloc'd and RETURNED */
	unsigned *signatureLen);		/* RETURNED */

/*
 * Verify digital signature, ECDSA style.
 */
feeReturn feePubKeyVerifyECDSASignature(feePubKey pubKey,
	const unsigned char *data,
	unsigned dataLen,
	const unsigned char *signature,
	unsigned signatureLen);

#endif	/* CRYPTKIT_ECDSA_ENABLE */

#endif	/* CRYPTKIT_HIGH_LEVEL_SIG */

/* 
 * Diffie-Hellman. Public key is specified either as a feePubKey or 
 * a ANSI X9.62 format public key string (0x04 | x | y). In either case
 * the caller must ensure that the two keys are on the same curve. 
 * Output data is falloc'd here; caller must free. Output data is 
 * exactly the size of the curve's modulus in bytes. 
 */
feeReturn feePubKeyECDH(
	feePubKey privKey,
	/* one of the following two is non-NULL */
	feePubKey pubKey,
	const unsigned char *pubKeyStr,
	unsigned pubKeyStrLen,
	/* output fallocd and RETURNED here */
	unsigned char **output,
	unsigned *outputLen);

/*
 * Accessor routines.
 */
const char *feePubKeyAlgorithmName(void);

unsigned feePubKeyBitsize(feePubKey pubKey);

#ifdef __cplusplus
}
#endif

#endif	/*_CK_FEEPUBLICKEY_H_*/