--- /dev/null
+/*
+ * Copyright (c) 2000-2001,2011,2014 Apple 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.
+ */
+
+#ifdef BSAFE_CSP_ENABLE
+
+
+//
+// algmaker - algorithm factory for BSafe 4
+//
+#include "bsafecspi.h"
+#include "bsafecsp.h"
+#include "AppleCSPSession.h"
+
+//
+// BSafe's Chooser table.
+// These are references to all *BSafe algorithms* we use (and thus must link in)
+//
+const B_ALGORITHM_METHOD * const BSafe::bsChooser[] = {
+ // digests
+ &AM_SHA,
+ &AM_MD5,
+ &AM_MD2,
+
+ // organizational
+ &AM_CBC_ENCRYPT,
+ &AM_CBC_DECRYPT,
+ &AM_ECB_ENCRYPT,
+ &AM_ECB_DECRYPT,
+ &AM_OFB_ENCRYPT,
+ &AM_OFB_DECRYPT,
+
+ // DES & variants
+ &AM_DES_ENCRYPT,
+ &AM_DES_DECRYPT,
+ &AM_DESX_ENCRYPT,
+ &AM_DESX_DECRYPT,
+ &AM_DES_EDE_ENCRYPT,
+ &AM_DES_EDE_DECRYPT,
+
+ // RCn stuff
+ &AM_RC2_CBC_ENCRYPT,
+ &AM_RC2_CBC_DECRYPT,
+ &AM_RC2_ENCRYPT,
+ &AM_RC2_DECRYPT,
+ &AM_RC4_ENCRYPT,
+ &AM_RC4_DECRYPT,
+ &AM_RC5_ENCRYPT,
+ &AM_RC5_DECRYPT,
+ &AM_RC5_CBC_ENCRYPT,
+ &AM_RC5_CBC_DECRYPT,
+
+ // RSA
+ &AM_RSA_STRONG_KEY_GEN,
+ &AM_RSA_KEY_GEN,
+ &AM_RSA_CRT_ENCRYPT_BLIND,
+ &AM_RSA_CRT_DECRYPT_BLIND,
+ &AM_RSA_ENCRYPT,
+ &AM_RSA_DECRYPT,
+
+ // DSA
+ &AM_DSA_PARAM_GEN,
+ &AM_DSA_KEY_GEN,
+
+ // signatures
+ &AM_DSA_SIGN,
+ &AM_DSA_VERIFY,
+
+ // random number generation
+ &AM_MD5_RANDOM,
+ &AM_SHA_RANDOM,
+
+ // sentinel
+ (B_ALGORITHM_METHOD *)NULL_PTR
+};
+
+
+//
+// Makers
+//
+template <class Ctx>
+class Maker0 : public BSafe::MakerBase {
+public:
+ Ctx *make(AppleCSPSession &session, const Context &context) const
+ { return new Ctx(session, context); }
+};
+
+template <class Ctx, class Arg>
+class Maker1 : public BSafe::MakerBase {
+ Arg arg;
+public:
+ Maker1(Arg a) : arg(a) { }
+ Ctx *make(AppleCSPSession &session, const Context &context) const
+ { return new Ctx(session, context, arg); }
+};
+
+template <class Ctx, class Arg1, class Arg2>
+class Maker2 : public BSafe::MakerBase {
+ Arg1 arg1; Arg2 arg2;
+public:
+ Maker2(Arg1 a1, Arg2 a2) : arg1(a1), arg2(a2) { }
+ Ctx *make(AppleCSPSession &session, const Context &context) const
+ { return new Ctx(session, context, arg1, arg2); }
+};
+
+template <class Ctx, class Arg1, class Arg2, class Arg3>
+class Maker3 : public BSafe::MakerBase {
+ Arg1 arg1; Arg2 arg2; Arg3 arg3;
+public:
+ Maker3(Arg1 a1, Arg2 a2, Arg3 a3) :
+ arg1(a1), arg2(a2), arg3(a3) { }
+ Ctx *make(AppleCSPSession &session, const Context &context) const
+ { return new Ctx(session, context, arg1, arg2, arg3); }
+};
+
+
+bug_const BSafe::MakerTable BSafe::algorithms[] = {
+ // signing algorithms
+ // constructor args: BSafe algorithm, signature size
+ {
+ CSSM_ALGID_SHA1WithDSA,
+ CSSM_ALGCLASS_SIGNATURE,
+ new Maker2<SigningContext, B_INFO_TYPE, size_t>
+ (AI_DSAWithSHA1, 48) // max size of 48 bytes
+ },
+ {
+ CSSM_ALGID_SHA1WithRSA,
+ CSSM_ALGCLASS_SIGNATURE,
+ new Maker2<SigningContext, B_INFO_TYPE, size_t>
+ (AI_SHA1WithRSAEncryption, 0) // size = RSA key size
+ },
+
+ {
+ CSSM_ALGID_MD5WithRSA,
+ CSSM_ALGCLASS_SIGNATURE,
+ new Maker2<SigningContext, B_INFO_TYPE, size_t>
+ (AI_MD5WithRSAEncryption, 0) // size = RSA key size
+ },
+
+ {
+ CSSM_ALGID_MD2WithRSA,
+ CSSM_ALGCLASS_SIGNATURE,
+ new Maker2<SigningContext, B_INFO_TYPE, size_t>
+ (AI_MD2WithRSAEncryption, 0) // size = RSA key size
+ },
+
+ // MAC algorithms
+ // constructor args: BSafe algorithm, signature size
+ {
+ CSSM_ALGID_SHA1HMAC,
+ CSSM_ALGCLASS_MAC,
+ new Maker2<MacContext, B_INFO_TYPE, size_t>
+ (AI_SHA1, 20)
+ },
+
+ // symmetric key generation
+ // constructor args: min/max key size in bits, mustBeByteSized
+ {
+ CSSM_ALGID_RC2,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (1*8, 128*8, true)
+ },
+ {
+ CSSM_ALGID_RC4,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (1*8, 256*8, true)
+ },
+ {
+ CSSM_ALGID_RC5,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (1*8, 255*8, true)
+ },
+ {
+ CSSM_ALGID_DES,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (64, 64, true)
+ },
+ {
+ CSSM_ALGID_DESX,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (192, 192, true)
+ },
+ {
+ CSSM_ALGID_3DES_3KEY,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (192, 192, true)
+ },
+ {
+ CSSM_ALGID_SHA1HMAC,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker3<SymmetricKeyGenContext, uint32, uint32, bool>
+ (160, 2048, true)
+ },
+
+ // symmetric encryption algorithms
+ // constructor arg: block size (1 ==> stream cipher)
+ {
+ CSSM_ALGID_DES,
+ CSSM_ALGCLASS_SYMMETRIC,
+ new Maker1<BlockCipherContext, size_t>(8)
+ },
+ {
+ CSSM_ALGID_DESX,
+ CSSM_ALGCLASS_SYMMETRIC,
+ new Maker1<BlockCipherContext, size_t>(8)
+ },
+ {
+ CSSM_ALGID_3DES_3KEY_EDE,
+ CSSM_ALGCLASS_SYMMETRIC,
+ new Maker1<BlockCipherContext, size_t>(8)
+ },
+ {
+ CSSM_ALGID_RC2,
+ CSSM_ALGCLASS_SYMMETRIC,
+ new Maker1<BlockCipherContext, size_t>(8)
+ },
+ {
+ CSSM_ALGID_RC4,
+ CSSM_ALGCLASS_SYMMETRIC,
+ new Maker1<BlockCipherContext, size_t>(1)
+ },
+ {
+ CSSM_ALGID_RC5,
+ CSSM_ALGCLASS_SYMMETRIC,
+ new Maker1<BlockCipherContext, size_t>(8)
+ },
+
+ // asymmetric encryption algorithms
+ {
+ CSSM_ALGID_RSA,
+ CSSM_ALGCLASS_ASYMMETRIC,
+ new Maker0<PublicKeyCipherContext>()
+ },
+ {
+ CSSM_ALGID_DSA,
+ CSSM_ALGCLASS_ASYMMETRIC,
+ new Maker0<PublicKeyCipherContext>()
+ },
+
+ // key pair generate algorithms
+ {
+ CSSM_ALGID_RSA,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker0<BSafeKeyPairGenContext>()
+ },
+ {
+ CSSM_ALGID_DSA,
+ CSSM_ALGCLASS_KEYGEN,
+ new Maker0<BSafeKeyPairGenContext>()
+ },
+
+ // pseudo-random number generators
+ {
+ CSSM_ALGID_MD5Random,
+ CSSM_ALGCLASS_RANDOMGEN,
+ new Maker1<RandomContext, B_INFO_TYPE>(AI_MD5Random)
+ },
+ {
+ CSSM_ALGID_SHARandom,
+ CSSM_ALGCLASS_RANDOMGEN,
+ new Maker1<RandomContext, B_INFO_TYPE>(AI_SHA1Random)
+ },
+};
+
+const unsigned int BSafe::algorithmCount = sizeof(algorithms) / sizeof(algorithms[0]);
+
+
+//
+// BSafeFactory hookup
+//
+void BSafeFactory::setNormAllocator(Allocator *alloc)
+{
+ BSafe::setNormAllocator(alloc);
+}
+void BSafeFactory::setPrivAllocator(Allocator *alloc)
+{
+ BSafe::setPrivAllocator(alloc);
+}
+
+bool BSafeFactory::setup(
+ AppleCSPSession &session,
+ CSPFullPluginSession::CSPContext * &cspCtx,
+ const Context &context)
+{
+ return BSafe::setup(session, cspCtx, context);
+}
+
+
+//
+// Algorithm setup
+//
+bool BSafe::setup(
+ AppleCSPSession &session,
+ CSPFullPluginSession::CSPContext * &cspCtx,
+ const Context &context)
+{
+ for (const BSafe::MakerTable *alg = algorithms;
+ alg < algorithms + algorithmCount;
+ alg++) {
+ if ((alg->algorithmId == context.algorithm()) &&
+ (alg->algClass == context.type())) {
+ if(cspCtx != NULL) {
+ /* we allow reuse */
+ return true;
+ }
+ // make new context
+ cspCtx = alg->maker->make(session, context);
+ return true;
+ }
+ }
+ /* not ours */
+ return false;
+}
+#endif /* BSAFE_CSP_ENABLE */