1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
Description: Avoid consul dependency
Embed the SeedMathRand function, to avoid creating a circular dependency with
consul. Taken from https://github.com/hashicorp/consul/blob/master/lib/rand.go
Same author and copyright as the rest of the code.
--- a/sockaddrs_test.go
+++ b/sockaddrs_test.go
@@ -1,16 +1,44 @@
package sockaddr_test
import (
+ crand "crypto/rand"
"fmt"
+ "math"
+ "math/big"
"math/rand"
+ "sync"
+ "time"
"testing"
- "github.com/hashicorp/consul/lib"
"github.com/hashicorp/go-sockaddr"
)
func init() {
- lib.SeedMathRand()
+ SeedMathRand()
+}
+
+var (
+ once sync.Once
+
+ // SeededSecurely is set to true if a cryptographically secure seed
+ // was used to initialize rand. When false, the start time is used
+ // as a seed.
+ SeededSecurely bool
+)
+
+// SeedMathRand provides weak, but guaranteed seeding, which is better than
+// running with Go's default seed of 1. A call to SeedMathRand() is expected
+// to be called via init(), but never a second time.
+func SeedMathRand() {
+ once.Do(func() {
+ n, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
+ if err != nil {
+ rand.Seed(time.Now().UTC().UnixNano())
+ return
+ }
+ rand.Seed(n.Int64())
+ SeededSecurely = true
+ })
}
// NOTE: A number of these code paths are exercised in template/ and
|