webrtc_stun/
fingerprint.rs1#[cfg(test)]
2mod fingerprint_test;
3
4use crate::attributes::ATTR_FINGERPRINT;
5use crate::checks::*;
6use crate::message::*;
7
8use util::Error;
9
10use crc32fast::Hasher;
11
12pub struct FingerprintAttr;
16
17pub const FINGERPRINT: FingerprintAttr = FingerprintAttr {};
24
25const FINGERPRINT_XOR_VALUE: u32 = 0x5354554e;
26const FINGERPRINT_SIZE: usize = 4; pub fn fingerprint_value(b: &[u8]) -> u32 {
35 let mut hasher = Hasher::new();
36 hasher.update(b);
37 let checksum = hasher.finalize();
38 checksum ^ FINGERPRINT_XOR_VALUE }
40
41impl Setter for FingerprintAttr {
42 fn add_to(&self, m: &mut Message) -> Result<(), Error> {
44 let l = m.length;
45 m.length += (FINGERPRINT_SIZE + ATTRIBUTE_HEADER_SIZE) as u32; m.write_length(); let val = fingerprint_value(&m.raw);
49 let b = val.to_be_bytes();
50 m.length = l;
51 m.add(ATTR_FINGERPRINT, &b);
52 Ok(())
53 }
54}
55
56impl FingerprintAttr {
57 pub fn check(&self, m: &Message) -> Result<(), Error> {
60 let b = m.get(ATTR_FINGERPRINT)?;
61 check_size(ATTR_FINGERPRINT, b.len(), FINGERPRINT_SIZE)?;
62 let val = u32::from_be_bytes([b[0], b[1], b[2], b[3]]);
63 let attr_start = m.raw.len() - (FINGERPRINT_SIZE + ATTRIBUTE_HEADER_SIZE);
64 let expected = fingerprint_value(&m.raw[..attr_start]);
65 check_fingerprint(val, expected)
66 }
67}