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

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

Issue 10651006: Add Common Encryption support to BMFF, including subsample decryption. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Use reinterpret_cast for string creation Created 8 years, 5 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
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 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698