xref: /webrtc/ice/src/rand/mod.rs (revision ffe74184)
1 #[cfg(test)]
2 mod rand_test;
3 
4 use rand::{thread_rng, Rng};
5 
6 const RUNES_ALPHA: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
7 const RUNES_CANDIDATE_ID_FOUNDATION: &[u8] =
8     b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/+";
9 
10 const LEN_UFRAG: usize = 16;
11 const LEN_PWD: usize = 32;
12 
13 //TODO: generates a random string for cryptographic usage.
generate_crypto_random_string(n: usize, runes: &[u8]) -> String14 pub fn generate_crypto_random_string(n: usize, runes: &[u8]) -> String {
15     let mut rng = thread_rng();
16 
17     let rand_string: String = (0..n)
18         .map(|_| {
19             let idx = rng.gen_range(0..runes.len());
20             runes[idx] as char
21         })
22         .collect();
23 
24     rand_string
25 }
26 
27 /// https://tools.ietf.org/html/rfc5245#section-15.1
28 /// candidate-id = "candidate" ":" foundation
29 /// foundation   = 1*32ice-char
30 /// ice-char     = ALPHA / DIGIT / "+" / "/"
generate_cand_id() -> String31 pub fn generate_cand_id() -> String {
32     format!(
33         "candidate:{}",
34         generate_crypto_random_string(32, RUNES_CANDIDATE_ID_FOUNDATION)
35     )
36 }
37 
38 /// Generates ICE pwd.
39 /// This internally uses `generate_crypto_random_string`.
generate_pwd() -> String40 pub fn generate_pwd() -> String {
41     generate_crypto_random_string(LEN_PWD, RUNES_ALPHA)
42 }
43 
44 /// ICE user fragment.
45 /// This internally uses `generate_crypto_random_string`.
generate_ufrag() -> String46 pub fn generate_ufrag() -> String {
47     generate_crypto_random_string(LEN_UFRAG, RUNES_ALPHA)
48 }
49