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

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: Satisfy mac_rel buildbot Created 8 years, 4 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
« 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 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 // Encrypted with kSubsampleKey and kSubsampleIv but without subsamples.
175 static const uint8 kNoSubsampleData[] = {
176 0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16,
177 0xfa, 0x9d, 0x18, 0x43, 0x1e, 0x96, 0x71, 0xb5,
178 0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95
179 };
180
181 static const SubsampleEntry kSubsampleEntries[] = {
182 { 2, 7 },
183 { 3, 11 },
184 { 1, 0 },
185 };
186
146 class AesDecryptorTest : public testing::Test { 187 class AesDecryptorTest : public testing::Test {
147 public: 188 public:
148 AesDecryptorTest() 189 AesDecryptorTest()
149 : decryptor_(&client_), 190 : decryptor_(&client_),
150 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, 191 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted,
151 base::Unretained(this))) { 192 base::Unretained(this))) {
152 } 193 }
153 194
154 protected: 195 protected:
155 // Returns a 16 byte CTR counter block. The CTR counter block format is a 196 // Returns a 16 byte CTR counter block. The CTR counter block format is a
(...skipping 13 matching lines...) Expand all
169 210
170 return std::string(counter_block_data, kDecryptionKeySize); 211 return std::string(counter_block_data, kDecryptionKeySize);
171 } 212 }
172 213
173 // Creates a WebM encrypted buffer that the demuxer would pass to the 214 // 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 215 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is
175 // initialization data from the WebM file. Every encrypted Block has 216 // initialization data from the WebM file. Every encrypted Block has
176 // an HMAC and IV prepended to an encrypted frame. Current encrypted WebM 217 // an HMAC and IV prepended to an encrypted frame. Current encrypted WebM
177 // request for comments specification is here 218 // request for comments specification is here
178 // http://wiki.webmproject.org/encryption/webm-encryption-rfc 219 // http://wiki.webmproject.org/encryption/webm-encryption-rfc
179 scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer(const uint8* data, 220 scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer(
180 int data_size, 221 const uint8* data, int data_size,
181 const uint8* key_id, 222 const uint8* key_id, int key_id_size) {
182 int key_id_size) {
183 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( 223 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom(
184 data + kWebMHmacSize, data_size - kWebMHmacSize); 224 data + kWebMHmacSize, data_size - kWebMHmacSize);
185 CHECK(encrypted_buffer); 225 CHECK(encrypted_buffer);
186 226
187 uint64 network_iv; 227 uint64 network_iv;
188 memcpy(&network_iv, data + kWebMHmacSize, sizeof(network_iv)); 228 memcpy(&network_iv, data + kWebMHmacSize, sizeof(network_iv));
189 const uint64 iv = base::NetToHost64(network_iv); 229 const uint64 iv = base::NetToHost64(network_iv);
190 std::string webm_iv = 230 std::string webm_iv =
191 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); 231 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv));
192 encrypted_buffer->SetDecryptConfig( 232 encrypted_buffer->SetDecryptConfig(
193 scoped_ptr<DecryptConfig>(new DecryptConfig( 233 scoped_ptr<DecryptConfig>(new DecryptConfig(
194 key_id, key_id_size, 234 std::string(reinterpret_cast<const char*>(key_id), key_id_size),
195 reinterpret_cast<const uint8*>(webm_iv.data()), webm_iv.size(), 235 webm_iv,
196 data, kWebMHmacSize, 236 std::string(reinterpret_cast<const char*>(data), kWebMHmacSize),
197 sizeof(iv)))); 237 sizeof(iv),
238 std::vector<SubsampleEntry>())));
198 return encrypted_buffer; 239 return encrypted_buffer;
199 } 240 }
200 241
242 scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer(
243 const uint8* data, int data_size,
244 const uint8* key_id, int key_id_size,
245 const uint8* iv, int iv_size,
246 int data_offset,
247 const std::vector<SubsampleEntry>& subsample_entries) {
248 scoped_refptr<DecoderBuffer> encrypted_buffer =
249 DecoderBuffer::CopyFrom(data, data_size);
250 CHECK(encrypted_buffer);
251 encrypted_buffer->SetDecryptConfig(
252 scoped_ptr<DecryptConfig>(new DecryptConfig(
253 std::string(reinterpret_cast<const char*>(key_id), key_id_size),
254 std::string(reinterpret_cast<const char*>(iv), iv_size),
255 std::string(),
256 data_offset,
257 subsample_entries)));
258 return encrypted_buffer;
259 }
260
201 void GenerateKeyRequest(const uint8* key_id, int key_id_size) { 261 void GenerateKeyRequest(const uint8* key_id, int key_id_size) {
202 EXPECT_CALL(client_, KeyMessageMock(kClearKeySystem, StrNe(std::string()), 262 EXPECT_CALL(client_, KeyMessageMock(kClearKeySystem, StrNe(std::string()),
203 NotNull(), Gt(0), "")) 263 NotNull(), Gt(0), ""))
204 .WillOnce(SaveArg<1>(&session_id_string_)); 264 .WillOnce(SaveArg<1>(&session_id_string_));
205 decryptor_.GenerateKeyRequest(kClearKeySystem, key_id, key_id_size); 265 decryptor_.GenerateKeyRequest(kClearKeySystem, key_id, key_id_size);
206 } 266 }
207 267
208 void AddKeyAndExpectToSucceed(const uint8* key_id, int key_id_size, 268 void AddKeyAndExpectToSucceed(const uint8* key_id, int key_id_size,
209 const uint8* key, int key_size) { 269 const uint8* key, int key_size) {
210 EXPECT_CALL(client_, KeyAdded(kClearKeySystem, session_id_string_)); 270 EXPECT_CALL(client_, KeyAdded(kClearKeySystem, session_id_string_));
211 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, 271 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size,
212 session_id_string_); 272 session_id_string_);
213 } 273 }
214 274
215 void AddKeyAndExpectToFail(const uint8* key_id, int key_id_size, 275 void AddKeyAndExpectToFail(const uint8* key_id, int key_id_size,
216 const uint8* key, int key_size) { 276 const uint8* key, int key_size) {
217 EXPECT_CALL(client_, KeyError(kClearKeySystem, session_id_string_, 277 EXPECT_CALL(client_, KeyError(kClearKeySystem, session_id_string_,
218 Decryptor::kUnknownError, 0)); 278 Decryptor::kUnknownError, 0));
219 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, 279 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size,
220 session_id_string_); 280 session_id_string_);
221 } 281 }
222 282
223 MOCK_METHOD2(BufferDecrypted, void(Decryptor::DecryptStatus, 283 MOCK_METHOD2(BufferDecrypted, void(Decryptor::DecryptStatus,
224 const scoped_refptr<DecoderBuffer>&)); 284 const scoped_refptr<DecoderBuffer>&));
225 285
226 void DecryptAndExpectToSucceed(const uint8* data, int data_size, 286 void DecryptAndExpectToSucceed(const scoped_refptr<DecoderBuffer>& encrypted,
227 const uint8* plain_text, 287 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; 288 scoped_refptr<DecoderBuffer> decrypted;
233 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) 289 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull()))
234 .WillOnce(SaveArg<1>(&decrypted)); 290 .WillOnce(SaveArg<1>(&decrypted));
235 291
236 decryptor_.Decrypt(encrypted_data, decrypt_cb_); 292 decryptor_.Decrypt(encrypted, decrypt_cb_);
237 ASSERT_TRUE(decrypted); 293 ASSERT_TRUE(decrypted);
238 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); 294 ASSERT_EQ(plain_text_size, decrypted->GetDataSize());
239 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); 295 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size));
240 } 296 }
241 297
242 void DecryptAndExpectToFail(const uint8* data, int data_size, 298 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted) {
243 const uint8* plain_text, int plain_text_size,
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())); 299 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull()));
248 decryptor_.Decrypt(encrypted_data, decrypt_cb_); 300 decryptor_.Decrypt(encrypted, decrypt_cb_);
249 } 301 }
250 302
251 scoped_refptr<DecoderBuffer> encrypted_data_; 303 scoped_refptr<DecoderBuffer> encrypted_data_;
252 MockDecryptorClient client_; 304 MockDecryptorClient client_;
253 AesDecryptor decryptor_; 305 AesDecryptor decryptor_;
254 std::string session_id_string_; 306 std::string session_id_string_;
255 AesDecryptor::DecryptCB decrypt_cb_; 307 AesDecryptor::DecryptCB decrypt_cb_;
256 }; 308 };
257 309
258 TEST_F(AesDecryptorTest, NormalDecryption) { 310 TEST_F(AesDecryptorTest, NormalWebMDecryption) {
259 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 311 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
260 GenerateKeyRequest(frame.key_id, frame.key_id_size); 312 GenerateKeyRequest(frame.key_id, frame.key_id_size);
261 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 313 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
262 frame.key, frame.key_size); 314 frame.key, frame.key_size);
263 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, 315 scoped_refptr<DecoderBuffer> encrypted_data =
264 frame.encrypted_data_size, 316 CreateWebMEncryptedBuffer(frame.encrypted_data,
317 frame.encrypted_data_size,
318 frame.key_id, frame.key_id_size);
319 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data,
265 frame.plain_text, 320 frame.plain_text,
266 frame.plain_text_size, 321 frame.plain_text_size));
267 frame.key_id,
268 frame.key_id_size));
269 } 322 }
270 323
271 TEST_F(AesDecryptorTest, WrongKey) { 324 TEST_F(AesDecryptorTest, WrongKey) {
272 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 325 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
273 GenerateKeyRequest(frame.key_id, frame.key_id_size); 326 GenerateKeyRequest(frame.key_id, frame.key_id_size);
274 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 327 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
275 kWebmWrongKey, arraysize(kWebmWrongKey)); 328 kWebmWrongKey, arraysize(kWebmWrongKey));
276 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(frame.encrypted_data, 329 scoped_refptr<DecoderBuffer> encrypted_data =
277 frame.encrypted_data_size, 330 CreateWebMEncryptedBuffer(frame.encrypted_data,
278 frame.plain_text, 331 frame.encrypted_data_size,
279 frame.plain_text_size, 332 frame.key_id, frame.key_id_size);
280 frame.key_id, 333 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
281 frame.key_id_size));
282 } 334 }
283 335
284 TEST_F(AesDecryptorTest, KeyReplacement) { 336 TEST_F(AesDecryptorTest, KeyReplacement) {
285 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 337 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
286 GenerateKeyRequest(frame.key_id, frame.key_id_size); 338 GenerateKeyRequest(frame.key_id, frame.key_id_size);
287 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 339 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
288 kWebmWrongKey, arraysize(kWebmWrongKey)); 340 kWebmWrongKey, arraysize(kWebmWrongKey));
289 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(frame.encrypted_data, 341 scoped_refptr<DecoderBuffer> encrypted_data =
290 frame.encrypted_data_size, 342 CreateWebMEncryptedBuffer(frame.encrypted_data,
291 frame.plain_text, 343 frame.encrypted_data_size,
292 frame.plain_text_size, 344 frame.key_id, frame.key_id_size);
293 frame.key_id, 345 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
294 frame.key_id_size));
295 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 346 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
296 frame.key, frame.key_size); 347 frame.key, frame.key_size);
297 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, 348 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data,
298 frame.encrypted_data_size,
299 frame.plain_text, 349 frame.plain_text,
300 frame.plain_text_size, 350 frame.plain_text_size));
301 frame.key_id,
302 frame.key_id_size));
303 } 351 }
304 352
305 TEST_F(AesDecryptorTest, WrongSizedKey) { 353 TEST_F(AesDecryptorTest, WrongSizedKey) {
306 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 354 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
307 GenerateKeyRequest(frame.key_id, frame.key_id_size); 355 GenerateKeyRequest(frame.key_id, frame.key_id_size);
308 AddKeyAndExpectToFail(frame.key_id, frame.key_id_size, 356 AddKeyAndExpectToFail(frame.key_id, frame.key_id_size,
309 kWebmWrongSizedKey, arraysize(kWebmWrongSizedKey)); 357 kWebmWrongSizedKey, arraysize(kWebmWrongSizedKey));
310 } 358 }
311 359
312 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { 360 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) {
313 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 361 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
314 GenerateKeyRequest(frame.key_id, frame.key_id_size); 362 GenerateKeyRequest(frame.key_id, frame.key_id_size);
315 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 363 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
316 frame.key, frame.key_size); 364 frame.key, frame.key_size);
317 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, 365 scoped_refptr<DecoderBuffer> encrypted_data =
318 frame.encrypted_data_size, 366 CreateWebMEncryptedBuffer(frame.encrypted_data,
367 frame.encrypted_data_size,
368 frame.key_id, frame.key_id_size);
369 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data,
319 frame.plain_text, 370 frame.plain_text,
320 frame.plain_text_size, 371 frame.plain_text_size));
321 frame.key_id,
322 frame.key_id_size));
323 372
324 const WebmEncryptedData& frame2 = kWebmEncryptedFrames[2]; 373 const WebmEncryptedData& frame2 = kWebmEncryptedFrames[2];
325 GenerateKeyRequest(frame2.key_id, frame2.key_id_size); 374 GenerateKeyRequest(frame2.key_id, frame2.key_id_size);
326 AddKeyAndExpectToSucceed(frame2.key_id, frame2.key_id_size, 375 AddKeyAndExpectToSucceed(frame2.key_id, frame2.key_id_size,
327 frame2.key, frame2.key_size); 376 frame2.key, frame2.key_size);
328 377
329 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; 378 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1];
330 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame1.encrypted_data, 379 scoped_refptr<DecoderBuffer> encrypted_data1 =
331 frame1.encrypted_data_size, 380 CreateWebMEncryptedBuffer(frame1.encrypted_data,
381 frame1.encrypted_data_size,
382 frame1.key_id, frame1.key_id_size);
383 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data1,
332 frame1.plain_text, 384 frame1.plain_text,
333 frame1.plain_text_size, 385 frame1.plain_text_size));
334 frame1.key_id,
335 frame1.key_id_size));
336 386
337 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame2.encrypted_data, 387 scoped_refptr<DecoderBuffer> encrypted_data2 =
338 frame2.encrypted_data_size, 388 CreateWebMEncryptedBuffer(frame2.encrypted_data,
389 frame2.encrypted_data_size,
390 frame2.key_id, frame2.key_id_size);
391 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2,
339 frame2.plain_text, 392 frame2.plain_text,
340 frame2.plain_text_size, 393 frame2.plain_text_size));
341 frame2.key_id,
342 frame2.key_id_size));
343 } 394 }
344 395
345 TEST_F(AesDecryptorTest, HmacCheckFailure) { 396 TEST_F(AesDecryptorTest, HmacCheckFailure) {
346 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 397 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
347 GenerateKeyRequest(frame.key_id, frame.key_id_size); 398 GenerateKeyRequest(frame.key_id, frame.key_id_size);
348 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 399 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
349 frame.key, frame.key_size); 400 frame.key, frame.key_size);
350 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0HmacDataChanged, 401 scoped_refptr<DecoderBuffer> encrypted_data =
351 frame.encrypted_data_size, 402 CreateWebMEncryptedBuffer(kWebmFrame0HmacDataChanged,
352 frame.plain_text, 403 frame.encrypted_data_size,
353 frame.plain_text_size, 404 frame.key_id, frame.key_id_size);
354 frame.key_id, 405 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
355 frame.key_id_size));
356 } 406 }
357 407
358 TEST_F(AesDecryptorTest, IvCheckFailure) { 408 TEST_F(AesDecryptorTest, IvCheckFailure) {
359 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 409 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
360 GenerateKeyRequest(frame.key_id, frame.key_id_size); 410 GenerateKeyRequest(frame.key_id, frame.key_id_size);
361 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 411 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
362 frame.key, frame.key_size); 412 frame.key, frame.key_size);
363 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0IvDataChanged, 413 scoped_refptr<DecoderBuffer> encrypted_data =
364 frame.encrypted_data_size, 414 CreateWebMEncryptedBuffer(kWebmFrame0IvDataChanged,
365 frame.plain_text, 415 frame.encrypted_data_size,
366 frame.plain_text_size, 416 frame.key_id, frame.key_id_size);
367 frame.key_id, 417 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
368 frame.key_id_size));
369 } 418 }
370 419
371 TEST_F(AesDecryptorTest, DataCheckFailure) { 420 TEST_F(AesDecryptorTest, DataCheckFailure) {
372 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; 421 const WebmEncryptedData& frame = kWebmEncryptedFrames[0];
373 GenerateKeyRequest(frame.key_id, frame.key_id_size); 422 GenerateKeyRequest(frame.key_id, frame.key_id_size);
374 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, 423 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size,
375 frame.key, frame.key_size); 424 frame.key, frame.key_size);
376 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0FrameDataChanged, 425 scoped_refptr<DecoderBuffer> encrypted_data =
377 frame.encrypted_data_size, 426 CreateWebMEncryptedBuffer(kWebmFrame0FrameDataChanged,
378 frame.plain_text, 427 frame.encrypted_data_size,
379 frame.plain_text_size, 428 frame.key_id, frame.key_id_size);
380 frame.key_id, 429 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
381 frame.key_id_size)); 430 }
431
432 TEST_F(AesDecryptorTest, SubsampleDecryption) {
433 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId));
434 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId),
435 kSubsampleKey, arraysize(kSubsampleKey));
436 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer(
437 kSubsampleData, arraysize(kSubsampleData),
438 kSubsampleKeyId, arraysize(kSubsampleKeyId),
439 kSubsampleIv, arraysize(kSubsampleIv),
440 0,
441 std::vector<SubsampleEntry>(
442 kSubsampleEntries,
443 kSubsampleEntries + arraysize(kSubsampleEntries)));
444 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(
445 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize));
446 }
447
448 // Ensures noninterference of data offset and subsample mechanisms. We never
449 // expect to encounter this in the wild, but since the DecryptConfig doesn't
450 // disallow such a configuration, it should be covered.
451 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) {
452 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId));
453 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId),
454 kSubsampleKey, arraysize(kSubsampleKey));
455 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer(
456 kPaddedSubsampleData, arraysize(kPaddedSubsampleData),
457 kSubsampleKeyId, arraysize(kSubsampleKeyId),
458 kSubsampleIv, arraysize(kSubsampleIv),
459 arraysize(kPaddedSubsampleData) - arraysize(kSubsampleData),
460 std::vector<SubsampleEntry>(
461 kSubsampleEntries,
462 kSubsampleEntries + arraysize(kSubsampleEntries)));
463 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(
464 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize));
465 }
466
467 // No subsample or offset.
468 TEST_F(AesDecryptorTest, NormalDecryption) {
469 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId));
470 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId),
471 kSubsampleKey, arraysize(kSubsampleKey));
472 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer(
473 kNoSubsampleData, arraysize(kNoSubsampleData),
474 kSubsampleKeyId, arraysize(kSubsampleKeyId),
475 kSubsampleIv, arraysize(kSubsampleIv),
476 0,
477 std::vector<SubsampleEntry>());
478 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(
479 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize));
480 }
481
482 TEST_F(AesDecryptorTest, IncorrectSubsampleSize) {
483 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId));
484 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId),
485 kSubsampleKey, arraysize(kSubsampleKey));
486 std::vector<SubsampleEntry> entries(
487 kSubsampleEntries,
488 kSubsampleEntries + arraysize(kSubsampleEntries));
489 entries[2].cypher_bytes += 1;
490
491 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer(
492 kSubsampleData, arraysize(kSubsampleData),
493 kSubsampleKeyId, arraysize(kSubsampleKeyId),
494 kSubsampleIv, arraysize(kSubsampleIv),
495 0,
496 entries);
497 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data));
382 } 498 }
383 499
384 } // namespace media 500 } // 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