+bool Tests::rsaCrtWithShamirsTrick()
+{
+ const auto& keys = RsaCrtShamirsTrick::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
+ const auto& kPub = keys.first;
+ const auto& kPriv = keys.second;
+
+ {
+ mpz_class message = kPub.n;
+ mpz_class signature = RsaCrtShamirsTrick::sign(message, kPriv);
+ if (Rsa::verifySignature(message, signature, kPub)) // Must not be able to signe message greater than kPub.n.
+ return false;
+ }
+
+ {
+ mpz_class message = kPub.n - 1;
+ mpz_class signature = RsaCrtShamirsTrick::sign(message, kPriv);
+ if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
+ return false;
+ }
+
+ {
+ mpz_class message = kPub.n / 2;
+ mpz_class signature = RsaCrtShamirsTrick::sign(message, kPriv);
+ if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
+ return false;
+ }
+
+ return true;
+}
+