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 $ */