package jwt
import (
"crypto"
"crypto/rand"
"crypto/rsa"
)
type SigningMethodRSA struct {
Name string
Hash crypto .Hash
}
var (
SigningMethodRS256 *SigningMethodRSA
SigningMethodRS384 *SigningMethodRSA
SigningMethodRS512 *SigningMethodRSA
)
func init() {
SigningMethodRS256 = &SigningMethodRSA {"RS256" , crypto .SHA256 }
RegisterSigningMethod (SigningMethodRS256 .Alg (), func () SigningMethod {
return SigningMethodRS256
})
SigningMethodRS384 = &SigningMethodRSA {"RS384" , crypto .SHA384 }
RegisterSigningMethod (SigningMethodRS384 .Alg (), func () SigningMethod {
return SigningMethodRS384
})
SigningMethodRS512 = &SigningMethodRSA {"RS512" , crypto .SHA512 }
RegisterSigningMethod (SigningMethodRS512 .Alg (), func () SigningMethod {
return SigningMethodRS512
})
}
func (m *SigningMethodRSA ) Alg () string {
return m .Name
}
func (m *SigningMethodRSA ) Verify (signingString , signature string , key interface {}) error {
var err error
var sig []byte
if sig , err = DecodeSegment (signature ); err != nil {
return err
}
var rsaKey *rsa .PublicKey
var ok bool
if rsaKey , ok = key .(*rsa .PublicKey ); !ok {
return ErrInvalidKeyType
}
if !m .Hash .Available () {
return ErrHashUnavailable
}
hasher := m .Hash .New ()
hasher .Write ([]byte (signingString ))
return rsa .VerifyPKCS1v15 (rsaKey , m .Hash , hasher .Sum (nil ), sig )
}
func (m *SigningMethodRSA ) Sign (signingString string , key interface {}) (string , error ) {
var rsaKey *rsa .PrivateKey
var ok bool
if rsaKey , ok = key .(*rsa .PrivateKey ); !ok {
return "" , ErrInvalidKey
}
if !m .Hash .Available () {
return "" , ErrHashUnavailable
}
hasher := m .Hash .New ()
hasher .Write ([]byte (signingString ))
if sigBytes , err := rsa .SignPKCS1v15 (rand .Reader , rsaKey , m .Hash , hasher .Sum (nil )); err == nil {
return EncodeSegment (sigBytes ), nil
} else {
return "" , err
}
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .