Support adding not-yet-known SSRCs to an SRTP session

dtls-srtp
Jonas Herzig 2018-12-02 13:52:43 +01:00
parent f8097adbae
commit 6e21908845
1 changed files with 32 additions and 2 deletions

View File

@ -85,6 +85,7 @@ pub struct Context<P: Protocol> {
pub encryption: EncryptionAlgorithm, pub encryption: EncryptionAlgorithm,
pub authentication: AuthenticationAlgorithm, pub authentication: AuthenticationAlgorithm,
pub auth_tag_len: usize, pub auth_tag_len: usize,
pub unknown_ssrcs: usize,
pub ssrc_context: BTreeMap<u32, SsrcContext<P>>, pub ssrc_context: BTreeMap<u32, SsrcContext<P>>,
} }
@ -366,6 +367,7 @@ where
encryption: EncryptionAlgorithm::default(), encryption: EncryptionAlgorithm::default(),
authentication: AuthenticationAlgorithm::default(), authentication: AuthenticationAlgorithm::default(),
auth_tag_len: 80 / 8, auth_tag_len: 80 / 8,
unknown_ssrcs: 0,
ssrc_context: BTreeMap::new(), ssrc_context: BTreeMap::new(),
} }
} }
@ -386,6 +388,10 @@ where
); );
} }
pub fn add_unknown_ssrcs(&mut self, count: usize) {
self.unknown_ssrcs += count;
}
pub fn update_session_keys(&mut self, ssrc: Ssrc, index: P::PacketIndex) { pub fn update_session_keys(&mut self, ssrc: Ssrc, index: P::PacketIndex) {
let index = if self.key_derivation_rate == 0 { let index = if self.key_derivation_rate == 0 {
0 0
@ -528,7 +534,19 @@ where
pub fn process_incoming(&mut self, packet: &[u8]) -> Result<Vec<u8>> { pub fn process_incoming(&mut self, packet: &[u8]) -> Result<Vec<u8>> {
// Step 1: determining the correct context // Step 1: determining the correct context
let ssrc = track_try!(P::read_ssrc(packet)); let ssrc = track_try!(P::read_ssrc(packet));
track_assert!(self.ssrc_context.contains_key(&ssrc), ErrorKind::Invalid, "Unknown SSRC {}", ssrc); if !self.ssrc_context.contains_key(&ssrc) {
track_assert!(self.unknown_ssrcs > 0, ErrorKind::Invalid, "Unknown SSRC {}", ssrc);
self.unknown_ssrcs -= 1;
let ssrc_context = SsrcContext {
replay_window_head: 0,
replay_window: FixedBitSet::with_capacity(128),
session_encr_key: vec![0; 128 / 8],
session_salt_key: vec![0; 112 / 8],
session_auth_key: vec![0; 160 / 8],
protocol_specific: P::default(),
};
self.ssrc_context.insert(ssrc, ssrc_context);
}
// Step 2: Determine index of the packet // Step 2: Determine index of the packet
let index = track_try!(P::determine_incoming_packet_index( let index = track_try!(P::determine_incoming_packet_index(
@ -600,7 +618,19 @@ where
pub fn process_outgoing(&mut self, packet: &[u8]) -> Result<Vec<u8>> { pub fn process_outgoing(&mut self, packet: &[u8]) -> Result<Vec<u8>> {
// Step 1: determining the correct context // Step 1: determining the correct context
let ssrc = track_try!(P::read_ssrc(packet)); let ssrc = track_try!(P::read_ssrc(packet));
track_assert!(self.ssrc_context.contains_key(&ssrc), ErrorKind::Invalid, "Unknown SSRC {}", ssrc); if !self.ssrc_context.contains_key(&ssrc) {
track_assert!(self.unknown_ssrcs > 0, ErrorKind::Invalid, "Unknown SSRC {}", ssrc);
self.unknown_ssrcs -= 1;
let ssrc_context = SsrcContext {
replay_window_head: 0,
replay_window: FixedBitSet::with_capacity(128),
session_encr_key: vec![0; 128 / 8],
session_salt_key: vec![0; 112 / 8],
session_auth_key: vec![0; 160 / 8],
protocol_specific: P::default(),
};
self.ssrc_context.insert(ssrc, ssrc_context);
}
// Step 2: Determine index of the packet // Step 2: Determine index of the packet
let index = track_try!(P::determine_outgoing_packet_index( let index = track_try!(P::determine_outgoing_packet_index(