func VerifyToken(t []byte, Wx, Wy *big.Int, k []byte) bool {
	Tx, Ty := HashToCurve(t)
	X, Y := curve.ScalarMult(Tx, Ty, k[:])
	if curve.IsOnCurve(Tx, Ty) && X.Cmp(Wx) == 0 && Y.Cmp(Wy) == 0 {
		return true
	}
	return false
}
VerifyToken checks that the token is correct,
by computing T = Hash(t) and compare W and k*T.
package main
import (
	"fmt"
	"math/big"
)
func KeyGen() (k []byte, Kx, Ky *big.Int) {
	k = RandomBytes()
	Kx, Ky = curve.ScalarBaseMult(k[:])
	return
}
func Initiate() (t, r []byte, Px, Py *big.Int) {
	r = RandomBytes()
	t = RandomBytes()
	Tx, Ty := HashToCurve(t)
	for Ty == nil || !curve.IsOnCurve(Tx, Ty) {
		t = RandomBytes()
		Tx, Ty = HashToCurve(t)
	}
	Px, Py = curve.ScalarMult(Tx, Ty, r)
	return
}
func GenerateToken(Px, Py, Kx, Ky *big.Int, k []byte) (Qx, Qy *big.Int, c [B]byte, z []byte) {
	Qx, Qy = curve.ScalarMult(Px, Py, k[:])
	c, z = CreateProof(Px, Py, Qx, Qy, Kx, Ky, k)
	return
}
func RandomiseToken(Px, Py, Qx, Qy, Kx, Ky *big.Int, c [B]byte, z, r []byte) (Wx, Wy *big.Int) {
	if VerifyProof(Px, Py, Qx, Qy, Kx, Ky, c, z) {
		fmt.Println("Proof is valid.")
	} else {
		fmt.Println("Proof is not valid.")
	}
	rInv := new(big.Int).SetBytes(r[:])
	rInv.ModInverse(rInv, params.N)
	Wx, Wy = curve.ScalarMult(Qx, Qy, rInv.Bytes())
	return
}