public bool CheckKey()
 {
     return
         (PoupardSternProof != null && _PermutationTestProof != null &&
          PoupardStern.VerifyPoupardStern(_PublicKey._Key, PoupardSternProof, PoupardSetup) &&
          PermutationTest.VerifyPermutationTest(_PublicKey._Key, PermutationTestProof, PermutationSetup));
 }
        public void CheckAlphaNTest0()
        {
            // Sanity check
            var keyPair = TestUtils.GeneratePrivate(Exp, setup.KeySize);

            var pubKey = (RsaKeyParameters)keyPair.Public;

            var Modulus = pubKey.Modulus;

            // Assert CheckAlphaN returns True
            Assert.IsTrue(PermutationTest.CheckAlphaN(alpha, Modulus));
        }
Exemple #3
0
        public void _CheckAlphaN(BigInteger Exp, int keySize, int alpha, out double alphaTime)
        {
            var keyPair = TestUtils.GeneratePrivate(Exp, keySize);

            var pubKey  = (RsaKeyParameters)keyPair.Public;
            var Modulus = pubKey.Modulus;

            sw.Restart(); //Check AlphaN start
            var output = PermutationTest.CheckAlphaN(alpha, Modulus);

            sw.Stop();  //Check AlphaN ends
            Assert.IsTrue(output);
            alphaTime = sw.Elapsed.TotalMilliseconds;
        }
        public void CheckAlphaNTest3()
        {
            // CheckAlphaN outputs fail if N is even (2 * alpha).
            BigInteger p, q;

            // p is Two (Even)
            p = BigInteger.Two;

            // Generate q to fill N
            q = BigInteger.ValueOf(alpha);

            var Modulus = p.Multiply(q);

            // Assert CheckAlphaN returns False
            Assert.IsFalse(PermutationTest.CheckAlphaN(alpha, Modulus));
        }
Exemple #5
0
        public void GetRhos_Data()
        {
            // GetRhos is really producing outputs rho that are<N and have GCD(N, rho) = 1
            int m2      = 10000;
            var keyPair = TestUtils.GeneratePrivate(Exp, keySize);

            var privKey = (RsaPrivateCrtKeyParameters)keyPair.Private;
            var pubKey  = (RsaKeyParameters)keyPair.Public;

            var Modulus = pubKey.Modulus;

            // Generate list of rho values
            PermutationTest.GetRhos(m2, ps, pubKey, keySize, out byte[][] rhoValues);

            Console.WriteLine(String.Join(",", rhoValues.Select(a => new BigInteger(1, a))));
        }
        public void Get_m1_m2Test()
        {
            // Get_m1_m2 produce outputs that match those in Section 2.7 of setup.pdf
            var k   = 128;
            var Exp = 65537;

            PermutationTest.Get_m1_m2(41, Exp, k, out int m1, out int m2);
            Assert.IsTrue(m1.Equals(24) && m2.Equals(24));
            PermutationTest.Get_m1_m2(89, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(20) && m2.Equals(20));
            PermutationTest.Get_m1_m2(191, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(17) && m2.Equals(17));
            PermutationTest.Get_m1_m2(937, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(13) && m2.Equals(13));
            PermutationTest.Get_m1_m2(1667, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(12) && m2.Equals(12));
            PermutationTest.Get_m1_m2(3187, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(11) && m2.Equals(12));
        }
Exemple #7
0
        public void Get_m1_m2Test()
        {
            // Get_m1_m2 produce outputs that match those in Section 2.7 of setup.pdf
            var k   = 128;
            var Exp = 65537;

            PermutationTest.Get_m1_m2(41, Exp, k, out int m1, out int m2);
            Assert.IsTrue(m1.Equals(25) && m2.Equals(25));
            PermutationTest.Get_m1_m2(997, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(13) && m2.Equals(13));
            PermutationTest.Get_m1_m2(4999, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(11) && m2.Equals(11));
            PermutationTest.Get_m1_m2(7649, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(10) && m2.Equals(11));
            PermutationTest.Get_m1_m2(20663, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(9) && m2.Equals(10));
            PermutationTest.Get_m1_m2(33469, Exp, k, out m1, out m2);
            Assert.IsTrue(m1.Equals(9) && m2.Equals(9));
        }
        public void CheckAlphaNTest2()
        {
            // CheckAlphaN outputs fail if N is even.
            // Sanity check
            var keyPair = TestUtils.GeneratePrivate(Exp, setup.KeySize);

            var privKey = (RsaPrivateCrtKeyParameters)keyPair.Private;
            var pubKey  = (RsaKeyParameters)keyPair.Public;

            var Modulus = pubKey.Modulus;

            var ModBytes = Modulus.ToByteArrayUnsigned();

            // Make the LSB a zero to make it even.
            ModBytes[ModBytes.Length - 1] &= (byte)0xfe;

            Modulus = new BigInteger(1, ModBytes);

            // Assert CheckAlphaN returns False
            Assert.IsFalse(PermutationTest.CheckAlphaN(alpha, Modulus));
        }
        public void CheckAlphaNTest1()
        {
            // CheckAlphaN outputs fail if N has some prime number p < alpha as a factor.
            BigInteger p, q;

            // prime that comes immediately before alpha
            var primeN = Utils.Primes(alpha - 1).Last();

            p = BigInteger.ValueOf(primeN);

            int pbitlength = p.BitLength;
            int qbitlength = (setup.KeySize - pbitlength);

            // Generate q
            q = TestUtils.GenQ(p, qbitlength, setup.KeySize, Exp);

            var Modulus = p.Multiply(q);

            // Assert CheckAlphaN returns False
            Assert.IsFalse(PermutationTest.CheckAlphaN(alpha, Modulus));
        }
        public void GetRhosTest()
        {
            // GetRhos is really producing outputs rho that are<N and have GCD(N, rho) = 1
            int m2      = 11;
            var keyPair = TestUtils.GeneratePrivate(Exp, setup.KeySize);

            var privKey = (RsaPrivateCrtKeyParameters)keyPair.Private;
            var pubKey  = (RsaKeyParameters)keyPair.Public;

            var Modulus = pubKey.Modulus;

            // Generate list of rho values
            PermutationTest.GetRhos(m2, ps, pubKey, setup.KeySize, out byte[][] rhoValues);

            for (int i = 0; i < rhoValues.Length; i++)
            {
                // Convert rho value to a number
                var num = Utils.OS2IP(rhoValues[i]);
                // Assert the number is less than N
                Assert.IsTrue(num.CompareTo(Modulus) < 0);
                // Assert GCD(rho, N) == 1
                Assert.IsTrue(Modulus.Gcd(num).Equals(BigInteger.One));
            }
        }
