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); }
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 }; }
/// <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); }
public Token(IList <byte[]> blocks, IList <RistrettoElement> keys, TokenSignature signature) { this.Signature = signature; this.Blocks = blocks; this.Keys = keys; }