Skip to content

Commit ace241f

Browse files
authored
Merge pull request #2 from domsolutions/use-generics
Use generics and fix bug of jwt count
2 parents 461428d + 7d37c3f commit ace241f

File tree

11 files changed

+161
-198
lines changed

11 files changed

+161
-198
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@ server_*
55
*.qlog
66
gopayloader.exe
77
gopayloader.zip
8+
gopayloader-darwin-amd64
9+
gopayloader-linux-amd64
10+
gopayloader-windows-amd64.exe

build-release.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash
2+
3+
GOOS=windows go build -o gopayloader-windows-amd64.exe ./
4+
GOOS=linux go build -o gopayloader-linux-amd64 ./
5+
GOOS=darwin go build -o gopayloader-darwin-amd64 ./

pkgs/jwt-generator/cache.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ func newCache(f *os.File) (*cache, error) {
2222
c.scanner = bufio.NewScanner(c.f)
2323
c.scanner.Split(bufio.ScanLines)
2424
if c.scanner.Scan() {
25-
meta := c.scanner.Bytes()
26-
if len(meta) < 8 {
27-
return nil, fmt.Errorf("jwt_generator: corrupt jwt cache, wanted 8 bytes got %d", len(meta))
25+
bb := make([]byte, 8)
26+
_, err := f.ReadAt(bb, 0)
27+
if err != nil {
28+
return nil, err
2829
}
29-
c.count = int64(binary.LittleEndian.Uint64(meta[0:8]))
30-
30+
c.count = int64(binary.LittleEndian.Uint64(bb))
3131
return &c, nil
3232
}
3333
return &c, nil
@@ -115,11 +115,13 @@ func (c *cache) save(tokens []string) error {
115115
}
116116

117117
b := make([]byte, 8)
118-
binary.LittleEndian.PutUint64(b, uint64(int64(add)+c.count))
118+
newCount := uint64(int64(add) + c.count)
119+
binary.LittleEndian.PutUint64(b, newCount)
119120
_, err = c.f.WriteAt(b, 0)
120121
if err != nil {
121122
return err
122123
}
124+
123125
_, err = c.f.WriteAt([]byte{byte('\n')}, 9)
124126
if err != nil {
125127
return err

pkgs/jwt-generator/jwt.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (j *JWTGenerator) Generate(reqJwtCount int64, dir string, retrying bool) er
8181
return err
8282
}
8383
f.Close()
84-
pterm.Error.Printf("jwt cache %s file corrupt, attempting to delete and recreate", fname)
84+
pterm.Debug.Printf("jwt cache %s file corrupt, attempting to delete and recreate; got error; %v \n", fname, err)
8585
if err := os.Remove(fname); err != nil {
8686
pterm.Error.Printf("Couldn't remove cache file %s; %v", fname, err)
8787
return err

pkgs/jwt-signer/ecdsa/ecdsa.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

pkgs/jwt-signer/ed25519/ed25519.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

pkgs/jwt-signer/rsa256/rsa256.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

pkgs/jwt-signer/rsa512/rsa512.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

pkgs/jwt-signer/signer.go

Lines changed: 90 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,105 @@
11
package jwt_signer
22

33
import (
4+
"crypto"
5+
"crypto/ecdsa"
6+
"crypto/rsa"
47
"errors"
58
"github.com/domsolutions/gopayloader/pkgs/jwt-signer/definition"
6-
"github.com/domsolutions/gopayloader/pkgs/jwt-signer/ecdsa"
7-
ed25519 "github.com/domsolutions/gopayloader/pkgs/jwt-signer/ed25519"
8-
"github.com/domsolutions/gopayloader/pkgs/jwt-signer/rsa256"
9-
rsa512 "github.com/domsolutions/gopayloader/pkgs/jwt-signer/rsa512"
9+
"github.com/golang-jwt/jwt"
10+
"github.com/pterm/pterm"
1011
)
1112

12-
type Signer func(privKey []byte, kid string) (definition.Signer, error)
13+
func CreateSigner(privKey []byte, kid string) (definition.Signer, error) {
14+
var signer definition.Signer
1315

14-
// TODO add more signers, use generics?
16+
signer, err := createSigner[*ecdsa.PrivateKey](privKey, kid, jwt.ParseECPrivateKeyFromPEM, jwt.SigningMethodES256)
17+
if err == nil {
18+
return signer, nil
19+
}
20+
signer, err = createSigner[*ecdsa.PrivateKey](privKey, kid, jwt.ParseECPrivateKeyFromPEM, jwt.SigningMethodES384)
21+
if err == nil {
22+
return signer, nil
23+
}
24+
signer, err = createSigner[*ecdsa.PrivateKey](privKey, kid, jwt.ParseECPrivateKeyFromPEM, jwt.SigningMethodES512)
25+
if err == nil {
26+
return signer, nil
27+
}
28+
signer, err = createSigner[crypto.PrivateKey](privKey, kid, jwt.ParseEdPrivateKeyFromPEM, jwt.SigningMethodEdDSA)
29+
if err == nil {
30+
return signer, nil
31+
}
32+
signer, err = createSigner[*rsa.PrivateKey](privKey, kid, jwt.ParseRSAPrivateKeyFromPEM, jwt.SigningMethodRS512)
33+
if err == nil {
34+
return signer, nil
35+
}
36+
signer, err = createSigner[*rsa.PrivateKey](privKey, kid, jwt.ParseRSAPrivateKeyFromPEM, jwt.SigningMethodRS256)
37+
if err == nil {
38+
return signer, nil
39+
}
40+
signer, err = createSigner[*rsa.PrivateKey](privKey, kid, jwt.ParseRSAPrivateKeyFromPEM, jwt.SigningMethodRS384)
41+
if err == nil {
42+
return signer, nil
43+
}
1544

16-
var signers = []Signer{ecdsa.Signer, ed25519.Signer, rsa256.Signer, rsa512.Signer}
45+
signer, err = createSigner[[]byte](privKey, kid, func(key []byte) ([]byte, error) {
46+
return key, nil
47+
}, jwt.SigningMethodHS256)
48+
if err == nil {
49+
return signer, nil
50+
}
1751

18-
func CreateSigner(privKey []byte, kid string) (definition.Signer, error) {
19-
var signer definition.Signer
20-
var err error
21-
for _, s := range signers {
22-
signer, err = s(privKey, kid)
23-
if err != nil {
24-
continue
25-
}
52+
signer, err = createSigner[[]byte](privKey, kid, func(key []byte) ([]byte, error) {
53+
return key, nil
54+
}, jwt.SigningMethodHS384)
55+
if err == nil {
56+
return signer, nil
57+
}
58+
59+
signer, err = createSigner[[]byte](privKey, kid, func(key []byte) ([]byte, error) {
60+
return key, nil
61+
}, jwt.SigningMethodHS512)
62+
if err == nil {
2663
return signer, nil
2764
}
2865

2966
return nil, errors.New("no supported jwt signer")
3067
}
68+
69+
type signer struct {
70+
kid string
71+
privKey any
72+
method jwt.SigningMethod
73+
}
74+
75+
func (e *signer) Generate(claims jwt.MapClaims) (string, error) {
76+
token := jwt.NewWithClaims(e.method, claims)
77+
token.Header["kid"] = e.kid
78+
79+
t, err := token.SignedString(e.privKey)
80+
if err != nil {
81+
return "", err
82+
}
83+
return t, nil
84+
}
85+
86+
func createSigner[k any](privKey []byte, kid string, genPrivKey func(key []byte) (k, error), method jwt.SigningMethod) (definition.Signer, error) {
87+
key, err := genPrivKey(privKey)
88+
if err != nil {
89+
pterm.Debug.Printf("Failed to parse private key %v", err)
90+
return nil, err
91+
}
92+
93+
s := &signer{
94+
kid: kid,
95+
privKey: key,
96+
method: method,
97+
}
98+
claim := make(jwt.MapClaims)
99+
claim["test"] = true
100+
if _, err := s.Generate(claim); err != nil {
101+
pterm.Debug.Printf("Failed to generate jwt %v", err)
102+
return nil, err
103+
}
104+
return s, nil
105+
}

0 commit comments

Comments
 (0)