1- use std:: io:: BufWriter ;
2-
31use aes:: cipher:: generic_array:: GenericArray ;
4- use byteorder:: { BigEndian , ByteOrder , WriteBytesExt } ;
2+ use byteorder:: { BigEndian , ByteOrder } ;
53use bytes:: { BufMut , Bytes , BytesMut } ;
64use ctr:: cipher:: { NewCipher , StreamCipher , StreamCipherSeek } ;
75use hmac:: { Hmac , Mac } ;
@@ -14,6 +12,11 @@ use crate::error::{Error, Result};
1412use crate :: key_derivation:: * ;
1513use crate :: protection_profile:: * ;
1614
15+ use openssl:: cipher;
16+ use openssl:: cipher_ctx:: CipherCtx ;
17+ use openssl:: error:: ErrorStack ;
18+ use openssl:: symm:: { Cipher as OpenSslCipher , Crypter , Mode } ;
19+
1720type HmacSha1 = Hmac < Sha1 > ;
1821type Aes128Ctr = ctr:: Ctr128BE < aes:: Aes128 > ;
1922
@@ -28,6 +31,8 @@ pub(crate) struct CipherAesCmHmacSha1 {
2831 srtcp_session_salt : Vec < u8 > ,
2932 srtcp_session_auth : HmacSha1 ,
3033 //srtcp_session_auth_tag: Vec<u8>,
34+
35+ ctx : CipherCtx
3136}
3237
3338impl CipherAesCmHmacSha1 {
@@ -84,6 +89,11 @@ impl CipherAesCmHmacSha1 {
8489 let srtcp_session_auth = HmacSha1 :: new_from_slice ( & srtcp_session_auth_tag)
8590 . map_err ( |e| Error :: Other ( e. to_string ( ) ) ) ?;
8691
92+ let t = openssl:: cipher:: Cipher :: aes_128_ctr ( ) ;
93+ let mut ctx = CipherCtx :: new ( ) . expect ( "a reusable cipher context" ) ;
94+ ctx. encrypt_init ( Some ( t) , Some ( & srtp_session_key[ ..] ) , None )
95+ . expect ( "enc init" ) ;
96+
8797 Ok ( CipherAesCmHmacSha1 {
8898 srtp_session_key,
8999 srtp_session_salt,
@@ -93,6 +103,7 @@ impl CipherAesCmHmacSha1 {
93103 srtcp_session_salt,
94104 srtcp_session_auth,
95105 //srtcp_session_auth_tag,
106+ ctx,
96107 } )
97108 }
98109
@@ -110,25 +121,19 @@ impl CipherAesCmHmacSha1 {
110121 /// - Authenticated portion of the packet is everything BEFORE MKI
111122 /// - k_a is the session message authentication key
112123 /// - n_tag is the bit-length of the output authentication tag
113- fn generate_srtp_auth_tag ( & mut self , buf : & [ u8 ] , roc : u32 ) -> Result < Vec < u8 > > {
124+ fn generate_srtp_auth_tag ( & mut self , buf : & [ u8 ] , roc : u32 ) -> Vec < u8 > {
114125 self . srtp_session_auth . reset ( ) ;
115126
116127 self . srtp_session_auth . update ( buf) ;
117128
118129 // For SRTP only, we need to hash the rollover counter as well.
119- let mut roc_buf: Vec < u8 > = vec ! [ ] ;
120- {
121- let mut writer = BufWriter :: < & mut Vec < u8 > > :: new ( roc_buf. as_mut ( ) ) ;
122- writer. write_u32 :: < BigEndian > ( roc) ?;
123- }
124-
125- self . srtp_session_auth . update ( & roc_buf) ;
130+ self . srtp_session_auth . update ( & roc. to_be_bytes ( ) ) ;
126131
127132 let result = self . srtp_session_auth . clone ( ) . finalize ( ) ;
128133 let code_bytes = result. into_bytes ( ) ;
129134
130135 // Truncate the hash to the first AUTH_TAG_SIZE bytes.
131- Ok ( code_bytes[ 0 ..self . auth_tag_len ( ) ] . to_vec ( ) )
136+ code_bytes[ 0 ..self . auth_tag_len ( ) ] . to_vec ( )
132137 }
133138
134139 /// https://tools.ietf.org/html/rfc3711#section-4.2
@@ -172,34 +177,30 @@ impl Cipher for CipherAesCmHmacSha1 {
172177 header : & rtp:: header:: Header ,
173178 roc : u32 ,
174179 ) -> Result < Bytes > {
180+ let header_len = header. marshal_size ( ) ;
175181 let mut writer =
176- BytesMut :: with_capacity ( header . marshal_size ( ) + payload. len ( ) + self . auth_tag_len ( ) ) ;
182+ BytesMut :: with_capacity ( header_len + payload. len ( ) + self . auth_tag_len ( ) ) ;
177183
178184 // Copy the header unencrypted.
179- let data = header. marshal ( ) ?;
180- writer. extend ( data) ;
181-
182- // Write the plaintext header to the destination buffer.
183- writer. extend_from_slice ( payload) ;
184-
185+ writer. extend ( header. marshal ( ) ) ;
185186 // Encrypt the payload
186- let counter = generate_counter (
187+ let nonce = generate_counter (
187188 header. sequence_number ,
188189 roc,
189190 header. ssrc ,
190191 & self . srtp_session_salt ,
191- ) ? ;
192- let key = GenericArray :: from_slice ( & self . srtp_session_key ) ;
193- let nonce = GenericArray :: from_slice ( & counter ) ;
194- let mut stream = Aes128Ctr :: new ( key , nonce) ;
195- let payload_offset = header . marshal_size ( ) ;
196- stream . apply_keystream ( & mut writer[ payload_offset ..] ) ;
192+ ) ;
193+
194+ writer . put_bytes ( 0 , payload . len ( ) ) ;
195+ self . ctx . encrypt_init ( None , None , Some ( & nonce) ) . unwrap ( ) ;
196+ let count = self . ctx . cipher_update ( & payload , Some ( & mut writer [ header_len.. ] ) ) . unwrap ( ) ;
197+ self . ctx . cipher_final ( & mut writer[ count ..] ) . unwrap ( ) ;
197198
198199 // Generate the auth tag.
199- let auth_tag = self . generate_srtp_auth_tag ( & writer, roc) ? ;
200+ let auth_tag = self . generate_srtp_auth_tag ( & writer, roc) ;
200201 writer. extend ( auth_tag) ;
201202
202- Ok ( writer . freeze ( ) )
203+ Ok ( Bytes :: from ( writer ) )
203204 }
204205
205206 fn decrypt_rtp (
@@ -219,7 +220,7 @@ impl Cipher for CipherAesCmHmacSha1 {
219220 let cipher_text = & encrypted[ ..encrypted. len ( ) - self . auth_tag_len ( ) ] ;
220221
221222 // Generate the auth tag we expect to see from the ciphertext.
222- let expected_tag = self . generate_srtp_auth_tag ( cipher_text, roc) ? ;
223+ let expected_tag = self . generate_srtp_auth_tag ( cipher_text, roc) ;
223224
224225 // See if the auth tag actually matches.
225226 // We use a constant time comparison to prevent timing attacks.
@@ -236,7 +237,7 @@ impl Cipher for CipherAesCmHmacSha1 {
236237 roc,
237238 header. ssrc ,
238239 & self . srtp_session_salt ,
239- ) ? ;
240+ ) ;
240241
241242 let key = GenericArray :: from_slice ( & self . srtp_session_key ) ;
242243 let nonce = GenericArray :: from_slice ( & counter) ;
@@ -261,7 +262,7 @@ impl Cipher for CipherAesCmHmacSha1 {
261262 ( srtcp_index >> 16 ) as u32 ,
262263 ssrc,
263264 & self . srtcp_session_salt ,
264- ) ? ;
265+ ) ;
265266
266267 let key = GenericArray :: from_slice ( & self . srtcp_session_key ) ;
267268 let nonce = GenericArray :: from_slice ( & counter) ;
@@ -325,7 +326,7 @@ impl Cipher for CipherAesCmHmacSha1 {
325326 ( srtcp_index >> 16 ) as u32 ,
326327 ssrc,
327328 & self . srtcp_session_salt ,
328- ) ? ;
329+ ) ;
329330
330331 let key = GenericArray :: from_slice ( & self . srtcp_session_key ) ;
331332 let nonce = GenericArray :: from_slice ( & counter) ;
0 commit comments