3 #define _CRT_SECURE_NO_DEPRECATE
20 USING_NAMESPACE(CryptoPP)
24 const double CLOCK_TICKS_PER_SECOND = (double)CLOCKS_PER_SEC;
25 #elif defined(CLK_TCK)
26 const double CLOCK_TICKS_PER_SECOND = (double)CLK_TCK;
28 const double CLOCK_TICKS_PER_SECOND = 1000000.0;
31 double logtotal = 0, g_allocatedTime, g_hertz;
32 unsigned int logcount = 0;
34 static const byte *
const key=(byte *)
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
36 void OutputResultBytes(
const char *name,
double length,
double timeTaken)
38 double mbs = length / timeTaken / (1024*1024);
39 cout <<
"\n<TR><TH>" << name;
41 cout << setiosflags(ios::fixed);
43 cout <<
"<TD>" << setprecision(0) << setiosflags(ios::fixed) << mbs;
45 cout <<
"<TD>" << setprecision(1) << setiosflags(ios::fixed) << timeTaken * g_hertz / length;
46 cout << resetiosflags(ios::fixed);
51 void OutputResultKeying(
double iterations,
double timeTaken)
53 cout <<
"<TD>" << setprecision(3) << setiosflags(ios::fixed) << (1000*1000*timeTaken/iterations);
55 cout <<
"<TD>" << setprecision(0) << setiosflags(ios::fixed) << timeTaken * g_hertz / iterations;
58 void OutputResultOperations(
const char *name,
const char *operation,
bool pc,
unsigned long iterations,
double timeTaken)
60 cout <<
"\n<TR><TH>" << name <<
" " << operation << (pc ?
" with precomputation" :
"");
64 cout <<
"<TD>" << setprecision(2) << setiosflags(ios::fixed) << (1000*timeTaken/iterations);
66 cout <<
"<TD>" << setprecision(2) << setiosflags(ios::fixed) << timeTaken * g_hertz / iterations / 1000000;
67 cout << resetiosflags(ios::fixed);
69 logtotal += log(iterations/timeTaken);
101 clock_t start = clock();
103 unsigned long i=0, blocks=1;
108 for (; i<blocks; i++)
110 timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND;
112 while (timeTaken < 2.0/3*timeTotal);
114 OutputResultBytes(name,
double(blocks) * BUF_SIZE, timeTaken);
122 BenchMark(name, static_cast<StreamTransformation &>(cipher), timeTotal);
127 const int BUF_SIZE=2048U;
130 clock_t start = clock();
132 unsigned long i=0, blocks=1;
137 for (; i<blocks; i++)
139 timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND;
141 while (timeTaken < 2.0/3*timeTotal);
143 OutputResultBytes(name,
double(blocks) * BUF_SIZE, timeTaken);
148 const int BUF_SIZE=2048U;
151 clock_t start = clock();
153 unsigned long i=0, blocks=1;
158 for (; i<blocks; i++)
159 bt.
Put(buf, BUF_SIZE);
160 timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND;
162 while (timeTaken < 2.0/3*timeTotal);
164 OutputResultBytes(name,
double(blocks) * BUF_SIZE, timeTaken);
169 unsigned long iterations = 0;
170 clock_t start = clock();
174 for (
unsigned int i=0; i<1024; i++)
175 c.
SetKey(key, keyLength, params);
176 timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND;
179 while (timeTaken < g_allocatedTime);
181 OutputResultKeying(iterations, timeTaken);
186 template <
class T_FactoryOutput,
class T_Interface>
187 void BenchMarkByName2(
const char *factoryName,
size_t keyLength = 0,
const char *displayName=NULL,
const NameValuePairs ¶ms = g_nullNameValuePairs, T_FactoryOutput *x=NULL, T_Interface *y=NULL)
189 std::string name = factoryName;
193 name +=
" (" + IntToString(keyLength * 8) +
"-bit key)";
197 keyLength = obj->DefaultKeyLength();
199 BenchMark(name.c_str(), *
static_cast<T_Interface *
>(obj.get()), g_allocatedTime);
204 template <
class T_FactoryOutput>
205 void BenchMarkByName(
const char *factoryName,
size_t keyLength = 0,
const char *displayName=NULL,
const NameValuePairs ¶ms = g_nullNameValuePairs, T_FactoryOutput *x=NULL)
207 BenchMarkByName2<T_FactoryOutput, T_FactoryOutput>(factoryName, keyLength, displayName, params, x, x);
211 void BenchMarkByNameKeyLess(
const char *factoryName,
const char *displayName=NULL,
const NameValuePairs ¶ms = g_nullNameValuePairs, T *x=NULL)
213 std::string name = factoryName;
218 BenchMark(name.c_str(), *obj, g_allocatedTime);
221 void BenchmarkAll(
double t,
double hertz)
229 const char *cpb, *cpk;
232 cpb =
"<TH>Cycles Per Byte";
233 cpk =
"<TH>Cycles to<br>Setup Key and IV";
234 cout <<
"CPU frequency of the test platform is " << g_hertz <<
" Hz.\n";
239 cout <<
"CPU frequency of the test platform was not provided.\n";
242 cout <<
"<TABLE border=1><COLGROUP><COL align=left><COL align=right><COL align=right><COL align=right><COL align=right>" << endl;
243 cout <<
"<THEAD><TR><TH>Algorithm<TH>MiB/Second" << cpb <<
"<TH>Microseconds to<br>Setup Key and IV" << cpk << endl;
245 cout <<
"\n<TBODY style=\"background: yellow\">";
246 #if CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
248 BenchMarkByName2<AuthenticatedSymmetricCipher, AuthenticatedSymmetricCipher>(
"AES/GCM", 0,
"AES/GCM");
252 BenchMarkByName2<AuthenticatedSymmetricCipher, AuthenticatedSymmetricCipher>(
"AES/GCM", 0,
"AES/GCM (2K tables)", MakeParameters(
Name::TableSize(), 2048));
253 BenchMarkByName2<AuthenticatedSymmetricCipher, AuthenticatedSymmetricCipher>(
"AES/GCM", 0,
"AES/GCM (64K tables)", MakeParameters(
Name::TableSize(), 64*1024));
255 BenchMarkByName2<AuthenticatedSymmetricCipher, AuthenticatedSymmetricCipher>(
"AES/CCM");
256 BenchMarkByName2<AuthenticatedSymmetricCipher, AuthenticatedSymmetricCipher>(
"AES/EAX");
258 cout <<
"\n<TBODY style=\"background: white\">";
259 #if CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
261 BenchMarkByName2<AuthenticatedSymmetricCipher, MessageAuthenticationCode>(
"AES/GCM", 0,
"GMAC(AES)");
265 BenchMarkByName2<AuthenticatedSymmetricCipher, MessageAuthenticationCode>(
"AES/GCM", 0,
"GMAC(AES) (2K tables)", MakeParameters(
Name::TableSize(), 2048));
266 BenchMarkByName2<AuthenticatedSymmetricCipher, MessageAuthenticationCode>(
"AES/GCM", 0,
"GMAC(AES) (64K tables)", MakeParameters(
Name::TableSize(), 64*1024));
268 BenchMarkByName<MessageAuthenticationCode>(
"VMAC(AES)-64");
269 BenchMarkByName<MessageAuthenticationCode>(
"VMAC(AES)-128");
270 BenchMarkByName<MessageAuthenticationCode>(
"HMAC(SHA-1)");
271 BenchMarkByName<MessageAuthenticationCode>(
"Two-Track-MAC");
272 BenchMarkByName<MessageAuthenticationCode>(
"CMAC(AES)");
273 BenchMarkByName<MessageAuthenticationCode>(
"DMAC(AES)");
275 cout <<
"\n<TBODY style=\"background: yellow\">";
276 BenchMarkByNameKeyLess<HashTransformation>(
"CRC32");
277 BenchMarkByNameKeyLess<HashTransformation>(
"Adler32");
278 BenchMarkByNameKeyLess<HashTransformation>(
"MD5");
279 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-1");
280 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-256");
281 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-512");
282 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-3-224");
283 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-3-256");
284 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-3-384");
285 BenchMarkByNameKeyLess<HashTransformation>(
"SHA-3-512");
286 BenchMarkByNameKeyLess<HashTransformation>(
"Tiger");
287 BenchMarkByNameKeyLess<HashTransformation>(
"Whirlpool");
288 BenchMarkByNameKeyLess<HashTransformation>(
"RIPEMD-160");
289 BenchMarkByNameKeyLess<HashTransformation>(
"RIPEMD-320");
290 BenchMarkByNameKeyLess<HashTransformation>(
"RIPEMD-128");
291 BenchMarkByNameKeyLess<HashTransformation>(
"RIPEMD-256");
293 cout <<
"\n<TBODY style=\"background: white\">";
294 BenchMarkByName<SymmetricCipher>(
"Panama-LE");
295 BenchMarkByName<SymmetricCipher>(
"Panama-BE");
296 BenchMarkByName<SymmetricCipher>(
"Salsa20");
297 BenchMarkByName<SymmetricCipher>(
"Salsa20", 0,
"Salsa20/12", MakeParameters(
Name::Rounds(), 12));
298 BenchMarkByName<SymmetricCipher>(
"Salsa20", 0,
"Salsa20/8", MakeParameters(
Name::Rounds(), 8));
299 BenchMarkByName<SymmetricCipher>(
"Sosemanuk");
300 BenchMarkByName<SymmetricCipher>(
"MARC4");
301 BenchMarkByName<SymmetricCipher>(
"SEAL-3.0-LE");
302 BenchMarkByName<SymmetricCipher>(
"WAKE-OFB-LE");
304 cout <<
"\n<TBODY style=\"background: yellow\">";
305 BenchMarkByName<SymmetricCipher>(
"AES/CTR", 16);
306 BenchMarkByName<SymmetricCipher>(
"AES/CTR", 24);
307 BenchMarkByName<SymmetricCipher>(
"AES/CTR", 32);
308 BenchMarkByName<SymmetricCipher>(
"AES/CBC", 16);
309 BenchMarkByName<SymmetricCipher>(
"AES/CBC", 24);
310 BenchMarkByName<SymmetricCipher>(
"AES/CBC", 32);
311 BenchMarkByName<SymmetricCipher>(
"AES/OFB", 16);
312 BenchMarkByName<SymmetricCipher>(
"AES/CFB", 16);
313 BenchMarkByName<SymmetricCipher>(
"AES/ECB", 16);
314 BenchMarkByName<SymmetricCipher>(
"Camellia/CTR", 16);
315 BenchMarkByName<SymmetricCipher>(
"Camellia/CTR", 32);
316 BenchMarkByName<SymmetricCipher>(
"Twofish/CTR");
317 BenchMarkByName<SymmetricCipher>(
"Serpent/CTR");
318 BenchMarkByName<SymmetricCipher>(
"CAST-256/CTR");
319 BenchMarkByName<SymmetricCipher>(
"RC6/CTR");
320 BenchMarkByName<SymmetricCipher>(
"MARS/CTR");
321 BenchMarkByName<SymmetricCipher>(
"SHACAL-2/CTR", 16);
322 BenchMarkByName<SymmetricCipher>(
"SHACAL-2/CTR", 64);
323 BenchMarkByName<SymmetricCipher>(
"DES/CTR");
324 BenchMarkByName<SymmetricCipher>(
"DES-XEX3/CTR");
325 BenchMarkByName<SymmetricCipher>(
"DES-EDE3/CTR");
326 BenchMarkByName<SymmetricCipher>(
"IDEA/CTR");
327 BenchMarkByName<SymmetricCipher>(
"RC5/CTR", 0,
"RC5 (r=16)");
328 BenchMarkByName<SymmetricCipher>(
"Blowfish/CTR");
329 BenchMarkByName<SymmetricCipher>(
"TEA/CTR");
330 BenchMarkByName<SymmetricCipher>(
"XTEA/CTR");
331 BenchMarkByName<SymmetricCipher>(
"CAST-128/CTR");
332 BenchMarkByName<SymmetricCipher>(
"SKIPJACK/CTR");
333 BenchMarkByName<SymmetricCipher>(
"SEED/CTR", 0,
"SEED/CTR (1/2 K table)");
334 cout <<
"</TABLE>" << endl;
336 BenchmarkAll2(t, hertz);
338 cout <<
"Throughput Geometric Average: " << setiosflags(ios::fixed) << exp(logtotal/logcount) << endl;
340 time_t endTime = time(NULL);
341 cout <<
"\nTest ended at " << asctime(localtime(&endTime));