Beispiel #1
0
 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);
     }));
 }
Beispiel #2
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);
            }));
        }