From 2fef52b856b1452c0cdbf8f693eae7897c725913 Mon Sep 17 00:00:00 2001 From: Pascal Fischer Date: Tue, 16 May 2023 12:44:26 +0200 Subject: [PATCH 1/2] remove dependency to external base62 package and create own methods in utils --- go.mod | 1 - go.sum | 2 - management/server/account.go | 4 +- management/server/personal_access_token.go | 5 +- .../server/personal_access_token_test.go | 8 ++- util/base62.go | 59 +++++++++++++++++++ util/base62_test.go | 31 ++++++++++ 7 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 util/base62.go create mode 100644 util/base62_test.go diff --git a/go.mod b/go.mod index 915163d6b..42810e385 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,6 @@ require ( ) require ( - codeberg.org/ac/base62 v0.0.0-20210305150220-e793b546833a fyne.io/fyne/v2 v2.1.4 github.com/c-robinson/iplib v1.0.3 github.com/coreos/go-iptables v0.6.0 diff --git a/go.sum b/go.sum index 7ef776045..668f2ff88 100644 --- a/go.sum +++ b/go.sum @@ -31,8 +31,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -codeberg.org/ac/base62 v0.0.0-20210305150220-e793b546833a h1:U6cY/g6VSiy59vuvnBU6J/eSir0qVg4BeTnCDLaX+20= -codeberg.org/ac/base62 v0.0.0-20210305150220-e793b546833a/go.mod h1:ykEpkLT4JtH3I4Rb4gwkDsNLfgUg803qRDeIX88t3e8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= fyne.io/fyne/v2 v2.1.4 h1:bt1+28++kAzRzPB0GM2EuSV4cnl8rXNX4cjfd8G06Rc= fyne.io/fyne/v2 v2.1.4/go.mod h1:p+E/Dh+wPW8JwR2DVcsZ9iXgR9ZKde80+Y+40Is54AQ= diff --git a/management/server/account.go b/management/server/account.go index 4807a0600..52b4c7394 100644 --- a/management/server/account.go +++ b/management/server/account.go @@ -15,7 +15,6 @@ import ( "sync" "time" - "codeberg.org/ac/base62" "github.com/eko/gocache/v3/cache" cacheStore "github.com/eko/gocache/v3/store" gocache "github.com/patrickmn/go-cache" @@ -28,6 +27,7 @@ import ( "github.com/netbirdio/netbird/management/server/jwtclaims" "github.com/netbirdio/netbird/management/server/status" "github.com/netbirdio/netbird/route" + "github.com/netbirdio/netbird/util" ) const ( @@ -1174,7 +1174,7 @@ func (am *DefaultAccountManager) GetAccountFromPAT(token string) (*Account, *Use secret := token[len(PATPrefix) : len(PATPrefix)+PATSecretLength] encodedChecksum := token[len(PATPrefix)+PATSecretLength : len(PATPrefix)+PATSecretLength+PATChecksumLength] - verificationChecksum, err := base62.Decode(encodedChecksum) + verificationChecksum, err := util.DecodeBase62(encodedChecksum) if err != nil { return nil, nil, nil, fmt.Errorf("token checksum decoding failed: %w", err) } diff --git a/management/server/personal_access_token.go b/management/server/personal_access_token.go index 68e4cda6b..2f7523315 100644 --- a/management/server/personal_access_token.go +++ b/management/server/personal_access_token.go @@ -7,9 +7,10 @@ import ( "hash/crc32" "time" - "codeberg.org/ac/base62" b "github.com/hashicorp/go-secure-stdlib/base62" "github.com/rs/xid" + + "github.com/netbirdio/netbird/util" ) const ( @@ -71,7 +72,7 @@ func generateNewToken() (string, string, error) { } checksum := crc32.ChecksumIEEE([]byte(secret)) - encodedChecksum := base62.Encode(checksum) + encodedChecksum := util.EncodeBase62(checksum) paddedChecksum := fmt.Sprintf("%06s", encodedChecksum) plainToken := PATPrefix + secret + paddedChecksum hashedToken := sha256.Sum256([]byte(plainToken)) diff --git a/management/server/personal_access_token_test.go b/management/server/personal_access_token_test.go index 03dd2ef4e..6779adb33 100644 --- a/management/server/personal_access_token_test.go +++ b/management/server/personal_access_token_test.go @@ -4,11 +4,13 @@ import ( "crypto/sha256" b64 "encoding/base64" "hash/crc32" + "math/big" "strings" "testing" - "codeberg.org/ac/base62" "github.com/stretchr/testify/assert" + + "github.com/netbirdio/netbird/util" ) func TestPAT_GenerateToken_Hashing(t *testing.T) { @@ -33,8 +35,10 @@ func TestPAT_GenerateToken_Checksum(t *testing.T) { secret := tokenWithoutPrefix[:len(tokenWithoutPrefix)-6] tokenCheckSum := tokenWithoutPrefix[len(tokenWithoutPrefix)-6:] + var i big.Int + i.SetString(secret, 62) expectedChecksum := crc32.ChecksumIEEE([]byte(secret)) - actualChecksum, err := base62.Decode(tokenCheckSum) + actualChecksum, err := util.DecodeBase62(tokenCheckSum) if err != nil { t.Fatal(err) } diff --git a/util/base62.go b/util/base62.go new file mode 100644 index 000000000..1924f9d0f --- /dev/null +++ b/util/base62.go @@ -0,0 +1,59 @@ +package util + +import ( + "fmt" + "math" + "strings" +) + +const ( + alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + base = uint32(len(alphabet)) +) + +// EncodeBase62 encodes a uint32 value to a base62 string. +func EncodeBase62(num uint32) string { + if num == 0 { + return string(alphabet[0]) + } + + var encoded strings.Builder + remainder := uint32(0) + + for num > 0 { + remainder = num % base + encoded.WriteByte(alphabet[remainder]) + num /= base + } + + // Reverse the encoded string + encodedString := encoded.String() + reversed := reverse(encodedString) + return reversed +} + +// DecodeBase62 decodes a base62 string to a uint32 value. +func DecodeBase62(encoded string) (uint32, error) { + var decoded uint32 + strLen := len(encoded) + + for i, char := range encoded { + index := strings.IndexRune(alphabet, char) + if index < 0 { + return 0, fmt.Errorf("invalid character: %c", char) + } + + decoded += uint32(index) * uint32(math.Pow(float64(base), float64(strLen-i-1))) + } + + return decoded, nil +} + +// Reverse a string. +func reverse(s string) string { + runes := []rune(s) + for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { + runes[i], runes[j] = runes[j], runes[i] + } + return string(runes) +} diff --git a/util/base62_test.go b/util/base62_test.go new file mode 100644 index 000000000..f43aecaa0 --- /dev/null +++ b/util/base62_test.go @@ -0,0 +1,31 @@ +package util + +import ( + "testing" +) + +func TestEncodeDecode(t *testing.T) { + tests := []struct { + num uint32 + }{ + {0}, + {1}, + {42}, + {12345}, + {99999}, + {123456789}, + } + + for _, tt := range tests { + encoded := EncodeBase62(tt.num) + decoded, err := DecodeBase62(encoded) + + if err != nil { + t.Errorf("Decode error: %v", err) + } + + if decoded != tt.num { + t.Errorf("Decode(%v) = %v, want %v", encoded, decoded, tt.num) + } + } +} From 873abc43bf4df7b0b678f77d6f4347fc583ab949 Mon Sep 17 00:00:00 2001 From: Pascal Fischer Date: Tue, 16 May 2023 12:57:56 +0200 Subject: [PATCH 2/2] move into separate package --- {util => base62}/base62.go | 10 +++++----- {util => base62}/base62_test.go | 6 +++--- management/server/account.go | 4 ++-- management/server/personal_access_token.go | 4 ++-- management/server/personal_access_token_test.go | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) rename {util => base62}/base62.go (81%) rename {util => base62}/base62_test.go (80%) diff --git a/util/base62.go b/base62/base62.go similarity index 81% rename from util/base62.go rename to base62/base62.go index 1924f9d0f..d2525f704 100644 --- a/util/base62.go +++ b/base62/base62.go @@ -1,4 +1,4 @@ -package util +package base62 import ( "fmt" @@ -11,8 +11,8 @@ const ( base = uint32(len(alphabet)) ) -// EncodeBase62 encodes a uint32 value to a base62 string. -func EncodeBase62(num uint32) string { +// Encode encodes a uint32 value to a base62 string. +func Encode(num uint32) string { if num == 0 { return string(alphabet[0]) } @@ -32,8 +32,8 @@ func EncodeBase62(num uint32) string { return reversed } -// DecodeBase62 decodes a base62 string to a uint32 value. -func DecodeBase62(encoded string) (uint32, error) { +// Decode decodes a base62 string to a uint32 value. +func Decode(encoded string) (uint32, error) { var decoded uint32 strLen := len(encoded) diff --git a/util/base62_test.go b/base62/base62_test.go similarity index 80% rename from util/base62_test.go rename to base62/base62_test.go index f43aecaa0..00da2124a 100644 --- a/util/base62_test.go +++ b/base62/base62_test.go @@ -1,4 +1,4 @@ -package util +package base62 import ( "testing" @@ -17,8 +17,8 @@ func TestEncodeDecode(t *testing.T) { } for _, tt := range tests { - encoded := EncodeBase62(tt.num) - decoded, err := DecodeBase62(encoded) + encoded := Encode(tt.num) + decoded, err := Decode(encoded) if err != nil { t.Errorf("Decode error: %v", err) diff --git a/management/server/account.go b/management/server/account.go index 52b4c7394..a7306e2e7 100644 --- a/management/server/account.go +++ b/management/server/account.go @@ -21,13 +21,13 @@ import ( "github.com/rs/xid" log "github.com/sirupsen/logrus" + "github.com/netbirdio/netbird/base62" nbdns "github.com/netbirdio/netbird/dns" "github.com/netbirdio/netbird/management/server/activity" "github.com/netbirdio/netbird/management/server/idp" "github.com/netbirdio/netbird/management/server/jwtclaims" "github.com/netbirdio/netbird/management/server/status" "github.com/netbirdio/netbird/route" - "github.com/netbirdio/netbird/util" ) const ( @@ -1174,7 +1174,7 @@ func (am *DefaultAccountManager) GetAccountFromPAT(token string) (*Account, *Use secret := token[len(PATPrefix) : len(PATPrefix)+PATSecretLength] encodedChecksum := token[len(PATPrefix)+PATSecretLength : len(PATPrefix)+PATSecretLength+PATChecksumLength] - verificationChecksum, err := util.DecodeBase62(encodedChecksum) + verificationChecksum, err := base62.Decode(encodedChecksum) if err != nil { return nil, nil, nil, fmt.Errorf("token checksum decoding failed: %w", err) } diff --git a/management/server/personal_access_token.go b/management/server/personal_access_token.go index 2f7523315..0a55f3237 100644 --- a/management/server/personal_access_token.go +++ b/management/server/personal_access_token.go @@ -10,7 +10,7 @@ import ( b "github.com/hashicorp/go-secure-stdlib/base62" "github.com/rs/xid" - "github.com/netbirdio/netbird/util" + "github.com/netbirdio/netbird/base62" ) const ( @@ -72,7 +72,7 @@ func generateNewToken() (string, string, error) { } checksum := crc32.ChecksumIEEE([]byte(secret)) - encodedChecksum := util.EncodeBase62(checksum) + encodedChecksum := base62.Encode(checksum) paddedChecksum := fmt.Sprintf("%06s", encodedChecksum) plainToken := PATPrefix + secret + paddedChecksum hashedToken := sha256.Sum256([]byte(plainToken)) diff --git a/management/server/personal_access_token_test.go b/management/server/personal_access_token_test.go index 6779adb33..311ffd9cf 100644 --- a/management/server/personal_access_token_test.go +++ b/management/server/personal_access_token_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/assert" - "github.com/netbirdio/netbird/util" + "github.com/netbirdio/netbird/base62" ) func TestPAT_GenerateToken_Hashing(t *testing.T) { @@ -38,7 +38,7 @@ func TestPAT_GenerateToken_Checksum(t *testing.T) { var i big.Int i.SetString(secret, 62) expectedChecksum := crc32.ChecksumIEEE([]byte(secret)) - actualChecksum, err := util.DecodeBase62(tokenCheckSum) + actualChecksum, err := base62.Decode(tokenCheckSum) if err != nil { t.Fatal(err) }