public void BDBadProofTest()
        {
            FieldZqElement     bigNum       = _parameters[0].FieldZq.GetElement(30);
            PedersenCommitment bigNumCommit = new PedersenCommitment(bigNum, _parameters[0]);
            int decompositionLength         = 8;


            ProverBitDecompositionParameters proverParams = new ProverBitDecompositionParameters(
                bigNumCommit,
                decompositionLength,
                _parameters[0]);
            BitDecompositionProof proof         = new BitDecompositionProof(proverParams);
            PrivateObject         proofAccessor = new PrivateObject(proof);

            SetMembershipProof[] smProof    = (SetMembershipProof[])proofAccessor.GetField("bitCommitmentProof");
            SetMembershipProof[] badSmProof = smProof;
            SetMembershipProof   tmp        = smProof[1];

            badSmProof[1] = badSmProof[0];
            proofAccessor.SetFieldOrProperty("bitCommitmentProof", badSmProof);
            Assert.IsFalse(proof.Verify(proverParams), "bad set membeship proof.");
            proofAccessor.SetFieldOrProperty("bitCommitmentProof", smProof);
            smProof[1] = tmp;
            Assert.IsTrue(proof.Verify(proverParams), "good set membership proof.");

            EqualityProof eqProof         = (EqualityProof)proofAccessor.GetField("compositionProof");
            PrivateObject eqProofAccessor = new PrivateObject(eqProof);

            GroupElement [] b = (GroupElement[])eqProofAccessor.GetField("b");
            b[1] = b[0];
            eqProofAccessor.SetField("b", b);
            Assert.IsFalse(proof.Verify(proverParams), "bad equality proof");
        }
        public void BDSerializationTest()
        {
            FieldZqElement     bigNum               = _parameters[0].FieldZq.GetElement(2056);
            PedersenCommitment bigNumCommit         = new PedersenCommitment(bigNum, _parameters[0]);
            int decompositionLength                 = 15;
            ProverBitDecompositionParameters prover = new ProverBitDecompositionParameters(
                bigNumCommit,
                decompositionLength,
                _parameters[0]);

            BitDecompositionProof proof = new BitDecompositionProof(prover);

            Assert.IsTrue(proof.Verify(prover), "original proof verification.");
            string jsonProof = CryptoSerializer.Serialize <BitDecompositionProof>(proof);
            // TODO: switch to using ip-based de-serialization; need to harmonize with U-Prove SDK code
            IssuerParameters ip = new IssuerParameters();

            ip.Gq = prover.Group;
            BitDecompositionProof deserializedProof = ip.Deserialize <BitDecompositionProof>(jsonProof);// CryptoSerializer.Deserialize<BitDecompositionProof>(jsonProof);

            Assert.IsTrue(deserializedProof.Verify(prover), "deserialized proof verfication");


            string jsonProver = CryptoSerializer.Serialize <ProverBitDecompositionParameters>(prover);
            ProverBitDecompositionParameters deserializedProver = CryptoSerializer.Deserialize <ProverBitDecompositionParameters>(jsonProver);

            Assert.IsTrue(deserializedProof.Verify(deserializedProver), "deserialized proof with deserialized prover.");

            BitDecompositionProof proof2 = new BitDecompositionProof(deserializedProver);

            Assert.IsTrue(proof2.Verify(deserializedProver), "proof2.verify(deserializedProver)");
            Assert.IsTrue(proof2.Verify(prover), "Proof2.verify(prover)");
        }
        public void BDBadProverTest()
        {
            ProverBitDecompositionParameters prover = new ProverBitDecompositionParameters(
                new PedersenCommitment(_parameters[2].FieldZq.GetElement(10), _parameters[2]),
                4,
                _parameters[2]);

            BitDecompositionProof proof          = new BitDecompositionProof(prover);
            PrivateObject         proverAccessor = new PrivateObject(prover);

            PedersenCommitment[] witnesses = (PedersenCommitment[] )proverAccessor.GetFieldOrProperty("Witnesses");
            witnesses[witnesses.Length - 1] = new PedersenCommitment(_parameters[2].FieldZq.GetElement(10), _parameters[2]);
            Assert.IsFalse(proof.Verify(prover));
        }
        public void BDBadProverParameterTest()
        {
            ProverBitDecompositionParameters prover = new ProverBitDecompositionParameters(
                new PedersenCommitment(_parameters[2].FieldZq.GetElement(10), _parameters[2]),
                4,
                _parameters[2]);


            prover.Witnesses[3] = new PedersenCommitment(_parameters[2].FieldZq.GetElement(2), _parameters[2]);
            StaticHelperClass.AssertThrowsException
            (
                () => { BitDecompositionProof proof = new BitDecompositionProof(prover); },
                typeof(Exception),
                "Bad prover parameters."
            );
        }
        public void BDProverSerializationTest()
        {
            FieldZqElement     bigNum               = _parameters[0].FieldZq.GetElement(2056);
            PedersenCommitment bigNumCommit         = new PedersenCommitment(bigNum, _parameters[0]);
            int decompositionLength                 = 15;
            ProverBitDecompositionParameters prover = new ProverBitDecompositionParameters(
                bigNumCommit,
                decompositionLength,
                _parameters[0]);

            string jsonString = CryptoSerializer.Serialize <ProverBitDecompositionParameters>(prover);
            ProverBitDecompositionParameters deserializedProver = CryptoSerializer.Deserialize <ProverBitDecompositionParameters>(jsonString);

            Assert.AreEqual(prover.Group.GroupName, deserializedProver.Group.GroupName);
            StaticHelperClass.AssertArraysAreEqual(prover.PublicValues, deserializedProver.PublicValues, "PublicValues");
            StaticHelperClass.AssertArraysAreEqual <DLRepOfGroupElement>(prover.Witnesses, deserializedProver.Witnesses, "Witnesses");
        }
        public void BDConstructorCastTest()
        {
            FieldZqElement     bigNum       = _parameters[0].FieldZq.GetElement(129);
            PedersenCommitment bigNumCommit = new PedersenCommitment(bigNum, _parameters[0]);
            int decompositionLength         = 15;


            ProverBitDecompositionParameters proverParams = new ProverBitDecompositionParameters(
                bigNumCommit,
                decompositionLength,
                _parameters[0]);

            Assert.IsInstanceOfType(proverParams.OpenCommitment, typeof(PedersenCommitment), "OpenCommitment wrong type");
            Assert.IsInstanceOfType(proverParams.ClosedCommitment, typeof(GroupElement), "ClosedCommitment wrong type");

            Assert.IsInstanceOfType(proverParams.OpenCommitment, typeof(PedersenCommitment), "OpenCommitment wrong type");
            Assert.IsInstanceOfType(proverParams.ClosedCommitment, typeof(GroupElement), "ClosedCommitment wrong type");
            for (int i = 0; i < proverParams.DecompositionLength; ++i)
            {
                Assert.IsInstanceOfType(proverParams.OpenBitDecomposition(i), typeof(PedersenCommitment), "OpenBitDecomposition(i) returned wrong type");
                Assert.IsInstanceOfType(proverParams.ClosedBitDecomposition(i), typeof(GroupElement), "ClosedBitDecomposition returned wrong type");
            }
        }
        public void BDEndToEnd()
        {
            FieldZqElement     bigNum       = _parameters[0].FieldZq.GetElement(2056);
            PedersenCommitment bigNumCommit = new PedersenCommitment(bigNum, _parameters[0]);
            int decompositionLength         = 15;


            ProverBitDecompositionParameters proverParams = new ProverBitDecompositionParameters(
                bigNumCommit,
                decompositionLength,
                _parameters[0]);

            BitDecompositionProof proof = new BitDecompositionProof(proverParams);

            Assert.IsTrue(proof.Verify(proverParams), "could not verify proof with prover params");

            VerifierBitDecompositionParameters verifierParams = new VerifierBitDecompositionParameters(
                proverParams.ClosedCommitment,
                proverParams.ClosedBitDecomposition(),
                proverParams);

            Assert.IsTrue(proof.Verify(verifierParams), "could not verify proof with verifier parameters");
        }