code: func NewRSASigner(alg Algorithm, method RSASignerVerifier) func(Store, crypto.Hash) (Signer, error) {
  	return func(store Store, hash crypto.Hash) (Signer, error) {
  		var ok bool
  		var privRaw, pubRaw interface{}
  		var priv *rsa.PrivateKey
  		var pub *rsa.PublicKey
  
  		// check private key
  		if privRaw, ok = store.PrivateKey(); ok {
  			if priv, ok = privRaw.(*rsa.PrivateKey); !ok {
  				return nil, ErrInvalidPrivateKey
  			}
  
  			// check private key length
  			if priv.N.BitLen() < RSAMinimumBitLen {
  				return nil, ErrInvalidPrivateKeySize
  			}
  		}
  
  		// check public key
  		if pubRaw, ok = store.PublicKey(); ok {
  			if pub, ok = pubRaw.(*rsa.PublicKey); !ok {
  				return nil, ErrInvalidPublicKey
  			}
  
  			// check public key length
  			if pub.N.BitLen() < RSAMinimumBitLen {
  				return nil, ErrInvalidPublicKeySize
  			}
  		}
  
  		// check that either a private or public key has been provided
  		if priv == nil && pub == nil {
  			return nil, ErrMissingPrivateOrPublicKey
  		}
  
  		return &RSASigner{
  			alg:    alg,
  			method: method,
  			hash:   hash,
  			priv:   priv,
  			pub:    pub,
  		}, nil
  	}
  }
docs: // NewRSASigner creates an RSA Signer for the specified Algorithm and provided
  // low level RSA implementation.