2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 // miscAlgFactory.h - miscellaneous algorithm factory
21 // Written by Doug Mitchell 3/28/2001
24 #include "miscAlgFactory.h"
25 #include <AES/aescspi.h>
26 #include <AES/gladmanContext.h>
27 #include "desContext.h"
28 #include "rc2Context.h"
29 #include "rc4Context.h"
30 #include "rc5Context.h"
31 #include "MacContext.h"
32 #include "DigestContext.h"
33 #include "SHA1_MD5_Object.h" /* raw digest */
34 #include "MD2Object.h"
35 #include "NullCryptor.h"
36 #include <Security/cssmapple.h>
39 * These #defines are mainly to facilitate measuring the performance of our own
40 * implementation vs. the ones in BSafe. This factory gets called first; if
41 * we disable e.g. DES here the BSAFE version will be used.
43 #ifdef BSAFE_CSP_ENABLE
45 #define MAF_DES_ENABLE 0
46 #define MAF_DES3_ENABLE 0
47 #define MAF_RC2_ENABLE 0
48 #define MAF_RC4_ENABLE 0
49 #define MAF_RC5_ENABLE 0
50 #define MAF_MAC_ENABLE 0
52 #else /* !BSAFE_CSP_ENABLE, normal case */
54 #define MAF_DES_ENABLE 1
55 #define MAF_DES3_ENABLE 1
56 #define MAF_RC2_ENABLE 1
57 #define MAF_RC4_ENABLE 1
58 #define MAF_RC5_ENABLE 1
59 #define MAF_MAC_ENABLE 1
61 #endif /* BSAFE_CSP_ENABLE */
63 #if (!MAF_DES_ENABLE || !MAF_DES3_ENABLE || !MAF_RC2_ENABLE || !MAF_RC4_ENABLE || \
64 !MAF_RC5_ENABLE || !MAF_MAC_ENABLE)
65 #warning Internal DES/RC2/RC4/RC5/Mac implementation disabled!
68 bool MiscAlgFactory::setup(
69 AppleCSPSession
&session
,
70 CSPFullPluginSession::CSPContext
* &cspCtx
,
71 const Context
&context
)
73 CSSM_CONTEXT_TYPE ctype
= context
.type();
74 CSSM_ALGORITHMS alg
= context
.algorithm();
77 case CSSM_ALGCLASS_SYMMETRIC
:
82 * Get optional block size to determine correct implementation
84 uint32 blockSize
= context
.getInt(CSSM_ATTRIBUTE_BLOCK_SIZE
);
86 blockSize
= GLADMAN_BLOCK_SIZE_BYTES
;
88 if(GLADMAN_AES_128_ENABLE
&&
89 (blockSize
== GLADMAN_BLOCK_SIZE_BYTES
)) {
90 cspCtx
= new GAESContext(session
);
93 cspCtx
= new AESContext(session
);
101 cspCtx
= new DESContext(session
);
104 #endif /* MAF_DES_ENABLE */
108 * TripleDES: for some reason, cssmtype.h defines different symbols
109 * for CSSM_ALGID_3DES_3KEY (key gen) and CSSM_ALGID_3DES_3KEY_EDE
110 * (an encrypt alg with mode), but they define to the same value.
112 case CSSM_ALGID_3DES_3KEY_EDE
:
114 cspCtx
= new DES3Context(session
);
122 cspCtx
= new RC2Context(session
);
130 cspCtx
= new RC4Context(session
);
138 cspCtx
= new RC5Context(session
);
143 #if NULL_CRYPT_ENABLE
144 case CSSM_ALGID_NONE
:
146 cspCtx
= new NullCryptor(session
);
149 #endif /* NULL_CRYPT_ENABLE */
152 break; // not our symmetric alg
153 } // switch alg for symmetric
154 break; // from case CSSM_ALGCLASS_SYMMETRIC
156 /* digest algorithms always enabled here */
157 case CSSM_ALGCLASS_DIGEST
:
159 case CSSM_ALGID_SHA1
:
162 cspCtx
= new DigestContext(session
,
169 cspCtx
= new DigestContext(session
,
176 cspCtx
= new DigestContext(session
,
181 break; // not our digest alg
182 } // switch digest alg
183 break; // from case CSSM_ALGCLASS_DIGEST
185 case CSSM_ALGCLASS_KEYGEN
:
189 cspCtx
= new AESKeyGenContext(session
);
196 cspCtx
= new AppleSymmKeyGenerator(session
,
197 DES_KEY_SIZE_BITS_EXTERNAL
,
198 DES_KEY_SIZE_BITS_EXTERNAL
,
199 true); // must be byte size
202 #endif /* MAF_DES_ENABLE */
205 case CSSM_ALGID_3DES_3KEY_EDE
:
207 cspCtx
= new AppleSymmKeyGenerator(session
,
208 DES3_KEY_SIZE_BYTES
* 8,
209 DES3_KEY_SIZE_BYTES
* 8,
210 true); // must be byte size
218 cspCtx
= new AppleSymmKeyGenerator(session
,
219 RC2_MIN_KEY_SIZE_BYTES
* 8,
220 RC2_MAX_KEY_SIZE_BYTES
* 8,
221 true); // must be byte size
229 cspCtx
= new AppleSymmKeyGenerator(session
,
230 RC4_MIN_KEY_SIZE_BYTES
* 8,
231 RC4_MAX_KEY_SIZE_BYTES
* 8,
232 true); // must be byte size
240 cspCtx
= new AppleSymmKeyGenerator(session
,
241 RC5_MIN_KEY_SIZE_BYTES
* 8,
242 RC5_MAX_KEY_SIZE_BYTES
* 8,
243 true); // must be byte size
249 case CSSM_ALGID_SHA1HMAC
:
251 cspCtx
= new AppleSymmKeyGenerator(session
,
252 HMAC_SHA_MIN_KEY_SIZE
* 8,
253 HMAC_MAX_KEY_SIZE
* 8,
254 true); // must be byte size
257 case CSSM_ALGID_MD5HMAC
:
259 cspCtx
= new AppleSymmKeyGenerator(session
,
260 HMAC_MD5_MIN_KEY_SIZE
* 8,
261 HMAC_MAX_KEY_SIZE
* 8,
262 true); // must be byte size
267 #if NULL_CRYPT_ENABLE
268 case CSSM_ALGID_NONE
:
270 cspCtx
= new AppleSymmKeyGenerator(session
,
271 NULL_CRYPT_BLOCK_SIZE
* 8,
272 NULL_CRYPT_BLOCK_SIZE
* 8,
273 true); // must be byte size
276 #endif /* NULL_CRYPT_ENABLE */
279 break; // not our keygen alg
280 } // switch alg for keygen
281 break; // from case CSSM_ALGCLASS_KEYGEN
283 case CSSM_ALGCLASS_MAC
:
286 case CSSM_ALGID_SHA1HMAC
:
287 case CSSM_ALGID_MD5HMAC
:
289 cspCtx
= new MacContext(session
, alg
);
293 #if CRYPTKIT_CSP_ENABLE
294 case CSSM_ALGID_SHA1HMAC_LEGACY
:
296 cspCtx
= new MacLegacyContext(session
, alg
);
301 /* not our mac alg */
307 break; // not our context type
308 } // switch context type