Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: media/crypto/aes_decryptor_unittest.cc

Issue 10917308: Remove the checksum/HMAC code from the decryptor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix proxy_decryptor_unittest. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/crypto/aes_decryptor.cc ('k') | media/filters/ffmpeg_video_decoder_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include <vector> 6 #include <vector>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/sys_byteorder.h" 10 #include "base/sys_byteorder.h"
(...skipping 23 matching lines...) Expand all
34 int key_id_size; 34 int key_id_size;
35 uint8 key[32]; 35 uint8 key[32];
36 int key_size; 36 int key_size;
37 uint8 encrypted_data[64]; 37 uint8 encrypted_data[64];
38 int encrypted_data_size; 38 int encrypted_data_size;
39 }; 39 };
40 40
41 static const char kClearKeySystem[] = "org.w3.clearkey"; 41 static const char kClearKeySystem[] = "org.w3.clearkey";
42 42
43 // Frames 0 & 1 are encrypted with the same key. Frame 2 is encrypted with a 43 // Frames 0 & 1 are encrypted with the same key. Frame 2 is encrypted with a
44 // different key. Frame 3 has the same HMAC key as frame 2, but frame 3 is 44 // different key. Frame 3 is unencrypted.
45 // unencrypted.
46 const WebmEncryptedData kWebmEncryptedFrames[] = { 45 const WebmEncryptedData kWebmEncryptedFrames[] = {
47 { 46 {
48 // plaintext 47 // plaintext
49 "Original data.", 14, 48 "Original data.", 14,
50 // key_id 49 // key_id
51 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 50 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
52 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 51 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
53 0x10, 0x11, 0x12, 0x13 52 0x10, 0x11, 0x12, 0x13
54 }, 20, 53 }, 20,
55 // key 54 // key
56 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 55 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
57 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 56 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
58 }, 16, 57 }, 16,
59 // encrypted_data 58 // encrypted_data
60 { 0x3c, 0x4e, 0xb8, 0xd9, 0x5c, 0x20, 0x48, 0x18, 59 { 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61 0x4f, 0x03, 0x74, 0xa1, 0x01, 0xff, 0xff, 0xff, 60 0xff, 0xf0, 0xd1, 0x12, 0xd5, 0x24, 0x81, 0x96,
62 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xaa, 0xff, 61 0x55, 0x1b, 0x68, 0x9f, 0x38, 0x91, 0x85
63 0xb7, 0x74, 0x02, 0x4e, 0x1c, 0x75, 0x3d, 0xee, 62 }, 23
64 0xcb, 0x64, 0xf7
65 }, 35
66 }, 63 },
67 { 64 {
68 // plaintext 65 // plaintext
69 "Changed Original data.", 22, 66 "Changed Original data.", 22,
70 // key_id 67 // key_id
71 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 68 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
72 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 69 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
73 0x10, 0x11, 0x12, 0x13 70 0x10, 0x11, 0x12, 0x13
74 }, 20, 71 }, 20,
75 // key 72 // key
76 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 73 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
77 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 74 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
78 }, 16, 75 }, 16,
79 // encrypted_data 76 // encrypted_data
80 { 0xe8, 0x4c, 0x51, 0x33, 0x14, 0x0d, 0xc7, 0x17, 77 { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0x32, 0x60, 0xc9, 0xd0, 0x01, 0x00, 0x00, 0x00, 78 0x00, 0x57, 0x66, 0xf4, 0x12, 0x1a, 0xed, 0xb5,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x8e, 0x87, 79 0x79, 0x1c, 0x8e, 0x25, 0xd7, 0x17, 0xe7, 0x5e,
83 0x21, 0xd3, 0xb9, 0x1c, 0x61, 0xf6, 0x5a, 0x60, 80 0x16, 0xe3, 0x40, 0x08, 0x27, 0x11, 0xe9
84 0xaa, 0x07, 0x0e, 0x96, 0xd0, 0x54, 0x5d, 0x35, 81 }, 31
85 0x9a, 0x4a, 0xd3
86 }, 43
87 }, 82 },
88 { 83 {
89 // plaintext 84 // plaintext
90 "Original data.", 14, 85 "Original data.", 14,
91 // key_id 86 // key_id
92 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 87 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
93 0x2c, 0x2d, 0x2e, 0x2f, 0x30 88 0x2c, 0x2d, 0x2e, 0x2f, 0x30
94 }, 13, 89 }, 13,
95 // key 90 // key
96 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 91 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
97 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 92 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40
98 }, 16, 93 }, 16,
99 // encrypted_data 94 // encrypted_data
100 { 0x46, 0x93, 0x8c, 0x93, 0x48, 0xf9, 0xeb, 0x30, 95 { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x74, 0x55, 0x6b, 0xf2, 0x01, 0x00, 0x00, 0x00, 96 0x01, 0x9c, 0x71, 0x26, 0x57, 0x3e, 0x25, 0x37,
102 0x00, 0x00, 0x00, 0x00, 0x01, 0x48, 0x5e, 0x4a, 97 0xf7, 0x31, 0x81, 0x19, 0x64, 0xce, 0xbc
103 0x41, 0x2a, 0x8b, 0xf4, 0xc6, 0x47, 0x54, 0x90, 98 }, 23
104 0x34, 0xf4, 0x8b
105 }, 35
106 }, 99 },
107 { 100 {
108 // plaintext 101 // plaintext
109 "Changed Original data.", 22, 102 "Changed Original data.", 22,
110 // key_id 103 // key_id
111 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 104 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
112 0x2c, 0x2d, 0x2e, 0x2f, 0x30 105 0x2c, 0x2d, 0x2e, 0x2f, 0x30
113 }, 13, 106 }, 13,
114 // key 107 // key
115 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 108 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
116 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 109 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40
117 }, 16, 110 }, 16,
118 // encrypted_data 111 // encrypted_data
119 { 0xee, 0xd6, 0xf5, 0x64, 0x5f, 0xe0, 0x6a, 0xa2, 112 { 0x00, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64,
120 0x9e, 0xd6, 0xce, 0x34, 0x00, 0x43, 0x68, 0x61, 113 0x20, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61,
121 0x6e, 0x67, 0x65, 0x64, 0x20, 0x4f, 0x72, 0x69, 114 0x6c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e
122 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x61, 115 }, 23
123 0x74, 0x61, 0x2e
124 }, 35
125 } 116 }
126 }; 117 };
127 118
119
120
128 static const uint8 kWebmWrongSizedKey[] = { 0x20, 0x20 }; 121 static const uint8 kWebmWrongSizedKey[] = { 0x20, 0x20 };
129 122
130 static const uint8 kSubsampleOriginalData[] = "Original subsample data."; 123 static const uint8 kSubsampleOriginalData[] = "Original subsample data.";
131 static const int kSubsampleOriginalDataSize = 24; 124 static const int kSubsampleOriginalDataSize = 24;
132 125
133 static const uint8 kSubsampleKeyId[] = { 0x00, 0x01, 0x02, 0x03 }; 126 static const uint8 kSubsampleKeyId[] = { 0x00, 0x01, 0x02, 0x03 };
134 127
135 static const uint8 kSubsampleKey[] = { 128 static const uint8 kSubsampleKey[] = {
136 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 129 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
137 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 130 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 CHECK_LE(iv_size, kDecryptionKeySize); 170 CHECK_LE(iv_size, kDecryptionKeySize);
178 171
179 std::string counter_block(reinterpret_cast<const char*>(iv), iv_size); 172 std::string counter_block(reinterpret_cast<const char*>(iv), iv_size);
180 counter_block.append(kDecryptionKeySize - iv_size, 0); 173 counter_block.append(kDecryptionKeySize - iv_size, 0);
181 return counter_block; 174 return counter_block;
182 } 175 }
183 176
184 // Creates a WebM encrypted buffer that the demuxer would pass to the 177 // Creates a WebM encrypted buffer that the demuxer would pass to the
185 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is 178 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is
186 // initialization data from the WebM file. Every encrypted Block has 179 // initialization data from the WebM file. Every encrypted Block has
187 // an HMAC and a signal byte prepended to a frame. If the frame is encrypted 180 // a signal byte prepended to a frame. If the frame is encrypted then an IV is
188 // then an IV is prepended to the Block. Current encrypted WebM request for 181 // prepended to the Block. Current encrypted WebM request for comments
189 // comments specification is here 182 // specification is here
190 // http://wiki.webmproject.org/encryption/webm-encryption-rfc 183 // http://wiki.webmproject.org/encryption/webm-encryption-rfc
191 static scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer( 184 static scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer(
192 const uint8* data, int data_size, 185 const uint8* data, int data_size,
193 const uint8* key_id, int key_id_size) { 186 const uint8* key_id, int key_id_size) {
194 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( 187 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom(
195 data + kWebMHmacSize, data_size - kWebMHmacSize); 188 data, data_size);
196 CHECK(encrypted_buffer); 189 CHECK(encrypted_buffer);
197 190
198 uint8 signal_byte = data[kWebMHmacSize]; 191 uint8 signal_byte = data[0];
199 int data_offset = sizeof(signal_byte); 192 int data_offset = sizeof(signal_byte);
200 193
201 // Setting the DecryptConfig object of the buffer while leaving the 194 // Setting the DecryptConfig object of the buffer while leaving the
202 // initialization vector empty will tell the decryptor that the frame is 195 // initialization vector empty will tell the decryptor that the frame is
203 // unencrypted but integrity should still be checked. 196 // unencrypted.
204 std::string counter_block_str; 197 std::string counter_block_str;
205 198
206 if (signal_byte & kWebMFlagEncryptedFrame) { 199 if (signal_byte & kWebMFlagEncryptedFrame) {
207 uint64 network_iv; 200 uint64 network_iv;
208 memcpy(&network_iv, data + kWebMHmacSize + data_offset, sizeof(network_iv)); 201 memcpy(&network_iv, data + data_offset, sizeof(network_iv));
209 const uint64 iv = base::NetToHost64(network_iv); 202 const uint64 iv = base::NetToHost64(network_iv);
210 counter_block_str = 203 counter_block_str =
211 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); 204 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv));
212 data_offset += sizeof(iv); 205 data_offset += sizeof(iv);
213 } 206 }
214 207
215 encrypted_buffer->SetDecryptConfig( 208 encrypted_buffer->SetDecryptConfig(
216 scoped_ptr<DecryptConfig>(new DecryptConfig( 209 scoped_ptr<DecryptConfig>(new DecryptConfig(
217 std::string(reinterpret_cast<const char*>(key_id), key_id_size), 210 std::string(reinterpret_cast<const char*>(key_id), key_id_size),
218 counter_block_str, 211 counter_block_str,
219 std::string(reinterpret_cast<const char*>(data), kWebMHmacSize),
220 data_offset, 212 data_offset,
221 std::vector<SubsampleEntry>()))); 213 std::vector<SubsampleEntry>())));
222 return encrypted_buffer; 214 return encrypted_buffer;
223 } 215 }
224 216
225 static scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer( 217 static scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer(
226 const uint8* data, int data_size, 218 const uint8* data, int data_size,
227 const uint8* key_id, int key_id_size, 219 const uint8* key_id, int key_id_size,
228 const uint8* iv, int iv_size, 220 const uint8* iv, int iv_size,
229 int data_offset, 221 int data_offset,
230 const std::vector<SubsampleEntry>& subsample_entries) { 222 const std::vector<SubsampleEntry>& subsample_entries) {
231 scoped_refptr<DecoderBuffer> encrypted_buffer = 223 scoped_refptr<DecoderBuffer> encrypted_buffer =
232 DecoderBuffer::CopyFrom(data, data_size); 224 DecoderBuffer::CopyFrom(data, data_size);
233 CHECK(encrypted_buffer); 225 CHECK(encrypted_buffer);
234 encrypted_buffer->SetDecryptConfig( 226 encrypted_buffer->SetDecryptConfig(
235 scoped_ptr<DecryptConfig>(new DecryptConfig( 227 scoped_ptr<DecryptConfig>(new DecryptConfig(
236 std::string(reinterpret_cast<const char*>(key_id), key_id_size), 228 std::string(reinterpret_cast<const char*>(key_id), key_id_size),
237 std::string(reinterpret_cast<const char*>(iv), iv_size), 229 std::string(reinterpret_cast<const char*>(iv), iv_size),
238 std::string(),
239 data_offset, 230 data_offset,
240 subsample_entries))); 231 subsample_entries)));
241 return encrypted_buffer; 232 return encrypted_buffer;
242 } 233 }
243 234
244 class AesDecryptorTest : public testing::Test { 235 class AesDecryptorTest : public testing::Test {
245 public: 236 public:
246 AesDecryptorTest() 237 AesDecryptorTest()
247 : decryptor_(&client_), 238 : decryptor_(&client_),
248 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, 239 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 scoped_refptr<DecoderBuffer> decrypted; 274 scoped_refptr<DecoderBuffer> decrypted;
284 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) 275 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull()))
285 .WillOnce(SaveArg<1>(&decrypted)); 276 .WillOnce(SaveArg<1>(&decrypted));
286 277
287 decryptor_.Decrypt(encrypted, decrypt_cb_); 278 decryptor_.Decrypt(encrypted, decrypt_cb_);
288 ASSERT_TRUE(decrypted); 279 ASSERT_TRUE(decrypted);
289 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); 280 ASSERT_EQ(plain_text_size, decrypted->GetDataSize());
290 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); 281 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size));
291 } 282 }
292 283
284 void DecryptAndExpectDataMismatch(
285 const scoped_refptr<DecoderBuffer>& encrypted,
286 const uint8* plain_text, int plain_text_size) {
287 scoped_refptr<DecoderBuffer> decrypted;
288 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull()))
289 .WillOnce(SaveArg<1>(&decrypted));
290
291 decryptor_.Decrypt(encrypted, decrypt_cb_);
292 ASSERT_TRUE(decrypted);
293 ASSERT_EQ(plain_text_size, decrypted->GetDataSize());
294 EXPECT_NE(0, memcmp(plain_text, decrypted->GetData(), plain_text_size));
295 }
296
297 void DecryptAndExpectSizeDataMismatch(
298 const scoped_refptr<DecoderBuffer>& encrypted,
299 const uint8* plain_text, int plain_text_size) {
300 scoped_refptr<DecoderBuffer> decrypted;
301 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull()))
302 .WillOnce(SaveArg<1>(&decrypted));
303
304 decryptor_.Decrypt(encrypted, decrypt_cb_);
305 ASSERT_TRUE(decrypted);
306 EXPECT_NE(plain_text_size, decrypted->GetDataSize());
307 EXPECT_NE(0, memcmp(plain_text, decrypted->GetData(), plain_text_size));
308 }
309
293 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted) { 310 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted) {
294 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); 311 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull()));
295 decryptor_.Decrypt(encrypted, decrypt_cb_); 312 decryptor_.Decrypt(encrypted, decrypt_cb_);
296 } 313 }
297 314
298 MockDecryptorClient client_; 315 MockDecryptorClient client_;
299 AesDecryptor decryptor_; 316 AesDecryptor decryptor_;
300 std::string session_id_string_; 317 std::string session_id_string_;
301 AesDecryptor::DecryptCB decrypt_cb_; 318 AesDecryptor::DecryptCB decrypt_cb_;
302 std::vector<SubsampleEntry> subsample_entries_; 319 std::vector<SubsampleEntry> subsample_entries_;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 // Change the first byte of the key. 354 // Change the first byte of the key.
338 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size); 355 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size);
339 wrong_key[0]++; 356 wrong_key[0]++;
340 357
341 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 358 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
342 &wrong_key[0], frame.key_size); 359 &wrong_key[0], frame.key_size);
343 scoped_refptr<DecoderBuffer> encrypted_data = 360 scoped_refptr<DecoderBuffer> encrypted_data =
344 CreateWebMEncryptedBuffer(frame.encrypted_data, 361 CreateWebMEncryptedBuffer(frame.encrypted_data,
345 frame.encrypted_data_size, 362 frame.encrypted_data_size,
346 frame.key_id, frame.key_id_size); 363 frame.key_id, frame.key_id_size);
347 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 364 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data,
365 frame.plain_text,
366 frame.plain_text_size));
348 } 367 }
349 368
350 TEST_F(AesDecryptorTest, NoKey) { 369 TEST_F(AesDecryptorTest, NoKey) {
351 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 370 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
352 GenerateKeyRequest(frame.key_id, frame.key_id_size); 371 GenerateKeyRequest(frame.key_id, frame.key_id_size);
353 372
354 scoped_refptr<DecoderBuffer> encrypted_data = 373 scoped_refptr<DecoderBuffer> encrypted_data =
355 CreateWebMEncryptedBuffer(frame.encrypted_data, frame.encrypted_data_size, 374 CreateWebMEncryptedBuffer(frame.encrypted_data, frame.encrypted_data_size,
356 frame.key_id, frame.key_id_size); 375 frame.key_id, frame.key_id_size);
357 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); 376 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull()));
358 decryptor_.Decrypt(encrypted_data, decrypt_cb_); 377 decryptor_.Decrypt(encrypted_data, decrypt_cb_);
359 } 378 }
360 379
361 TEST_F(AesDecryptorTest, KeyReplacement) { 380 TEST_F(AesDecryptorTest, KeyReplacement) {
362 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 381 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
363 GenerateKeyRequest(frame.key_id, frame.key_id_size); 382 GenerateKeyRequest(frame.key_id, frame.key_id_size);
364 383
365 // Change the first byte of the key. 384 // Change the first byte of the key.
366 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size); 385 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size);
367 wrong_key[0]++; 386 wrong_key[0]++;
368 387
369 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 388 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
370 &wrong_key[0], frame.key_size); 389 &wrong_key[0], frame.key_size);
371 scoped_refptr<DecoderBuffer> encrypted_data = 390 scoped_refptr<DecoderBuffer> encrypted_data =
372 CreateWebMEncryptedBuffer(frame.encrypted_data, 391 CreateWebMEncryptedBuffer(frame.encrypted_data,
373 frame.encrypted_data_size, 392 frame.encrypted_data_size,
374 frame.key_id, frame.key_id_size); 393 frame.key_id, frame.key_id_size);
375 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 394 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data,
395 frame.plain_text,
396 frame.plain_text_size));
376 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 397 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
377 frame.key, frame.key_size); 398 frame.key, frame.key_size);
378 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, 399 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data,
379 frame.plain_text, 400 frame.plain_text,
380 frame.plain_text_size)); 401 frame.plain_text_size));
381 } 402 }
382 403
383 TEST_F(AesDecryptorTest, WrongSizedKey) { 404 TEST_F(AesDecryptorTest, WrongSizedKey) {
384 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 405 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
385 GenerateKeyRequest(frame.key_id, frame.key_id_size); 406 GenerateKeyRequest(frame.key_id, frame.key_id_size);
(...skipping 30 matching lines...) Expand all
416 437
417 scoped_refptr<DecoderBuffer> encrypted_data2 = 438 scoped_refptr<DecoderBuffer> encrypted_data2 =
418 CreateWebMEncryptedBuffer(frame2.encrypted_data, 439 CreateWebMEncryptedBuffer(frame2.encrypted_data,
419 frame2.encrypted_data_size, 440 frame2.encrypted_data_size,
420 frame2.key_id, frame2.key_id_size); 441 frame2.key_id, frame2.key_id_size);
421 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, 442 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2,
422 frame2.plain_text, 443 frame2.plain_text,
423 frame2.plain_text_size)); 444 frame2.plain_text_size));
424 } 445 }
425 446
426 TEST_F(AesDecryptorTest, HmacCheckFailure) { 447 TEST_F(AesDecryptorTest, CorruptedIv) {
427 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 448 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
428 GenerateKeyRequest(frame.key_id, frame.key_id_size); 449 GenerateKeyRequest(frame.key_id, frame.key_id_size);
429 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 450 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
430 frame.key, frame.key_size);
431
432 // Change byte 0 to modify the HMAC. Bytes 0-11 of WebM encrypted data
433 // contains the HMAC.
434 std::vector<uint8> frame_with_bad_hmac(
435 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size);
436 frame_with_bad_hmac[0]++;
437
438 scoped_refptr<DecoderBuffer> encrypted_data =
439 CreateWebMEncryptedBuffer(&frame_with_bad_hmac[0],
440 frame.encrypted_data_size,
441 frame.key_id, frame.key_id_size);
442 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
443 }
444
445 TEST_F(AesDecryptorTest, IvCheckFailure) {
446 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
447 GenerateKeyRequest(frame.key_id, frame.key_id_size);
448 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
449 frame.key, frame.key_size); 451 frame.key, frame.key_size);
450 452
451 // Change byte 13 to modify the IV. Bytes 13-20 of WebM encrypted data 453 // Change byte 13 to modify the IV. Bytes 13-20 of WebM encrypted data
452 // contains the IV. 454 // contains the IV.
453 std::vector<uint8> frame_with_bad_iv( 455 std::vector<uint8> frame_with_bad_iv(
454 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); 456 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size);
455 frame_with_bad_iv[kWebMHmacSize + 1]++; 457 frame_with_bad_iv[1]++;
456 458
457 scoped_refptr<DecoderBuffer> encrypted_data = 459 scoped_refptr<DecoderBuffer> encrypted_data =
458 CreateWebMEncryptedBuffer(&frame_with_bad_iv[0], 460 CreateWebMEncryptedBuffer(&frame_with_bad_iv[0],
459 frame.encrypted_data_size, 461 frame.encrypted_data_size,
460 frame.key_id, frame.key_id_size); 462 frame.key_id, frame.key_id_size);
461 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 463 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data,
464 frame.plain_text,
465 frame.plain_text_size));
462 } 466 }
463 467
464 TEST_F(AesDecryptorTest, DataCheckFailure) { 468 TEST_F(AesDecryptorTest, CorruptedData) {
465 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 469 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
466 GenerateKeyRequest(frame.key_id, frame.key_id_size); 470 GenerateKeyRequest(frame.key_id, frame.key_id_size);
467 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 471 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
468 frame.key, frame.key_size); 472 frame.key, frame.key_size);
469 473
470 // Change last byte to modify the data. Bytes 21+ of WebM encrypted data 474 // Change last byte to modify the data. Bytes 21+ of WebM encrypted data
471 // contains the encrypted frame. 475 // contains the encrypted frame.
472 std::vector<uint8> frame_with_bad_vp8_data( 476 std::vector<uint8> frame_with_bad_vp8_data(
473 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); 477 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size);
474 frame_with_bad_vp8_data[frame.encrypted_data_size - 1]++; 478 frame_with_bad_vp8_data[frame.encrypted_data_size - 1]++;
475 479
476 scoped_refptr<DecoderBuffer> encrypted_data = 480 scoped_refptr<DecoderBuffer> encrypted_data =
477 CreateWebMEncryptedBuffer(&frame_with_bad_vp8_data[0], 481 CreateWebMEncryptedBuffer(&frame_with_bad_vp8_data[0],
478 frame.encrypted_data_size, 482 frame.encrypted_data_size,
479 frame.key_id, frame.key_id_size); 483 frame.key_id, frame.key_id_size);
480 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 484 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data,
485 frame.plain_text,
486 frame.plain_text_size));
481 } 487 }
482 488
483 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { 489 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) {
484 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 490 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
485 GenerateKeyRequest(frame.key_id, frame.key_id_size); 491 GenerateKeyRequest(frame.key_id, frame.key_id_size);
486 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 492 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
487 frame.key, frame.key_size); 493 frame.key, frame.key_size);
488 494
489 // Change signal byte from an encrypted frame to an unencrypted frame. Byte 495 // Change signal byte from an encrypted frame to an unencrypted frame. Byte
490 // 12 of WebM encrypted data contains the signal byte. 496 // 12 of WebM encrypted data contains the signal byte.
491 std::vector<uint8> frame_with_wrong_signal_byte( 497 std::vector<uint8> frame_with_wrong_signal_byte(
492 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); 498 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size);
493 frame_with_wrong_signal_byte[kWebMHmacSize] = 0; 499 frame_with_wrong_signal_byte[0] = 0;
494 500
495 scoped_refptr<DecoderBuffer> encrypted_data = 501 scoped_refptr<DecoderBuffer> encrypted_data =
496 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0], 502 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0],
497 frame.encrypted_data_size, 503 frame.encrypted_data_size,
498 frame.key_id, frame.key_id_size); 504 frame.key_id, frame.key_id_size);
499 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 505 ASSERT_NO_FATAL_FAILURE(
506 DecryptAndExpectSizeDataMismatch(encrypted_data,
507 frame.plain_text,
508 frame.plain_text_size));
500 } 509 }
501 510
502 TEST_F(AesDecryptorTest, UnencryptedAsEncryptedFailure) { 511 TEST_F(AesDecryptorTest, UnencryptedAsEncryptedFailure) {
503 const WebmEncryptedData& frame = kWebmEncryptedFrames[3]; 512 const WebmEncryptedData& frame = kWebmEncryptedFrames[3];
504 GenerateKeyRequest(frame.key_id, frame.key_id_size); 513 GenerateKeyRequest(frame.key_id, frame.key_id_size);
505 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 514 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
506 frame.key, frame.key_size); 515 frame.key, frame.key_size);
507 516
508 // Change signal byte from an unencrypted frame to an encrypted frame. Byte 517 // Change signal byte from an unencrypted frame to an encrypted frame. Byte
509 // 12 of WebM encrypted data contains the signal byte. 518 // 0 of WebM encrypted data contains the signal byte.
510 std::vector<uint8> frame_with_wrong_signal_byte( 519 std::vector<uint8> frame_with_wrong_signal_byte(
511 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); 520 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size);
512 frame_with_wrong_signal_byte[kWebMHmacSize] = kWebMFlagEncryptedFrame; 521 frame_with_wrong_signal_byte[0] = kWebMFlagEncryptedFrame;
513 522
514 scoped_refptr<DecoderBuffer> encrypted_data = 523 scoped_refptr<DecoderBuffer> encrypted_data =
515 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0], 524 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0],
516 frame.encrypted_data_size, 525 frame.encrypted_data_size,
517 frame.key_id, frame.key_id_size); 526 frame.key_id, frame.key_id_size);
518 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 527 ASSERT_NO_FATAL_FAILURE(
528 DecryptAndExpectSizeDataMismatch(encrypted_data,
529 frame.plain_text,
530 frame.plain_text_size));
519 } 531 }
520 532
521 TEST_F(AesDecryptorTest, SubsampleDecryption) { 533 TEST_F(AesDecryptorTest, SubsampleDecryption) {
522 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); 534 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId));
523 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), 535 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId),
524 kSubsampleKey, arraysize(kSubsampleKey)); 536 kSubsampleKey, arraysize(kSubsampleKey));
525 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( 537 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer(
526 kSubsampleData, arraysize(kSubsampleData), 538 kSubsampleData, arraysize(kSubsampleData),
527 kSubsampleKeyId, arraysize(kSubsampleKeyId), 539 kSubsampleKeyId, arraysize(kSubsampleKeyId),
528 kSubsampleIv, arraysize(kSubsampleIv), 540 kSubsampleIv, arraysize(kSubsampleIv),
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( 586 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer(
575 kSubsampleData, arraysize(kSubsampleData), 587 kSubsampleData, arraysize(kSubsampleData),
576 kSubsampleKeyId, arraysize(kSubsampleKeyId), 588 kSubsampleKeyId, arraysize(kSubsampleKeyId),
577 kSubsampleIv, arraysize(kSubsampleIv), 589 kSubsampleIv, arraysize(kSubsampleIv),
578 0, 590 0,
579 entries); 591 entries);
580 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); 592 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
581 } 593 }
582 594
583 } // namespace media 595 } // namespace media
OLDNEW
« no previous file with comments | « media/crypto/aes_decryptor.cc ('k') | media/filters/ffmpeg_video_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698