Esempio n. 1
0
        // 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);
    }
Esempio n. 3
0
        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());
        }