Shamir's trick implementation.
[crypto_lab3.git] / src / RsaCrt.h
index 29bc4b9..6e93e6b 100644 (file)
@@ -1,20 +1,43 @@
 #ifndef RSACRT_H
 #define RSACRT_H
 
+#include <utility>
+#include <exception>
+
 #include <gmpxx.h>
 
+#include "Rsa.h"
+
 class RsaCrt
 {
 public:
-   RsaCrt();
-
-   struct KeyPrivCRT {
+   struct KeyPriv {
       mpz_class p;
       mpz_class q;
       mpz_class dp;
       mpz_class dq;
       mpz_class qInv;
    };
+
+   /**
+    * Generate a pair of keys (public, private).
+    */
+   static std::pair<Rsa::KeyPub, KeyPriv> generateRSAKeys(uint exponent, uint keySizeBits);
+
+   /**
+    * m must not be greater or equal than kPriv.n.
+    * @param m the message to sign. No padding is used.
+    */
+   static mpz_class sign(const mpz_class& m, const KeyPriv& kPriv);
+
+   /**
+    * Sp is altered by flipping its 42nd bit.
+    * @param m the message to sign. No padding is used.
+    */
+   static mpz_class signWithFaultySp(const mpz_class& m, const KeyPriv& kPriv);
+
+private:
+   static mpz_class sign(const mpz_class& m, const KeyPriv& kPriv, bool withError);
 };
 
 #endif