func (w *Wallet) Verify(msg []byte, sig []byte) error {
	pub, err := w.key.DecodePublicKey()
	if err != nil {
		return err
	}
	pubKey, ok := pub.(*rsa.PublicKey)
	if !ok {
		return fmt.Errorf("could not typecast key to %T", rsa.PublicKey{})
	}
	err = rsa.VerifyPSS(pubKey, crypto.SHA256, msg, sig, opts)
	if err != nil {
		return err
	}
	return nil
}
Verify verifies the signature for the specific message
package wallet
import (
	"crypto"
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"fmt"
	"io/ioutil"
	"math/big"
	"github.com/Dev43/arweave-go/utils"
	"github.com/mendsley/gojwk"
)
var opts = &rsa.PSSOptions{
	SaltLength: rsa.PSSSaltLengthAuto,
	Hash:       crypto.SHA256,
}
type Wallet struct {
	address   string
	key       *gojwk.Key
	publicKey string
	pubKey    *rsa.PublicKey
}
func NewWallet() *Wallet {
	return &Wallet{}
}
func GenerateWallet() *Wallet {
	reader := rand.Reader
	rsaKey, _ := rsa.GenerateKey(reader, 4096)
	w := &Wallet{}
	w.key = &gojwk.Key{
		Kty: "RSA",
		N: utils.EncodeToBase64(rsaKey.N.Bytes()),
		E: utils.EncodeToBase64(big.NewInt(int64(rsaKey.E)).Bytes()),
		D: utils.EncodeToBase64(rsaKey.D.Bytes()),
	}
	w.pubKey = rsaKey.Public().(*rsa.PublicKey)
	h := sha256.New()
	h.Write(rsaKey.N.Bytes())
	w.address = utils.EncodeToBase64(h.Sum(nil))
	w.publicKey = utils.EncodeToBase64(rsaKey.N.Bytes())
	return w
}
func (w *Wallet) Address() string {
	return w.address
}
func (w *Wallet) PubKeyModulus() *big.Int {
	return w.pubKey.N
}
func (w *Wallet) Sign(msg []byte) ([]byte, error) {
	priv, err := w.key.DecodePrivateKey()
	if err != nil {
		return nil, err
	}
	rng := rand.Reader
	privRsa, ok := priv.(*rsa.PrivateKey)
	if !ok {
		return nil, fmt.Errorf("could not typecast key to %T", rsa.PrivateKey{})
	}
	sig, err := rsa.SignPSS(rng, privRsa, crypto.SHA256, msg, opts)
	if err != nil {
		return nil, err
	}
	return sig, nil
}