From 4db4680452edea5cfbfa4c6ee86346d11f6a57ef Mon Sep 17 00:00:00 2001 From: "maximilian.schubert@telekom.de" Date: Wed, 16 Nov 2022 12:14:05 +0100 Subject: [PATCH] new rand token func with crypto/rand + test --- helper/helper.go | 30 ++++++++++++++++++------------ helper/helper_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 helper/helper_test.go diff --git a/helper/helper.go b/helper/helper.go index 81fe065..135f735 100644 --- a/helper/helper.go +++ b/helper/helper.go @@ -22,6 +22,7 @@ package helper import ( + "crypto/rand" "crypto/tls" "crypto/x509" "encoding/base64" @@ -30,10 +31,9 @@ import ( "hash/fnv" "io/ioutil" "log" - "math/rand" + "math/big" "net" "regexp" - "time" "google.golang.org/grpc/credentials" ) @@ -117,19 +117,25 @@ const charset = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" -var seededRand *rand.Rand = rand.New( - rand.NewSource(time.Now().UnixNano())) - -func stringWithCharset(length int, charset string) string { - b := make([]byte, length) - for i := range b { - b[i] = charset[seededRand.Intn(len(charset))] +func stringWithCharset(n int64, chars string) (string, error) { + ret := make([]byte, n) + for i := int64(0); i < n; i++ { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(chars)))) + if err != nil { + return "", err + } + ret[i] = chars[num.Int64()] } - return string(b) + + return string(ret), nil } -func GenerateRandomToken(length int) string { - return stringWithCharset(length, charset) +func GenerateRandomToken(length int64) string { + token, err := stringWithCharset(length, charset) + if err != nil { + panic("Could not generate a random token, please check func GenerateRandomToken") + } + return token } //------------------ diff --git a/helper/helper_test.go b/helper/helper_test.go new file mode 100644 index 0000000..43f505d --- /dev/null +++ b/helper/helper_test.go @@ -0,0 +1,43 @@ +package helper + +import ( + "fmt" + "testing" +) + +func Test_stringWithCharset(t *testing.T) { + tests := []struct { + name string + length int64 + charset string + }{ + { + name: "normal string", + length: 32, + charset: charset, + }, + { + name: "0 string", + length: 0, + charset: charset, + }, + { + name: "0 charset", + length: 32, + charset: "1", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + str, err := stringWithCharset(tt.length, tt.charset) + fmt.Printf("%v\n", str) + if err != nil { + t.Error("stringWithCharset with errors") + } + if len(str) != int(tt.length) { + t.Errorf("Length of string is not as eypexted: %v != %v", len(str), tt.length) + } + }) + } +}