package jwt
import (
"errors"
"crypto"
"crypto/ed25519"
"crypto/rand"
)
var (
ErrEd25519Verification = errors .New ("ed25519: verification error" )
)
type SigningMethodEd25519 struct {}
var (
SigningMethodEdDSA *SigningMethodEd25519
)
func init() {
SigningMethodEdDSA = &SigningMethodEd25519 {}
RegisterSigningMethod (SigningMethodEdDSA .Alg (), func () SigningMethod {
return SigningMethodEdDSA
})
}
func (m *SigningMethodEd25519 ) Alg () string {
return "EdDSA"
}
func (m *SigningMethodEd25519 ) Verify (signingString , signature string , key interface {}) error {
var err error
var ed25519Key ed25519 .PublicKey
var ok bool
if ed25519Key , ok = key .(ed25519 .PublicKey ); !ok {
return ErrInvalidKeyType
}
if len (ed25519Key ) != ed25519 .PublicKeySize {
return ErrInvalidKey
}
var sig []byte
if sig , err = DecodeSegment (signature ); err != nil {
return err
}
if !ed25519 .Verify (ed25519Key , []byte (signingString ), sig ) {
return ErrEd25519Verification
}
return nil
}
func (m *SigningMethodEd25519 ) Sign (signingString string , key interface {}) (string , error ) {
var ed25519Key crypto .Signer
var ok bool
if ed25519Key , ok = key .(crypto .Signer ); !ok {
return "" , ErrInvalidKeyType
}
if _ , ok := ed25519Key .Public ().(ed25519 .PublicKey ); !ok {
return "" , ErrInvalidKey
}
sig , err := ed25519Key .Sign (rand .Reader , []byte (signingString ), crypto .Hash (0 ))
if err != nil {
return "" , err
}
return EncodeSegment (sig ), nil
}
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 .