this repo has no description
1package oauth
2
3import (
4 "crypto/ecdsa"
5 "crypto/elliptic"
6 "crypto/rand"
7 "fmt"
8 "net/url"
9 "time"
10
11 "github.com/lestrrat-go/jwx/v2/jwk"
12)
13
14func GenerateKey(kidPrefix *string) (jwk.Key, error) {
15 privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
16 if err != nil {
17 return nil, err
18 }
19
20 key, err := jwk.FromRaw(privKey)
21 if err != nil {
22 return nil, err
23 }
24
25 var kid string
26 if kidPrefix != nil {
27 kid = fmt.Sprintf("%s-%d", *kidPrefix, time.Now().Unix())
28
29 } else {
30 kid = fmt.Sprintf("%d", time.Now().Unix())
31 }
32
33 if err := key.Set(jwk.KeyIDKey, kid); err != nil {
34 return nil, err
35 }
36 return key, nil
37}
38
39func isSafeAndParsed(ustr string) (*url.URL, error) {
40 u, err := url.Parse(ustr)
41 if err != nil {
42 return nil, err
43 }
44
45 if u.Scheme != "https" {
46 return nil, fmt.Errorf("input url is not https")
47 }
48
49 if u.Hostname() == "" {
50 return nil, fmt.Errorf("url hostname was empty")
51 }
52
53 if u.User != nil {
54 return nil, fmt.Errorf("url user was not empty")
55 }
56
57 if u.Port() != "" {
58 return nil, fmt.Errorf("url port was not empty")
59 }
60
61 return u, nil
62}
63
64func getPrivateKey(key jwk.Key) (*ecdsa.PrivateKey, error) {
65 var pkey ecdsa.PrivateKey
66 if err := key.Raw(&pkey); err != nil {
67 return nil, err
68 }
69
70 return &pkey, nil
71}
72
73func getPublicKey(key jwk.Key) (*ecdsa.PublicKey, error) {
74 var pkey ecdsa.PublicKey
75 if err := key.Raw(&pkey); err != nil {
76 return nil, err
77 }
78
79 return &pkey, nil
80}
81
82type JwksResponseObject struct {
83 Keys []jwk.Key `json:"keys"`
84}
85
86func CreateJwksResponseObject(key jwk.Key) *JwksResponseObject {
87 return &JwksResponseObject{
88 Keys: []jwk.Key{key},
89 }
90}
91
92func ParseKeyFromBytes(b []byte) (jwk.Key, error) {
93 return jwk.ParseKey(b)
94}