@@ -31,9 +31,8 @@ pub(crate) struct CipherAesCmHmacSha1 {
3131 srtcp_session_salt : Vec < u8 > ,
3232 srtcp_session_auth : HmacSha1 ,
3333 //srtcp_session_auth_tag: Vec<u8>,
34-
3534 rtp_ctx : CipherCtx ,
36- rtcp_ctx : CipherCtx
35+ rtcp_ctx : CipherCtx ,
3736}
3837
3938impl CipherAesCmHmacSha1 {
@@ -92,12 +91,14 @@ impl CipherAesCmHmacSha1 {
9291
9392 let t = openssl:: cipher:: Cipher :: aes_128_ctr ( ) ;
9493 let mut rtp_ctx = CipherCtx :: new ( ) . expect ( "a reusable cipher context" ) ;
95- rtp_ctx. encrypt_init ( Some ( t) , Some ( & srtp_session_key[ ..] ) , None )
94+ rtp_ctx
95+ . encrypt_init ( Some ( t) , Some ( & srtp_session_key[ ..] ) , None )
9696 . expect ( "enc init" ) ;
9797
9898 let t = openssl:: cipher:: Cipher :: aes_128_ctr ( ) ;
9999 let mut rtcp_ctx = CipherCtx :: new ( ) . expect ( "a reusable cipher context" ) ;
100- rtcp_ctx. encrypt_init ( Some ( t) , Some ( & srtcp_session_key[ ..] ) , None )
100+ rtcp_ctx
101+ . encrypt_init ( Some ( t) , Some ( & srtcp_session_key[ ..] ) , None )
101102 . expect ( "enc init" ) ;
102103
103104 Ok ( CipherAesCmHmacSha1 {
@@ -110,7 +111,7 @@ impl CipherAesCmHmacSha1 {
110111 srtcp_session_auth,
111112 //srtcp_session_auth_tag,
112113 rtp_ctx,
113- rtcp_ctx
114+ rtcp_ctx,
114115 } )
115116 }
116117
@@ -180,8 +181,7 @@ impl Cipher for CipherAesCmHmacSha1 {
180181 roc : u32 ,
181182 ) -> Result < Bytes > {
182183 let header_len = header. marshal_size ( ) ;
183- let mut writer =
184- Vec :: with_capacity ( payload. len ( ) + self . auth_tag_len ( ) ) ;
184+ let mut writer = Vec :: with_capacity ( payload. len ( ) + self . auth_tag_len ( ) ) ;
185185
186186 // Copy the header unencrypted.
187187 writer. extend_from_slice ( & payload[ ..header_len] ) ;
@@ -195,7 +195,10 @@ impl Cipher for CipherAesCmHmacSha1 {
195195 ) ;
196196 writer. resize ( payload. len ( ) , 0 ) ;
197197 self . rtp_ctx . encrypt_init ( None , None , Some ( & nonce) ) . unwrap ( ) ;
198- let count = self . rtp_ctx . cipher_update ( & payload[ header_len..] , Some ( & mut writer[ header_len..] ) ) . unwrap ( ) ;
198+ let count = self
199+ . rtp_ctx
200+ . cipher_update ( & payload[ header_len..] , Some ( & mut writer[ header_len..] ) )
201+ . unwrap ( ) ;
199202 self . rtp_ctx . cipher_final ( & mut writer[ count..] ) . unwrap ( ) ;
200203
201204 // Generate and write the auth tag.
@@ -244,7 +247,10 @@ impl Cipher for CipherAesCmHmacSha1 {
244247
245248 writer. put_bytes ( 0 , encrypted. len ( ) - header_len - self . auth_tag_len ( ) ) ;
246249 self . rtp_ctx . decrypt_init ( None , None , Some ( & nonce) ) . unwrap ( ) ;
247- let count = self . rtp_ctx . cipher_update ( & cipher_text[ header_len..] , Some ( & mut writer[ header_len..] ) ) . unwrap ( ) ;
250+ let count = self
251+ . rtp_ctx
252+ . cipher_update ( & cipher_text[ header_len..] , Some ( & mut writer[ header_len..] ) )
253+ . unwrap ( ) ;
248254 self . rtp_ctx . cipher_final ( & mut writer[ count..] ) . unwrap ( ) ;
249255
250256 Ok ( writer. freeze ( ) )
@@ -255,7 +261,9 @@ impl Cipher for CipherAesCmHmacSha1 {
255261 BytesMut :: with_capacity ( decrypted. len ( ) + SRTCP_INDEX_SIZE + self . auth_tag_len ( ) ) ;
256262
257263 // Write the decrypted to the destination buffer.
258- writer. extend_from_slice ( & decrypted[ ..rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ] ) ;
264+ writer. extend_from_slice (
265+ & decrypted[ ..rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ] ,
266+ ) ;
259267
260268 // Encrypt everything after header
261269 let nonce = generate_counter (
@@ -265,10 +273,22 @@ impl Cipher for CipherAesCmHmacSha1 {
265273 & self . srtcp_session_salt ,
266274 ) ;
267275
268- writer. resize ( decrypted. len ( ) - rtcp:: header:: HEADER_LENGTH - rtcp:: header:: SSRC_LENGTH , 0 ) ;
269- self . rtcp_ctx . encrypt_init ( None , None , Some ( & nonce) ) . unwrap ( ) ;
270- let count = self . rtcp_ctx . cipher_update ( & decrypted[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..] , Some ( & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..] ) ) . unwrap ( ) ;
271- self . rtcp_ctx . cipher_final ( & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH + count..] ) . unwrap ( ) ;
276+ writer. resize ( decrypted. len ( ) , 0 ) ;
277+ self . rtcp_ctx
278+ . encrypt_init ( None , None , Some ( & nonce) )
279+ . unwrap ( ) ;
280+ let count = self
281+ . rtcp_ctx
282+ . cipher_update (
283+ & decrypted[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..] ,
284+ Some ( & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..] ) ,
285+ )
286+ . unwrap ( ) ;
287+ self . rtcp_ctx
288+ . cipher_final (
289+ & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH + count..] ,
290+ )
291+ . unwrap ( ) ;
272292
273293 // Add SRTCP index and set Encryption bit
274294 writer. put_u32 ( srtcp_index as u32 | ( 1u32 << 31 ) ) ;
@@ -281,6 +301,7 @@ impl Cipher for CipherAesCmHmacSha1 {
281301 }
282302
283303 fn decrypt_rtcp ( & mut self , encrypted : & [ u8 ] , srtcp_index : usize , ssrc : u32 ) -> Result < Bytes > {
304+ println ! ( "encrypted len {:?}" , encrypted. len( ) ) ;
284305 if encrypted. len ( ) < self . auth_tag_len ( ) + SRTCP_INDEX_SIZE {
285306 return Err ( Error :: SrtcpTooSmall (
286307 encrypted. len ( ) ,
@@ -292,7 +313,9 @@ impl Cipher for CipherAesCmHmacSha1 {
292313
293314 let mut writer = BytesMut :: with_capacity ( tail_offset) ;
294315
295- writer. extend_from_slice ( & encrypted[ 0 ..tail_offset] ) ;
316+ writer. extend_from_slice (
317+ & encrypted[ ..rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ] ,
318+ ) ;
296319
297320 let is_encrypted = encrypted[ tail_offset] >> 7 ;
298321 if is_encrypted == 0 {
@@ -310,6 +333,7 @@ impl Cipher for CipherAesCmHmacSha1 {
310333
311334 let cipher_text = & encrypted[ ..encrypted. len ( ) - self . auth_tag_len ( ) ] ;
312335
336+ println ! ( "cipher_text len {:?}" , cipher_text. len( ) ) ;
313337 // Generate the auth tag we expect to see from the ciphertext.
314338 let expected_tag = self . generate_srtcp_auth_tag ( cipher_text) ;
315339
@@ -319,21 +343,29 @@ impl Cipher for CipherAesCmHmacSha1 {
319343 return Err ( Error :: RtcpFailedToVerifyAuthTag ) ;
320344 }
321345
322- let counter = generate_counter (
346+ let nonce = generate_counter (
323347 ( srtcp_index & 0xFFFF ) as u16 ,
324348 ( srtcp_index >> 16 ) as u32 ,
325349 ssrc,
326350 & self . srtcp_session_salt ,
327351 ) ;
328352
329- let key = GenericArray :: from_slice ( & self . srtcp_session_key ) ;
330- let nonce = GenericArray :: from_slice ( & counter) ;
331- let mut stream = Aes128Ctr :: new ( key, nonce) ;
332-
333- stream. seek ( 0 ) ;
334- stream. apply_keystream (
335- & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..] ,
336- ) ;
353+ writer. resize ( tail_offset, 0 ) ;
354+ self . rtcp_ctx
355+ . decrypt_init ( None , None , Some ( & nonce) )
356+ . unwrap ( ) ;
357+ let count = self
358+ . rtcp_ctx
359+ . cipher_update (
360+ & encrypted[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..tail_offset] ,
361+ Some ( & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH ..] ) ,
362+ )
363+ . unwrap ( ) ;
364+ self . rtcp_ctx
365+ . cipher_final (
366+ & mut writer[ rtcp:: header:: HEADER_LENGTH + rtcp:: header:: SSRC_LENGTH + count..] ,
367+ )
368+ . unwrap ( ) ;
337369
338370 Ok ( writer. freeze ( ) )
339371 }
0 commit comments