...
1 package jws
2
3 import (
4 "github.com/lestrrat-go/jwx/jwa"
5 "github.com/pkg/errors"
6 )
7
8 type SignerFactory interface {
9 Create() (Signer, error)
10 }
11 type SignerFactoryFn func() (Signer, error)
12
13 func (fn SignerFactoryFn) Create() (Signer, error) {
14 return fn()
15 }
16
17 var signerDB map[jwa.SignatureAlgorithm]SignerFactory
18
19
20
21
22
23
24
25 func RegisterSigner(alg jwa.SignatureAlgorithm, f SignerFactory) {
26 signerDB[alg] = f
27 }
28
29 func init() {
30 signerDB = make(map[jwa.SignatureAlgorithm]SignerFactory)
31
32 for _, alg := range []jwa.SignatureAlgorithm{jwa.RS256, jwa.RS384, jwa.RS512, jwa.PS256, jwa.PS384, jwa.PS512} {
33 RegisterSigner(alg, func(alg jwa.SignatureAlgorithm) SignerFactory {
34 return SignerFactoryFn(func() (Signer, error) {
35 return newRSASigner(alg), nil
36 })
37 }(alg))
38 }
39
40 for _, alg := range []jwa.SignatureAlgorithm{jwa.ES256, jwa.ES384, jwa.ES512, jwa.ES256K} {
41 RegisterSigner(alg, func(alg jwa.SignatureAlgorithm) SignerFactory {
42 return SignerFactoryFn(func() (Signer, error) {
43 return newECDSASigner(alg), nil
44 })
45 }(alg))
46 }
47
48 for _, alg := range []jwa.SignatureAlgorithm{jwa.HS256, jwa.HS384, jwa.HS512} {
49 RegisterSigner(alg, func(alg jwa.SignatureAlgorithm) SignerFactory {
50 return SignerFactoryFn(func() (Signer, error) {
51 return newHMACSigner(alg), nil
52 })
53 }(alg))
54 }
55
56 RegisterSigner(jwa.EdDSA, SignerFactoryFn(func() (Signer, error) {
57 return newEdDSASigner(), nil
58 }))
59 }
60
61
62 func NewSigner(alg jwa.SignatureAlgorithm) (Signer, error) {
63 f, ok := signerDB[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