signing_method.go raw
1 package jwt
2
3 import (
4 "sync"
5 )
6
7 var signingMethods = map[string]func() SigningMethod{}
8 var signingMethodLock = new(sync.RWMutex)
9
10 // SigningMethod can be used add new methods for signing or verifying tokens.
11 type SigningMethod interface {
12 Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid
13 Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error
14 Alg() string // returns the alg identifier for this method (example: 'HS256')
15 }
16
17 // RegisterSigningMethod registers the "alg" name and a factory function for signing method.
18 // This is typically done during init() in the method's implementation
19 func RegisterSigningMethod(alg string, f func() SigningMethod) {
20 signingMethodLock.Lock()
21 defer signingMethodLock.Unlock()
22
23 signingMethods[alg] = f
24 }
25
26 // GetSigningMethod retrieves a signing method from an "alg" string
27 func GetSigningMethod(alg string) (method SigningMethod) {
28 signingMethodLock.RLock()
29 defer signingMethodLock.RUnlock()
30
31 if methodF, ok := signingMethods[alg]; ok {
32 method = methodF()
33 }
34 return
35 }
36
37 // GetAlgorithms returns a list of registered "alg" names
38 func GetAlgorithms() (algs []string) {
39 signingMethodLock.RLock()
40 defer signingMethodLock.RUnlock()
41
42 for alg := range signingMethods {
43 algs = append(algs, alg)
44 }
45 return
46 }
47