summaryrefslogtreecommitdiffstats
path: root/lib/rand.go
blob: 03fd6513322e951d68a4b6e5e416410b766252ea (plain) (blame)
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
// Copyright © 2020 rsiddharth <s@ricketyspace.net>
// SPDX-License-Identifier: ISC

package lib

import (
	"crypto/rand"
	"math/big"
)

// Return a random number from range [min, max]
func RandomInt(min, max int64) int64 {
	if min >= max {
		panic("RandomInt: min cannot be >= max!")
	}

	var rn *big.Int
	var err error
	for {
		rn, err = rand.Int(rand.Reader, big.NewInt(max+1))
		if err != nil {
			panic(err)
		}
		if rn.Int64() >= min {
			return rn.Int64()
		}
	}
}

func RandomKey(size int) ([]byte, error) {
	k := make([]byte, size)
	_, err := rand.Read(k)
	if err != nil {
		return []byte{}, err
	}
	return k, nil
}

// Randomly generates `min` to `max` bytes.
func randomBytes(min, max int64) []byte {
	bs := make([]byte, RandomInt(min, max))
	_, err := rand.Read(bs)
	if err != nil {
		panic(err)
	}
	return bs
}