Botan 1.10.17
lookup_block.cpp
Go to the documentation of this file.
1/*
2* Block Cipher Lookup
3* (C) 1999-2007 Jack Lloyd
4*
5* Distributed under the terms of the Botan license
6*/
7
8#include <botan/internal/core_engine.h>
9#include <botan/scan_name.h>
10#include <botan/algo_factory.h>
11
12#if defined(BOTAN_HAS_AES)
13 #include <botan/aes.h>
14#endif
15
16#if defined(BOTAN_HAS_BLOWFISH)
17 #include <botan/blowfish.h>
18#endif
19
20#if defined(BOTAN_HAS_CAMELLIA)
21 #include <botan/camellia.h>
22#endif
23
24#if defined(BOTAN_HAS_CAST)
25 #include <botan/cast128.h>
26 #include <botan/cast256.h>
27#endif
28
29#if defined(BOTAN_HAS_CASCADE)
30 #include <botan/cascade.h>
31#endif
32
33#if defined(BOTAN_HAS_DES)
34 #include <botan/des.h>
35 #include <botan/desx.h>
36#endif
37
38#if defined(BOTAN_HAS_GOST_28147_89)
39 #include <botan/gost_28147.h>
40#endif
41
42#if defined(BOTAN_HAS_IDEA)
43 #include <botan/idea.h>
44#endif
45
46#if defined(BOTAN_HAS_KASUMI)
47 #include <botan/kasumi.h>
48#endif
49
50#if defined(BOTAN_HAS_LION)
51 #include <botan/lion.h>
52#endif
53
54#if defined(BOTAN_HAS_LUBY_RACKOFF)
55 #include <botan/lubyrack.h>
56#endif
57
58#if defined(BOTAN_HAS_MARS)
59 #include <botan/mars.h>
60#endif
61
62#if defined(BOTAN_HAS_MISTY1)
63 #include <botan/misty1.h>
64#endif
65
66#if defined(BOTAN_HAS_NOEKEON)
67 #include <botan/noekeon.h>
68#endif
69
70#if defined(BOTAN_HAS_RC2)
71 #include <botan/rc2.h>
72#endif
73
74#if defined(BOTAN_HAS_RC5)
75 #include <botan/rc5.h>
76#endif
77
78#if defined(BOTAN_HAS_RC6)
79 #include <botan/rc6.h>
80#endif
81
82#if defined(BOTAN_HAS_SAFER)
83 #include <botan/safer_sk.h>
84#endif
85
86#if defined(BOTAN_HAS_SEED)
87 #include <botan/seed.h>
88#endif
89
90#if defined(BOTAN_HAS_SERPENT)
91 #include <botan/serpent.h>
92#endif
93
94#if defined(BOTAN_HAS_SKIPJACK)
95 #include <botan/skipjack.h>
96#endif
97
98#if defined(BOTAN_HAS_SQUARE)
99 #include <botan/square.h>
100#endif
101
102#if defined(BOTAN_HAS_TEA)
103 #include <botan/tea.h>
104#endif
105
106#if defined(BOTAN_HAS_TWOFISH)
107 #include <botan/twofish.h>
108#endif
109
110#if defined(BOTAN_HAS_XTEA)
111 #include <botan/xtea.h>
112#endif
113
114namespace Botan {
115
116/*
117* Look for an algorithm with this name
118*/
120 Algorithm_Factory& af) const
121 {
122
123#if defined(BOTAN_HAS_AES)
124 if(request.algo_name() == "AES-128")
125 return new AES_128;
126 if(request.algo_name() == "AES-192")
127 return new AES_192;
128 if(request.algo_name() == "AES-256")
129 return new AES_256;
130#endif
131
132#if defined(BOTAN_HAS_BLOWFISH)
133 if(request.algo_name() == "Blowfish")
134 return new Blowfish;
135#endif
136
137#if defined(BOTAN_HAS_CAMELLIA)
138 if(request.algo_name() == "Camellia-128")
139 return new Camellia_128;
140 if(request.algo_name() == "Camellia-192")
141 return new Camellia_192;
142 if(request.algo_name() == "Camellia-256")
143 return new Camellia_256;
144#endif
145
146#if defined(BOTAN_HAS_CAST)
147 if(request.algo_name() == "CAST-128")
148 return new CAST_128;
149 if(request.algo_name() == "CAST-256")
150 return new CAST_256;
151#endif
152
153#if defined(BOTAN_HAS_DES)
154 if(request.algo_name() == "DES")
155 return new DES;
156 if(request.algo_name() == "DESX")
157 return new DESX;
158 if(request.algo_name() == "TripleDES")
159 return new TripleDES;
160#endif
161
162#if defined(BOTAN_HAS_GOST_28147_89)
163 if(request.algo_name() == "GOST-28147-89")
164 return new GOST_28147_89(request.arg(0, "R3411_94_TestParam"));
165#endif
166
167#if defined(BOTAN_HAS_IDEA)
168 if(request.algo_name() == "IDEA")
169 return new IDEA;
170#endif
171
172#if defined(BOTAN_HAS_KASUMI)
173 if(request.algo_name() == "KASUMI")
174 return new KASUMI;
175#endif
176
177#if defined(BOTAN_HAS_MARS)
178 if(request.algo_name() == "MARS")
179 return new MARS;
180#endif
181
182#if defined(BOTAN_HAS_MISTY1)
183 if(request.algo_name() == "MISTY1")
184 return new MISTY1(request.arg_as_integer(0, 8));
185#endif
186
187#if defined(BOTAN_HAS_NOEKEON)
188 if(request.algo_name() == "Noekeon")
189 return new Noekeon;
190#endif
191
192#if defined(BOTAN_HAS_RC2)
193 if(request.algo_name() == "RC2")
194 return new RC2;
195#endif
196
197#if defined(BOTAN_HAS_RC5)
198 if(request.algo_name() == "RC5")
199 return new RC5(request.arg_as_integer(0, 12));
200#endif
201
202#if defined(BOTAN_HAS_RC6)
203 if(request.algo_name() == "RC6")
204 return new RC6;
205#endif
206
207#if defined(BOTAN_HAS_SAFER)
208 if(request.algo_name() == "SAFER-SK")
209 return new SAFER_SK(request.arg_as_integer(0, 10));
210#endif
211
212#if defined(BOTAN_HAS_SEED)
213 if(request.algo_name() == "SEED")
214 return new SEED;
215#endif
216
217#if defined(BOTAN_HAS_SERPENT)
218 if(request.algo_name() == "Serpent")
219 return new Serpent;
220#endif
221
222#if defined(BOTAN_HAS_SKIPJACK)
223 if(request.algo_name() == "Skipjack")
224 return new Skipjack;
225#endif
226
227#if defined(BOTAN_HAS_SQUARE)
228 if(request.algo_name() == "Square")
229 return new Square;
230#endif
231
232#if defined(BOTAN_HAS_TEA)
233 if(request.algo_name() == "TEA")
234 return new TEA;
235#endif
236
237#if defined(BOTAN_HAS_TWOFISH)
238 if(request.algo_name() == "Twofish")
239 return new Twofish;
240#endif
241
242#if defined(BOTAN_HAS_XTEA)
243 if(request.algo_name() == "XTEA")
244 return new XTEA;
245#endif
246
247#if defined(BOTAN_HAS_LUBY_RACKOFF)
248 if(request.algo_name() == "Luby-Rackoff" && request.arg_count() == 1)
249 {
250 const HashFunction* hash = af.prototype_hash_function(request.arg(0));
251
252 if(hash)
253 return new LubyRackoff(hash->clone());
254 }
255#endif
256
257#if defined(BOTAN_HAS_CASCADE)
258 if(request.algo_name() == "Cascade" && request.arg_count() == 2)
259 {
260 const BlockCipher* c1 = af.prototype_block_cipher(request.arg(0));
261 const BlockCipher* c2 = af.prototype_block_cipher(request.arg(1));
262
263 if(c1 && c2)
264 return new Cascade_Cipher(c1->clone(), c2->clone());
265 }
266#endif
267
268#if defined(BOTAN_HAS_LION)
269 if(request.algo_name() == "Lion" && request.arg_count_between(2, 3))
270 {
271 const size_t block_size = request.arg_as_integer(2, 1024);
272
273 const HashFunction* hash =
274 af.prototype_hash_function(request.arg(0));
275
276 const StreamCipher* stream_cipher =
277 af.prototype_stream_cipher(request.arg(1));
278
279 if(!hash || !stream_cipher)
280 return 0;
281
282 return new Lion(hash->clone(), stream_cipher->clone(), block_size);
283 }
284#endif
285
286 return 0;
287 }
288
289}
const HashFunction * prototype_hash_function(const std::string &algo_spec, const std::string &provider="")
const BlockCipher * prototype_block_cipher(const std::string &algo_spec, const std::string &provider="")
const StreamCipher * prototype_stream_cipher(const std::string &algo_spec, const std::string &provider="")
virtual BlockCipher * clone() const =0
Cascade_Cipher(BlockCipher *cipher1, BlockCipher *cipher2)
Definition cascade.cpp:83
BlockCipher * find_block_cipher(const SCAN_Name &, Algorithm_Factory &) const
GOST_28147_89(const GOST_28147_89_Params &params)
virtual HashFunction * clone() const =0
Lion(HashFunction *hash, StreamCipher *cipher, size_t block_size)
Definition lion.cpp:111
LubyRackoff(HashFunction *hash)
Definition lubyrack.cpp:127
MISTY1(size_t rounds=8)
Definition misty1.cpp:254
SAFER_SK(size_t rounds)
Definition safer_sk.cpp:247
std::string arg(size_t i) const
size_t arg_count() const
Definition scan_name.h:47
std::string algo_name() const
Definition scan_name.h:37
size_t arg_as_integer(size_t i, size_t def_value) const
bool arg_count_between(size_t lower, size_t upper) const
Definition scan_name.h:54
virtual StreamCipher * clone() const =0