/* 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); /* * 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); /* * 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); /* * 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_*/