@@ -31,9 +31,8 @@ pub(crate) struct CipherAesCmHmacSha1 {
31
31
srtcp_session_salt : Vec < u8 > ,
32
32
srtcp_session_auth : HmacSha1 ,
33
33
//srtcp_session_auth_tag: Vec<u8>,
34
-
35
34
rtp_ctx : CipherCtx ,
36
- rtcp_ctx : CipherCtx
35
+ rtcp_ctx : CipherCtx ,
37
36
}
38
37
39
38
impl CipherAesCmHmacSha1 {
@@ -92,12 +91,14 @@ impl CipherAesCmHmacSha1 {
92
91
93
92
let t = openssl:: cipher:: Cipher :: aes_128_ctr ( ) ;
94
93
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 )
96
96
. expect ( "enc init" ) ;
97
97
98
98
let t = openssl:: cipher:: Cipher :: aes_128_ctr ( ) ;
99
99
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 )
101
102
. expect ( "enc init" ) ;
102
103
103
104
Ok ( CipherAesCmHmacSha1 {
@@ -110,7 +111,7 @@ impl CipherAesCmHmacSha1 {
110
111
srtcp_session_auth,
111
112
//srtcp_session_auth_tag,
112
113
rtp_ctx,
113
- rtcp_ctx
114
+ rtcp_ctx,
114
115
} )
115
116
}
116
117
@@ -180,8 +181,7 @@ impl Cipher for CipherAesCmHmacSha1 {
180
181
roc : u32 ,
181
182
) -> Result < Bytes > {
182
183
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 ( ) ) ;
185
185
186
186
// Copy the header unencrypted.
187
187
writer. extend_from_slice ( & payload[ ..header_len] ) ;
@@ -195,7 +195,10 @@ impl Cipher for CipherAesCmHmacSha1 {
195
195
) ;
196
196
writer. resize ( payload. len ( ) , 0 ) ;
197
197
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 ( ) ;
199
202
self . rtp_ctx . cipher_final ( & mut writer[ count..] ) . unwrap ( ) ;
200
203
201
204
// Generate and write the auth tag.
@@ -244,7 +247,10 @@ impl Cipher for CipherAesCmHmacSha1 {
244
247
245
248
writer. put_bytes ( 0 , encrypted. len ( ) - header_len - self . auth_tag_len ( ) ) ;
246
249
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 ( ) ;
248
254
self . rtp_ctx . cipher_final ( & mut writer[ count..] ) . unwrap ( ) ;
249
255
250
256
Ok ( writer. freeze ( ) )
@@ -255,7 +261,9 @@ impl Cipher for CipherAesCmHmacSha1 {
255
261
BytesMut :: with_capacity ( decrypted. len ( ) + SRTCP_INDEX_SIZE + self . auth_tag_len ( ) ) ;
256
262
257
263
// 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
+ ) ;
259
267
260
268
// Encrypt everything after header
261
269
let nonce = generate_counter (
@@ -265,10 +273,22 @@ impl Cipher for CipherAesCmHmacSha1 {
265
273
& self . srtcp_session_salt ,
266
274
) ;
267
275
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 ( ) ;
272
292
273
293
// Add SRTCP index and set Encryption bit
274
294
writer. put_u32 ( srtcp_index as u32 | ( 1u32 << 31 ) ) ;
@@ -281,6 +301,7 @@ impl Cipher for CipherAesCmHmacSha1 {
281
301
}
282
302
283
303
fn decrypt_rtcp ( & mut self , encrypted : & [ u8 ] , srtcp_index : usize , ssrc : u32 ) -> Result < Bytes > {
304
+ println ! ( "encrypted len {:?}" , encrypted. len( ) ) ;
284
305
if encrypted. len ( ) < self . auth_tag_len ( ) + SRTCP_INDEX_SIZE {
285
306
return Err ( Error :: SrtcpTooSmall (
286
307
encrypted. len ( ) ,
@@ -292,7 +313,9 @@ impl Cipher for CipherAesCmHmacSha1 {
292
313
293
314
let mut writer = BytesMut :: with_capacity ( tail_offset) ;
294
315
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
+ ) ;
296
319
297
320
let is_encrypted = encrypted[ tail_offset] >> 7 ;
298
321
if is_encrypted == 0 {
@@ -310,6 +333,7 @@ impl Cipher for CipherAesCmHmacSha1 {
310
333
311
334
let cipher_text = & encrypted[ ..encrypted. len ( ) - self . auth_tag_len ( ) ] ;
312
335
336
+ println ! ( "cipher_text len {:?}" , cipher_text. len( ) ) ;
313
337
// Generate the auth tag we expect to see from the ciphertext.
314
338
let expected_tag = self . generate_srtcp_auth_tag ( cipher_text) ;
315
339
@@ -319,21 +343,29 @@ impl Cipher for CipherAesCmHmacSha1 {
319
343
return Err ( Error :: RtcpFailedToVerifyAuthTag ) ;
320
344
}
321
345
322
- let counter = generate_counter (
346
+ let nonce = generate_counter (
323
347
( srtcp_index & 0xFFFF ) as u16 ,
324
348
( srtcp_index >> 16 ) as u32 ,
325
349
ssrc,
326
350
& self . srtcp_session_salt ,
327
351
) ;
328
352
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 ( ) ;
337
369
338
370
Ok ( writer. freeze ( ) )
339
371
}
0 commit comments