forked from pion/ice
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rand.go
53 lines (44 loc) · 1.75 KB
/
rand.go
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
package ice
import "github.com/pion/randutil"
const (
runesAlpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
runesDigit = "0123456789"
runesCandidateIDFoundation = runesAlpha + runesDigit + "+/"
lenUFrag = 16
lenPwd = 32
)
// Seeding random generator each time limits number of generated sequence to 31-bits,
// and causes collision on low time accuracy environments.
// Use global random generator seeded by crypto grade random.
var (
globalMathRandomGenerator = randutil.NewMathRandomGenerator() //nolint:gochecknoglobals
globalCandidateIDGenerator = candidateIDGenerator{globalMathRandomGenerator} //nolint:gochecknoglobals
)
// candidateIDGenerator is a random candidate ID generator.
// Candidate ID is used in SDP and always shared to the other peer.
// It doesn't require cryptographic random.
type candidateIDGenerator struct {
randutil.MathRandomGenerator
}
func newCandidateIDGenerator() *candidateIDGenerator {
return &candidateIDGenerator{
randutil.NewMathRandomGenerator(),
}
}
func (g *candidateIDGenerator) Generate() string {
// https://tools.ietf.org/html/rfc5245#section-15.1
// candidate-id = "candidate" ":" foundation
// foundation = 1*32ice-char
// ice-char = ALPHA / DIGIT / "+" / "/"
return "candidate:" + g.MathRandomGenerator.GenerateString(32, runesCandidateIDFoundation)
}
// generatePwd generates ICE pwd.
// This internally uses generateCryptoRandomString.
func generatePwd() (string, error) {
return randutil.GenerateCryptoRandomString(lenPwd, runesAlpha)
}
// generateUFrag generates ICE user fragment.
// This internally uses generateCryptoRandomString.
func generateUFrag() (string, error) {
return randutil.GenerateCryptoRandomString(lenUFrag, runesAlpha)
}