30 USING_NAMESPACE(CryptoPP)
33 void OutputResultOperations(const
char *name, const
char *operation,
bool pc,
unsigned long iterations,
double timeTaken);
35 void BenchMarkEncryption(const
char *name,
PK_Encryptor &key,
double timeTotal,
bool pc=false)
37 unsigned int len = 16;
38 SecByteBlock plaintext(len), ciphertext(key.CiphertextLength(len));
41 clock_t start = clock();
44 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i++)
45 key.Encrypt(GlobalRNG(), plaintext, len, ciphertext);
47 OutputResultOperations(name,
"Encryption", pc, i, timeTaken);
49 if (!pc && key.GetMaterial().SupportsPrecomputation())
51 key.AccessMaterial().Precompute(16);
52 BenchMarkEncryption(name, key, timeTotal,
true);
58 unsigned int len = 16;
62 pub.
Encrypt(GlobalRNG(), plaintext, len, ciphertext);
64 clock_t start = clock();
67 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i++)
68 priv.
Decrypt(GlobalRNG(), ciphertext, ciphertext.size(), plaintext);
70 OutputResultOperations(name,
"Decryption",
false, i, timeTaken);
73 void BenchMarkSigning(
const char *name,
PK_Signer &key,
double timeTotal,
bool pc=
false)
75 unsigned int len = 16;
79 clock_t start = clock();
82 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i++)
83 key.
SignMessage(GlobalRNG(), message, len, signature);
85 OutputResultOperations(name,
"Signature", pc, i, timeTaken);
90 BenchMarkSigning(name, key, timeTotal,
true);
94 void BenchMarkVerification(
const char *name,
const PK_Signer &priv,
PK_Verifier &pub,
double timeTotal,
bool pc=
false)
96 unsigned int len = 16;
99 priv.
SignMessage(GlobalRNG(), message, len, signature);
101 clock_t start = clock();
104 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i++)
105 pub.
VerifyMessage(message, len, signature, signature.size());
107 OutputResultOperations(name,
"Verification", pc, i, timeTaken);
112 BenchMarkVerification(name, priv, pub, timeTotal,
true);
120 clock_t start = clock();
123 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i++)
126 OutputResultOperations(name,
"Key-Pair Generation", pc, i, timeTaken);
131 BenchMarkKeyGen(name, d, timeTotal,
true);
139 clock_t start = clock();
142 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i++)
145 OutputResultOperations(name,
"Key-Pair Generation", pc, i, timeTaken);
150 BenchMarkKeyGen(name, d, timeTotal,
true);
162 clock_t start = clock();
165 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i+=2)
167 d.
Agree(val, priv1, pub2);
168 d.
Agree(val, priv2, pub1);
171 OutputResultOperations(name,
"Key Agreement", pc, i, timeTaken);
186 clock_t start = clock();
189 for (timeTaken=(
double)0, i=0; timeTaken < timeTotal; timeTaken = double(clock() - start) / CLOCK_TICKS_PER_SECOND, i+=2)
191 d.
Agree(val, spriv1, epriv1, spub2, epub2);
192 d.
Agree(val, spriv2, epriv2, spub1, epub1);
195 OutputResultOperations(name,
"Key Agreement", pc, i, timeTaken);
199 template <
class SCHEME>
200 void BenchMarkCrypto(
const char *filename,
const char *name,
double timeTotal, SCHEME *x=NULL)
203 typename SCHEME::Decryptor priv(f);
204 typename SCHEME::Encryptor pub(priv);
205 BenchMarkEncryption(name, pub, timeTotal);
206 BenchMarkDecryption(name, priv, pub, timeTotal);
210 template <
class SCHEME>
211 void BenchMarkSignature(
const char *filename,
const char *name,
double timeTotal, SCHEME *x=NULL)
214 typename SCHEME::Signer priv(f);
215 typename SCHEME::Verifier pub(priv);
216 BenchMarkSigning(name, priv, timeTotal);
217 BenchMarkVerification(name, priv, pub, timeTotal);
222 void BenchMarkKeyAgreement(
const char *filename,
const char *name,
double timeTotal, D *x=NULL)
226 BenchMarkKeyGen(name, d, timeTotal);
227 BenchMarkAgreement(name, d, timeTotal);
230 extern double g_hertz;
232 void BenchmarkAll2(
double t,
double hertz)
236 cout <<
"<TABLE border=1><COLGROUP><COL align=left><COL align=right><COL align=right>" << endl;
237 cout <<
"<THEAD><TR><TH>Operation<TH>Milliseconds/Operation" << (g_hertz ?
"<TH>Megacycles/Operation" :
"") << endl;
239 cout <<
"\n<TBODY style=\"background: yellow\">";
240 BenchMarkCrypto<RSAES<OAEP<SHA> > >(PACKAGE_DATA_DIR
"TestData/rsa1024.dat",
"RSA 1024", t);
241 BenchMarkCrypto<LUCES<OAEP<SHA> > >(PACKAGE_DATA_DIR
"TestData/luc1024.dat",
"LUC 1024", t);
242 BenchMarkCrypto<DLIES<> >(PACKAGE_DATA_DIR
"TestData/dlie1024.dat",
"DLIES 1024", t);
243 BenchMarkCrypto<LUC_IES<> >(PACKAGE_DATA_DIR
"TestData/lucc512.dat",
"LUCELG 512", t);
245 cout <<
"\n<TBODY style=\"background: white\">";
246 BenchMarkCrypto<RSAES<OAEP<SHA> > >(PACKAGE_DATA_DIR
"TestData/rsa2048.dat",
"RSA 2048", t);
247 BenchMarkCrypto<LUCES<OAEP<SHA> > >(PACKAGE_DATA_DIR
"TestData/luc2048.dat",
"LUC 2048", t);
248 BenchMarkCrypto<DLIES<> >(PACKAGE_DATA_DIR
"TestData/dlie2048.dat",
"DLIES 2048", t);
249 BenchMarkCrypto<LUC_IES<> >(PACKAGE_DATA_DIR
"TestData/lucc1024.dat",
"LUCELG 1024", t);
251 cout <<
"\n<TBODY style=\"background: yellow\">";
252 BenchMarkSignature<RSASS<PSSR, SHA> >(PACKAGE_DATA_DIR
"TestData/rsa1024.dat",
"RSA 1024", t);
253 BenchMarkSignature<RWSS<PSSR, SHA> >(PACKAGE_DATA_DIR
"TestData/rw1024.dat",
"RW 1024", t);
254 BenchMarkSignature<LUCSS<PSSR, SHA> >(PACKAGE_DATA_DIR
"TestData/luc1024.dat",
"LUC 1024", t);
255 BenchMarkSignature<NR<SHA> >(PACKAGE_DATA_DIR
"TestData/nr1024.dat",
"NR 1024", t);
256 BenchMarkSignature<DSA>(PACKAGE_DATA_DIR
"TestData/dsa1024.dat",
"DSA 1024", t);
257 BenchMarkSignature<LUC_HMP<SHA> >(PACKAGE_DATA_DIR
"TestData/lucs512.dat",
"LUC-HMP 512", t);
258 BenchMarkSignature<ESIGN<SHA> >(PACKAGE_DATA_DIR
"TestData/esig1023.dat",
"ESIGN 1023", t);
259 BenchMarkSignature<ESIGN<SHA> >(PACKAGE_DATA_DIR
"TestData/esig1536.dat",
"ESIGN 1536", t);
261 cout <<
"\n<TBODY style=\"background: white\">";
262 BenchMarkSignature<RSASS<PSSR, SHA> >(PACKAGE_DATA_DIR
"TestData/rsa2048.dat",
"RSA 2048", t);
263 BenchMarkSignature<RWSS<PSSR, SHA> >(PACKAGE_DATA_DIR
"TestData/rw2048.dat",
"RW 2048", t);
264 BenchMarkSignature<LUCSS<PSSR, SHA> >(PACKAGE_DATA_DIR
"TestData/luc2048.dat",
"LUC 2048", t);
265 BenchMarkSignature<NR<SHA> >(PACKAGE_DATA_DIR
"TestData/nr2048.dat",
"NR 2048", t);
266 BenchMarkSignature<LUC_HMP<SHA> >(PACKAGE_DATA_DIR
"TestData/lucs1024.dat",
"LUC-HMP 1024", t);
267 BenchMarkSignature<ESIGN<SHA> >(PACKAGE_DATA_DIR
"TestData/esig2046.dat",
"ESIGN 2046", t);
269 cout <<
"\n<TBODY style=\"background: yellow\">";
270 BenchMarkKeyAgreement<XTR_DH>(PACKAGE_DATA_DIR
"TestData/xtrdh171.dat",
"XTR-DH 171", t);
271 BenchMarkKeyAgreement<XTR_DH>(PACKAGE_DATA_DIR
"TestData/xtrdh342.dat",
"XTR-DH 342", t);
272 BenchMarkKeyAgreement<DH>(PACKAGE_DATA_DIR
"TestData/dh1024.dat",
"DH 1024", t);
273 BenchMarkKeyAgreement<DH>(PACKAGE_DATA_DIR
"TestData/dh2048.dat",
"DH 2048", t);
274 BenchMarkKeyAgreement<LUC_DH>(PACKAGE_DATA_DIR
"TestData/lucd512.dat",
"LUCDIF 512", t);
275 BenchMarkKeyAgreement<LUC_DH>(PACKAGE_DATA_DIR
"TestData/lucd1024.dat",
"LUCDIF 1024", t);
276 BenchMarkKeyAgreement<MQV>(PACKAGE_DATA_DIR
"TestData/mqv1024.dat",
"MQV 1024", t);
277 BenchMarkKeyAgreement<MQV>(PACKAGE_DATA_DIR
"TestData/mqv2048.dat",
"MQV 2048", t);
279 cout <<
"\n<TBODY style=\"background: white\">";
288 BenchMarkEncryption(
"ECIES over GF(p) 256", cpub, t);
289 BenchMarkDecryption(
"ECIES over GF(p) 256", cpriv, cpub, t);
290 BenchMarkSigning(
"ECDSA over GF(p) 256", spriv, t);
291 BenchMarkVerification(
"ECDSA over GF(p) 256", spriv, spub, t);
292 BenchMarkKeyGen(
"ECDHC over GF(p) 256", ecdhc, t);
293 BenchMarkAgreement(
"ECDHC over GF(p) 256", ecdhc, t);
294 BenchMarkKeyGen(
"ECMQVC over GF(p) 256", ecmqvc, t);
295 BenchMarkAgreement(
"ECMQVC over GF(p) 256", ecmqvc, t);
298 cout <<
"<TBODY style=\"background: yellow\">" << endl;
307 BenchMarkEncryption(
"ECIES over GF(2^n) 233", cpub, t);
308 BenchMarkDecryption(
"ECIES over GF(2^n) 233", cpriv, cpub, t);
309 BenchMarkSigning(
"ECDSA over GF(2^n) 233", spriv, t);
310 BenchMarkVerification(
"ECDSA over GF(2^n) 233", spriv, spub, t);
311 BenchMarkKeyGen(
"ECDHC over GF(2^n) 233", ecdhc, t);
312 BenchMarkAgreement(
"ECDHC over GF(2^n) 233", ecdhc, t);
313 BenchMarkKeyGen(
"ECMQVC over GF(2^n) 233", ecmqvc, t);
314 BenchMarkAgreement(
"ECMQVC over GF(2^n) 233", ecmqvc, t);
316 cout <<
"</TABLE>" << endl;