1 /**
2 * Compile-time constants for conditional compilation
3 * 
4 * Copyright:
5 * (C) 2014-2015 Jack Lloyd
6 * (C) 2014-2015 Etienne Cimon
7 *
8 * License:
9 * Botan is released under the Simplified BSD License (see LICENSE.md)
10 */
11 module botan.constants;
12 
13 public import botan_math.mp_types;
14 enum LogLevel = Debug;
15 
16 enum SKIP_TRANSFORM_TEST = false;
17 enum SKIP_X509_TEST = false;
18 enum SKIP_BLOCK_TEST = false;
19 enum SKIP_CVC_TEST = false; // TODO: EAC11 ECDSA Key decoding
20 enum SKIP_CRYPTOBOX_TEST = false;
21 enum SKIP_RFC3394_TEST = false;
22 enum SKIP_TSS_TEST = false;
23 enum SKIP_HASH_TEST = false;
24 enum SKIP_KDF_TEST = false;
25 enum SKIP_COMPRESSION_TEST = false;
26 enum SKIP_MAC_TEST = false;
27 enum SKIP_BIGINT_TEST = false;
28 enum SKIP_EC_GFP_TEST = false;
29 enum SKIP_AEAD_TEST = false;
30 enum SKIP_OCB_TEST = false;
31 enum SKIP_CIPHER_MODE_TEST = false;
32 enum SKIP_BCRYPT_TEST = false;
33 enum SKIP_PASSHASH9_TEST = false;
34 enum SKIP_PBKDF_TEST = false;
35 enum SKIP_HKDF_TEST = false;
36 enum SKIP_CURVE25519_TEST = false;
37 enum SKIP_DH_TEST = false;
38 enum SKIP_DLIES_TEST = false;
39 enum SKIP_DSA_TEST = false;
40 enum SKIP_ECDH_TEST = false;
41 enum SKIP_ECDSA_TEST = false;
42 enum SKIP_ELGAMAL_TEST = false;
43 enum SKIP_GOST_TEST = false;
44 enum SKIP_NR_TEST = false;
45 enum SKIP_RFC6979_TEST = false;
46 enum SKIP_RSA_TEST = false;
47 enum SKIP_RW_TEST = false;
48 enum SKIP_X509_KEY_TEST = false;
49 enum SKIP_RNG_TEST = false;
50 enum SKIP_STREAM_CIPHER_TEST = false;
51 enum SKIP_TLS_TEST = false;
52 
53 version(CanTest)     {    enum BOTAN_HAS_TESTS = true;                                                         }
54 else                      enum BOTAN_HAS_TESTS = false;
55 
56 
57 // This indicates the corresponding Botan (C++) version numbers
58 enum BOTAN_VERSION_MAJOR = 1;
59 enum BOTAN_VERSION_MINOR = 12;
60 enum BOTAN_VERSION_PATCH = 3;
61 enum BOTAN_VERSION_DATESTAMP = 20151109;
62 enum BOTAN_VERSION_RELEASE_TYPE = "unreleased";
63 enum BOTAN_VERSION_VC_REVISION = "git:6661c489929afc6c83c3038518dc37fd58938f3a";
64 enum BOTAN_DISTRIBUTION_INFO = "unspecified";
65 
66 enum BOTAN_TARGET_CPU_HAS_KNOWN_ENDIANNESS = true;
67 enum BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK = true;
68 enum BOTAN_TARGET_HAS_NATIVE_UINT128 = false;
69 enum DEFAULT_BUFFERSIZE = 4096;
70 enum TLS_DEFAULT_BUFFERSIZE = 4096;
71 
72 enum BOTAN_MEM_POOL_CHUNK_SIZE = 64*1024;
73 enum BOTAN_BLOCK_CIPHER_PAR_MULT = 4;
74 
75 enum BOTAN_KARAT_MUL_THRESHOLD = 32;
76 enum BOTAN_KARAT_SQR_THRESHOLD = 32;
77 enum BOTAN_RNG_MAX_OUTPUT_BEFORE_RESEED = 512;
78 enum BOTAN_RNG_RESEED_POLL_BITS = 128;
79 
80 // todo: Make version specifiers for the below constants
81 enum BOTAN_HAS_CIPHER_MODE_PADDING = true;
82 enum BOTAN_HAS_AUTO_SEEDING_RNG = true;
83 enum BOTAN_HAS_CODEC_FILTERS = true;
84 enum BOTAN_HAS_HKDF = true;
85 
86 version (unittest)     enum BOTAN_TEST = true;
87 else                   enum BOTAN_TEST = false;
88 
89 version(D_InlineAsm_X86) {    enum BOTAN_HAS_DMD_X86_INLINE_ASM = true;                                                  
90                               enum BOTAN_HAS_DMD_X86_64_INLINE_ASM = false;                                              }
91 else version(D_InlineAsm_X86_64){  enum BOTAN_HAS_DMD_X86_INLINE_ASM = false; 
92                               enum BOTAN_HAS_DMD_X86_64_INLINE_ASM = true;                                               }
93 else                     {    enum BOTAN_HAS_DMD_X86_INLINE_ASM = false;
94                               enum BOTAN_HAS_DMD_X86_64_INLINE_ASM = false;                                              }
95 
96 version(FORCE_SSE4)      {    enum BOTAN_FORCE_SSE4 = true;                                                              }
97 else                          enum BOTAN_FORCE_SSE4 = false;
98 version(SIMD_SSE2)       {    enum BOTAN_HAS_SIMD_SSE2 = true;          static assert(BOTAN_HAS_SIMD);                   }
99 else                          enum BOTAN_HAS_SIMD_SSE2 = false;
100 version(SIMD_Altivec)    {    static if (BOTAN_TARGET_CPU_IS_PPC_FAMILY) 
101                                   enum BOTAN_HAS_SIMD_ALTIVEC = true;
102                               else enum BOTAN_HAS_SIMD_ALTIVEC = false;                                                  }
103 else                              enum BOTAN_HAS_SIMD_ALTIVEC = false;
104 version(SIMD_Scalar)     {    enum BOTAN_HAS_SIMD_SCALAR = true;                                                         }
105 else                          enum BOTAN_HAS_SIMD_SCALAR = false;
106 
107 static if (BOTAN_HAS_SIMD_SCALAR || BOTAN_HAS_SIMD_ALTIVEC || BOTAN_HAS_SIMD_SSE2)
108     enum BOTAN_HAS_SIMD_OPS = true;
109 else
110     enum BOTAN_HAS_SIMD_OPS = false;
111 
112 static if (BOTAN_HAS_X86_ARCH && BOTAN_HAS_SIMD_SSE2) pragma(msg, "Error: SIMD_SSE2 cannot be enabled on x86 architecture.");
113 
114 version(No_SSE_Intrinsics){   enum BOTAN_NO_SSE_INTRINSICS = true;      static assert(!BOTAN_HAS_SIMD_SSE2);             }
115 else                          enum BOTAN_NO_SSE_INTRINSICS = false;
116 
117 version(Bench)           {    enum BOTAN_HAS_BENCHMARK = true;                                                           }
118 else                          enum BOTAN_HAS_BENCHMARK = false;
119 
120 version(Self_Tests)      {    enum BOTAN_HAS_SELFTESTS = true;                                                           }
121 else                           enum BOTAN_HAS_SELFTESTS = false;
122 version(RT_Test)         {    enum BOTAN_PUBLIC_KEY_STRONG_CHECKS_ON_LOAD = true;                                        }
123 else                          enum BOTAN_PUBLIC_KEY_STRONG_CHECKS_ON_LOAD = false;
124 version(RT_Test_Priv)    {    enum BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_LOAD = true;                                       }
125 else                          enum BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_LOAD = false;
126 version(RT_Test_Priv_Gen){    enum BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE = true;                                   }
127 else                          enum BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE = false;
128 version(PUBKEY)          {    enum BOTAN_HAS_PUBLIC_KEY_CRYPTO = true;                                                   }
129 else                          enum BOTAN_HAS_PUBLIC_KEY_CRYPTO = false;
130 version(TLS)             {    enum BOTAN_HAS_TLS = true;                                                                 }
131 else                          enum BOTAN_HAS_TLS = false;
132 version(X509)            {    enum BOTAN_HAS_X509_CERTIFICATES = true;                                                   }
133 else                          enum BOTAN_HAS_X509_CERTIFICATES = false;
134 version(CVC)             {    enum BOTAN_HAS_CARD_VERIFIABLE_CERTIFICATES = true;                                        }
135 else                          enum BOTAN_HAS_CARD_VERIFIABLE_CERTIFICATES = false;
136 version(SQLite)          {    enum BOTAN_HAS_SQLITE = true;                                                              }
137 else                          enum BOTAN_HAS_SQLITE = false;
138 version(AONT)            {    enum BOTAN_HAS_AONT = true;                                                                }
139 else                          enum BOTAN_HAS_AONT = false;
140 version(CryptoBox)       {    enum BOTAN_HAS_CRYPTOBOX = true;                                                           }
141 else                          enum BOTAN_HAS_CRYPTOBOX = false;
142 version(CryptoBox_PSK)   {    enum BOTAN_HAS_CRYPTOBOX_PSK = true;                                                       }
143 else                          enum BOTAN_HAS_CRYPTOBOX_PSK = false;
144 version(FPE_FE1)         {    enum BOTAN_HAS_FPE_FE1 = true;                                                             }
145 else                          enum BOTAN_HAS_FPE_FE1 = false;
146 version(RFC3394)         {    enum BOTAN_HAS_RFC3394_KEYWRAP = true;                                                     }
147 else                          enum BOTAN_HAS_RFC3394_KEYWRAP = false;
148 version(PassHash9)       {    enum BOTAN_HAS_PASSHASH9 = true;                                                           }
149 else                          enum BOTAN_HAS_PASSHASH9 = false;
150 version(BCrypt)          {    enum BOTAN_HAS_BCRYPT = true;                                                              }
151 else                          enum BOTAN_HAS_BCRYPT = false;
152 version(SRP6)            {    enum BOTAN_HAS_SRP6 = true;                                                                }
153 else                          enum BOTAN_HAS_SRP6 = false;
154 version(TSS)             {    enum BOTAN_HAS_THRESHOLD_SECRET_SHARING = true;                                            }
155 else                          enum BOTAN_HAS_THRESHOLD_SECRET_SHARING = false;
156 version(KDF1)            {    enum BOTAN_HAS_KDF1 = true;                                                                }
157 else                          enum BOTAN_HAS_KDF1 = false;
158 version(KDF2)            {    enum BOTAN_HAS_KDF2 = true;                                                                }
159 else                          enum BOTAN_HAS_KDF2 = false;
160 version(X942_PRF)        {    enum BOTAN_HAS_X942_PRF = true;                                                            }
161 else                          enum BOTAN_HAS_X942_PRF = false;
162 version(SSL_V3_PRF)      {    enum BOTAN_HAS_SSL_V3_PRF = true;                                                          }
163 else                          enum BOTAN_HAS_SSL_V3_PRF = false;
164 version(TLS_V10_PRF)     {    enum BOTAN_HAS_TLS_V10_PRF = true;                                                         }
165 else                          enum BOTAN_HAS_TLS_V10_PRF = false;
166 version(TLS_V12_PRF)     {    enum BOTAN_HAS_TLS_V12_PRF = true;                                                         }
167 else                          enum BOTAN_HAS_TLS_V12_PRF = false;
168 version(AES_NI)          {    enum BOTAN_HAS_AES_NI = true;            static assert(BOTAN_HAS_SIMD);                    }
169 else                          enum BOTAN_HAS_AES_NI = false;
170 version(Serpent_x86_32)  {    enum BOTAN_HAS_SERPENT_X86_32 = true;    static assert(BOTAN_HAS_X86_ARCH, ERR_ARCH);      }
171 else                          enum BOTAN_HAS_SERPENT_X86_32 = false;
172 version(MD4_x86_32)      {    enum BOTAN_HAS_MD4_X86_32 = true;        static assert(BOTAN_HAS_X86_ARCH, ERR_ARCH);      }
173 else                          enum BOTAN_HAS_MD4_X86_32 = false;
174 version(MD5_x86_32)      {    enum BOTAN_HAS_MD5_X86_32 = true;        static assert(BOTAN_HAS_X86_ARCH, ERR_ARCH);      }
175 else                          enum BOTAN_HAS_MD5_X86_32 = false;
176 version(SHA1_x86_64)     {    enum BOTAN_HAS_SHA1_X86_64 = true;       static assert(BOTAN_HAS_X86_64_ARCH, ERR_ARCH);   }
177 else                          enum BOTAN_HAS_SHA1_X86_64 = false;
178 version(SHA1_x86_32)     {    enum BOTAN_HAS_SHA1_X86_32 = true;       static assert(BOTAN_HAS_X86_ARCH, ERR_ARCH);      }
179 else                          enum BOTAN_HAS_SHA1_X86_32 = false;
180 version(CFB)             {    enum BOTAN_HAS_MODE_CFB = true;                                                            }
181 else                          enum BOTAN_HAS_MODE_CFB = false;
182 version(ECB)             {    enum BOTAN_HAS_MODE_ECB = true;                                                            }
183 else                          enum BOTAN_HAS_MODE_ECB = false;
184 version(CBC)             {    enum BOTAN_HAS_MODE_CBC = true;                                                            }
185 else                          enum BOTAN_HAS_MODE_CBC = false;
186 version(XTS)             {    enum BOTAN_HAS_MODE_XTS = true;                                                            }
187 else                          enum BOTAN_HAS_MODE_XTS = false;
188 version(OFB)             {    enum BOTAN_HAS_OFB = true;                                                                 }
189 else                          enum BOTAN_HAS_OFB = false;
190 version(CTR_BE)          {    enum BOTAN_HAS_CTR_BE = true;                                                              }
191 else                          enum BOTAN_HAS_CTR_BE = false;
192 version(AEAD_FILTER)     {    enum BOTAN_HAS_AEAD_FILTER = true;                                                         }
193 else                          enum BOTAN_HAS_AEAD_FILTER = false;
194 version(AEAD_CCM)        {    enum BOTAN_HAS_AEAD_CCM = true;                                                            }
195 else                          enum BOTAN_HAS_AEAD_CCM = false;
196 version(AEAD_EAX)        {    enum BOTAN_HAS_AEAD_EAX = true;                                                            }
197 else                          enum BOTAN_HAS_AEAD_EAX = false;
198 version(AEAD_OCB)        {    enum BOTAN_HAS_AEAD_OCB = true;                                                            }
199 else                          enum BOTAN_HAS_AEAD_OCB = false;
200 version(AEAD_GCM)        {    enum BOTAN_HAS_AEAD_GCM = true;                                                            }
201 else                          enum BOTAN_HAS_AEAD_GCM = false;
202 version(AEAD_SIV)        {    enum BOTAN_HAS_AEAD_SIV = true;                                                            }
203 else                          enum BOTAN_HAS_AEAD_SIV = false;
204 version(AEAD_CHACHA20_POLY1305){enum BOTAN_HAS_AEAD_CHACHA20_POLY1305 = true;                                            }
205 else                          enum BOTAN_HAS_AEAD_CHACHA20_POLY1305 = false;
206 
207 version(RFC6979)         {    enum BOTAN_HAS_RFC6979_GENERATOR = true;                                                   }
208 else                          enum BOTAN_HAS_RFC6979_GENERATOR = false;
209 version(RSA)             {    enum BOTAN_HAS_RSA = true;                                                                 }
210 else                          enum BOTAN_HAS_RSA = false;
211 version(RW)              {    enum BOTAN_HAS_RW = true;                                                                  }
212 else                          enum BOTAN_HAS_RW = false;
213 version(DLIES)           {    enum BOTAN_HAS_DLIES = true;                                                               }
214 else                          enum BOTAN_HAS_DLIES = false;                                                            
215 version(DSA)             {    enum BOTAN_HAS_DSA = true;                                                                 }
216 else                          enum BOTAN_HAS_DSA = false;
217 version(ECDSA)           {    enum BOTAN_HAS_ECDSA = true;                                                               }
218 else                          enum BOTAN_HAS_ECDSA = false;
219 version(ElGamal)         {    enum BOTAN_HAS_ELGAMAL = true;                                                             }
220 else                          enum BOTAN_HAS_ELGAMAL = false;
221 version(GOST_3410)       {    enum BOTAN_HAS_GOST_34_10_2001 = true;                                                     }
222 else                          enum BOTAN_HAS_GOST_34_10_2001 = false;
223 version(Nyberg_Rueppel)  {    enum BOTAN_HAS_NYBERG_RUEPPEL = true;                                                      }
224 else                          enum BOTAN_HAS_NYBERG_RUEPPEL = false;
225 version(Diffie_Hellman)  {    enum BOTAN_HAS_DIFFIE_HELLMAN = true;                                                      }
226 else                          enum BOTAN_HAS_DIFFIE_HELLMAN = false;
227 version(ECDH)            {    enum BOTAN_HAS_ECDH = true;                                                                }
228 else                          enum BOTAN_HAS_ECDH = false;
229 version(Curve25519)      {    enum BOTAN_HAS_CURVE25519 = true;                                                          }
230 else                          enum BOTAN_HAS_CURVE25519 = false;
231 version(AES)             {    enum BOTAN_HAS_AES = true;                                                                 }
232 else                          enum BOTAN_HAS_AES = false;
233 version(Blowfish)        {    enum BOTAN_HAS_BLOWFISH = true;                                                            }
234 else                          enum BOTAN_HAS_BLOWFISH = false;
235 version(Camellia)        {    enum BOTAN_HAS_CAMELLIA = true;                                                            }
236 else                          enum BOTAN_HAS_CAMELLIA = false;
237 version(CAST)            {    enum BOTAN_HAS_CAST = true;                                                                }
238 else                          enum BOTAN_HAS_CAST = false;
239 version(Cascade)         {    enum BOTAN_HAS_CASCADE = true;                                                             }
240 else                          enum BOTAN_HAS_CASCADE = false;
241 version(DES)             {    enum BOTAN_HAS_DES = true;                                                                 }
242 else                          enum BOTAN_HAS_DES = false;
243 version(GOST_28147)      {    enum BOTAN_HAS_GOST_28147_89 = true;                                                       }
244 else                          enum BOTAN_HAS_GOST_28147_89 = false;
245 version(IDEA)            {    enum BOTAN_HAS_IDEA = true;                                                                }
246 else                          enum BOTAN_HAS_IDEA = false;
247 version(KASUMI)          {    enum BOTAN_HAS_KASUMI = true;                                                              }
248 else                          enum BOTAN_HAS_KASUMI = false;
249 version(LION)            {    enum BOTAN_HAS_LION = true;                                                                }
250 else                          enum BOTAN_HAS_LION = false;
251 version(MARS)            {    enum BOTAN_HAS_MARS = true;                                                                }
252 else                          enum BOTAN_HAS_MARS = false;
253 version(MISTY1)          {    enum BOTAN_HAS_MISTY1 = true;                                                              }
254 else                          enum BOTAN_HAS_MISTY1 = false;
255 version(NOEKEON)         {    enum BOTAN_HAS_NOEKEON = true;                                                             }
256 else                          enum BOTAN_HAS_NOEKEON = false;
257 version(RC2)             {    enum BOTAN_HAS_RC2 = true;                                                                 }
258 else                          enum BOTAN_HAS_RC2 = false;
259 version(RC5)             {    enum BOTAN_HAS_RC5 = true;                                                                 }
260 else                          enum BOTAN_HAS_RC5 = false;
261 version(RC6)             {    enum BOTAN_HAS_RC6 = true;                                                                 }
262 else                          enum BOTAN_HAS_RC6 = false;
263 version(SAFER)           {    enum BOTAN_HAS_SAFER = true;                                                               }
264 else                          enum BOTAN_HAS_SAFER = false;
265 version(SEED)            {    enum BOTAN_HAS_SEED = true;                                                                }
266 else                          enum BOTAN_HAS_SEED = false;
267 version(Serpent)         {    enum BOTAN_HAS_SERPENT = true;                                                             }
268 else                          enum BOTAN_HAS_SERPENT = false;
269 version(TEA)             {    enum BOTAN_HAS_TEA = true;                                                                 }
270 else                          enum BOTAN_HAS_TEA = false;
271 version(Twofish)         {    enum BOTAN_HAS_TWOFISH = true;                                                             }
272 else                          enum BOTAN_HAS_TWOFISH = false;
273 version(Threefish)       {    enum BOTAN_HAS_THREEFISH_512 = true;                                                       }
274 else                          enum BOTAN_HAS_THREEFISH_512 = false;
275 version(XTEA)            {    enum BOTAN_HAS_XTEA = true;                                                                }
276 else                          enum BOTAN_HAS_XTEA = false;
277 version(Adler32)         {    enum BOTAN_HAS_ADLER32 = true;                                                             }
278 else                          enum BOTAN_HAS_ADLER32 = false;
279 version(CRC24)           {    enum BOTAN_HAS_CRC24 = true;                                                               }
280 else                          enum BOTAN_HAS_CRC24 = false;
281 version(CRC32)           {    enum BOTAN_HAS_CRC32 = true;                                                               }
282 else                          enum BOTAN_HAS_CRC32 = false;
283 version(GOST_3411)       {    enum BOTAN_HAS_GOST_34_11 = true;                                                          }
284 else                          enum BOTAN_HAS_GOST_34_11 = false;
285 version(HAS_160)         {    enum BOTAN_HAS_HAS_160 = true;                                                             }
286 else                          enum BOTAN_HAS_HAS_160 = false;
287 version(Keccak)          {    enum BOTAN_HAS_KECCAK = true;                                                              }
288 else                          enum BOTAN_HAS_KECCAK = false;
289 version(MD2)             {    enum BOTAN_HAS_MD2 = true;                                                                 }
290 else                          enum BOTAN_HAS_MD2 = false;
291 version(MD4)             {    enum BOTAN_HAS_MD4 = true;                                                                 }
292 else                          enum BOTAN_HAS_MD4 = false;
293 version(MD5)             {    enum BOTAN_HAS_MD5 = true;                                                                 }
294 else                          enum BOTAN_HAS_MD5 = false;
295 version(RIPEMD_128)      {    enum BOTAN_HAS_RIPEMD_128 = true;                                                          }
296 else                          enum BOTAN_HAS_RIPEMD_128 = false;
297 version(RIPEMD_160)      {    enum BOTAN_HAS_RIPEMD_160 = true;                                                          }
298 else                          enum BOTAN_HAS_RIPEMD_160 = false;
299 version(SHA1)            {    enum BOTAN_HAS_SHA1 = true;                                                                }
300 else                          enum BOTAN_HAS_SHA1 = false;  
301 version(SHA2_32)         {    enum BOTAN_HAS_SHA2_32 = true;                                                             }
302 else                          enum BOTAN_HAS_SHA2_32 = false;
303 version(SHA2_64)         {    enum BOTAN_HAS_SHA2_64 = true;                                                             }
304 else                          enum BOTAN_HAS_SHA2_64 = false;
305 version(Skein_512)       {    enum BOTAN_HAS_SKEIN_512 = true;                                                           }
306 else                          enum BOTAN_HAS_SKEIN_512 = false;
307 version(Tiger)           {    enum BOTAN_HAS_TIGER = true;                                                               }
308 else                          enum BOTAN_HAS_TIGER = false;
309 version(Whirlpool)       {    enum BOTAN_HAS_WHIRLPOOL = true;                                                           }
310 else                          enum BOTAN_HAS_WHIRLPOOL = false;
311 version(ParallelHash)    {    enum BOTAN_HAS_PARALLEL_HASH = true;                                                       }
312 else                          enum BOTAN_HAS_PARALLEL_HASH = false;
313 version(Comb4P)          {    enum BOTAN_HAS_COMB4P = true;                                                              }
314 else                          enum BOTAN_HAS_COMB4P = false;
315 version(POLY1305)        {    enum BOTAN_HAS_POLY1305 = true;                                                            }
316 else                          enum BOTAN_HAS_POLY1305 = false;
317 version(CBC_MAC)         {    enum BOTAN_HAS_CBC_MAC = true;                                                             }
318 else                          enum BOTAN_HAS_CBC_MAC = false;
319 version(CMAC)            {    enum BOTAN_HAS_CMAC = true;                                                                }
320 else                          enum BOTAN_HAS_CMAC = false;
321 version(HMAC)            {    enum BOTAN_HAS_HMAC = true;                                                                }
322 else                          enum BOTAN_HAS_HMAC = false;
323 version(SSL3_MAC)        {    enum BOTAN_HAS_SSL3_MAC = true;                                                            }
324 else                          enum BOTAN_HAS_SSL3_MAC = false;
325 version(ANSI_X919_MAC)   {    enum BOTAN_HAS_ANSI_X919_MAC = true;                                                       }
326 else                          enum BOTAN_HAS_ANSI_X919_MAC = false;
327 version(PBKDF1)          {    enum BOTAN_HAS_PBKDF1 = true;                                                              }
328 else                          enum BOTAN_HAS_PBKDF1 = false;
329 version(PBKDF2)          {    enum BOTAN_HAS_PBKDF2 = true;                                                              }
330 else                          enum BOTAN_HAS_PBKDF2 = false;
331 version(RC4)             {    enum BOTAN_HAS_RC4 = true;                                                                 }
332 else                          enum BOTAN_HAS_RC4 = false;
333 version(ChaCha)          {    enum BOTAN_HAS_CHACHA = true;                                                              }
334 else                          enum BOTAN_HAS_CHACHA = false;
335 version(Salsa20)         {    enum BOTAN_HAS_SALSA20 = true;                                                             }
336 else                          enum BOTAN_HAS_SALSA20 = false;
337 version(AES_SSSE3)       {    debug enum BOTAN_HAS_AES_SSSE3 = true;     static assert(BOTAN_HAS_SIMD);                  }
338 else                          enum BOTAN_HAS_AES_SSSE3 = false;
339 version(Serpent_SIMD)    {    enum BOTAN_HAS_SERPENT_SIMD = true;        static assert(BOTAN_HAS_SIMD_OPS);              }
340 else                          enum BOTAN_HAS_SERPENT_SIMD = false;
341 version(Threefish_512_AVX2){  enum BOTAN_HAS_THREEFISH_512_AVX2 = true;  static assert(BOTAN_HAS_SIMD_ALTIVEC);          }
342 else                          enum BOTAN_HAS_THREEFISH_512_AVX2 = false;
343 version(Noekeon_SIMD)    {    enum BOTAN_HAS_NOEKEON_SIMD = true;        static assert(BOTAN_HAS_SIMD_OPS);              }
344 else                          enum BOTAN_HAS_NOEKEON_SIMD = false;
345 version(XTEA_SIMD)       {    enum BOTAN_HAS_XTEA_SIMD = true;           static assert(BOTAN_HAS_SIMD_OPS);              }
346 else                          enum BOTAN_HAS_XTEA_SIMD = false;
347 version(IDEA_SSE2 )      {    enum BOTAN_HAS_IDEA_SSE2 = true;           static assert(BOTAN_HAS_SIMD);                  }
348 else                          enum BOTAN_HAS_IDEA_SSE2 = false;
349 version(SHA1_SSE2)       {    enum BOTAN_HAS_SHA1_SSE2 = true;           static assert(BOTAN_HAS_SIMD);                  }
350 else                          enum BOTAN_HAS_SHA1_SSE2 = false;
351 
352 
353 version(Engine_ASM)      {    enum BOTAN_HAS_ENGINE_ASSEMBLER = true;                                                    }
354 else                          enum BOTAN_HAS_ENGINE_ASSEMBLER = false;
355 version(Engine_AES_ISA)  {    enum BOTAN_HAS_ENGINE_AES_ISA = true;                                                      }
356 else                          enum BOTAN_HAS_ENGINE_AES_ISA = false;
357 version(Engine_SIMD)     {    enum BOTAN_HAS_ENGINE_SIMD = true;         static assert(BOTAN_HAS_SIMD);                  }
358 else                          enum BOTAN_HAS_ENGINE_SIMD = false;
359 version(Engine_GNU_MP)   {    enum BOTAN_HAS_ENGINE_GNU_MP = true;                                                       }
360 else                          enum BOTAN_HAS_ENGINE_GNU_MP = false;
361 version(Engine_OPENSSL)  {    enum BOTAN_HAS_ENGINE_OPENSSL = true;                                                      }
362 else                          enum BOTAN_HAS_ENGINE_OPENSSL = false;
363 version(Entropy_HRTimer) {    enum BOTAN_HAS_ENTROPY_SRC_HIGH_RESOLUTION_TIMER = true;                                   }
364 else                          enum BOTAN_HAS_ENTROPY_SRC_HIGH_RESOLUTION_TIMER = false;
365 version(Entropy_Rdrand)  {    enum BOTAN_HAS_ENTROPY_SRC_RDRAND = true;                                                  }
366 else                          enum BOTAN_HAS_ENTROPY_SRC_RDRAND = false;
367 version(Entropy_DevRand) {    enum BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM = true;                                              }    
368 else                          enum BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM = false;
369 version(Entropy_EGD)     {    enum BOTAN_HAS_ENTROPY_SRC_EGD = true;                                                     }
370 else                          enum BOTAN_HAS_ENTROPY_SRC_EGD = false;
371 version(Entropy_UnixProc){    enum BOTAN_HAS_ENTROPY_SRC_UNIX_PROCESS_RUNNER = true;                                     }
372 else                          enum BOTAN_HAS_ENTROPY_SRC_UNIX_PROCESS_RUNNER = false;
373 version(Entropy_BEOS)    {    enum BOTAN_HAS_ENTROPY_SRC_BEOS = true;                                                    }
374 else                          enum BOTAN_HAS_ENTROPY_SRC_BEOS = false;
375 version(Entropy_CAPI)    {    enum BOTAN_HAS_ENTROPY_SRC_CAPI = true;                                                    }
376 else                          enum BOTAN_HAS_ENTROPY_SRC_CAPI = false;
377 version(Entropy_Win32)   {    enum BOTAN_HAS_ENTROPY_SRC_WIN32 = true;                                                   }
378 else                          enum BOTAN_HAS_ENTROPY_SRC_WIN32 = false;
379 version(Entropy_ProcWalk){    enum BOTAN_HAS_ENTROPY_SRC_PROC_WALKER = true;                                             }
380 else                          enum BOTAN_HAS_ENTROPY_SRC_PROC_WALKER = false;
381 version(EMSA1)           {    enum BOTAN_HAS_EMSA1 = true;                                                               }
382 else                          enum BOTAN_HAS_EMSA1 = false;
383 version(EMSA1_BSI)       {    enum BOTAN_HAS_EMSA1_BSI = true;                                                           }
384 else                          enum BOTAN_HAS_EMSA1_BSI = false;
385 version(EMSA_X931)       {    enum BOTAN_HAS_EMSA_X931 = true;                                                           }
386 else                          enum BOTAN_HAS_EMSA_X931 = false;
387 version(EMSA_PKCS1)      {    enum BOTAN_HAS_EMSA_PKCS1 = true;                                                          }
388 else                          enum BOTAN_HAS_EMSA_PKCS1 = false;
389 version(EMSA_PSSR)       {    enum BOTAN_HAS_EMSA_PSSR = true;                                                           }
390 else                          enum BOTAN_HAS_EMSA_PSSR = false;
391 version(EMSA_RAW)        {    enum BOTAN_HAS_EMSA_RAW = true;                                                            }
392 else                          enum BOTAN_HAS_EMSA_RAW = false;
393 version(EME_OAEP)        {    enum BOTAN_HAS_EME_OAEP = true;                                                            }
394 else                          enum BOTAN_HAS_EME_OAEP = false;
395 version(EME_PKCS1v15)    {    enum BOTAN_HAS_EME_PKCS1_V15 = true;                                                       }
396 else                          enum BOTAN_HAS_EME_PKCS1_V15 = false;
397 version(PBE_PKCSv20)     {    enum BOTAN_HAS_PBE_PKCS_V20 = true;                                                        }
398 else                          enum BOTAN_HAS_PBE_PKCS_V20 = false;
399 version(GCM_CLMUL)       {    enum BOTAN_HAS_GCM_CLMUL = true;            static assert(BOTAN_HAS_SIMD);                 }
400 else                          enum BOTAN_HAS_GCM_CLMUL = false;   
401 
402 version(X931_RNG)        {    enum BOTAN_HAS_X931_RNG = true;                                                            }
403 else                          enum BOTAN_HAS_X931_RNG = false;
404 version(HMAC_DRBG)       {    enum BOTAN_HAS_HMAC_DRBG = true;                                                           }
405 else                          enum BOTAN_HAS_HMAC_DRBG = false;
406 
407 version(ZLib)            {    enum BOTAN_HAS_ZLIB = true;                                                                }
408 else                          enum BOTAN_HAS_ZLIB = false;
409 version(Bzip2)           {    enum BOTAN_HAS_BZIP2 = true;                                                               }
410 else                          enum BOTAN_HAS_BZIP2 = false;
411 version(LZMA)            {    enum BOTAN_HAS_LZMA = true;                                                                }
412 else                          enum BOTAN_HAS_LZMA = false;
413 
414 version(OPENSSL_NO_SHA)  {    enum BOTAN_HAS_OPENSSL_NO_SHA = true;                                                      }
415 else                          enum BOTAN_HAS_OPENSSL_NO_SHA = false;
416 version(OPENSSL_NO_SHA256) {  enum BOTAN_HAS_OPENSSL_NO_SHA256 = true;                                                   }
417 else                          enum BOTAN_HAS_OPENSSL_NO_SHA256 = false;
418 version(OPENSSL_NO_SHA512) {  enum BOTAN_HAS_OPENSSL_NO_SHA512 = true;                                                   }
419 else                          enum BOTAN_HAS_OPENSSL_NO_SHA512 = false;
420 version(OPENSSL_NO_MD2)  {    enum BOTAN_HAS_OPENSSL_NO_MD2 = true;                                                      }
421 else                          enum BOTAN_HAS_OPENSSL_NO_MD2 = false;
422 version(OPENSSL_NO_MD4)  {    enum BOTAN_HAS_OPENSSL_NO_MD4 = true;                                                      }
423 else                          enum BOTAN_HAS_OPENSSL_NO_MD4 = false;
424 version(OPENSSL_NO_MD5)  {    enum BOTAN_HAS_OPENSSL_NO_MD5 = true;                                                      }
425 else                          enum BOTAN_HAS_OPENSSL_NO_MD5 = false;
426 version(OPENSSL_NO_RIPEMD) {  enum BOTAN_HAS_OPENSSL_NO_RIPEMD = true;                                                   }
427 else                          enum BOTAN_HAS_OPENSSL_NO_RIPEMD = false;
428 
429 
430 version(OPENSSL_NO_AES)  {    enum BOTAN_HAS_OPENSSL_NO_AES = true;                                                      }
431 else                          enum BOTAN_HAS_OPENSSL_NO_AES = false;
432 version(OPENSSL_NO_DES)  {    enum BOTAN_HAS_OPENSSL_NO_DES = true;                                                      }
433 else                          enum BOTAN_HAS_OPENSSL_NO_DES = false;
434 version(OPENSSL_NO_BF)   {    enum BOTAN_HAS_OPENSSL_NO_BF = true;                                                       }
435 else                          enum BOTAN_HAS_OPENSSL_NO_BF = false;
436 version(OPENSSL_NO_CAST) {    enum BOTAN_HAS_OPENSSL_NO_CAST = true;                                                     }
437 else                          enum BOTAN_HAS_OPENSSL_NO_CAST = false;
438 version(OPENSSL_NO_CAMELLIA){ enum BOTAN_HAS_OPENSSL_NO_CAMELLIA = true;                                                 }
439 else                          enum BOTAN_HAS_OPENSSL_NO_CAMELLIA = false;
440 version(OPENSSL_NO_RC2)  {    enum BOTAN_HAS_OPENSSL_NO_RC2 = true;                                                      }
441 else                          enum BOTAN_HAS_OPENSSL_NO_RC2 = false;
442 version(OPENSSL_NO_RC5)  {    enum BOTAN_HAS_OPENSSL_NO_RC5 = true;                                                      }
443 else                          enum BOTAN_HAS_OPENSSL_NO_RC5 = false;
444 version(OPENSSL_NO_IDEA) {    enum BOTAN_HAS_OPENSSL_NO_IDEA = true;                                                     }
445 else                          enum BOTAN_HAS_OPENSSL_NO_IDEA = false;
446 version(OPENSSL_NO_SEED) {    enum BOTAN_HAS_OPENSSL_NO_SEED = true;                                                     }
447 else                          enum BOTAN_HAS_OPENSSL_NO_SEED = false;
448 
449 // workaround for DMD bug in release
450 static if (!__traits(compiles, BOTAN_HAS_AES_SSSE3)) enum BOTAN_HAS_AES_SSSE3 = false;
451 
452 enum { // LogLevel
453     Trace,
454     Info,
455     Debug,
456     Error,
457     None
458 }
459 
460 void logTrace(ARGS...)(lazy ARGS args) {
461     static if (LogLevel <= Trace) {
462         import std.stdio: writeln;
463         writeln("T: ", args);
464     }
465 }
466 
467 void logInfo(ARGS...)(lazy ARGS args) {
468     static if (LogLevel <= Info) {
469         import std.stdio: writeln;
470         writeln("I: ", args);
471     }
472 }
473 
474 void logDebug(ARGS...)(lazy ARGS args) {
475     
476     static if (LogLevel <= Debug) {
477         import std.stdio: writeln;
478         writeln("D: ", args);
479     }
480 }
481 
482 void logError(ARGS...)(lazy ARGS args) {
483     static if (LogLevel <= Error) {
484         import std.stdio: writeln, stderr;
485         stderr.writeln("E: ", args);
486     }
487 }