pub mod candidate;
pub mod config;
pub mod discovery;
pub mod relay;
pub mod runtime;
pub mod stun;
pub mod traversal;
pub mod turn;
pub use candidate::{Candidate, CandidateType, ConnectionType};
pub use config::{NatConfig, RelayServerConfig, StunServerConfig, TurnServerConfig};
pub use discovery::RelayDiscovery;
pub use relay::RelayServer;
pub use runtime::{NatPeerSnapshot, NatStatusSnapshot};
pub use stun::StunClient;
pub use traversal::NatTraversal;
pub use turn::RelayClient;
#[must_use]
pub fn pubkey_b64_to_hex(b64: &str) -> Option<String> {
use base64::{engine::general_purpose::STANDARD, Engine as _};
let bytes = STANDARD.decode(b64).ok()?;
if bytes.len() != 32 {
return None;
}
Some(hex::encode(bytes))
}
#[cfg(test)]
mod mod_tests {
use super::pubkey_b64_to_hex;
use base64::{engine::general_purpose::STANDARD, Engine as _};
#[test]
fn pubkey_b64_to_hex_matches_known_vector() {
let b64 = STANDARD.encode([0u8; 32]);
assert_eq!(pubkey_b64_to_hex(&b64), Some("0".repeat(64)));
}
#[test]
fn pubkey_b64_to_hex_rejects_bad_input() {
assert_eq!(pubkey_b64_to_hex("not-base64!!!"), None);
let short = STANDARD.encode([1u8, 2, 3, 4]);
assert_eq!(pubkey_b64_to_hex(&short), None);
}
}