1 use super::*; 2 use crate::error::Result; 3 use util::marshal::*; 4 5 use bytes::Bytes; 6 7 impl Context { decrypt_rtp_with_header( &mut self, encrypted: &[u8], header: &rtp::header::Header, ) -> Result<Bytes>8 pub fn decrypt_rtp_with_header( 9 &mut self, 10 encrypted: &[u8], 11 header: &rtp::header::Header, 12 ) -> Result<Bytes> { 13 let roc; 14 { 15 if let Some(state) = self.get_srtp_ssrc_state(header.ssrc) { 16 if let Some(replay_detector) = &mut state.replay_detector { 17 if !replay_detector.check(header.sequence_number as u64) { 18 return Err(Error::SrtpSsrcDuplicated( 19 header.ssrc, 20 header.sequence_number, 21 )); 22 } 23 } 24 25 roc = state.next_rollover_count(header.sequence_number); 26 } else { 27 return Err(Error::SsrcMissingFromSrtp(header.ssrc)); 28 } 29 } 30 31 let dst = self.cipher.decrypt_rtp(encrypted, header, roc)?; 32 { 33 if let Some(state) = self.get_srtp_ssrc_state(header.ssrc) { 34 if let Some(replay_detector) = &mut state.replay_detector { 35 replay_detector.accept(); 36 } 37 state.update_rollover_count(header.sequence_number); 38 } 39 } 40 41 Ok(dst) 42 } 43 44 /// DecryptRTP decrypts a RTP packet with an encrypted payload decrypt_rtp(&mut self, encrypted: &[u8]) -> Result<Bytes>45 pub fn decrypt_rtp(&mut self, encrypted: &[u8]) -> Result<Bytes> { 46 let mut buf = encrypted; 47 let header = rtp::header::Header::unmarshal(&mut buf)?; 48 self.decrypt_rtp_with_header(encrypted, &header) 49 } 50 encrypt_rtp_with_header( &mut self, plaintext: &[u8], header: &rtp::header::Header, ) -> Result<Bytes>51 pub fn encrypt_rtp_with_header( 52 &mut self, 53 plaintext: &[u8], 54 header: &rtp::header::Header, 55 ) -> Result<Bytes> { 56 let roc; 57 { 58 if let Some(state) = self.get_srtp_ssrc_state(header.ssrc) { 59 roc = state.next_rollover_count(header.sequence_number); 60 } else { 61 return Err(Error::SsrcMissingFromSrtp(header.ssrc)); 62 } 63 } 64 65 let dst = self 66 .cipher 67 .encrypt_rtp(&plaintext[header.marshal_size()..], header, roc)?; 68 69 { 70 if let Some(state) = self.get_srtp_ssrc_state(header.ssrc) { 71 state.update_rollover_count(header.sequence_number); 72 } 73 } 74 75 Ok(dst) 76 } 77 78 /// EncryptRTP marshals and encrypts an RTP packet, writing to the dst buffer provided. 79 /// If the dst buffer does not have the capacity to hold `len(plaintext) + 10` bytes, a new one will be allocated and returned. encrypt_rtp(&mut self, plaintext: &[u8]) -> Result<Bytes>80 pub fn encrypt_rtp(&mut self, plaintext: &[u8]) -> Result<Bytes> { 81 let mut buf = plaintext; 82 let header = rtp::header::Header::unmarshal(&mut buf)?; 83 self.encrypt_rtp_with_header(plaintext, &header) 84 } 85 } 86