# Task: prove knowledge of a schnorr signature ## The signature scheme - Public generator: $G \in \mathbb{G}$ - Private key: $x \in \mathbb{F}_r$ - Public key: $X = xG \in \mathbb{G}$ - Message: m: Blob - Sign: (X, x, m): - k $\gets\mathbb{F}_r$ - K = kG - e = Hash( K | m ) - s = k - xe - Return (s, e) - Verify (X, m, s, e): - K = sG + eX - hash( K | m ) ?= e ## APIs: ``` rust struct FieldVar { f: Variable } struct PointVar { x: Variable, y: Variable } trait PlonkGate { fn new_constant<C>(&mut self, c: C) -> Variable; fn new_witness<V>(&mut self, t: V) -> Variable; } trait EccGate: PlonkGate { fn point_add( &mut self, p1: &PointVar, p2: &PointVar, ) -> Result<PointVar, Error>; fn point_double( &mut self, p: &PointVar, ) -> Result<PointVar, Error>; fn scalar_mul( &mut self, p: &PointVar, s: &FieldVar, ) -> Result<PointVar, Error>; fn hash_to_field<H: Hash>( &mut self, input: &HashInput, ) -> Result<FieldVar, Error>; fn schnorr_verify( &mut self, pubkey: &PointVar, msg: &Bits, e: &Digest, s: &FieldVar, ) -> Result<(), Error>; } impl EccGate for PlonkGate { /* - Verify (X, m, s, e): - K = sG + eX - hash( K | m ) ?= e */ fn schnorr_verify( &mut self, pubkey: &PointVar, msg: &Bits, e: &FieldVar, s: &FieldVar, ) -> Result<(), Error> { // sG let G = self.new_constant(&GENERATOR); let s = self.new_witness(&s); let sG = self.scalar_mul(&G, &s); // eX let e = self.new_witness(&e); let eX = self.scalar_mul(&pubkey, &e); let K = self.point_add(&sG, &eX); } } ```