Exemple #11
0
        public void BenchmarkPermutationTest()
        {
            Console.WriteLine($"Parameters,,, {keySizeList[0]}-bit RSA,, {keySizeList[1]}-bit RSA,, {keySizeList[2]}-bit RSA,");
            Console.WriteLine("alpha, m1, m2, Prove, Verify, Prove, Verify, Prove, Verify");

            foreach (int alpha in alphaList)
            {
                PermutationTest.Get_m1_m2(alpha, Exp.IntValue, k, out int m1, out int m2);
                Console.Write($"{alpha},{m1},{m2}");
                foreach (int keySize in keySizeList)
                {
                    double ProvingTime   = 0.0;
                    double VerifyingTime = 0.0;
                    for (int i = 0; i < iterations; i++)
                    {
                        _ProvingAndVerifyingTest1(Exp, keySize, alpha, out double subPTime, out double subVTime);
                        ProvingTime   += subPTime;
                        VerifyingTime += subVTime;
                    }
                    Console.Write($",{ProvingTime / iterations} ,{VerifyingTime / iterations}");
                }
                Console.WriteLine();
            }
        }
        private static Tuple <RsaKey, RSAKeyData> LoadRSAKeyData(string dataDir, string keyName, bool noRSAProof)
        {
            RSAKeyData data = new RSAKeyData();
            RsaKey     key  = null;

            {
                var rsaFile = Path.Combine(dataDir, keyName);
                if (!File.Exists(rsaFile))
                {
                    Logs.Configuration.LogWarning("RSA private key not found, please backup it. Creating...");
                    key = new RsaKey();
                    File.WriteAllBytes(rsaFile, key.ToBytes());
                    Logs.Configuration.LogInformation("RSA key saved (" + rsaFile + ")");
                }
                else
                {
                    Logs.Configuration.LogInformation("RSA private key found (" + rsaFile + ")");
                    key = new RsaKey(File.ReadAllBytes(rsaFile));
                }
            }

            data.PublicKey = key.PubKey;


            if (!noRSAProof)
            {
                {
                    var poupard = Path.Combine(dataDir, "ProofPoupard-" + keyName);
                    PoupardSternProof poupardProof = null;
                    if (!File.Exists(poupard))
                    {
                        Logs.Configuration.LogInformation("Creating Poupard Stern proof...");
                        poupardProof = PoupardStern.ProvePoupardStern(key._Key, RSAKeyData.PoupardSetup);
                        MemoryStream  ms = new MemoryStream();
                        BitcoinStream bs = new BitcoinStream(ms, true);
                        bs.ReadWriteC(ref poupardProof);
                        File.WriteAllBytes(poupard, ms.ToArray());
                        Logs.Configuration.LogInformation("Poupard Stern proof created (" + poupard + ")");
                    }
                    else
                    {
                        Logs.Configuration.LogInformation("Poupard Stern Proof found (" + poupard + ")");
                        var           bytes = File.ReadAllBytes(poupard);
                        MemoryStream  ms    = new MemoryStream(bytes);
                        BitcoinStream bs    = new BitcoinStream(ms, false);
                        bs.ReadWriteC(ref poupardProof);
                    }
                    data.PoupardSternProof = poupardProof;
                }

                {
                    var permutation = Path.Combine(dataDir, "ProofPermutation-" + keyName);
                    PermutationTestProof permutationProof = null;
                    if (!File.Exists(permutation))
                    {
                        Logs.Configuration.LogInformation("Creating Permutation Test proof...");
                        permutationProof = PermutationTest.ProvePermutationTest(key._Key, RSAKeyData.PermutationSetup);
                        MemoryStream  ms = new MemoryStream();
                        BitcoinStream bs = new BitcoinStream(ms, true);
                        bs.ReadWriteC(ref permutationProof);
                        File.WriteAllBytes(permutation, ms.ToArray());
                        Logs.Configuration.LogInformation("Permutation Test proof created (" + permutation + ")");
                    }
                    else
                    {
                        Logs.Configuration.LogInformation("Permutation Test Proof found (" + permutation + ")");
                        var           bytes = File.ReadAllBytes(permutation);
                        MemoryStream  ms    = new MemoryStream(bytes);
                        BitcoinStream bs    = new BitcoinStream(ms, false);
                        bs.ReadWriteC(ref permutationProof);
                    }
                    data.PermutationTestProof = permutationProof;
                }
            }
            return(Tuple.Create(key, data));
        }