forked from ebhomengo/niki
1
0
Fork 0
niki/vendor/github.com/golang-jwt/jwt/v5/rsa_pss.go

217 lines
3.4 KiB
Go
Raw Normal View History

2024-02-18 10:42:21 +00:00
//go:build go1.4
// +build go1.4
package jwt
import (
"crypto"
"crypto/rand"
"crypto/rsa"
)
// SigningMethodRSAPSS implements the RSAPSS family of signing methods signing methods
2024-02-18 10:42:21 +00:00
type SigningMethodRSAPSS struct {
*SigningMethodRSA
2024-02-18 10:42:21 +00:00
Options *rsa.PSSOptions
2024-02-18 10:42:21 +00:00
// VerifyOptions is optional. If set overrides Options for rsa.VerifyPPS.
2024-02-18 10:42:21 +00:00
// Used to accept tokens signed with rsa.PSSSaltLengthAuto, what doesn't follow
2024-02-18 10:42:21 +00:00
// https://tools.ietf.org/html/rfc7518#section-3.5 but was used previously.
2024-02-18 10:42:21 +00:00
// See https://github.com/dgrijalva/jwt-go/issues/285#issuecomment-437451244 for details.
2024-02-18 10:42:21 +00:00
VerifyOptions *rsa.PSSOptions
}
// Specific instances for RS/PS and company.
2024-02-18 10:42:21 +00:00
var (
SigningMethodPS256 *SigningMethodRSAPSS
2024-02-18 10:42:21 +00:00
SigningMethodPS384 *SigningMethodRSAPSS
2024-02-18 10:42:21 +00:00
SigningMethodPS512 *SigningMethodRSAPSS
)
func init() {
2024-02-18 10:42:21 +00:00
// PS256
2024-02-18 10:42:21 +00:00
SigningMethodPS256 = &SigningMethodRSAPSS{
2024-02-18 10:42:21 +00:00
SigningMethodRSA: &SigningMethodRSA{
2024-02-18 10:42:21 +00:00
Name: "PS256",
2024-02-18 10:42:21 +00:00
Hash: crypto.SHA256,
},
2024-02-18 10:42:21 +00:00
Options: &rsa.PSSOptions{
2024-02-18 10:42:21 +00:00
SaltLength: rsa.PSSSaltLengthEqualsHash,
},
2024-02-18 10:42:21 +00:00
VerifyOptions: &rsa.PSSOptions{
2024-02-18 10:42:21 +00:00
SaltLength: rsa.PSSSaltLengthAuto,
},
}
2024-02-18 10:42:21 +00:00
RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod {
2024-02-18 10:42:21 +00:00
return SigningMethodPS256
2024-02-18 10:42:21 +00:00
})
// PS384
2024-02-18 10:42:21 +00:00
SigningMethodPS384 = &SigningMethodRSAPSS{
2024-02-18 10:42:21 +00:00
SigningMethodRSA: &SigningMethodRSA{
2024-02-18 10:42:21 +00:00
Name: "PS384",
2024-02-18 10:42:21 +00:00
Hash: crypto.SHA384,
},
2024-02-18 10:42:21 +00:00
Options: &rsa.PSSOptions{
2024-02-18 10:42:21 +00:00
SaltLength: rsa.PSSSaltLengthEqualsHash,
},
2024-02-18 10:42:21 +00:00
VerifyOptions: &rsa.PSSOptions{
2024-02-18 10:42:21 +00:00
SaltLength: rsa.PSSSaltLengthAuto,
},
}
2024-02-18 10:42:21 +00:00
RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod {
2024-02-18 10:42:21 +00:00
return SigningMethodPS384
2024-02-18 10:42:21 +00:00
})
// PS512
2024-02-18 10:42:21 +00:00
SigningMethodPS512 = &SigningMethodRSAPSS{
2024-02-18 10:42:21 +00:00
SigningMethodRSA: &SigningMethodRSA{
2024-02-18 10:42:21 +00:00
Name: "PS512",
2024-02-18 10:42:21 +00:00
Hash: crypto.SHA512,
},
2024-02-18 10:42:21 +00:00
Options: &rsa.PSSOptions{
2024-02-18 10:42:21 +00:00
SaltLength: rsa.PSSSaltLengthEqualsHash,
},
2024-02-18 10:42:21 +00:00
VerifyOptions: &rsa.PSSOptions{
2024-02-18 10:42:21 +00:00
SaltLength: rsa.PSSSaltLengthAuto,
},
}
2024-02-18 10:42:21 +00:00
RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod {
2024-02-18 10:42:21 +00:00
return SigningMethodPS512
2024-02-18 10:42:21 +00:00
})
2024-02-18 10:42:21 +00:00
}
// Verify implements token verification for the SigningMethod.
2024-02-18 10:42:21 +00:00
// For this verify method, key must be an rsa.PublicKey struct
2024-02-18 10:42:21 +00:00
func (m *SigningMethodRSAPSS) Verify(signingString string, sig []byte, key interface{}) error {
2024-02-18 10:42:21 +00:00
var rsaKey *rsa.PublicKey
2024-02-18 10:42:21 +00:00
switch k := key.(type) {
2024-02-18 10:42:21 +00:00
case *rsa.PublicKey:
2024-02-18 10:42:21 +00:00
rsaKey = k
2024-02-18 10:42:21 +00:00
default:
2024-02-18 10:42:21 +00:00
return ErrInvalidKey
2024-02-18 10:42:21 +00:00
}
// Create hasher
2024-02-18 10:42:21 +00:00
if !m.Hash.Available() {
2024-02-18 10:42:21 +00:00
return ErrHashUnavailable
2024-02-18 10:42:21 +00:00
}
2024-02-18 10:42:21 +00:00
hasher := m.Hash.New()
2024-02-18 10:42:21 +00:00
hasher.Write([]byte(signingString))
opts := m.Options
2024-02-18 10:42:21 +00:00
if m.VerifyOptions != nil {
2024-02-18 10:42:21 +00:00
opts = m.VerifyOptions
2024-02-18 10:42:21 +00:00
}
return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, opts)
2024-02-18 10:42:21 +00:00
}
// Sign implements token signing for the SigningMethod.
2024-02-18 10:42:21 +00:00
// For this signing method, key must be an rsa.PrivateKey struct
2024-02-18 10:42:21 +00:00
func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) ([]byte, error) {
2024-02-18 10:42:21 +00:00
var rsaKey *rsa.PrivateKey
switch k := key.(type) {
2024-02-18 10:42:21 +00:00
case *rsa.PrivateKey:
2024-02-18 10:42:21 +00:00
rsaKey = k
2024-02-18 10:42:21 +00:00
default:
2024-02-18 10:42:21 +00:00
return nil, ErrInvalidKeyType
2024-02-18 10:42:21 +00:00
}
// Create the hasher
2024-02-18 10:42:21 +00:00
if !m.Hash.Available() {
2024-02-18 10:42:21 +00:00
return nil, ErrHashUnavailable
2024-02-18 10:42:21 +00:00
}
hasher := m.Hash.New()
2024-02-18 10:42:21 +00:00
hasher.Write([]byte(signingString))
// Sign the string and return the encoded bytes
2024-02-18 10:42:21 +00:00
if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil {
2024-02-18 10:42:21 +00:00
return sigBytes, nil
2024-02-18 10:42:21 +00:00
} else {
2024-02-18 10:42:21 +00:00
return nil, err
2024-02-18 10:42:21 +00:00
}
2024-02-18 10:42:21 +00:00
}