// Generate synthetic nonce using current state combined with additional randomness. public PublicNoncesSequence CreateSyntheticPublicNoncesProvider(IEnumerable <Scalar> secrets, WasabiRandom random) { // To integrate prior inputs for deterministic component of nonce // generation, first clone the state at the current point in the // transcript, which should already have the statement tag and public // inputs committed. var forked = _strobe.MakeCopy(); // add secret inputs as key material foreach (var secret in secrets) { forked.Key(secret.ToBytes(), false); } // Add additional randomness forked.Key(random.GetBytes(KeySizeInBytes), false); IEnumerable <Scalar> NoncesGenerator() { while (true) { yield return(new Scalar(forked.Prf(KeySizeInBytes, false))); } } // Generate a new scalar for each secret using this updated state as a seed. return(NoncesGenerator); }
public SyntheticSecretNonceProvider(Strobe128 strobe, IEnumerable <Scalar> secrets, WasabiRandom random) { Guard.NotNullOrEmpty(nameof(secrets), secrets); _strobe = strobe; _secretCount = secrets.Count(); // add secret inputs as key material foreach (var secret in secrets) { _strobe.Key(secret.ToBytes(), false); } _strobe.Key(random.GetBytes(32), false); }
public SyntheticSecretNonceProvider(Strobe128 strobe, IEnumerable <Scalar> secrets, WasabiRandom random) { Guard.NotNullOrEmpty(nameof(secrets), secrets); _strobe = strobe; // add secret inputs as key material foreach (var secret in secrets) { _strobe.Key(secret.ToBytes(), false); } // add randomness as key material _strobe.Key(random.GetBytes(32), false); // Set up a generator of vectors of scalars the size as secrets vector Sequence = VectorGenerator(secrets.Count()); }