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
|
package test
import (
crand "crypto/rand"
"errors"
"fmt"
mrand "math/rand"
)
var errRequestTooLargeBuffer = errors.New("requested too large buffer")
type randomizer struct {
randomness []byte
}
func initRand() randomizer {
// read 1MB of randomness
randomness := make([]byte, 1<<20)
if _, err := crand.Read(randomness); err != nil {
fmt.Println("Failed to initiate randomness:", err) // nolint
}
return randomizer{
randomness: randomness,
}
}
func (r *randomizer) randBuf(size int) ([]byte, error) {
n := len(r.randomness) - size
if n < 1 {
return nil, fmt.Errorf("%w (%d). max is %d", errRequestTooLargeBuffer, size, len(r.randomness))
}
start := mrand.Intn(n) //nolint:gosec
return r.randomness[start : start+size], nil
}
|