| // +build go1.4 | 
 |  | 
 | package crypto | 
 |  | 
 | import ( | 
 | 	"crypto" | 
 | 	"crypto/rand" | 
 | 	"crypto/rsa" | 
 | 	"encoding/json" | 
 | ) | 
 |  | 
 | // SigningMethodRSAPSS implements the RSAPSS family of SigningMethods. | 
 | type SigningMethodRSAPSS struct { | 
 | 	*SigningMethodRSA | 
 | 	Options *rsa.PSSOptions | 
 | } | 
 |  | 
 | // Specific instances for RS/PS SigningMethods. | 
 | var ( | 
 | 	// SigningMethodPS256 implements PS256. | 
 | 	SigningMethodPS256 = &SigningMethodRSAPSS{ | 
 | 		&SigningMethodRSA{ | 
 | 			Name: "PS256", | 
 | 			Hash: crypto.SHA256, | 
 | 		}, | 
 | 		&rsa.PSSOptions{ | 
 | 			SaltLength: rsa.PSSSaltLengthAuto, | 
 | 			Hash:       crypto.SHA256, | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	// SigningMethodPS384 implements PS384. | 
 | 	SigningMethodPS384 = &SigningMethodRSAPSS{ | 
 | 		&SigningMethodRSA{ | 
 | 			Name: "PS384", | 
 | 			Hash: crypto.SHA384, | 
 | 		}, | 
 | 		&rsa.PSSOptions{ | 
 | 			SaltLength: rsa.PSSSaltLengthAuto, | 
 | 			Hash:       crypto.SHA384, | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	// SigningMethodPS512 implements PS512. | 
 | 	SigningMethodPS512 = &SigningMethodRSAPSS{ | 
 | 		&SigningMethodRSA{ | 
 | 			Name: "PS512", | 
 | 			Hash: crypto.SHA512, | 
 | 		}, | 
 | 		&rsa.PSSOptions{ | 
 | 			SaltLength: rsa.PSSSaltLengthAuto, | 
 | 			Hash:       crypto.SHA512, | 
 | 		}, | 
 | 	} | 
 | ) | 
 |  | 
 | // Verify implements the Verify method from SigningMethod. | 
 | // For this verify method, key must be an *rsa.PublicKey. | 
 | func (m *SigningMethodRSAPSS) Verify(raw []byte, signature Signature, key interface{}) error { | 
 | 	rsaKey, ok := key.(*rsa.PublicKey) | 
 | 	if !ok { | 
 | 		return ErrInvalidKey | 
 | 	} | 
 | 	return rsa.VerifyPSS(rsaKey, m.Hash, m.sum(raw), signature, m.Options) | 
 | } | 
 |  | 
 | // Sign implements the Sign method from SigningMethod. | 
 | // For this signing method, key must be an *rsa.PrivateKey. | 
 | func (m *SigningMethodRSAPSS) Sign(raw []byte, key interface{}) (Signature, error) { | 
 | 	rsaKey, ok := key.(*rsa.PrivateKey) | 
 | 	if !ok { | 
 | 		return nil, ErrInvalidKey | 
 | 	} | 
 | 	sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, m.sum(raw), m.Options) | 
 | 	if err != nil { | 
 | 		return nil, err | 
 | 	} | 
 | 	return Signature(sigBytes), nil | 
 | } | 
 |  | 
 | func (m *SigningMethodRSAPSS) sum(b []byte) []byte { | 
 | 	h := m.Hash.New() | 
 | 	h.Write(b) | 
 | 	return h.Sum(nil) | 
 | } | 
 |  | 
 | // Hasher implements the Hasher method from SigningMethod. | 
 | func (m *SigningMethodRSAPSS) Hasher() crypto.Hash { return m.Hash } | 
 |  | 
 | // MarshalJSON implements json.Marshaler. | 
 | // See SigningMethodECDSA.MarshalJSON() for information. | 
 | func (m *SigningMethodRSAPSS) MarshalJSON() ([]byte, error) { | 
 | 	return []byte(`"` + m.Alg() + `"`), nil | 
 | } | 
 |  | 
 | var _ json.Marshaler = (*SigningMethodRSAPSS)(nil) |