1 module tomcrypt.custom;
2
3 import core.stdc.stdlib;
4 import core.stdc..string;
5 import core.sys.posix.time;
6
7 /* macros for various libc functions you can change for embedded targets */
8 //#ifndef XMALLOC
9 // #ifdef malloc
10 // #define LTC_NO_PROTOTYPES
11 // #endif
12 //#define XMALLOC malloc
13 //#endif
14 alias XMALLOC = malloc;
15
16 //#ifndef XREALLOC
17 // #ifdef realloc
18 // #define LTC_NO_PROTOTYPES
19 // #endif
20 //#define XREALLOC realloc
21 //#endif
22 alias XREALLOC = realloc;
23
24 //#ifndef XCALLOC
25 // #ifdef calloc
26 // #define LTC_NO_PROTOTYPES
27 // #endif
28 //#define XCALLOC calloc
29 //#endif
30 alias XCALLOC = calloc;
31
32 //#ifndef XFREE
33 // #ifdef free
34 // #define LTC_NO_PROTOTYPES
35 // #endif
36 //#define XFREE free
37 //#endif
38 alias XFREE = free;
39
40 //#ifndef XMEMSET
41 // #ifdef memset
42 // #define LTC_NO_PROTOTYPES
43 // #endif
44 //#define XMEMSET memset
45 //#endif
46 alias XMEMSET = memset;
47
48 //#ifndef XMEMCPY
49 // #ifdef memcpy
50 // #define LTC_NO_PROTOTYPES
51 // #endif
52 //#define XMEMCPY memcpy
53 //#endif
54 alias XMEMCPY = memcpy;
55
56 //#ifndef XMEMCMP
57 // #ifdef memcmp
58 // #define LTC_NO_PROTOTYPES
59 // #endif
60 //#define XMEMCMP memcmp
61 //#endif
62 alias XMEMCMP = memcmp;
63
64 //#ifndef XSTRCMP
65 // #ifdef strcmp
66 // #define LTC_NO_PROTOTYPES
67 // #endif
68 //#define XSTRCMP strcmp
69 //#endif
70 alias XSTRCMP = strcmp;
71
72 //#ifndef XCLOCK
73 //#define XCLOCK clock
74 //#endif
75 alias XCLOCK = clock;
76
77 //#ifndef XCLOCKS_PER_SEC
78 //#define XCLOCKS_PER_SEC CLOCKS_PER_SEC
79 //#endif
80 alias XCLOCKS_PER_SEC = CLOCKS_PER_SEC;
81
82 //#ifndef XQSORT
83 // #ifdef qsort
84 // #define LTC_NO_PROTOTYPES
85 // #endif
86 //#define XQSORT qsort
87 //#endif
88 alias XQSORT = qsort;
89
90 /* Easy button? */
91 version(LTC_EASY)
92 {
93 version = LTC_NO_CIPHERS;
94 version = LTC_RIJNDAEL;
95 version = LTC_BLOWFISH;
96 version = LTC_DES;
97 version = LTC_CAST5;
98
99 version = LTC_NO_MODES;
100 version = LTC_ECB_MODE;
101 version = LTC_CBC_MODE;
102 version = LTC_CTR_MODE;
103
104 version = LTC_NO_HASHES;
105 version = LTC_SHA1;
106 version = LTC_SHA512;
107 version = LTC_SHA384;
108 version = LTC_SHA256;
109 version = LTC_SHA224;
110
111 version = LTC_NO_MACS;
112 version = LTC_HMAC;
113 version = LTC_OMAC;
114 version = LTC_CCM_MODE;
115
116 version = LTC_NO_PRNGS;
117 version = LTC_SPRNG;
118 version = LTC_YARROW;
119 version = LTC_DEVRANDOM;
120 version = TRY_URANDOM_FIRST;
121
122 version = LTC_NO_PK;
123 version = LTC_MRSA;
124 version = LTC_MECC;
125 }
126
127 /* Use small code where possible */
128 /* version = LTC_SMALL_CODE; */
129
130 /* Enable self-test test vector checking */
131 version(LTC_NO_TEST) {}
132 else
133 {
134 version = LTC_TEST;
135 }
136
137 /* clean the stack of functions which put private information on stack */
138 /* version = LTC_CLEAN_STACK; */
139
140 /* disable all file related functions */
141 /* version = LTC_NO_FILE; */
142
143 /* disable all forms of ASM */
144 /* version = LTC_NO_ASM; */
145
146 /* disable FAST mode */
147 /* version = LTC_NO_FAST; */
148
149 /* disable BSWAP on x86 */
150 /* version = LTC_NO_BSWAP; */
151
152 /* ---> Symmetric Block Ciphers <--- */
153 version(LTC_NO_CIPHERS) {}
154 else
155 {
156 version = LTC_BLOWFISH;
157 version = LTC_RC2;
158 version = LTC_RC5;
159 version = LTC_RC6;
160 version = LTC_SAFERP;
161 version = LTC_RIJNDAEL;
162 version = LTC_XTEA;
163
164 /* _TABLES tells it to use tables during setup, _SMALL means to use the smaller scheduled key format
165 * (saves 4KB of ram), _ALL_TABLES enables all tables during setup */
166 version = LTC_TWOFISH;
167
168 version(LTC_NO_TABLES)
169 {
170 version = LTC_TWOFISH_SMALL;
171 }
172 else
173 {
174 version = LTC_TWOFISH_TABLES;
175 /* version = LTC_TWOFISH_ALL_TABLES; */
176 }
177
178 /* version = LTC_TWOFISH_SMALL; */
179 /* LTC_DES includes EDE triple-LTC_DES */
180 version = LTC_DES;
181 version = LTC_CAST5;
182 version = LTC_NOEKEON;
183 version = LTC_SKIPJACK;
184 version = LTC_SAFER;
185 version = LTC_KHAZAD;
186 version = LTC_ANUBIS;
187 version = LTC_ANUBIS_TWEAK;
188 version = LTC_KSEED;
189 version = LTC_KASUMI;
190 }
191
192 /* ---> Block Cipher Modes of Operation <--- */
193 version(LTC_NO_MODES) {}
194 else
195 {
196 version = LTC_CFB_MODE;
197 version = LTC_OFB_MODE;
198 version = LTC_ECB_MODE;
199 version = LTC_CBC_MODE;
200 version = LTC_CTR_MODE;
201
202 /* F8 chaining mode */
203 version = LTC_F8_MODE;
204
205 /* LRW mode */
206 version = LTC_LRW_MODE;
207 version(LTC_NO_TABLES) {}
208 else
209 {
210 /* like GCM mode this will enable 16 8x128 tables [64KB] that make
211 * seeking very fast.
212 */
213 version = LRW_TABLES;
214 }
215
216 /* XTS mode */
217 version = LTC_XTS_MODE;
218 }
219
220 /* ---> One-Way Hash Functions <--- */
221 version(LTC_NO_HASHES) {}
222 else
223 {
224 version = LTC_CHC_HASH;
225 version = LTC_WHIRLPOOL;
226 version = LTC_SHA512;
227 version = LTC_SHA384;
228 version = LTC_SHA256;
229 version = LTC_SHA224;
230 version = LTC_TIGER;
231 version = LTC_SHA1;
232 version = LTC_MD5;
233 version = LTC_MD4;
234 version = LTC_MD2;
235 version = LTC_RIPEMD128;
236 version = LTC_RIPEMD160;
237 version = LTC_RIPEMD256;
238 version = LTC_RIPEMD320;
239 }
240
241 /* ---> MAC functions <--- */
242 version(LTC_NO_MACS) {}
243 else
244 {
245 version = LTC_HMAC;
246 version = LTC_OMAC;
247 version = LTC_PMAC;
248 version = LTC_XCBC;
249 version = LTC_F9_MODE;
250 version = LTC_PELICAN;
251
252 version(LTC_PELICAN)
253 {
254 version(LTC_RIJNDAEL) {}
255 else
256 {
257 pragma(error, "Pelican-MAC requires LTC_RIJNDAEL");
258 }
259 }
260
261 /* ---> Encrypt + Authenticate Modes <--- */
262
263 version = LTC_EAX_MODE;
264 version(LTC_EAX_MODE)
265 {
266 version(LTC_CTR_MODE) {}
267 else
268 {
269 pragma(error, "LTC_EAX_MODE requires CTR and LTC_OMAC mode");
270 }
271
272 version(LTC_OMAC) {}
273 else
274 {
275 pragma(error, "LTC_EAX_MODE requires CTR and LTC_OMAC mode");
276 }
277 }
278
279 version = LTC_OCB_MODE;
280 version = LTC_CCM_MODE;
281 version = LTC_GCM_MODE;
282
283 /* Use 64KiB tables */
284 version(LTC_NO_TABLES) {}
285 else
286 {
287 version = LTC_GCM_TABLES;
288 }
289
290 /* USE SSE2? requires GCC works on x86_32 and x86_64*/
291 version(LTC_GCM_TABLES)
292 {
293 /* version = LTC_GCM_TABLES_SSE2; */
294 }
295 }
296
297 /* Various tidbits of modern neatoness */
298 version = LTC_BASE64;
299
300 /* --> Pseudo Random Number Generators <--- */
301 version (LTC_NO_PRNGS) {}
302 else
303 {
304 /* Yarrow */
305 version = LTC_YARROW;
306 /* which descriptor of AES to use? */
307 /* 0 = rijndael_enc 1 = aes_enc, 2 = rijndael [full], 3 = aes [full] */
308 enum LTC_YARROW_AES = 0;
309
310 version(LTC_YARROW)
311 {
312 version(LTC_CTR_MODE) {}
313 else
314 {
315 pragma(error, "LTC_YARROW requires LTC_CTR_MODE chaining mode to be defined!");
316 }
317 }
318
319 /* a PRNG that simply reads from an available system source */
320 version = LTC_SPRNG;
321
322 /* The LTC_RC4 stream cipher */
323 version = LTC_RC4;
324
325 /* Fortuna PRNG */
326 version = LTC_FORTUNA;
327 /* reseed every N calls to the read function */
328 enum LTC_FORTUNA_WD = 10;
329 /* number of pools (4..32) can save a bit of ram by lowering the count */
330 enum LTC_FORTUNA_POOLS = 32;
331
332 /* Greg's LTC_SOBER128 PRNG ;-0 */
333 version = LTC_SOBER128;
334
335 /* the *nix style /dev/random device */
336 version = LTC_DEVRANDOM;
337 /* try /dev/urandom before trying /dev/random */
338 version = TRY_URANDOM_FIRST;
339 }
340
341 /* ---> math provider? <--- */
342 version(LTC_NO_MATH) {}
343 else
344 {
345 /* LibTomMath */
346 /* version = LTM_LTC_DESC; */
347
348 /* TomsFastMath */
349 /* version = TFM_LTC_DESC; */
350 }
351
352 /* ---> Public Key Crypto <--- */
353 version(LTC_NO_PK) {}
354 else
355 {
356 /* Include RSA support */
357 version = LTC_MRSA;
358
359 /* Include Katja (a Rabin variant like RSA) */
360 /* version = MKAT; */
361
362 /* Digital Signature Algorithm */
363 version = LTC_MDSA;
364
365 /* ECC */
366 version = LTC_MECC;
367
368 /* use Shamir's trick for point mul (speeds up signature verification) */
369 version = LTC_ECC_SHAMIR;
370
371 version(TFM_LTC_DESC)
372 {
373 version(LTC_MECC)
374 {
375 version = LTC_MECC_ACCEL;
376 }
377 }
378
379 /* do we want fixed point ECC */
380 /* version = LTC_MECC_FP; */
381
382 /* Timing Resistant? */
383 /* version = LTC_ECC_TIMING_RESISTANT; */
384 }
385
386 /* LTC_PKCS #1 (RSA) and #5 (Password Handling) stuff */
387 version(LTC_NO_PKCS) {}
388 else
389 {
390 version = LTC_PKCS_1;
391 version = LTC_PKCS_5;
392
393 /* Include ASN.1 DER (required by DSA/RSA) */
394 version = LTC_DER;
395 }
396
397 /* cleanup */
398
399 version(LTC_MECC)
400 {
401 /* Supported ECC Key Sizes */
402 version(LTC_NO_CURVES) {}
403 else
404 {
405 version = ECC112;
406 version = ECC128;
407 version = ECC160;
408 version = ECC192;
409 version = ECC224;
410 version = ECC256;
411 version = ECC384;
412 version = ECC521;
413 }
414 }
415
416 /* Include the MPI functionality? (required by the PK algorithms) */
417 version(LTC_MECC) version = MPI;
418 version(LTC_MRSA) version = MPI;
419 version(LTC_MDSA) version = MPI;
420 version(MKATJA) version = MPI;
421
422 version(LTC_MRSA)
423 {
424 version = LTC_PKCS_1;
425 }
426
427 version(LTC_DER)
428 {
429 version(MPI) {}
430 else
431 {
432 pragma(error, "ASN.1 DER requires MPI functionality");
433 }
434 }
435
436 version(LTC_MDSA) {version(LTC_DER) {} else pragma(error, "PK requires ASN.1 DER functionality, make sure LTC_DER is enabled");}
437 version(LTC_MRSA) {version(LTC_DER) {} else pragma(error, "PK requires ASN.1 DER functionality, make sure LTC_DER is enabled");}
438 version(LTC_MECC) {version(LTC_DER) {} else pragma(error, "PK requires ASN.1 DER functionality, make sure LTC_DER is enabled");}
439 version(MKATJA) {version(LTC_DER) {} else pragma(error, "PK requires ASN.1 DER functionality, make sure LTC_DER is enabled");}
440
441 /* THREAD management */
442 version(LTC_PTHREAD)
443 {
444 import core.sys.posix.pthread;
445
446 string LTC_MUTEX_GLOBAL(string x) {return "pthread_mutex_t "~x~" = PTHREAD_MUTEX_INITIALIZER;";}
447 string LTC_MUTEX_PROTO(string x) {return "extern pthread_mutex_t "~x~";";}
448 string LTC_MUTEX_TYPE(string x) {return "pthread_mutex_t "~x~";";}
449 void LTC_MUTEX_INIT(pthread_mutex_t x) { pthread_mutex_init(x, null); }
450 alias LTC_MUTEX_LOCK = pthread_mutex_lock;
451 alias LTC_MUTEX_UNLOCK = pthread_mutex_unlock;
452 }
453 else
454 {
455 void tcl_nothing(T...)(T args) {}
456
457 /* default no functions */
458 string LTC_MUTEX_GLOBAL(string x) {return "";}
459 string LTC_MUTEX_PROTO(string x) {return "";}
460 string LTC_MUTEX_TYPE(string x) {return "";}
461 alias LTC_MUTEX_INIT = tcl_nothing;
462 alias LTC_MUTEX_LOCK = tcl_nothing;
463 alias LTC_MUTEX_UNLOCK = tcl_nothing;
464 }
465
466 /* Debuggers */
467
468 /* define this if you use Valgrind, note: it CHANGES the way SOBER-128 and LTC_RC4 work (see the code) */
469 /* version = LTC_VALGRIND; */
470
471 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_custom.h,v $ */
472 /* $Revision: 1.73 $ */
473 /* $Date: 2007/05/12 14:37:41 $ */