rand.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package ice
  2. import "github.com/pion/randutil"
  3. const (
  4. runesAlpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  5. runesDigit = "0123456789"
  6. runesCandidateIDFoundation = runesAlpha + runesDigit + "+/"
  7. lenUFrag = 16
  8. lenPwd = 32
  9. )
  10. // Seeding random generator each time limits number of generated sequence to 31-bits,
  11. // and causes collision on low time accuracy environments.
  12. // Use global random generator seeded by crypto grade random.
  13. var (
  14. globalMathRandomGenerator = randutil.NewMathRandomGenerator() //nolint:gochecknoglobals
  15. globalCandidateIDGenerator = candidateIDGenerator{globalMathRandomGenerator} //nolint:gochecknoglobals
  16. )
  17. // candidateIDGenerator is a random candidate ID generator.
  18. // Candidate ID is used in SDP and always shared to the other peer.
  19. // It doesn't require cryptographic random.
  20. type candidateIDGenerator struct {
  21. randutil.MathRandomGenerator
  22. }
  23. func newCandidateIDGenerator() *candidateIDGenerator {
  24. return &candidateIDGenerator{
  25. randutil.NewMathRandomGenerator(),
  26. }
  27. }
  28. func (g *candidateIDGenerator) Generate() string {
  29. // https://tools.ietf.org/html/rfc5245#section-15.1
  30. // candidate-id = "candidate" ":" foundation
  31. // foundation = 1*32ice-char
  32. // ice-char = ALPHA / DIGIT / "+" / "/"
  33. return "candidate:" + g.MathRandomGenerator.GenerateString(32, runesCandidateIDFoundation)
  34. }
  35. // generatePwd generates ICE pwd.
  36. // This internally uses generateCryptoRandomString.
  37. func generatePwd() (string, error) {
  38. return randutil.GenerateCryptoRandomString(lenPwd, runesAlpha)
  39. }
  40. // generateUFrag generates ICE user fragment.
  41. // This internally uses generateCryptoRandomString.
  42. func generateUFrag() (string, error) {
  43. return randutil.GenerateCryptoRandomString(lenUFrag, runesAlpha)
  44. }