summaryrefslogtreecommitdiff
path: root/googlepatches/google-7-srtp-security-fix.patch
blob: 54e3e9e5bbba46a6b9401ecf3b3452da8c88c187 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
diff --git a/google3/third_party/libsrtp/crypto/include/integers.h b/google3/third_party/libsrtp/crypto/include/integers.h
index 7010efd..3515d13 100644
--- a/google3/third_party/libsrtp/crypto/include/integers.h
+++ b/google3/third_party/libsrtp/crypto/include/integers.h
@@ -98,7 +98,6 @@ typedef unsigned short int	uint16_t;
 typedef unsigned int		uint32_t;
 #endif
 
-
 #ifdef NO_64BIT_MATH
 typedef double uint64_t;
 /* assert that sizeof(double) == 8 */
diff --git a/google3/third_party/libsrtp/include/srtp.h b/google3/third_party/libsrtp/include/srtp.h
index 7f17853..bbaac95 100644
--- a/google3/third_party/libsrtp/include/srtp.h
+++ b/google3/third_party/libsrtp/include/srtp.h
@@ -50,10 +50,6 @@
 extern "C" {
 #endif
 
-#ifdef _MSC_VER
-#pragma pack(4)
-#endif
-
 #include "crypto_kernel.h" 
 
 /**
@@ -930,10 +926,6 @@ srtp_install_event_handler(srtp_event_handler_func_t func);
 #define SRTCP_E_BYTE_BIT 0x80
 #define SRTCP_INDEX_MASK 0x7fffffff
 
-#ifdef _MSC_VER
-#pragma pack()
-#endif
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/google3/third_party/libsrtp/srtp/srtp.c b/google3/third_party/libsrtp/srtp/srtp.c
index 6010dd4..3fc52ee 100644
--- a/google3/third_party/libsrtp/srtp/srtp.c
+++ b/google3/third_party/libsrtp/srtp/srtp.c
@@ -1657,6 +1657,8 @@ srtp_unprotect_rtcp(srtp_t ctx, void *srtcp_hdr, int *pkt_octet_len) {
   srtp_stream_ctx_t *stream;
   int prefix_len;
   uint32_t seq_num;
+  int e_bit_in_packet;     /* whether the E-bit was found in the packet */
+  int sec_serv_confidentiality; /* whether confidentiality was requested */
 
   /* we assume the hdr is 32-bit aligned to start */
   /*
@@ -1694,7 +1696,10 @@ srtp_unprotect_rtcp(srtp_t ctx, void *srtcp_hdr, int *pkt_octet_len) {
       return err_status_no_ctx;
     } 
   }
-  
+
+  sec_serv_confidentiality = stream->rtcp_services == sec_serv_conf ||
+      stream->rtcp_services == sec_serv_conf_and_auth;
+
   /* get tag length from stream context */
   tag_len = auth_get_tag_length(stream->rtcp_auth); 
 
@@ -1714,8 +1719,12 @@ srtp_unprotect_rtcp(srtp_t ctx, void *srtcp_hdr, int *pkt_octet_len) {
    */
   trailer = (uint32_t *) ((char *) hdr +
 		     *pkt_octet_len -(tag_len + sizeof(srtcp_trailer_t)));
-  if (*((unsigned char *) trailer) & SRTCP_E_BYTE_BIT) {
-    enc_start = (uint32_t *)hdr + uint32s_in_rtcp_header;  
+  e_bit_in_packet = (*((unsigned char *) trailer) & SRTCP_E_BYTE_BIT) == SRTCP_E_BYTE_BIT;
+  if (e_bit_in_packet != sec_serv_confidentiality) {
+    return err_status_cant_check;
+  }
+  if (sec_serv_confidentiality) {
+    enc_start = (uint32_t *)hdr + uint32s_in_rtcp_header;
   } else {
     enc_octet_len = 0;
     enc_start = NULL; /* this indicates that there's no encryption */
diff --git a/google3/third_party/libsrtp/test/srtp_driver.c b/google3/third_party/libsrtp/test/srtp_driver.c
index f6a84f9..3c97072 100644
--- a/google3/third_party/libsrtp/test/srtp_driver.c
+++ b/google3/third_party/libsrtp/test/srtp_driver.c
@@ -1246,7 +1246,7 @@ srtp_create_big_policy(srtp_policy_t **list) {
    * loop over policy list, mallocing a new list and copying values
    * into it (and incrementing the SSRC value as we go along)
    */
-  tmp = NULL;
+  tmp = p = NULL;
   while (policy_array[i] != NULL) {
     p  = (srtp_policy_t*) malloc(sizeof(srtp_policy_t));
     if (p == NULL)