...
1 package jwt
2
3 import (
4 "errors"
5
6 "crypto"
7 "crypto/ed25519"
8 "crypto/rand"
9 )
10
11 var (
12 ErrEd25519Verification = errors.New("ed25519: verification error")
13 )
14
15
16
17 type SigningMethodEd25519 struct{}
18
19
20 var (
21 SigningMethodEdDSA *SigningMethodEd25519
22 )
23
24 func init() {
25 SigningMethodEdDSA = &SigningMethodEd25519{}
26 RegisterSigningMethod(SigningMethodEdDSA.Alg(), func() SigningMethod {
27 return SigningMethodEdDSA
28 })
29 }
30
31 func (m *SigningMethodEd25519) Alg() string {
32 return "EdDSA"
33 }
34
35
36
37 func (m *SigningMethodEd25519) Verify(signingString, signature string, key interface{}) error {
38 var err error
39 var ed25519Key ed25519.PublicKey
40 var ok bool
41
42 if ed25519Key, ok = key.(ed25519.PublicKey); !ok {
43 return ErrInvalidKeyType
44 }
45
46 if len(ed25519Key) != ed25519.PublicKeySize {
47 return ErrInvalidKey
48 }
49
50
51 var sig []byte
52 if sig, err = DecodeSegment(signature); err != nil {
53 return err
54 }
55
56
57 if !ed25519.Verify(ed25519Key, []byte(signingString), sig) {
58 return ErrEd25519Verification
59 }
60
61 return nil
62 }
63
64
65
66 func (m *SigningMethodEd25519) Sign(signingString string, key interface{}) (string, error) {
67 var ed25519Key crypto.Signer
68 var ok bool
69
70 if ed25519Key, ok = key.(crypto.Signer); !ok {
71 return "", ErrInvalidKeyType
72 }
73
74 if _, ok := ed25519Key.Public().(ed25519.PublicKey); !ok {
75 return "", ErrInvalidKey
76 }
77
78
79
80 sig, err := ed25519Key.Sign(rand.Reader, []byte(signingString), crypto.Hash(0))
81 if err != nil {
82 return "", err
83 }
84 return EncodeSegment(sig), nil
85 }
86
View as plain text