--- /dev/null
+/* 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_*/