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