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); })); }
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); })); }