Blame vendor/github.com/dgrijalva/jwt-go/rsa_pss.go

Packit 63bb0d
// +build go1.4
Packit 63bb0d
Packit 63bb0d
package jwt
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"crypto"
Packit 63bb0d
	"crypto/rand"
Packit 63bb0d
	"crypto/rsa"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Implements the RSAPSS family of signing methods signing methods
Packit 63bb0d
type SigningMethodRSAPSS struct {
Packit 63bb0d
	*SigningMethodRSA
Packit 63bb0d
	Options *rsa.PSSOptions
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Specific instances for RS/PS and company
Packit 63bb0d
var (
Packit 63bb0d
	SigningMethodPS256 *SigningMethodRSAPSS
Packit 63bb0d
	SigningMethodPS384 *SigningMethodRSAPSS
Packit 63bb0d
	SigningMethodPS512 *SigningMethodRSAPSS
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
func init() {
Packit 63bb0d
	// PS256
Packit 63bb0d
	SigningMethodPS256 = &SigningMethodRSAPSS{
Packit 63bb0d
		&SigningMethodRSA{
Packit 63bb0d
			Name: "PS256",
Packit 63bb0d
			Hash: crypto.SHA256,
Packit 63bb0d
		},
Packit 63bb0d
		&rsa.PSSOptions{
Packit 63bb0d
			SaltLength: rsa.PSSSaltLengthAuto,
Packit 63bb0d
			Hash:       crypto.SHA256,
Packit 63bb0d
		},
Packit 63bb0d
	}
Packit 63bb0d
	RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod {
Packit 63bb0d
		return SigningMethodPS256
Packit 63bb0d
	})
Packit 63bb0d
Packit 63bb0d
	// PS384
Packit 63bb0d
	SigningMethodPS384 = &SigningMethodRSAPSS{
Packit 63bb0d
		&SigningMethodRSA{
Packit 63bb0d
			Name: "PS384",
Packit 63bb0d
			Hash: crypto.SHA384,
Packit 63bb0d
		},
Packit 63bb0d
		&rsa.PSSOptions{
Packit 63bb0d
			SaltLength: rsa.PSSSaltLengthAuto,
Packit 63bb0d
			Hash:       crypto.SHA384,
Packit 63bb0d
		},
Packit 63bb0d
	}
Packit 63bb0d
	RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod {
Packit 63bb0d
		return SigningMethodPS384
Packit 63bb0d
	})
Packit 63bb0d
Packit 63bb0d
	// PS512
Packit 63bb0d
	SigningMethodPS512 = &SigningMethodRSAPSS{
Packit 63bb0d
		&SigningMethodRSA{
Packit 63bb0d
			Name: "PS512",
Packit 63bb0d
			Hash: crypto.SHA512,
Packit 63bb0d
		},
Packit 63bb0d
		&rsa.PSSOptions{
Packit 63bb0d
			SaltLength: rsa.PSSSaltLengthAuto,
Packit 63bb0d
			Hash:       crypto.SHA512,
Packit 63bb0d
		},
Packit 63bb0d
	}
Packit 63bb0d
	RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod {
Packit 63bb0d
		return SigningMethodPS512
Packit 63bb0d
	})
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Implements the Verify method from SigningMethod
Packit 63bb0d
// For this verify method, key must be an rsa.PublicKey struct
Packit 63bb0d
func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error {
Packit 63bb0d
	var err error
Packit 63bb0d
Packit 63bb0d
	// Decode the signature
Packit 63bb0d
	var sig []byte
Packit 63bb0d
	if sig, err = DecodeSegment(signature); err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var rsaKey *rsa.PublicKey
Packit 63bb0d
	switch k := key.(type) {
Packit 63bb0d
	case *rsa.PublicKey:
Packit 63bb0d
		rsaKey = k
Packit 63bb0d
	default:
Packit 63bb0d
		return ErrInvalidKey
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	// Create hasher
Packit 63bb0d
	if !m.Hash.Available() {
Packit 63bb0d
		return ErrHashUnavailable
Packit 63bb0d
	}
Packit 63bb0d
	hasher := m.Hash.New()
Packit 63bb0d
	hasher.Write([]byte(signingString))
Packit 63bb0d
Packit 63bb0d
	return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Implements the Sign method from SigningMethod
Packit 63bb0d
// For this signing method, key must be an rsa.PrivateKey struct
Packit 63bb0d
func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) {
Packit 63bb0d
	var rsaKey *rsa.PrivateKey
Packit 63bb0d
Packit 63bb0d
	switch k := key.(type) {
Packit 63bb0d
	case *rsa.PrivateKey:
Packit 63bb0d
		rsaKey = k
Packit 63bb0d
	default:
Packit 63bb0d
		return "", ErrInvalidKeyType
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	// Create the hasher
Packit 63bb0d
	if !m.Hash.Available() {
Packit 63bb0d
		return "", ErrHashUnavailable
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	hasher := m.Hash.New()
Packit 63bb0d
	hasher.Write([]byte(signingString))
Packit 63bb0d
Packit 63bb0d
	// Sign the string and return the encoded bytes
Packit 63bb0d
	if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil {
Packit 63bb0d
		return EncodeSegment(sigBytes), nil
Packit 63bb0d
	} else {
Packit 63bb0d
		return "", err
Packit 63bb0d
	}
Packit 63bb0d
}