From 34e83b8e8d7db027abbaeac3beba39f28ccafab3 Mon Sep 17 00:00:00 2001 From: "mflodman@webrtc.org" Date: Wed, 17 Oct 2012 11:05:54 +0000 Subject: [PATCH] Added buffer length when calling encrypt/decrypt. Write the extra two bytes. Replacing http://review.webrtc.org/893004/. BUG=934 TEST=Run ViE Autotest Encryption with Valgrind. Review URL: https://webrtc-codereview.appspot.com/901006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2938 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../source/vie_autotest_encryption.cc | 24 ++++++++++++------- src/video_engine/vie_receiver.cc | 4 ++-- src/video_engine/vie_sender.cc | 19 +++++++++++---- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/video_engine/test/auto_test/source/vie_autotest_encryption.cc b/src/video_engine/test/auto_test/source/vie_autotest_encryption.cc index 0c06f327d9..1d7a8353ec 100644 --- a/src/video_engine/test/auto_test/source/vie_autotest_encryption.cc +++ b/src/video_engine/test/auto_test/source/vie_autotest_encryption.cc @@ -31,45 +31,53 @@ public: { } - virtual void encrypt(int channel_no, unsigned char * in_data, - unsigned char * out_data, int bytes_in, int* bytes_out) + virtual void encrypt(int channel_no, unsigned char* in_data, + unsigned char* out_data, int bytes_in, int* bytes_out) { for (int i = 0; i < bytes_in; i++) { out_data[i] = ~in_data[i]; } + assert(*bytes_out >= bytes_in + 2); *bytes_out = bytes_in + 2; + out_data[bytes_in] = 'a'; + out_data[bytes_in + 1] = 'b'; } - virtual void decrypt(int channel_no, unsigned char * in_data, - unsigned char * out_data, int bytes_in, int* bytes_out) + virtual void decrypt(int channel_no, unsigned char* in_data, + unsigned char* out_data, int bytes_in, int* bytes_out) { for (int i = 0; i < bytes_in - 2; i++) { out_data[i] = ~in_data[i]; } + assert(*bytes_out >= bytes_in - 2); *bytes_out = bytes_in - 2; } - virtual void encrypt_rtcp(int channel_no, unsigned char * in_data, - unsigned char * out_data, int bytes_in, + virtual void encrypt_rtcp(int channel_no, unsigned char* in_data, + unsigned char* out_data, int bytes_in, int* bytes_out) { for (int i = 0; i < bytes_in; i++) { out_data[i] = ~in_data[i]; } + assert(*bytes_out >= bytes_in + 2); *bytes_out = bytes_in + 2; + out_data[bytes_in] = 'a'; + out_data[bytes_in + 1] = 'b'; } - virtual void decrypt_rtcp(int channel_no, unsigned char * in_data, - unsigned char * out_data, int bytes_in, + virtual void decrypt_rtcp(int channel_no, unsigned char* in_data, + unsigned char* out_data, int bytes_in, int* bytes_out) { for (int i = 0; i < bytes_in - 2; i++) { out_data[i] = ~in_data[i]; } + assert(*bytes_out >= bytes_in - 2); *bytes_out = bytes_in - 2; } }; diff --git a/src/video_engine/vie_receiver.cc b/src/video_engine/vie_receiver.cc index f3c6a6a02c..a32c8134e2 100644 --- a/src/video_engine/vie_receiver.cc +++ b/src/video_engine/vie_receiver.cc @@ -164,7 +164,7 @@ int ViEReceiver::InsertRTPPacket(const WebRtc_Word8* rtp_packet, CriticalSectionScoped cs(receive_cs_.get()); if (external_decryption_) { - int decrypted_length = 0; + int decrypted_length = kViEMaxMtu; external_decryption_->decrypt(channel_id_, received_packet, decryption_buffer_, received_packet_length, &decrypted_length); @@ -202,7 +202,7 @@ int ViEReceiver::InsertRTCPPacket(const WebRtc_Word8* rtcp_packet, CriticalSectionScoped cs(receive_cs_.get()); if (external_decryption_) { - int decrypted_length = 0; + int decrypted_length = kViEMaxMtu; external_decryption_->decrypt_rtcp(channel_id_, received_packet, decryption_buffer_, received_packet_length, diff --git a/src/video_engine/vie_sender.cc b/src/video_engine/vie_sender.cc index 6f682c1746..4e6dcaef84 100644 --- a/src/video_engine/vie_sender.cc +++ b/src/video_engine/vie_sender.cc @@ -137,6 +137,8 @@ int ViESender::SendPacket(int vie_id, const void* data, int len) { // TODO(mflodman) Change decrypt to get rid of this cast. void* tmp_ptr = const_cast(data); unsigned char* send_packet = static_cast(tmp_ptr); + + // Data length for packets sent to possible encryption and to the transport. int send_packet_length = len; if (rtp_dump_) { @@ -144,10 +146,13 @@ int ViESender::SendPacket(int vie_id, const void* data, int len) { } if (external_encryption_) { - external_encryption_->encrypt(channel_id_, send_packet, - encryption_buffer_, send_packet_length, - static_cast(&send_packet_length)); + // Encryption buffer size. + int encrypted_packet_length = kViEMaxMtu; + + external_encryption_->encrypt(channel_id_, send_packet, encryption_buffer_, + send_packet_length, &encrypted_packet_length); send_packet = encryption_buffer_; + send_packet_length = encrypted_packet_length; } const int bytes_sent = transport_->SendPacket(channel_id_, send_packet, send_packet_length); @@ -171,6 +176,8 @@ int ViESender::SendRTCPPacket(int vie_id, const void* data, int len) { // TODO(mflodman) Change decrypt to get rid of this cast. void* tmp_ptr = const_cast(data); unsigned char* send_packet = static_cast(tmp_ptr); + + // Data length for packets sent to possible encryption and to the transport. int send_packet_length = len; if (rtp_dump_) { @@ -178,10 +185,14 @@ int ViESender::SendRTCPPacket(int vie_id, const void* data, int len) { } if (external_encryption_) { + // Encryption buffer size. + int encrypted_packet_length = kViEMaxMtu; + external_encryption_->encrypt_rtcp( channel_id_, send_packet, encryption_buffer_, send_packet_length, - static_cast(&send_packet_length)); + &encrypted_packet_length); send_packet = encryption_buffer_; + send_packet_length = encrypted_packet_length; } const int bytes_sent = transport_->SendRTCPPacket(channel_id_, send_packet,