コード例 #1
0
        static void TestPairing()
        {
            Console.WriteLine("TestG2");
            G1 P = new G1();

            P.HashAndMapTo("123");
            G2 Q = new G2();

            Q.HashAndMapTo("1");
            Fr a = new Fr();
            Fr b = new Fr();

            a.SetStr("12345678912345673453", 10);
            b.SetStr("230498230982394243424", 10);
            G1 aP = new G1();
            G2 bQ = new G2();

            aP.Mul(P, a);
            bQ.Mul(Q, b);
            GT e1 = new GT();
            GT e2 = new GT();
            GT e3 = new GT();

            e1.Pairing(P, Q);
            e2.Pairing(aP, Q);
            e3.Pow(e1, a);
            assert("e2.Equals(e3)", e2.Equals(e3));
            e2.Pairing(P, bQ);
            e3.Pow(e1, b);
            assert("e2.Equals(e3)", e2.Equals(e3));
        }
コード例 #2
0
        public bool ValidateSignature(Signature signature, byte[] message)
        {
            var mappedMessage = new G2();

            mappedMessage.SetHashOf(message);
            return(GT.Pairing(RawKey, mappedMessage).Equals(GT.Pairing(G1.Generator, signature.RawSignature)));
        }
コード例 #3
0
ファイル: PrivateKey.cs プロジェクト: LAToken/lachain
 public PartiallyDecryptedShare Decrypt(EncryptedShare share)
 {
     return(DecryptBenchmark.Benchmark(() =>
     {
         var h = Utils.HashToG2(share.U, share.V);
         if (!GT.Pairing(G1.Generator, share.W).Equals(GT.Pairing(share.U, h)))
         {
             throw new Exception("Invalid share!");
         }
         var ui = share.U * _x;
         return new PartiallyDecryptedShare(ui, _id, share.Id);
     }));
 }
コード例 #4
0
        public void PairingTest()
        {
            var a = Fr.GetRandom();
            var b = Fr.GetRandom();

            var A = G1.Generator * a;
            var B = G2.Generator * b;

            var X = GT.Pairing(A, B);
            var Y = GT.Pow(GT.Pairing(G1.Generator, G2.Generator), a * b);

            Assert.True(X.Equals(Y));
        }
コード例 #5
0
        public void TestPairing()
        {
            var fr1   = Fr.GetRandom();
            var fr2   = Fr.GetRandom();
            var rndG1 = G1.Generator * fr1;
            var rndG2 = G2.Generator * fr2;

            Assert.AreEqual(GT.One, GT.Pairing(G1.Zero, G2.Zero));
            Assert.AreEqual(GT.One, GT.Pairing(G1.Zero, rndG2));
            Assert.AreEqual(GT.One, GT.Pairing(rndG1, G2.Zero));
            var generatorsPairing = GT.Pairing(G1.Generator, G2.Generator);

            Assert.AreEqual(GT.Pow(generatorsPairing, fr1 * fr2), GT.Pairing(rndG1, rndG2));
        }
コード例 #6
0
        public void TestMillerLoop()
        {
            var p = G1.Generator * Fr.GetRandom();
            var q = G2.Generator * Fr.GetRandom();

            Assert.AreEqual(
                GT.Pairing(p, q),
                GT.FinalExp(GT.MillerLoop(p, q))
                );
            var r      = G1.Generator * Fr.GetRandom();
            var s      = G2.Generator * Fr.GetRandom();
            var pqLoop = GT.MillerLoop(p, q);
            var rsLoop = GT.MillerLoop(r, s);

            Assert.AreEqual(
                GT.Pairing(p, q) * GT.Pairing(r, s),
                GT.FinalExp(pqLoop * rsLoop)
                );
        }