예제 #1
0
        public Token Append(RNGCryptoServiceProvider rng, KeyPair keypair, byte[] message)
        {
            TokenSignature signature = this.Signature.Sign(rng, keypair, message);
            Token          token     = new Token(this.Blocks, this.Keys, signature);

            token.Blocks.Add(message);
            token.Keys.Add(keypair.PublicKey);

            return(token);
        }
예제 #2
0
 public Token(RNGCryptoServiceProvider rng, KeyPair keypair, byte[] message)
 {
     this.Signature = new TokenSignature(rng, keypair, message);
     this.Blocks    = new List <byte[]> {
         message
     };
     this.Keys = new List <RistrettoElement> {
         keypair.PublicKey
     };
 }
예제 #3
0
        /// <summary>
        /// Generates a new valid signature from an existing one, a private key and a message
        /// </summary>
        /// <param name="rng"></param>
        /// <param name="keypair"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public TokenSignature Sign(RNGCryptoServiceProvider rng, KeyPair keypair, byte[] message)
        {
            byte[] randomData = new byte[64];
            rng.GetBytes(randomData);
            Scalar r = Scalar.FromBytesModOrderWide(randomData);

            var ristretto         = Constants.RISTRETTO_GENERATOR.Multiply(r);
            var ristrettoElements = new List <RistrettoElement> {
                ristretto
            };
            Scalar d = HashPoints(ristrettoElements);
            Scalar e = HashMessage(keypair.PublicKey, message);
            Scalar z = r.Multiply(d).Subtract(e.Multiply(keypair.PrivateKey));

            TokenSignature sig = new TokenSignature(this.Parameters, this.Z.Add(z));

            sig.Parameters.Add(ristretto);

            return(sig);
        }
예제 #4
0
 public Token(IList <byte[]> blocks, IList <RistrettoElement> keys, TokenSignature signature)
 {
     this.Signature = signature;
     this.Blocks    = blocks;
     this.Keys      = keys;
 }