/* * Copyright (c) 2000-2002 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. */ /* * DH_keys.h - Diffie-Hellman key pair support */ #ifndef _DH_KEYS_H_ #define _DH_KEYS_H_ #include #include #include "AppleCSPKeys.h" #include #include #include #include #include #include #define DH_PUB_KEY_FORMAT CSSM_KEYBLOB_RAW_FORMAT_PKCS3 #define DH_PRIV_KEY_FORMAT CSSM_KEYBLOB_RAW_FORMAT_PKCS3 #define DH_MIN_KEY_SIZE 512 /* FIXME */ #define DH_MAX_KEY_SIZE 2048 #define cspDhDebug(args...) secdebug("dhDebug", ## args) /* * Diffie-Hellman version of a BinaryKey. */ class DHBinaryKey : public BinaryKey { public: DHBinaryKey(DH *dhKey = NULL); ~DHBinaryKey(); void generateKeyBlob( CssmAllocator &allocator, CssmData &blob, CSSM_KEYBLOB_FORMAT &format, AppleCSPSession &session, const CssmKey *paramKey, /* optional, unused here */ CSSM_KEYATTR_FLAGS &attrFlags); /* IN/OUT */ /* * This may contain a fully-capable private key, or a public * key with as little as the pub_key field set. */ DH *mDhKey; }; class DHKeyPairGenContext : public AppleCSPContext, private AppleKeyPairGenContext { public: DHKeyPairGenContext( AppleCSPSession &session, const Context &) : AppleCSPContext(session), mGenAttrs(NULL) {} ~DHKeyPairGenContext() { freeGenAttrs(); } // 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); // specified in, and called from, CSPFullPluginSessionÊ- generate parameters void generate( const Context &context, uint32 bitSize, CssmData ¶ms, uint32 &attrCount, Context::Attr * &attrs); /* * Necessary to handle and deflect "context changed" notification which occurs * after the strange return from "generate parameters", when the plugin adds * the "returned" values to the Context. */ bool changed(const Context &context) { return true; } void dhGenParams( uint32 keySizeInBits, unsigned g, // probably should be BIGNUM int privValueLength, // optional NSS_DHParameter &algParams, SecNssCoder &coder); // for temp contents of algParams private: /* gross hack to store attributes "returned" from GenParams */ Context::Attr *mGenAttrs; void freeGenAttrs(); }; /* DHKeyPairGenContext */ /* * CSPKeyInfoProvider for Diffie-Hellman keys */ class DHKeyInfoProvider : public CSPKeyInfoProvider { private: DHKeyInfoProvider( const CssmKey &cssmKey, AppleCSPSession &session); public: static CSPKeyInfoProvider *provider( const CssmKey &cssmKey, AppleCSPSession &session); ~DHKeyInfoProvider() { } void CssmKeyToBinary( CssmKey *paramKey, // optional, ignored here CSSM_KEYATTR_FLAGS &attrFlags, // IN/OUT BinaryKey **binKey); // RETURNED void QueryKeySizeInBits( CSSM_KEY_SIZE &keySize); // RETURNED bool getHashableBlob( CssmAllocator &allocator, CssmData &hashBlob); }; #endif /* _DH_KEYS_H_ */