Пример #1
0
        private static G1 AssemblePublicKey(IEnumerable <G1> shares, int n)
        {
            var xs = Enumerable.Range(1, n).Select(Fr.FromInt).ToArray();
            var ys = shares.ToArray();

            return(MclBls12381.LagrangeInterpolate(xs, ys));
        }
Пример #2
0
        public Signature AssembleSignature(IEnumerable <KeyValuePair <int, Signature> > shares)
        {
            var keyValuePairs = shares as KeyValuePair <int, Signature>[] ?? shares.ToArray();
            var xs            = keyValuePairs.Take(Threshold + 1).Select(pair => Fr.FromInt(pair.Key + 1)).ToArray();
            var ys            = keyValuePairs.Take(Threshold + 1).Select(pair => pair.Value.RawSignature).ToArray();

            if (xs.Length <= Threshold || ys.Length <= Threshold)
            {
                throw new ArgumentException("not enough shares for signature");
            }
            return(new Signature(MclBls12381.LagrangeInterpolate(xs, ys)));
        }
Пример #3
0
        public void TestPolyInterpolationG2()
        {
            const int degree = 100;
            var       coeffs = Enumerable.Range(0, degree)
                               .Select(i => G2.Generator * Fr.GetRandom())
                               .ToArray();
            var xs = Enumerable.Range(1, degree)
                     .Select(i => Fr.GetRandom())
                     .ToArray();
            var ys = xs
                     .Select(x => MclBls12381.EvaluatePolynomial(coeffs, x))
                     .ToArray();
            var intercept = MclBls12381.EvaluatePolynomial(coeffs, Fr.FromInt(0));

            Assert.AreEqual(intercept, MclBls12381.LagrangeInterpolate(xs, ys));
            Assert.Throws <ArgumentException>(() => MclBls12381.LagrangeInterpolate(xs, ys.Take(degree - 1).ToArray()));
        }
Пример #4
0
        public void EvalInterpolateTestFr()
        {
            const int n      = 10;
            var       poly   = Enumerable.Range(0, n).Select(_ => Fr.GetRandom()).ToArray();
            var       values = Enumerable.Range(100, n + 1)
                               .Select(i => MclBls12381.EvaluatePolynomial(poly, Fr.FromInt(i)))
                               .ToArray();

            for (var i = 0; i < n + 1; ++i)
            {
                Assert.AreEqual(DummyEval(poly, Fr.FromInt(100 + i)), values[i]);
            }
            var intercept = MclBls12381.LagrangeInterpolate(
                Enumerable.Range(100, n + 1).Select(Fr.FromInt).ToArray(),
                values
                );

            Assert.AreEqual(poly[0], intercept);
        }
Пример #5
0
        public Fr InterpolateValues()
        {
            if (Commitment is null)
            {
                throw new ArgumentException("Cannot interpolate without commitment");
            }
            var xs = Acks.WithIndex()
                     .Where(x => x.item)
                     .Select(x => x.index + 1)
                     .Select(Fr.FromInt)
                     .Take(Commitment.Degree + 1)
                     .ToArray();
            var ys = Acks.WithIndex()
                     .Where(x => x.item)
                     .Select(x => Values[x.index])
                     .Take(Commitment.Degree + 1)
                     .ToArray();

            if (xs.Length != Commitment.Degree + 1 || ys.Length != Commitment.Degree + 1)
            {
                throw new Exception("Cannot interpolate values");
            }
            return(MclBls12381.LagrangeInterpolate(xs, ys));
        }
Пример #6
0
        public RawShare FullDecrypt(EncryptedShare share, List <PartiallyDecryptedShare> us)
        {
            return(FullDecryptBenchmark.Benchmark(() =>
            {
                if (us.Count < _t)
                {
                    throw new Exception("Insufficient number of shares!");
                }

                var ids = new HashSet <int>();
                foreach (var part in us)
                {
                    if (ids.Contains(part.DecryptorId))
                    {
                        throw new Exception($"Id {part.DecryptorId} was provided more than once!");
                    }
                    if (part.ShareId != share.Id)
                    {
                        throw new Exception($"Share id mismatch for decryptor {part.DecryptorId}");
                    }
                    ids.Add(part.DecryptorId);
                }

                var ys = new List <G1>();
                var xs = new List <Fr>();

                foreach (var part in us)
                {
                    xs.Add(Fr.FromInt(part.DecryptorId + 1));
                    ys.Add(part.Ui);
                }

                var u = MclBls12381.LagrangeInterpolate(xs.ToArray(), ys.ToArray());
                return new RawShare(Utils.XorWithHash(u, share.V), share.Id);
            }));
        }