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