xref: /webrtc/srtp/src/context/srtp_test.rs (revision 259fddd2)
1 use super::*;
2 
3 use util::Error;
4 
5 use std::io::BufWriter;
6 
7 use lazy_static::lazy_static;
8 
9 //TODO: BenchmarkEncryptRTP
10 //TODO: BenchmarkEncryptRTPInPlace
11 //TODO: BenchmarkDecryptRTP
12 
13 fn build_test_context() -> Result<Context, Error> {
14     let master_key = vec![
15         0x0d, 0xcd, 0x21, 0x3e, 0x4c, 0xbc, 0xf2, 0x8f, 0x01, 0x7f, 0x69, 0x94, 0x40, 0x1e, 0x28,
16         0x89,
17     ];
18     let master_salt = vec![
19         0x62, 0x77, 0x60, 0x38, 0xc0, 0x6d, 0xc9, 0x41, 0x9f, 0x6d, 0xd9, 0x43, 0x3e, 0x7c,
20     ];
21 
22     Context::new(
23         &master_key,
24         &master_salt,
25         PROTECTION_PROFILE_AES128CM_HMAC_SHA1_80,
26         None,
27         None,
28     )
29 }
30 
31 struct RTPTestCase {
32     sequence_number: u16,
33     encrypted: Vec<u8>,
34 }
35 
36 lazy_static! {
37     static ref RTP_TEST_CASE_DECRYPTED: Vec<u8> = vec![0x00, 0x01, 0x02, 0x03, 0x04, 0x05];
38     static ref RTP_TEST_CASES: Vec<RTPTestCase> = vec![
39         RTPTestCase {
40             sequence_number: 5000,
41             encrypted: vec![
42                 0x6d, 0xd3, 0x7e, 0xd5, 0x99, 0xb7, 0x2d, 0x28, 0xb1, 0xf3, 0xa1, 0xf0, 0xc, 0xfb,
43                 0xfd, 0x8
44             ],
45         },
46         RTPTestCase {
47             sequence_number: 5001,
48             encrypted: vec![
49                 0xda, 0x47, 0xb, 0x2a, 0x74, 0x53, 0x65, 0xbd, 0x2f, 0xeb, 0xdc, 0x4b, 0x6d, 0x23,
50                 0xf3, 0xde
51             ],
52         },
53         RTPTestCase {
54             sequence_number: 5002,
55             encrypted: vec![
56                 0x6e, 0xa7, 0x69, 0x8d, 0x24, 0x6d, 0xdc, 0xbf, 0xec, 0x2, 0x1c, 0xd1, 0x60, 0x76,
57                 0xc1, 0x0e
58             ],
59         },
60         RTPTestCase {
61             sequence_number: 5003,
62             encrypted: vec![
63                 0x24, 0x7e, 0x96, 0xc8, 0x7d, 0x33, 0xa2, 0x92, 0x8d, 0x13, 0x8d, 0xe0, 0x76, 0x9f,
64                 0x08, 0xdc
65             ],
66         },
67         RTPTestCase {
68             sequence_number: 5004,
69             encrypted: vec![
70                 0x75, 0x43, 0x28, 0xe4, 0x3a, 0x77, 0x59, 0x9b, 0x2e, 0xdf, 0x7b, 0x12, 0x68, 0x0b,
71                 0x57, 0x49
72             ],
73         },
74         RTPTestCase{
75             sequence_number: 65535, // upper boundary
76             encrypted: vec![
77                 0xaf, 0xf7, 0xc2, 0x70, 0x37, 0x20, 0x83, 0x9c, 0x2c, 0x63, 0x85, 0x15, 0x0e, 0x44,
78                 0xca, 0x36
79             ],
80         },
81     ];
82 }
83 
84 #[test]
85 fn test_rtp_invalid_auth() -> Result<(), Error> {
86     let master_key = vec![
87         0x0d, 0xcd, 0x21, 0x3e, 0x4c, 0xbc, 0xf2, 0x8f, 0x01, 0x7f, 0x69, 0x94, 0x40, 0x1e, 0x28,
88         0x89,
89     ];
90     let invalid_salt = vec![
91         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92     ];
93 
94     let mut encrypt_context = build_test_context()?;
95     let mut invalid_context = Context::new(
96         &master_key,
97         &invalid_salt,
98         PROTECTION_PROFILE_AES128CM_HMAC_SHA1_80,
99         None,
100         None,
101     )?;
102 
103     for test_case in &*RTP_TEST_CASES {
104         let pkt = rtp::packet::Packet {
105             header: rtp::header::Header {
106                 sequence_number: test_case.sequence_number,
107                 ..Default::default()
108             },
109             payload: RTP_TEST_CASE_DECRYPTED.clone(),
110         };
111         let mut pkt_raw: Vec<u8> = vec![];
112         {
113             let mut writer = BufWriter::<&mut Vec<u8>>::new(pkt_raw.as_mut());
114             pkt.marshal(&mut writer)?;
115         }
116 
117         let out = encrypt_context.encrypt_rtp(&pkt_raw)?;
118 
119         let result = invalid_context.decrypt_rtp(&out);
120         assert!(
121             result.is_err(),
122             "Managed to decrypt with incorrect salt for packet with SeqNum: {}",
123             test_case.sequence_number
124         );
125     }
126 
127     Ok(())
128 }
129 
130 #[test]
131 fn test_rtp_lifecyle() -> Result<(), Error> {
132     let mut encrypt_context = build_test_context()?;
133     let mut decrypt_context = build_test_context()?;
134     let auth_tag_len = PROTECTION_PROFILE_AES128CM_HMAC_SHA1_80.auth_tag_len()?;
135 
136     for test_case in RTP_TEST_CASES.iter() {
137         let decrypted_pkt = rtp::packet::Packet {
138             header: rtp::header::Header {
139                 sequence_number: test_case.sequence_number,
140                 ..Default::default()
141             },
142             payload: RTP_TEST_CASE_DECRYPTED.clone(),
143         };
144 
145         let mut decrypted_raw: Vec<u8> = vec![];
146         {
147             let mut writer = BufWriter::<&mut Vec<u8>>::new(decrypted_raw.as_mut());
148             decrypted_pkt.marshal(&mut writer)?;
149         }
150 
151         let encrypted_pkt = rtp::packet::Packet {
152             header: rtp::header::Header {
153                 sequence_number: test_case.sequence_number,
154                 ..Default::default()
155             },
156             payload: test_case.encrypted.clone(),
157         };
158         let mut encrypted_raw: Vec<u8> = vec![];
159         {
160             let mut writer = BufWriter::<&mut Vec<u8>>::new(encrypted_raw.as_mut());
161             encrypted_pkt.marshal(&mut writer)?;
162         }
163 
164         let actual_encrypted = encrypt_context.encrypt_rtp(&decrypted_raw)?;
165         assert_eq!(
166             actual_encrypted, encrypted_raw,
167             "RTP packet with SeqNum invalid encryption: {}",
168             test_case.sequence_number
169         );
170 
171         let actual_decrypted = decrypt_context.decrypt_rtp(&encrypted_raw)?;
172         assert_ne!(
173             encrypted_raw[..encrypted_raw.len() - auth_tag_len].to_vec(),
174             actual_decrypted,
175             "DecryptRTP improperly encrypted in place"
176         );
177 
178         assert_eq!(
179             actual_decrypted, decrypted_raw,
180             "RTP packet with SeqNum invalid decryption: {}",
181             test_case.sequence_number,
182         )
183     }
184 
185     Ok(())
186 }
187