Skip to content

Commit 9634b1a

Browse files
logist322rainliu
authored andcommitted
Works
1 parent 716e434 commit 9634b1a

File tree

1 file changed

+56
-24
lines changed

1 file changed

+56
-24
lines changed

srtp/src/cipher/cipher_aes_cm_hmac_sha1.rs

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3938
impl 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

Comments
 (0)