...
1
2
3 package jwa
4
5 import (
6 "fmt"
7 "sort"
8 "sync"
9
10 "github.com/pkg/errors"
11 )
12
13
14 type SignatureAlgorithm string
15
16
17 const (
18 ES256 SignatureAlgorithm = "ES256"
19 ES256K SignatureAlgorithm = "ES256K"
20 ES384 SignatureAlgorithm = "ES384"
21 ES512 SignatureAlgorithm = "ES512"
22 EdDSA SignatureAlgorithm = "EdDSA"
23 HS256 SignatureAlgorithm = "HS256"
24 HS384 SignatureAlgorithm = "HS384"
25 HS512 SignatureAlgorithm = "HS512"
26 NoSignature SignatureAlgorithm = "none"
27 PS256 SignatureAlgorithm = "PS256"
28 PS384 SignatureAlgorithm = "PS384"
29 PS512 SignatureAlgorithm = "PS512"
30 RS256 SignatureAlgorithm = "RS256"
31 RS384 SignatureAlgorithm = "RS384"
32 RS512 SignatureAlgorithm = "RS512"
33 )
34
35 var allSignatureAlgorithms = map[SignatureAlgorithm]struct{}{
36 ES256: {},
37 ES256K: {},
38 ES384: {},
39 ES512: {},
40 EdDSA: {},
41 HS256: {},
42 HS384: {},
43 HS512: {},
44 NoSignature: {},
45 PS256: {},
46 PS384: {},
47 PS512: {},
48 RS256: {},
49 RS384: {},
50 RS512: {},
51 }
52
53 var listSignatureAlgorithmOnce sync.Once
54 var listSignatureAlgorithm []SignatureAlgorithm
55
56
57 func SignatureAlgorithms() []SignatureAlgorithm {
58 listSignatureAlgorithmOnce.Do(func() {
59 listSignatureAlgorithm = make([]SignatureAlgorithm, 0, len(allSignatureAlgorithms))
60 for v := range allSignatureAlgorithms {
61 listSignatureAlgorithm = append(listSignatureAlgorithm, v)
62 }
63 sort.Slice(listSignatureAlgorithm, func(i, j int) bool {
64 return string(listSignatureAlgorithm[i]) < string(listSignatureAlgorithm[j])
65 })
66 })
67 return listSignatureAlgorithm
68 }
69
70
71
72 func (v *SignatureAlgorithm) Accept(value interface{}) error {
73 var tmp SignatureAlgorithm
74 if x, ok := value.(SignatureAlgorithm); ok {
75 tmp = x
76 } else {
77 var s string
78 switch x := value.(type) {
79 case fmt.Stringer:
80 s = x.String()
81 case string:
82 s = x
83 default:
84 return errors.Errorf(`invalid type for jwa.SignatureAlgorithm: %T`, value)
85 }
86 tmp = SignatureAlgorithm(s)
87 }
88 if _, ok := allSignatureAlgorithms[tmp]; !ok {
89 return errors.Errorf(`invalid jwa.SignatureAlgorithm value`)
90 }
91
92 *v = tmp
93 return nil
94 }
95
96
97 func (v SignatureAlgorithm) String() string {
98 return string(v)
99 }
100
View as plain text