...
1 package jws
2
3 import (
4 "github.com/lestrrat-go/jwx/jwa"
5 "github.com/pkg/errors"
6 )
7
8 type VerifierFactory interface {
9 Create() (Verifier, error)
10 }
11 type VerifierFactoryFn func() (Verifier, error)
12
13 func (fn VerifierFactoryFn) Create() (Verifier, error) {
14 return fn()
15 }
16
17 var verifierDB map[jwa.SignatureAlgorithm]VerifierFactory
18
19
20
21
22
23
24
25 func RegisterVerifier(alg jwa.SignatureAlgorithm, f VerifierFactory) {
26 verifierDB[alg] = f
27 }
28
29 func init() {
30 verifierDB = make(map[jwa.SignatureAlgorithm]VerifierFactory)
31
32 for _, alg := range []jwa.SignatureAlgorithm{jwa.RS256, jwa.RS384, jwa.RS512, jwa.PS256, jwa.PS384, jwa.PS512} {
33 RegisterVerifier(alg, func(alg jwa.SignatureAlgorithm) VerifierFactory {
34 return VerifierFactoryFn(func() (Verifier, error) {
35 return newRSAVerifier(alg), nil
36 })
37 }(alg))
38 }
39
40 for _, alg := range []jwa.SignatureAlgorithm{jwa.ES256, jwa.ES384, jwa.ES512, jwa.ES256K} {
41 RegisterVerifier(alg, func(alg jwa.SignatureAlgorithm) VerifierFactory {
42 return VerifierFactoryFn(func() (Verifier, error) {
43 return newECDSAVerifier(alg), nil
44 })
45 }(alg))
46 }
47
48 for _, alg := range []jwa.SignatureAlgorithm{jwa.HS256, jwa.HS384, jwa.HS512} {
49 RegisterVerifier(alg, func(alg jwa.SignatureAlgorithm) VerifierFactory {
50 return VerifierFactoryFn(func() (Verifier, error) {
51 return newHMACVerifier(alg), nil
52 })
53 }(alg))
54 }
55
56 RegisterVerifier(jwa.EdDSA, VerifierFactoryFn(func() (Verifier, error) {
57 return newEdDSAVerifier(), nil
58 }))
59 }
60
61
62 func NewVerifier(alg jwa.SignatureAlgorithm) (Verifier, error) {
63 f, ok := verifierDB[alg]
64 if ok {
65 return f.Create()
66 }
67 return nil, errors.Errorf(`unsupported signature algorithm "%s"`, alg)
68 }
69
View as plain text