92bccd0ace882171840cd5ea95690835d986c301
[crypto_lab3.git] / src / Tests.cpp
1 #include "Tests.h"
2
3 #include <iostream>
4 using namespace std;
5
6 #include <gmpxx.h>
7
8 #include "Rand.h"
9 #include "RsaStd.h"
10 #include "RsaCrt.h"
11
12 Tests::Tests(uint keySizeBits, uint rsaPublicExponent) :
13 KEY_SIZE_BITS(keySizeBits),
14 RSA_PUBLIC_EXPONENT(rsaPublicExponent)
15 {
16 }
17
18 void Tests::runTests()
19 {
20 if (this->rsaStandard())
21 cout << "RSA standard OK" << endl;
22 else
23 cout << "RSA standard failed!" << endl;
24
25 if (this->rsaCrt())
26 cout << "RSA CRT OK" << endl;
27 else
28 cout << "RSA CRT failed!" << endl;
29 }
30
31 void Tests::runTimeMeasures()
32 {
33 const int N = 1000;
34 const int nbKeys = 20; // Number of different generated key.
35
36 int timeRsaStd = 0;
37 int timeRsaCRT = 0;
38
39 for (int k = 0; k < nbKeys; ++k)
40 {
41 timeRsaStd += timeSignRsaStd(N);
42 timeRsaCRT += timeSignRsaCRT(N);
43 }
44
45 cout << N * nbKeys << " x RSA standard: " << timeRsaStd << " ms" << endl;
46 cout << N * nbKeys << " x RSA CRT: " << timeRsaCRT << " ms" << endl;
47 cout << "Speedup: " << (double(timeRsaStd) / double(timeRsaCRT)) << endl;
48 }
49
50 bool Tests::rsaStandard()
51 {
52 const auto& keys = RsaStd::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
53 const auto& kPub = keys.first;
54 const auto& kPriv = keys.second;
55
56 {
57 mpz_class message = kPriv.n;
58 mpz_class signature = RsaStd::sign(message, kPriv);
59 if (Rsa::verifySignature(message, signature, kPub)) // Must not be able to signe message greater than kPriv.n.
60 return false;
61 }
62
63 {
64 mpz_class message = kPriv.n - 1;
65 mpz_class signature = RsaStd::sign(message, kPriv);
66 if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
67 return false;
68 }
69
70 {
71 mpz_class message = kPriv.n / 2;
72 mpz_class signature = RsaStd::sign(message, kPriv);
73 if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
74 return false;
75 }
76
77 return true;
78 }
79
80 bool Tests::rsaCrt()
81 {
82 const auto& keys = RsaCrt::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
83 const auto& kPub = keys.first;
84 const auto& kPriv = keys.second;
85
86 {
87 mpz_class message = kPub.n;
88 mpz_class signature = RsaCrt::sign(message, kPriv);
89 if (Rsa::verifySignature(message, signature, kPub)) // Must not be able to signe message greater than kPub.n.
90 return false;
91 }
92
93 {
94 mpz_class message = kPub.n - 1;
95 mpz_class signature = RsaCrt::sign(message, kPriv);
96 if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
97 return false;
98 }
99
100 {
101 mpz_class message = kPub.n / 2;
102 mpz_class signature = RsaCrt::sign(message, kPriv);
103 if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
104 return false;
105 }
106
107 return true;
108 }
109
110 int Tests::timeSignRsaStd(int N)
111 {
112 Timer timer;
113 const auto& keys = RsaStd::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
114
115 mpz_class message = Rand::randSize(KEY_SIZE_BITS / 2);
116 for (int i = 0; i < N; i++)
117 RsaStd::sign(message, keys.second);
118
119 return timer.ms();
120 }
121
122 int Tests::timeSignRsaCRT(int N)
123 {
124 Timer timer;
125 const auto& keys = RsaCrt::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
126
127 mpz_class message = Rand::randSize(KEY_SIZE_BITS / 2);
128 for (int i = 0; i < N; i++)
129 RsaCrt::sign(message, keys.second);
130
131 return timer.ms();
132 }