33package fuji
44
55import (
6- "math/rand"
6+ "crypto/rand"
7+ "fmt"
8+ "math/big"
79 "strings"
8- "sync"
9- "time"
1010)
1111
1212/** Letters used when generating a random password */
@@ -18,38 +18,47 @@ const kNumbers = "0123456789"
1818/** Special characters used when generating a random password */
1919const kSpecial = "!_?-.;+/()=&"
2020
21- func randomCharFromSet (prng * rand.Rand , set string ) string {
22- index := prng .Intn (len (set ))
23- return set [index : index + 1 ]
21+ func randomCharFromSet (set string ) (string , error ) {
22+ index , err := randomInt (len (set ))
23+ if err != nil {
24+ return "" , err
25+ }
26+ return set [index : index + 1 ], nil
27+ }
28+
29+ func randomInt (max int ) (int , error ) {
30+ if max <= 0 {
31+ return 0 , fmt .Errorf ("max must be positive" )
32+ }
33+ n , err := rand .Int (rand .Reader , big .NewInt (int64 (max )))
34+ if err != nil {
35+ return 0 , fmt .Errorf ("could not generate secure random integer: %w" , err )
36+ }
37+ return int (n .Int64 ()), nil
2438}
2539
26- func generatePassword () string {
40+ func generatePassword () ( string , error ) {
2741 pwd := ""
28- prng := getPrng ()
2942
3043 for i := 0 ; i < 16 ; i ++ {
3144 var token string
45+ var err error
3246 switch i % 4 {
3347 case 0 :
34- token = randomCharFromSet (prng , kLetters )
48+ token , err = randomCharFromSet (kLetters )
3549 case 1 :
36- token = randomCharFromSet (prng , kNumbers )
50+ token , err = randomCharFromSet (kNumbers )
3751 case 2 :
38- token = randomCharFromSet (prng , kSpecial )
52+ token , err = randomCharFromSet (kSpecial )
3953 case 3 :
40- token = strings .ToUpper (randomCharFromSet (prng , kLetters ))
54+ var letter string
55+ letter , err = randomCharFromSet (kLetters )
56+ token = strings .ToUpper (letter )
57+ }
58+ if err != nil {
59+ return "" , err
4160 }
4261 pwd += token
4362 }
44- return pwd
45- }
46-
47- var _prng * rand.Rand
48- var _initPrngOnce sync.Once
49-
50- func getPrng () * rand.Rand {
51- _initPrngOnce .Do (func () {
52- _prng = rand .New (rand .NewSource (time .Now ().UnixNano ()))
53- })
54- return _prng
63+ return pwd , nil
5564}
0 commit comments