OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/sys_byteorder.h" | 9 #include "base/sys_byteorder.h" |
10 #include "media/base/decoder_buffer.h" | 10 #include "media/base/decoder_buffer.h" |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 // byte 33 is changed from 0xf7 to 0xf8. Bytes 20+ of WebM encrypted data | 136 // byte 33 is changed from 0xf7 to 0xf8. Bytes 20+ of WebM encrypted data |
137 // contains the encrypted frame. | 137 // contains the encrypted frame. |
138 static const unsigned char kWebmFrame0FrameDataChanged[] = { | 138 static const unsigned char kWebmFrame0FrameDataChanged[] = { |
139 0xfb, 0xe7, 0x1d, 0xbb, 0x4c, 0x23, 0xce, 0xba, | 139 0xfb, 0xe7, 0x1d, 0xbb, 0x4c, 0x23, 0xce, 0xba, |
140 0xcc, 0xf8, 0xda, 0xc0, 0xff, 0xff, 0xff, 0xff, | 140 0xcc, 0xf8, 0xda, 0xc0, 0xff, 0xff, 0xff, 0xff, |
141 0xff, 0xff, 0xff, 0xff, 0x99, 0xaa, 0xff, 0xb7, | 141 0xff, 0xff, 0xff, 0xff, 0x99, 0xaa, 0xff, 0xb7, |
142 0x74, 0x02, 0x4e, 0x1c, 0x75, 0x3d, 0xee, 0xcb, | 142 0x74, 0x02, 0x4e, 0x1c, 0x75, 0x3d, 0xee, 0xcb, |
143 0x64, 0xf8 | 143 0x64, 0xf8 |
144 }; | 144 }; |
145 | 145 |
146 static const uint8 kSubsampleOriginalData[] = "Original subsample data."; | |
147 static const int kSubsampleOriginalDataSize = 24; | |
148 | |
149 static const uint8 kSubsampleKeyId[] = { 0x00, 0x01, 0x02, 0x03 }; | |
150 | |
151 static const uint8 kSubsampleKey[] = { | |
152 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, | |
153 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 | |
154 }; | |
155 | |
156 static const uint8 kSubsampleIv[] = { | |
157 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, | |
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
159 }; | |
160 | |
161 static const uint8 kSubsampleData[] = { | |
162 0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad, | |
163 0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d, | |
164 0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e | |
165 }; | |
166 | |
167 static const uint8 kPaddedSubsampleData[] = { | |
168 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | |
169 0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad, | |
170 0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d, | |
171 0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e | |
172 }; | |
173 | |
174 static const SubsampleEntry kSubsampleEntries[] = { | |
175 { 2, 7 }, | |
176 { 3, 11 }, | |
177 { 1, 0 }, | |
178 }; | |
179 | |
146 class AesDecryptorTest : public testing::Test { | 180 class AesDecryptorTest : public testing::Test { |
147 public: | 181 public: |
148 AesDecryptorTest() | 182 AesDecryptorTest() |
149 : decryptor_(&client_), | 183 : decryptor_(&client_), |
150 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, | 184 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, |
151 base::Unretained(this))) { | 185 base::Unretained(this))) { |
152 } | 186 } |
153 | 187 |
154 protected: | 188 protected: |
155 // Returns a 16 byte CTR counter block. The CTR counter block format is a | 189 // Returns a 16 byte CTR counter block. The CTR counter block format is a |
(...skipping 13 matching lines...) Expand all Loading... | |
169 | 203 |
170 return std::string(counter_block_data, kDecryptionKeySize); | 204 return std::string(counter_block_data, kDecryptionKeySize); |
171 } | 205 } |
172 | 206 |
173 // Creates a WebM encrypted buffer that the demuxer would pass to the | 207 // Creates a WebM encrypted buffer that the demuxer would pass to the |
174 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is | 208 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is |
175 // initialization data from the WebM file. Every encrypted Block has | 209 // initialization data from the WebM file. Every encrypted Block has |
176 // an HMAC and IV prepended to an encrypted frame. Current encrypted WebM | 210 // an HMAC and IV prepended to an encrypted frame. Current encrypted WebM |
177 // request for comments specification is here | 211 // request for comments specification is here |
178 // http://wiki.webmproject.org/encryption/webm-encryption-rfc | 212 // http://wiki.webmproject.org/encryption/webm-encryption-rfc |
179 scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer(const uint8* data, | 213 scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer(const uint8* data, |
ddorwin
2012/07/25 07:13:47
For consistency, pair params these up like the fun
strobe_
2012/07/25 21:12:36
Done.
| |
180 int data_size, | 214 int data_size, |
181 const uint8* key_id, | 215 const uint8* key_id, |
182 int key_id_size) { | 216 int key_id_size) { |
183 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( | 217 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( |
184 data + kWebMHmacSize, data_size - kWebMHmacSize); | 218 data + kWebMHmacSize, data_size - kWebMHmacSize); |
185 CHECK(encrypted_buffer); | 219 CHECK(encrypted_buffer); |
186 | 220 |
187 uint64 network_iv; | 221 uint64 network_iv; |
188 memcpy(&network_iv, data + kWebMHmacSize, sizeof(network_iv)); | 222 memcpy(&network_iv, data + kWebMHmacSize, sizeof(network_iv)); |
189 const uint64 iv = base::NetToHost64(network_iv); | 223 const uint64 iv = base::NetToHost64(network_iv); |
190 std::string webm_iv = | 224 std::string webm_iv = |
191 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); | 225 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); |
192 encrypted_buffer->SetDecryptConfig( | 226 encrypted_buffer->SetDecryptConfig( |
193 scoped_ptr<DecryptConfig>(new DecryptConfig( | 227 scoped_ptr<DecryptConfig>(new DecryptConfig( |
194 key_id, key_id_size, | 228 std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
195 reinterpret_cast<const uint8*>(webm_iv.data()), webm_iv.size(), | 229 webm_iv, |
196 data, kWebMHmacSize, | 230 std::string(reinterpret_cast<const char*>(data), kWebMHmacSize), |
197 sizeof(iv)))); | 231 sizeof(iv), |
232 std::vector<SubsampleEntry>()))); | |
198 return encrypted_buffer; | 233 return encrypted_buffer; |
199 } | 234 } |
200 | 235 |
236 scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer( | |
237 const uint8* data, int data_size, | |
238 const uint8* key_id, int key_id_size, | |
239 const uint8* iv, int iv_size, | |
240 int data_offset, | |
241 const std::vector<SubsampleEntry>& subsample_entries) { | |
242 scoped_refptr<DecoderBuffer> encrypted_buffer = | |
243 DecoderBuffer::CopyFrom(data, data_size); | |
244 CHECK(encrypted_buffer); | |
245 encrypted_buffer->SetDecryptConfig( | |
246 scoped_ptr<DecryptConfig>(new DecryptConfig( | |
247 std::string(reinterpret_cast<const char*>(key_id), key_id_size), | |
248 std::string(reinterpret_cast<const char*>(iv), iv_size), | |
249 std::string(), | |
250 data_offset, | |
251 subsample_entries))); | |
252 return encrypted_buffer; | |
253 } | |
254 | |
201 void GenerateKeyRequest(const uint8* key_id, int key_id_size) { | 255 void GenerateKeyRequest(const uint8* key_id, int key_id_size) { |
202 EXPECT_CALL(client_, KeyMessageMock(kClearKeySystem, StrNe(std::string()), | 256 EXPECT_CALL(client_, KeyMessageMock(kClearKeySystem, StrNe(std::string()), |
203 NotNull(), Gt(0), "")) | 257 NotNull(), Gt(0), "")) |
204 .WillOnce(SaveArg<1>(&session_id_string_)); | 258 .WillOnce(SaveArg<1>(&session_id_string_)); |
205 decryptor_.GenerateKeyRequest(kClearKeySystem, key_id, key_id_size); | 259 decryptor_.GenerateKeyRequest(kClearKeySystem, key_id, key_id_size); |
206 } | 260 } |
207 | 261 |
208 void AddKeyAndExpectToSucceed(const uint8* key_id, int key_id_size, | 262 void AddKeyAndExpectToSucceed(const uint8* key_id, int key_id_size, |
209 const uint8* key, int key_size) { | 263 const uint8* key, int key_size) { |
210 EXPECT_CALL(client_, KeyAdded(kClearKeySystem, session_id_string_)); | 264 EXPECT_CALL(client_, KeyAdded(kClearKeySystem, session_id_string_)); |
211 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, | 265 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, |
212 session_id_string_); | 266 session_id_string_); |
213 } | 267 } |
214 | 268 |
215 void AddKeyAndExpectToFail(const uint8* key_id, int key_id_size, | 269 void AddKeyAndExpectToFail(const uint8* key_id, int key_id_size, |
216 const uint8* key, int key_size) { | 270 const uint8* key, int key_size) { |
217 EXPECT_CALL(client_, KeyError(kClearKeySystem, session_id_string_, | 271 EXPECT_CALL(client_, KeyError(kClearKeySystem, session_id_string_, |
218 Decryptor::kUnknownError, 0)); | 272 Decryptor::kUnknownError, 0)); |
219 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, | 273 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, |
220 session_id_string_); | 274 session_id_string_); |
221 } | 275 } |
222 | 276 |
223 MOCK_METHOD2(BufferDecrypted, void(Decryptor::DecryptStatus, | 277 MOCK_METHOD2(BufferDecrypted, void(Decryptor::DecryptStatus, |
224 const scoped_refptr<DecoderBuffer>&)); | 278 const scoped_refptr<DecoderBuffer>&)); |
225 | 279 |
226 void DecryptAndExpectToSucceed(const uint8* data, int data_size, | 280 void DecryptAndExpectToSucceed(const scoped_refptr<DecoderBuffer>& encrypted, |
227 const uint8* plain_text, | 281 const uint8* plain_text, int plain_text_size) { |
228 int plain_text_size, | |
229 const uint8* key_id, int key_id_size) { | |
230 scoped_refptr<DecoderBuffer> encrypted_data = | |
231 CreateWebMEncryptedBuffer(data, data_size, key_id, key_id_size); | |
232 scoped_refptr<DecoderBuffer> decrypted; | 282 scoped_refptr<DecoderBuffer> decrypted; |
233 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) | 283 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) |
234 .WillOnce(SaveArg<1>(&decrypted)); | 284 .WillOnce(SaveArg<1>(&decrypted)); |
235 | 285 |
236 decryptor_.Decrypt(encrypted_data, decrypt_cb_); | 286 decryptor_.Decrypt(encrypted, decrypt_cb_); |
237 ASSERT_TRUE(decrypted); | 287 ASSERT_TRUE(decrypted); |
238 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); | 288 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); |
239 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); | 289 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); |
240 } | 290 } |
241 | 291 |
242 void DecryptAndExpectToFail(const uint8* data, int data_size, | 292 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted, |
243 const uint8* plain_text, int plain_text_size, | 293 const uint8* plain_text, int plain_text_size) { |
ddorwin
2012/07/25 07:13:47
These two params aren't needed.
I guess a WrongKey
strobe_
2012/07/25 21:12:36
Done.
| |
244 const uint8* key_id, int key_id_size) { | |
245 scoped_refptr<DecoderBuffer> encrypted_data = | |
246 CreateWebMEncryptedBuffer(data, data_size, key_id, key_id_size); | |
247 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); | 294 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); |
248 decryptor_.Decrypt(encrypted_data, decrypt_cb_); | 295 decryptor_.Decrypt(encrypted, decrypt_cb_); |
249 } | 296 } |
250 | 297 |
251 scoped_refptr<DecoderBuffer> encrypted_data_; | 298 scoped_refptr<DecoderBuffer> encrypted_data_; |
252 MockDecryptorClient client_; | 299 MockDecryptorClient client_; |
253 AesDecryptor decryptor_; | 300 AesDecryptor decryptor_; |
254 std::string session_id_string_; | 301 std::string session_id_string_; |
255 AesDecryptor::DecryptCB decrypt_cb_; | 302 AesDecryptor::DecryptCB decrypt_cb_; |
256 }; | 303 }; |
257 | 304 |
258 TEST_F(AesDecryptorTest, NormalDecryption) { | 305 TEST_F(AesDecryptorTest, NormalDecryption) { |
259 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 306 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
260 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 307 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
261 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 308 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
262 frame.key, frame.key_size); | 309 frame.key, frame.key_size); |
263 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, | 310 scoped_refptr<DecoderBuffer> encrypted_data = |
264 frame.encrypted_data_size, | 311 CreateWebMEncryptedBuffer(frame.encrypted_data, |
312 frame.encrypted_data_size, | |
313 frame.key_id, frame.key_id_size); | |
314 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, | |
265 frame.plain_text, | 315 frame.plain_text, |
266 frame.plain_text_size, | 316 frame.plain_text_size)); |
267 frame.key_id, | |
268 frame.key_id_size)); | |
269 } | 317 } |
270 | 318 |
271 TEST_F(AesDecryptorTest, WrongKey) { | 319 TEST_F(AesDecryptorTest, WrongKey) { |
272 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 320 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
273 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 321 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
274 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 322 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
275 kWebmWrongKey, arraysize(kWebmWrongKey)); | 323 kWebmWrongKey, arraysize(kWebmWrongKey)); |
276 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(frame.encrypted_data, | 324 scoped_refptr<DecoderBuffer> encrypted_data = |
277 frame.encrypted_data_size, | 325 CreateWebMEncryptedBuffer(frame.encrypted_data, |
326 frame.encrypted_data_size, | |
327 frame.key_id, frame.key_id_size); | |
328 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data, | |
278 frame.plain_text, | 329 frame.plain_text, |
279 frame.plain_text_size, | 330 frame.plain_text_size)); |
280 frame.key_id, | |
281 frame.key_id_size)); | |
282 } | 331 } |
283 | 332 |
284 TEST_F(AesDecryptorTest, KeyReplacement) { | 333 TEST_F(AesDecryptorTest, KeyReplacement) { |
285 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 334 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
286 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 335 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
287 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 336 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
288 kWebmWrongKey, arraysize(kWebmWrongKey)); | 337 kWebmWrongKey, arraysize(kWebmWrongKey)); |
289 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(frame.encrypted_data, | 338 scoped_refptr<DecoderBuffer> encrypted_data = |
290 frame.encrypted_data_size, | 339 CreateWebMEncryptedBuffer(frame.encrypted_data, |
340 frame.encrypted_data_size, | |
341 frame.key_id, frame.key_id_size); | |
342 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data, | |
291 frame.plain_text, | 343 frame.plain_text, |
292 frame.plain_text_size, | 344 frame.plain_text_size)); |
293 frame.key_id, | |
294 frame.key_id_size)); | |
295 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 345 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
296 frame.key, frame.key_size); | 346 frame.key, frame.key_size); |
297 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, | 347 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, |
298 frame.encrypted_data_size, | |
299 frame.plain_text, | 348 frame.plain_text, |
300 frame.plain_text_size, | 349 frame.plain_text_size)); |
301 frame.key_id, | |
302 frame.key_id_size)); | |
303 } | 350 } |
304 | 351 |
305 TEST_F(AesDecryptorTest, WrongSizedKey) { | 352 TEST_F(AesDecryptorTest, WrongSizedKey) { |
306 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 353 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
307 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 354 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
308 AddKeyAndExpectToFail(frame.key_id, frame.key_id_size, | 355 AddKeyAndExpectToFail(frame.key_id, frame.key_id_size, |
309 kWebmWrongSizedKey, arraysize(kWebmWrongSizedKey)); | 356 kWebmWrongSizedKey, arraysize(kWebmWrongSizedKey)); |
310 } | 357 } |
311 | 358 |
312 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { | 359 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { |
313 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 360 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
314 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 361 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
315 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 362 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
316 frame.key, frame.key_size); | 363 frame.key, frame.key_size); |
317 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, | 364 scoped_refptr<DecoderBuffer> encrypted_data = |
318 frame.encrypted_data_size, | 365 CreateWebMEncryptedBuffer(frame.encrypted_data, |
366 frame.encrypted_data_size, | |
367 frame.key_id, frame.key_id_size); | |
368 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, | |
319 frame.plain_text, | 369 frame.plain_text, |
320 frame.plain_text_size, | 370 frame.plain_text_size)); |
321 frame.key_id, | |
322 frame.key_id_size)); | |
323 | 371 |
324 const WebmEncryptedData& frame2 = kWebmEncryptedFrames[2]; | 372 const WebmEncryptedData& frame2 = kWebmEncryptedFrames[2]; |
325 GenerateKeyRequest(frame2.key_id, frame2.key_id_size); | 373 GenerateKeyRequest(frame2.key_id, frame2.key_id_size); |
326 AddKeyAndExpectToSucceed(frame2.key_id, frame2.key_id_size, | 374 AddKeyAndExpectToSucceed(frame2.key_id, frame2.key_id_size, |
327 frame2.key, frame2.key_size); | 375 frame2.key, frame2.key_size); |
328 | 376 |
329 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; | 377 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; |
330 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame1.encrypted_data, | 378 scoped_refptr<DecoderBuffer> encrypted_data1 = |
331 frame1.encrypted_data_size, | 379 CreateWebMEncryptedBuffer(frame1.encrypted_data, |
380 frame1.encrypted_data_size, | |
381 frame1.key_id, frame1.key_id_size); | |
382 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data1, | |
332 frame1.plain_text, | 383 frame1.plain_text, |
333 frame1.plain_text_size, | 384 frame1.plain_text_size)); |
334 frame1.key_id, | |
335 frame1.key_id_size)); | |
336 | 385 |
337 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame2.encrypted_data, | 386 scoped_refptr<DecoderBuffer> encrypted_data2 = |
338 frame2.encrypted_data_size, | 387 CreateWebMEncryptedBuffer(frame2.encrypted_data, |
388 frame2.encrypted_data_size, | |
389 frame2.key_id, frame2.key_id_size); | |
390 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, | |
339 frame2.plain_text, | 391 frame2.plain_text, |
340 frame2.plain_text_size, | 392 frame2.plain_text_size)); |
341 frame2.key_id, | |
342 frame2.key_id_size)); | |
343 } | 393 } |
344 | 394 |
345 TEST_F(AesDecryptorTest, HmacCheckFailure) { | 395 TEST_F(AesDecryptorTest, HmacCheckFailure) { |
346 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 396 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
347 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 397 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
348 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 398 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
349 frame.key, frame.key_size); | 399 frame.key, frame.key_size); |
350 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0HmacDataChanged, | 400 scoped_refptr<DecoderBuffer> encrypted_data = |
351 frame.encrypted_data_size, | 401 CreateWebMEncryptedBuffer(kWebmFrame0HmacDataChanged, |
402 frame.encrypted_data_size, | |
403 frame.key_id, frame.key_id_size); | |
404 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data, | |
352 frame.plain_text, | 405 frame.plain_text, |
353 frame.plain_text_size, | 406 frame.plain_text_size)); |
354 frame.key_id, | |
355 frame.key_id_size)); | |
356 } | 407 } |
357 | 408 |
358 TEST_F(AesDecryptorTest, IvCheckFailure) { | 409 TEST_F(AesDecryptorTest, IvCheckFailure) { |
359 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 410 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
360 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 411 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
361 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 412 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
362 frame.key, frame.key_size); | 413 frame.key, frame.key_size); |
363 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0IvDataChanged, | 414 scoped_refptr<DecoderBuffer> encrypted_data = |
364 frame.encrypted_data_size, | 415 CreateWebMEncryptedBuffer(kWebmFrame0IvDataChanged, |
416 frame.encrypted_data_size, | |
417 frame.key_id, frame.key_id_size); | |
418 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data, | |
365 frame.plain_text, | 419 frame.plain_text, |
366 frame.plain_text_size, | 420 frame.plain_text_size)); |
367 frame.key_id, | |
368 frame.key_id_size)); | |
369 } | 421 } |
370 | 422 |
371 TEST_F(AesDecryptorTest, DataCheckFailure) { | 423 TEST_F(AesDecryptorTest, DataCheckFailure) { |
372 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 424 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
373 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 425 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
374 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 426 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
375 frame.key, frame.key_size); | 427 frame.key, frame.key_size); |
376 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0FrameDataChanged, | 428 scoped_refptr<DecoderBuffer> encrypted_data = |
377 frame.encrypted_data_size, | 429 CreateWebMEncryptedBuffer(kWebmFrame0FrameDataChanged, |
430 frame.encrypted_data_size, | |
431 frame.key_id, frame.key_id_size); | |
432 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data, | |
378 frame.plain_text, | 433 frame.plain_text, |
379 frame.plain_text_size, | 434 frame.plain_text_size)); |
380 frame.key_id, | 435 } |
381 frame.key_id_size)); | 436 |
437 TEST_F(AesDecryptorTest, SubsampleDecryption) { | |
ddorwin
2012/07/25 07:13:47
Should have a test for non-WebM no subsample info
strobe_
2012/07/25 21:12:36
Done.
| |
438 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); | |
439 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), | |
440 kSubsampleKey, arraysize(kSubsampleKey)); | |
441 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( | |
442 kSubsampleData, arraysize(kSubsampleData), | |
443 kSubsampleKeyId, arraysize(kSubsampleKeyId), | |
444 kSubsampleIv, arraysize(kSubsampleIv), | |
445 0, | |
446 std::vector<SubsampleEntry>( | |
447 kSubsampleEntries, | |
448 kSubsampleEntries + arraysize(kSubsampleEntries))); | |
449 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed( | |
450 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize)); | |
451 } | |
452 | |
453 // Ensures noninterference of data offset and subsample mechanisms. We never | |
454 // expect to encounter this in the wild, but since the DecryptConfig doesn't | |
455 // disallow such a configuration, it should be covered. | |
456 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { | |
457 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); | |
458 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), | |
459 kSubsampleKey, arraysize(kSubsampleKey)); | |
460 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( | |
461 kPaddedSubsampleData, arraysize(kPaddedSubsampleData), | |
462 kSubsampleKeyId, arraysize(kSubsampleKeyId), | |
463 kSubsampleIv, arraysize(kSubsampleIv), | |
464 arraysize(kPaddedSubsampleData) - arraysize(kSubsampleData), | |
465 std::vector<SubsampleEntry>( | |
466 kSubsampleEntries, | |
467 kSubsampleEntries + arraysize(kSubsampleEntries))); | |
468 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed( | |
469 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize)); | |
470 } | |
471 | |
472 TEST_F(AesDecryptorTest, IncorrectSubsampleSize) { | |
473 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); | |
474 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), | |
475 kSubsampleKey, arraysize(kSubsampleKey)); | |
476 std::vector<SubsampleEntry> entries( | |
477 kSubsampleEntries, | |
478 kSubsampleEntries + arraysize(kSubsampleEntries)); | |
479 entries[2].cypher_bytes += 1; | |
480 | |
481 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( | |
482 kSubsampleData, arraysize(kSubsampleData), | |
483 kSubsampleKeyId, arraysize(kSubsampleKeyId), | |
484 kSubsampleIv, arraysize(kSubsampleIv), | |
485 0, | |
486 entries); | |
487 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail( | |
488 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize)); | |
382 } | 489 } |
383 | 490 |
384 } // namespace media | 491 } // namespace media |
OLD | NEW |