package jwt
import (
"crypto"
"crypto/hmac"
"errors"
)
type SigningMethodHMAC struct {
Name string
Hash crypto .Hash
}
var (
SigningMethodHS256 *SigningMethodHMAC
SigningMethodHS384 *SigningMethodHMAC
SigningMethodHS512 *SigningMethodHMAC
ErrSignatureInvalid = errors .New ("signature is invalid" )
)
func init() {
SigningMethodHS256 = &SigningMethodHMAC {"HS256" , crypto .SHA256 }
RegisterSigningMethod (SigningMethodHS256 .Alg (), func () SigningMethod {
return SigningMethodHS256
})
SigningMethodHS384 = &SigningMethodHMAC {"HS384" , crypto .SHA384 }
RegisterSigningMethod (SigningMethodHS384 .Alg (), func () SigningMethod {
return SigningMethodHS384
})
SigningMethodHS512 = &SigningMethodHMAC {"HS512" , crypto .SHA512 }
RegisterSigningMethod (SigningMethodHS512 .Alg (), func () SigningMethod {
return SigningMethodHS512
})
}
func (m *SigningMethodHMAC ) Alg () string {
return m .Name
}
func (m *SigningMethodHMAC ) Verify (signingString , signature string , key interface {}) error {
keyBytes , ok := key .([]byte )
if !ok {
return ErrInvalidKeyType
}
sig , err := DecodeSegment (signature )
if err != nil {
return err
}
if !m .Hash .Available () {
return ErrHashUnavailable
}
hasher := hmac .New (m .Hash .New , keyBytes )
hasher .Write ([]byte (signingString ))
if !hmac .Equal (sig , hasher .Sum (nil )) {
return ErrSignatureInvalid
}
return nil
}
func (m *SigningMethodHMAC ) Sign (signingString string , key interface {}) (string , error ) {
if keyBytes , ok := key .([]byte ); ok {
if !m .Hash .Available () {
return "" , ErrHashUnavailable
}
hasher := hmac .New (m .Hash .New , keyBytes )
hasher .Write ([]byte (signingString ))
return EncodeSegment (hasher .Sum (nil )), nil
}
return "" , ErrInvalidKeyType
}
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 .