| package crypto | 
 |  | 
 | import ( | 
 | 	"crypto" | 
 | 	"crypto/rand" | 
 | 	"crypto/rsa" | 
 | 	"encoding/json" | 
 | ) | 
 |  | 
 | // SigningMethodRSA implements the RSA family of SigningMethods. | 
 | type SigningMethodRSA struct { | 
 | 	Name string | 
 | 	Hash crypto.Hash | 
 | 	_    struct{} | 
 | } | 
 |  | 
 | // Specific instances of RSA SigningMethods. | 
 | var ( | 
 | 	// SigningMethodRS256 implements RS256. | 
 | 	SigningMethodRS256 = &SigningMethodRSA{ | 
 | 		Name: "RS256", | 
 | 		Hash: crypto.SHA256, | 
 | 	} | 
 |  | 
 | 	// SigningMethodRS384 implements RS384. | 
 | 	SigningMethodRS384 = &SigningMethodRSA{ | 
 | 		Name: "RS384", | 
 | 		Hash: crypto.SHA384, | 
 | 	} | 
 |  | 
 | 	// SigningMethodRS512 implements RS512. | 
 | 	SigningMethodRS512 = &SigningMethodRSA{ | 
 | 		Name: "RS512", | 
 | 		Hash: crypto.SHA512, | 
 | 	} | 
 | ) | 
 |  | 
 | // Alg implements the SigningMethod interface. | 
 | func (m *SigningMethodRSA) Alg() string { return m.Name } | 
 |  | 
 | // Verify implements the Verify method from SigningMethod. | 
 | // For this signing method, must be an *rsa.PublicKey. | 
 | func (m *SigningMethodRSA) Verify(raw []byte, sig Signature, key interface{}) error { | 
 | 	rsaKey, ok := key.(*rsa.PublicKey) | 
 | 	if !ok { | 
 | 		return ErrInvalidKey | 
 | 	} | 
 | 	return rsa.VerifyPKCS1v15(rsaKey, m.Hash, m.sum(raw), sig) | 
 | } | 
 |  | 
 | // Sign implements the Sign method from SigningMethod. | 
 | // For this signing method, must be an *rsa.PrivateKey structure. | 
 | func (m *SigningMethodRSA) Sign(data []byte, key interface{}) (Signature, error) { | 
 | 	rsaKey, ok := key.(*rsa.PrivateKey) | 
 | 	if !ok { | 
 | 		return nil, ErrInvalidKey | 
 | 	} | 
 | 	sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, m.sum(data)) | 
 | 	if err != nil { | 
 | 		return nil, err | 
 | 	} | 
 | 	return Signature(sigBytes), nil | 
 | } | 
 |  | 
 | func (m *SigningMethodRSA) sum(b []byte) []byte { | 
 | 	h := m.Hash.New() | 
 | 	h.Write(b) | 
 | 	return h.Sum(nil) | 
 | } | 
 |  | 
 | // Hasher implements the SigningMethod interface. | 
 | func (m *SigningMethodRSA) Hasher() crypto.Hash { return m.Hash } | 
 |  | 
 | // MarshalJSON implements json.Marshaler. | 
 | // See SigningMethodECDSA.MarshalJSON() for information. | 
 | func (m *SigningMethodRSA) MarshalJSON() ([]byte, error) { | 
 | 	return []byte(`"` + m.Alg() + `"`), nil | 
 | } | 
 |  | 
 | var _ json.Marshaler = (*SigningMethodRSA)(nil) |