func (v *Verifier) SetChallenge(challenge *big.Int) {
	v.challenge = challenge
}
SetChallenge is used when Fiat-Shamir is used - when challenge is generated using hash by the prover.
package schnorr
import (
	"fmt"
	"math/big"
	"github.com/xlab-si/emmy/crypto/common"
)
type Prover struct {
	Group      *Group
	secrets    []*big.Int
	bases      []*big.Int
	randomVals []*big.Int
	y          *big.Int
}
func NewProver(group *Group, secrets,
	bases []*big.Int, y *big.Int) (*Prover, error) {
	if len(secrets) != len(bases) {
		return nil, fmt.Errorf("number of secrets and representation bases shoud be the same")
	}
	return &Prover{
		Group:   group,
		secrets: secrets,
		bases:   bases,
		y:       y,
	}, nil
}
func (p *Prover) GetProofRandomData() *big.Int {
	t := big.NewInt(1)
	var randomVals = make([]*big.Int, len(p.bases))
	for i, _ := range randomVals {
		r := common.GetRandomInt(p.Group.Q)
		randomVals[i] = r
		f := p.Group.Exp(p.bases[i], r)
		t = p.Group.Mul(t, f)
	}
	p.randomVals = randomVals
	return t
}
func (p *Prover) GetProofData(challenge *big.Int) []*big.Int {
	var proofData = make([]*big.Int, len(p.bases))
	for i, _ := range proofData {
		z_i := p.Group.Mul(challenge, p.secrets[i])
		z_i = p.Group.Add(z_i, p.randomVals[i])
		proofData[i] = z_i
	}
	return proofData
}
type Proof struct {
	ProofRandomData *big.Int
	Challenge       *big.Int
	ProofData       []*big.Int
}
func NewProof(proofRandomData, challenge *big.Int,
	proofData []*big.Int) *Proof {
	return &Proof{
		ProofRandomData: proofRandomData,
		Challenge:       challenge,
		ProofData:       proofData,
	}
}
type Verifier struct {
	Group           *Group
	bases           []*big.Int
	proofRandomData *big.Int
	y               *big.Int
	challenge       *big.Int
}
func NewVerifier(group *Group) *Verifier {
	return &Verifier{
		Group: group,
	}
}
func (v *Verifier) SetProofRandomData(proofRandomData *big.Int, bases []*big.Int,
	y *big.Int) {
	v.proofRandomData = proofRandomData
	v.bases = bases
	v.y = y
}
func (v *Verifier) GetChallenge() *big.Int {
	challenge := common.GetRandomInt(v.Group.Q)
	v.challenge = challenge
	return challenge
}