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