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

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

Issue 265993002: Add Promises for EME (Chromium side) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: One more trybot issue Created 6 years, 6 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/cdm/aes_decryptor.cc ('k') | media/cdm/ppapi/cdm_adapter.h » ('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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "media/base/cdm_promise.h"
10 #include "media/base/decoder_buffer.h" 11 #include "media/base/decoder_buffer.h"
11 #include "media/base/decrypt_config.h" 12 #include "media/base/decrypt_config.h"
12 #include "media/base/mock_filters.h" 13 #include "media/base/mock_filters.h"
13 #include "media/cdm/aes_decryptor.h" 14 #include "media/cdm/aes_decryptor.h"
14 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 17
17 using ::testing::_; 18 using ::testing::_;
18 using ::testing::Gt; 19 using ::testing::Gt;
19 using ::testing::IsNull; 20 using ::testing::IsNull;
20 using ::testing::NotNull; 21 using ::testing::NotNull;
21 using ::testing::SaveArg; 22 using ::testing::SaveArg;
22 using ::testing::StrNe; 23 using ::testing::StrNe;
23 24
24 MATCHER(IsEmpty, "") { return arg.empty(); } 25 MATCHER(IsEmpty, "") { return arg.empty(); }
26 MATCHER(IsNotEmpty, "") { return !arg.empty(); }
25 27
26 class GURL; 28 class GURL;
27 29
28 namespace media { 30 namespace media {
29 31
30 const uint8 kOriginalData[] = "Original subsample data."; 32 const uint8 kOriginalData[] = "Original subsample data.";
31 const int kOriginalDataSize = 24; 33 const int kOriginalDataSize = 24;
32 34
33 // In the examples below, 'k'(key) has to be 16 bytes, and will always require 35 // In the examples below, 'k'(key) has to be 16 bytes, and will always require
34 // 2 bytes of padding. 'kid'(keyid) is variable length, and may require 0, 1, 36 // 2 bytes of padding. 'kid'(keyid) is variable length, and may require 0, 1,
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 std::string key_id_string( 188 std::string key_id_string(
187 reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]), 189 reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]),
188 key_id.size()); 190 key_id.size());
189 std::string iv_string( 191 std::string iv_string(
190 reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size()); 192 reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size());
191 encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>( 193 encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>(
192 new DecryptConfig(key_id_string, iv_string, subsample_entries))); 194 new DecryptConfig(key_id_string, iv_string, subsample_entries)));
193 return encrypted_buffer; 195 return encrypted_buffer;
194 } 196 }
195 197
198 enum PromiseResult { RESOLVED, REJECTED };
199
196 class AesDecryptorTest : public testing::Test { 200 class AesDecryptorTest : public testing::Test {
197 public: 201 public:
198 AesDecryptorTest() 202 AesDecryptorTest()
199 : decryptor_(base::Bind(&AesDecryptorTest::OnSessionCreated, 203 : decryptor_(base::Bind(&AesDecryptorTest::OnSessionMessage,
200 base::Unretained(this)),
201 base::Bind(&AesDecryptorTest::OnSessionMessage,
202 base::Unretained(this)),
203 base::Bind(&AesDecryptorTest::OnSessionReady,
204 base::Unretained(this)),
205 base::Bind(&AesDecryptorTest::OnSessionClosed,
206 base::Unretained(this)),
207 base::Bind(&AesDecryptorTest::OnSessionError,
208 base::Unretained(this))), 204 base::Unretained(this))),
209 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, 205 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted,
210 base::Unretained(this))), 206 base::Unretained(this))),
211 original_data_(kOriginalData, kOriginalData + kOriginalDataSize), 207 original_data_(kOriginalData, kOriginalData + kOriginalDataSize),
212 encrypted_data_(kEncryptedData, 208 encrypted_data_(kEncryptedData,
213 kEncryptedData + arraysize(kEncryptedData)), 209 kEncryptedData + arraysize(kEncryptedData)),
214 subsample_encrypted_data_( 210 subsample_encrypted_data_(
215 kSubsampleEncryptedData, 211 kSubsampleEncryptedData,
216 kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)), 212 kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)),
217 key_id_(kKeyId, kKeyId + arraysize(kKeyId)), 213 key_id_(kKeyId, kKeyId + arraysize(kKeyId)),
218 iv_(kIv, kIv + arraysize(kIv)), 214 iv_(kIv, kIv + arraysize(kIv)),
219 normal_subsample_entries_( 215 normal_subsample_entries_(
220 kSubsampleEntriesNormal, 216 kSubsampleEntriesNormal,
221 kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)), 217 kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)) {
222 next_session_id_(1) {
223 } 218 }
224 219
225 protected: 220 protected:
221 void OnResolveWithSession(PromiseResult expected,
222 const std::string& web_session_id) {
223 EXPECT_EQ(expected, RESOLVED);
224 EXPECT_GT(web_session_id.length(), 0ul);
225 web_session_id_ = web_session_id;
226 }
227
228 void OnResolve(PromiseResult expected) {
229 EXPECT_EQ(expected, RESOLVED);
230 }
231
232 void OnReject(PromiseResult expected,
233 MediaKeys::Exception exception_code,
234 uint32 system_code,
235 const std::string& error_message) {
236 EXPECT_EQ(expected, REJECTED);
237 }
238
239 scoped_ptr<SimpleCdmPromise> CreatePromise(PromiseResult expected) {
240 scoped_ptr<SimpleCdmPromise> promise(new SimpleCdmPromise(
241 base::Bind(
242 &AesDecryptorTest::OnResolve, base::Unretained(this), expected),
243 base::Bind(
244 &AesDecryptorTest::OnReject, base::Unretained(this), expected)));
245 return promise.Pass();
246 }
247
248 scoped_ptr<NewSessionCdmPromise> CreateSessionPromise(
249 PromiseResult expected) {
250 scoped_ptr<NewSessionCdmPromise> promise(new NewSessionCdmPromise(
251 base::Bind(&AesDecryptorTest::OnResolveWithSession,
252 base::Unretained(this),
253 expected),
254 base::Bind(
255 &AesDecryptorTest::OnReject, base::Unretained(this), expected)));
256 return promise.Pass();
257 }
258
226 // Creates a new session using |key_id|. Returns the session ID. 259 // Creates a new session using |key_id|. Returns the session ID.
227 uint32 CreateSession(const std::vector<uint8>& key_id) { 260 std::string CreateSession(const std::vector<uint8>& key_id) {
228 DCHECK(!key_id.empty()); 261 DCHECK(!key_id.empty());
229 uint32 session_id = next_session_id_++; 262 EXPECT_CALL(*this,
230 EXPECT_CALL(*this, OnSessionCreated(session_id, StrNe(std::string()))); 263 OnSessionMessage(IsNotEmpty(), key_id, GURL::EmptyGURL()));
231 EXPECT_CALL(*this, OnSessionMessage(session_id, key_id, GURL::EmptyGURL())); 264 decryptor_.CreateSession(std::string(),
232 EXPECT_TRUE(decryptor_.CreateSession( 265 &key_id[0],
233 session_id, std::string(), &key_id[0], key_id.size())); 266 key_id.size(),
234 return session_id; 267 MediaKeys::TEMPORARY_SESSION,
268 CreateSessionPromise(RESOLVED));
269 // This expects the promise to be called synchronously, which is the case
270 // for AesDecryptor.
271 return web_session_id_;
235 } 272 }
236 273
237 // Releases the session specified by |session_id|. 274 // Releases the session specified by |session_id|.
238 void ReleaseSession(uint32 session_id) { 275 void ReleaseSession(const std::string& session_id) {
239 EXPECT_CALL(*this, OnSessionClosed(session_id)); 276 decryptor_.ReleaseSession(session_id, CreatePromise(RESOLVED));
240 decryptor_.ReleaseSession(session_id);
241 } 277 }
242 278
243 enum UpdateSessionExpectation {
244 SESSION_READY,
245 SESSION_ERROR
246 };
247
248 // Updates the session specified by |session_id| with |key|. |result| 279 // Updates the session specified by |session_id| with |key|. |result|
249 // tests that the update succeeds or generates an error. 280 // tests that the update succeeds or generates an error.
250 void UpdateSessionAndExpect(uint32 session_id, 281 void UpdateSessionAndExpect(std::string session_id,
251 const std::string& key, 282 const std::string& key,
252 UpdateSessionExpectation result) { 283 PromiseResult result) {
253 DCHECK(!key.empty()); 284 DCHECK(!key.empty());
254 285
255 switch (result) { 286 decryptor_.UpdateSession(session_id,
256 case SESSION_READY: 287 reinterpret_cast<const uint8*>(key.c_str()),
257 EXPECT_CALL(*this, OnSessionReady(session_id)); 288 key.length(),
258 break; 289 CreatePromise(result));
259 case SESSION_ERROR:
260 EXPECT_CALL(*this,
261 OnSessionError(session_id, MediaKeys::kUnknownError, 0));
262 break;
263 }
264
265 decryptor_.UpdateSession(
266 session_id, reinterpret_cast<const uint8*>(key.c_str()), key.length());
267 } 290 }
268 291
269 MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status, 292 MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status,
270 const scoped_refptr<DecoderBuffer>&)); 293 const scoped_refptr<DecoderBuffer>&));
271 294
272 enum DecryptExpectation { 295 enum DecryptExpectation {
273 SUCCESS, 296 SUCCESS,
274 DATA_MISMATCH, 297 DATA_MISMATCH,
275 DATA_AND_SIZE_MISMATCH, 298 DATA_AND_SIZE_MISMATCH,
276 DECRYPT_ERROR, 299 DECRYPT_ERROR,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 case DATA_AND_SIZE_MISMATCH: 341 case DATA_AND_SIZE_MISMATCH:
319 EXPECT_NE(plain_text.size(), decrypted_text.size()); 342 EXPECT_NE(plain_text.size(), decrypted_text.size());
320 break; 343 break;
321 case DECRYPT_ERROR: 344 case DECRYPT_ERROR:
322 case NO_KEY: 345 case NO_KEY:
323 EXPECT_TRUE(decrypted_text.empty()); 346 EXPECT_TRUE(decrypted_text.empty());
324 break; 347 break;
325 } 348 }
326 } 349 }
327 350
328 MOCK_METHOD2(OnSessionCreated,
329 void(uint32 session_id, const std::string& web_session_id));
330 MOCK_METHOD3(OnSessionMessage, 351 MOCK_METHOD3(OnSessionMessage,
331 void(uint32 session_id, 352 void(const std::string& web_session_id,
332 const std::vector<uint8>& message, 353 const std::vector<uint8>& message,
333 const GURL& destination_url)); 354 const GURL& destination_url));
334 MOCK_METHOD1(OnSessionReady, void(uint32 session_id));
335 MOCK_METHOD1(OnSessionClosed, void(uint32 session_id));
336 MOCK_METHOD3(OnSessionError,
337 void(uint32 session_id,
338 MediaKeys::KeyError,
339 uint32 system_code));
340 355
341 AesDecryptor decryptor_; 356 AesDecryptor decryptor_;
342 AesDecryptor::DecryptCB decrypt_cb_; 357 AesDecryptor::DecryptCB decrypt_cb_;
358 std::string web_session_id_;
343 359
344 // Constants for testing. 360 // Constants for testing.
345 const std::vector<uint8> original_data_; 361 const std::vector<uint8> original_data_;
346 const std::vector<uint8> encrypted_data_; 362 const std::vector<uint8> encrypted_data_;
347 const std::vector<uint8> subsample_encrypted_data_; 363 const std::vector<uint8> subsample_encrypted_data_;
348 const std::vector<uint8> key_id_; 364 const std::vector<uint8> key_id_;
349 const std::vector<uint8> iv_; 365 const std::vector<uint8> iv_;
350 const std::vector<SubsampleEntry> normal_subsample_entries_; 366 const std::vector<SubsampleEntry> normal_subsample_entries_;
351 const std::vector<SubsampleEntry> no_subsample_entries_; 367 const std::vector<SubsampleEntry> no_subsample_entries_;
352
353 // Generate new session ID every time
354 uint32 next_session_id_;
355 }; 368 };
356 369
357 TEST_F(AesDecryptorTest, CreateSessionWithNullInitData) { 370 TEST_F(AesDecryptorTest, CreateSessionWithNullInitData) {
358 uint32 session_id = 8;
359 EXPECT_CALL(*this, 371 EXPECT_CALL(*this,
360 OnSessionMessage(session_id, IsEmpty(), GURL::EmptyGURL())); 372 OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
361 EXPECT_CALL(*this, OnSessionCreated(session_id, StrNe(std::string()))); 373 decryptor_.CreateSession(std::string(),
362 EXPECT_TRUE(decryptor_.CreateSession(session_id, std::string(), NULL, 0)); 374 NULL,
375 0,
376 MediaKeys::TEMPORARY_SESSION,
377 CreateSessionPromise(RESOLVED));
363 } 378 }
364 379
365 TEST_F(AesDecryptorTest, MultipleCreateSession) { 380 TEST_F(AesDecryptorTest, MultipleCreateSession) {
366 uint32 session_id1 = 10;
367 EXPECT_CALL(*this, 381 EXPECT_CALL(*this,
368 OnSessionMessage(session_id1, IsEmpty(), GURL::EmptyGURL())); 382 OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
369 EXPECT_CALL(*this, OnSessionCreated(session_id1, StrNe(std::string()))); 383 decryptor_.CreateSession(std::string(),
370 EXPECT_TRUE(decryptor_.CreateSession(session_id1, std::string(), NULL, 0)); 384 NULL,
385 0,
386 MediaKeys::TEMPORARY_SESSION,
387 CreateSessionPromise(RESOLVED));
371 388
372 uint32 session_id2 = 11;
373 EXPECT_CALL(*this, 389 EXPECT_CALL(*this,
374 OnSessionMessage(session_id2, IsEmpty(), GURL::EmptyGURL())); 390 OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
375 EXPECT_CALL(*this, OnSessionCreated(session_id2, StrNe(std::string()))); 391 decryptor_.CreateSession(std::string(),
376 EXPECT_TRUE(decryptor_.CreateSession(session_id2, std::string(), NULL, 0)); 392 NULL,
393 0,
394 MediaKeys::TEMPORARY_SESSION,
395 CreateSessionPromise(RESOLVED));
377 396
378 uint32 session_id3 = 23;
379 EXPECT_CALL(*this, 397 EXPECT_CALL(*this,
380 OnSessionMessage(session_id3, IsEmpty(), GURL::EmptyGURL())); 398 OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
381 EXPECT_CALL(*this, OnSessionCreated(session_id3, StrNe(std::string()))); 399 decryptor_.CreateSession(std::string(),
382 EXPECT_TRUE(decryptor_.CreateSession(session_id3, std::string(), NULL, 0)); 400 NULL,
401 0,
402 MediaKeys::TEMPORARY_SESSION,
403 CreateSessionPromise(RESOLVED));
383 } 404 }
384 405
385 TEST_F(AesDecryptorTest, NormalDecryption) { 406 TEST_F(AesDecryptorTest, NormalDecryption) {
386 uint32 session_id = CreateSession(key_id_); 407 std::string session_id = CreateSession(key_id_);
387 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 408 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
388 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 409 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
389 encrypted_data_, key_id_, iv_, no_subsample_entries_); 410 encrypted_data_, key_id_, iv_, no_subsample_entries_);
390 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); 411 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
391 } 412 }
392 413
393 TEST_F(AesDecryptorTest, UnencryptedFrame) { 414 TEST_F(AesDecryptorTest, UnencryptedFrame) {
394 // An empty iv string signals that the frame is unencrypted. 415 // An empty iv string signals that the frame is unencrypted.
395 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 416 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
396 original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); 417 original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_);
397 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); 418 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
398 } 419 }
399 420
400 TEST_F(AesDecryptorTest, WrongKey) { 421 TEST_F(AesDecryptorTest, WrongKey) {
401 uint32 session_id = CreateSession(key_id_); 422 std::string session_id = CreateSession(key_id_);
402 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY); 423 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED);
403 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 424 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
404 encrypted_data_, key_id_, iv_, no_subsample_entries_); 425 encrypted_data_, key_id_, iv_, no_subsample_entries_);
405 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); 426 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
406 } 427 }
407 428
408 TEST_F(AesDecryptorTest, NoKey) { 429 TEST_F(AesDecryptorTest, NoKey) {
409 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 430 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
410 encrypted_data_, key_id_, iv_, no_subsample_entries_); 431 encrypted_data_, key_id_, iv_, no_subsample_entries_);
411 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); 432 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull()));
412 decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_); 433 decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_);
413 } 434 }
414 435
415 TEST_F(AesDecryptorTest, KeyReplacement) { 436 TEST_F(AesDecryptorTest, KeyReplacement) {
416 uint32 session_id = CreateSession(key_id_); 437 std::string session_id = CreateSession(key_id_);
417 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 438 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
418 encrypted_data_, key_id_, iv_, no_subsample_entries_); 439 encrypted_data_, key_id_, iv_, no_subsample_entries_);
419 440
420 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY); 441 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED);
421 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( 442 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
422 encrypted_buffer, original_data_, DATA_MISMATCH)); 443 encrypted_buffer, original_data_, DATA_MISMATCH));
423 444
424 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 445 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
425 ASSERT_NO_FATAL_FAILURE( 446 ASSERT_NO_FATAL_FAILURE(
426 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 447 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
427 } 448 }
428 449
429 TEST_F(AesDecryptorTest, WrongSizedKey) { 450 TEST_F(AesDecryptorTest, WrongSizedKey) {
430 uint32 session_id = CreateSession(key_id_); 451 std::string session_id = CreateSession(key_id_);
431 UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, SESSION_ERROR); 452 UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, REJECTED);
432 } 453 }
433 454
434 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { 455 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) {
435 uint32 session_id = CreateSession(key_id_); 456 std::string session_id = CreateSession(key_id_);
436 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 457 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
437 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 458 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
438 encrypted_data_, key_id_, iv_, no_subsample_entries_); 459 encrypted_data_, key_id_, iv_, no_subsample_entries_);
439 ASSERT_NO_FATAL_FAILURE( 460 ASSERT_NO_FATAL_FAILURE(
440 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 461 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
441 462
442 UpdateSessionAndExpect(session_id, kKey2AsJWK, SESSION_READY); 463 UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED);
443 464
444 // The first key is still available after we added a second key. 465 // The first key is still available after we added a second key.
445 ASSERT_NO_FATAL_FAILURE( 466 ASSERT_NO_FATAL_FAILURE(
446 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 467 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
447 468
448 // The second key is also available. 469 // The second key is also available.
449 encrypted_buffer = CreateEncryptedBuffer( 470 encrypted_buffer = CreateEncryptedBuffer(
450 std::vector<uint8>(kEncryptedData2, 471 std::vector<uint8>(kEncryptedData2,
451 kEncryptedData2 + arraysize(kEncryptedData2)), 472 kEncryptedData2 + arraysize(kEncryptedData2)),
452 std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)), 473 std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)),
453 std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)), 474 std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)),
454 no_subsample_entries_); 475 no_subsample_entries_);
455 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( 476 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
456 encrypted_buffer, 477 encrypted_buffer,
457 std::vector<uint8>(kOriginalData2, 478 std::vector<uint8>(kOriginalData2,
458 kOriginalData2 + arraysize(kOriginalData2) - 1), 479 kOriginalData2 + arraysize(kOriginalData2) - 1),
459 SUCCESS)); 480 SUCCESS));
460 } 481 }
461 482
462 TEST_F(AesDecryptorTest, CorruptedIv) { 483 TEST_F(AesDecryptorTest, CorruptedIv) {
463 uint32 session_id = CreateSession(key_id_); 484 std::string session_id = CreateSession(key_id_);
464 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 485 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
465 486
466 std::vector<uint8> bad_iv = iv_; 487 std::vector<uint8> bad_iv = iv_;
467 bad_iv[1]++; 488 bad_iv[1]++;
468 489
469 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 490 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
470 encrypted_data_, key_id_, bad_iv, no_subsample_entries_); 491 encrypted_data_, key_id_, bad_iv, no_subsample_entries_);
471 492
472 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); 493 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
473 } 494 }
474 495
475 TEST_F(AesDecryptorTest, CorruptedData) { 496 TEST_F(AesDecryptorTest, CorruptedData) {
476 uint32 session_id = CreateSession(key_id_); 497 std::string session_id = CreateSession(key_id_);
477 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 498 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
478 499
479 std::vector<uint8> bad_data = encrypted_data_; 500 std::vector<uint8> bad_data = encrypted_data_;
480 bad_data[1]++; 501 bad_data[1]++;
481 502
482 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 503 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
483 bad_data, key_id_, iv_, no_subsample_entries_); 504 bad_data, key_id_, iv_, no_subsample_entries_);
484 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); 505 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
485 } 506 }
486 507
487 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { 508 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) {
488 uint32 session_id = CreateSession(key_id_); 509 std::string session_id = CreateSession(key_id_);
489 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 510 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
490 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 511 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
491 encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); 512 encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_);
492 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); 513 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
493 } 514 }
494 515
495 TEST_F(AesDecryptorTest, SubsampleDecryption) { 516 TEST_F(AesDecryptorTest, SubsampleDecryption) {
496 uint32 session_id = CreateSession(key_id_); 517 std::string session_id = CreateSession(key_id_);
497 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 518 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
498 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 519 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
499 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); 520 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_);
500 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); 521 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
501 } 522 }
502 523
503 // Ensures noninterference of data offset and subsample mechanisms. We never 524 // Ensures noninterference of data offset and subsample mechanisms. We never
504 // expect to encounter this in the wild, but since the DecryptConfig doesn't 525 // expect to encounter this in the wild, but since the DecryptConfig doesn't
505 // disallow such a configuration, it should be covered. 526 // disallow such a configuration, it should be covered.
506 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { 527 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) {
507 uint32 session_id = CreateSession(key_id_); 528 std::string session_id = CreateSession(key_id_);
508 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 529 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
509 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 530 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
510 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); 531 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_);
511 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); 532 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
512 } 533 }
513 534
514 TEST_F(AesDecryptorTest, SubsampleWrongSize) { 535 TEST_F(AesDecryptorTest, SubsampleWrongSize) {
515 uint32 session_id = CreateSession(key_id_); 536 std::string session_id = CreateSession(key_id_);
516 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 537 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
517 538
518 std::vector<SubsampleEntry> subsample_entries_wrong_size( 539 std::vector<SubsampleEntry> subsample_entries_wrong_size(
519 kSubsampleEntriesWrongSize, 540 kSubsampleEntriesWrongSize,
520 kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize)); 541 kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize));
521 542
522 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 543 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
523 subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size); 544 subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size);
524 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); 545 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
525 } 546 }
526 547
527 TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) { 548 TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) {
528 uint32 session_id = CreateSession(key_id_); 549 std::string session_id = CreateSession(key_id_);
529 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 550 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
530 551
531 std::vector<SubsampleEntry> subsample_entries_invalid_total_size( 552 std::vector<SubsampleEntry> subsample_entries_invalid_total_size(
532 kSubsampleEntriesInvalidTotalSize, 553 kSubsampleEntriesInvalidTotalSize,
533 kSubsampleEntriesInvalidTotalSize + 554 kSubsampleEntriesInvalidTotalSize +
534 arraysize(kSubsampleEntriesInvalidTotalSize)); 555 arraysize(kSubsampleEntriesInvalidTotalSize));
535 556
536 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 557 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
537 subsample_encrypted_data_, key_id_, iv_, 558 subsample_encrypted_data_, key_id_, iv_,
538 subsample_entries_invalid_total_size); 559 subsample_entries_invalid_total_size);
539 DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR); 560 DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR);
540 } 561 }
541 562
542 // No cypher bytes in any of the subsamples. 563 // No cypher bytes in any of the subsamples.
543 TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) { 564 TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) {
544 uint32 session_id = CreateSession(key_id_); 565 std::string session_id = CreateSession(key_id_);
545 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 566 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
546 567
547 std::vector<SubsampleEntry> clear_only_subsample_entries( 568 std::vector<SubsampleEntry> clear_only_subsample_entries(
548 kSubsampleEntriesClearOnly, 569 kSubsampleEntriesClearOnly,
549 kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly)); 570 kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly));
550 571
551 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 572 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
552 original_data_, key_id_, iv_, clear_only_subsample_entries); 573 original_data_, key_id_, iv_, clear_only_subsample_entries);
553 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); 574 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
554 } 575 }
555 576
556 // No clear bytes in any of the subsamples. 577 // No clear bytes in any of the subsamples.
557 TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) { 578 TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) {
558 uint32 session_id = CreateSession(key_id_); 579 std::string session_id = CreateSession(key_id_);
559 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 580 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
560 581
561 std::vector<SubsampleEntry> cypher_only_subsample_entries( 582 std::vector<SubsampleEntry> cypher_only_subsample_entries(
562 kSubsampleEntriesCypherOnly, 583 kSubsampleEntriesCypherOnly,
563 kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly)); 584 kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly));
564 585
565 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 586 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
566 encrypted_data_, key_id_, iv_, cypher_only_subsample_entries); 587 encrypted_data_, key_id_, iv_, cypher_only_subsample_entries);
567 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); 588 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
568 } 589 }
569 590
570 TEST_F(AesDecryptorTest, ReleaseSession) { 591 TEST_F(AesDecryptorTest, ReleaseSession) {
571 uint32 session_id = CreateSession(key_id_); 592 std::string session_id = CreateSession(key_id_);
572 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 593 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
573 encrypted_data_, key_id_, iv_, no_subsample_entries_); 594 encrypted_data_, key_id_, iv_, no_subsample_entries_);
574 595
575 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 596 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
576 ASSERT_NO_FATAL_FAILURE( 597 ASSERT_NO_FATAL_FAILURE(
577 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 598 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
578 599
579 ReleaseSession(session_id); 600 ReleaseSession(session_id);
580 } 601 }
581 602
582 TEST_F(AesDecryptorTest, NoKeyAfterReleaseSession) { 603 TEST_F(AesDecryptorTest, NoKeyAfterReleaseSession) {
583 uint32 session_id = CreateSession(key_id_); 604 std::string session_id = CreateSession(key_id_);
584 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 605 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
585 encrypted_data_, key_id_, iv_, no_subsample_entries_); 606 encrypted_data_, key_id_, iv_, no_subsample_entries_);
586 607
587 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); 608 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
588 ASSERT_NO_FATAL_FAILURE( 609 ASSERT_NO_FATAL_FAILURE(
589 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 610 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
590 611
591 ReleaseSession(session_id); 612 ReleaseSession(session_id);
592 ASSERT_NO_FATAL_FAILURE( 613 ASSERT_NO_FATAL_FAILURE(
593 DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY)); 614 DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY));
594 } 615 }
595 616
596 TEST_F(AesDecryptorTest, LatestKeyUsed) { 617 TEST_F(AesDecryptorTest, LatestKeyUsed) {
597 uint32 session_id1 = CreateSession(key_id_); 618 std::string session_id1 = CreateSession(key_id_);
598 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 619 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
599 encrypted_data_, key_id_, iv_, no_subsample_entries_); 620 encrypted_data_, key_id_, iv_, no_subsample_entries_);
600 621
601 // Add alternate key, buffer should not be decoded properly. 622 // Add alternate key, buffer should not be decoded properly.
602 UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, SESSION_READY); 623 UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, RESOLVED);
603 ASSERT_NO_FATAL_FAILURE( 624 ASSERT_NO_FATAL_FAILURE(
604 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); 625 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH));
605 626
606 // Create a second session with a correct key value for key_id_. 627 // Create a second session with a correct key value for key_id_.
607 uint32 session_id2 = CreateSession(key_id_); 628 std::string session_id2 = CreateSession(key_id_);
608 UpdateSessionAndExpect(session_id2, kKeyAsJWK, SESSION_READY); 629 UpdateSessionAndExpect(session_id2, kKeyAsJWK, RESOLVED);
609 630
610 // Should be able to decode with latest key. 631 // Should be able to decode with latest key.
611 ASSERT_NO_FATAL_FAILURE( 632 ASSERT_NO_FATAL_FAILURE(
612 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 633 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
613 } 634 }
614 635
615 TEST_F(AesDecryptorTest, LatestKeyUsedAfterReleaseSession) { 636 TEST_F(AesDecryptorTest, LatestKeyUsedAfterReleaseSession) {
616 uint32 session_id1 = CreateSession(key_id_); 637 std::string session_id1 = CreateSession(key_id_);
617 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( 638 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
618 encrypted_data_, key_id_, iv_, no_subsample_entries_); 639 encrypted_data_, key_id_, iv_, no_subsample_entries_);
619 UpdateSessionAndExpect(session_id1, kKeyAsJWK, SESSION_READY); 640 UpdateSessionAndExpect(session_id1, kKeyAsJWK, RESOLVED);
620 ASSERT_NO_FATAL_FAILURE( 641 ASSERT_NO_FATAL_FAILURE(
621 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 642 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
622 643
623 // Create a second session with a different key value for key_id_. 644 // Create a second session with a different key value for key_id_.
624 uint32 session_id2 = CreateSession(key_id_); 645 std::string session_id2 = CreateSession(key_id_);
625 UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, SESSION_READY); 646 UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, RESOLVED);
626 647
627 // Should not be able to decode with new key. 648 // Should not be able to decode with new key.
628 ASSERT_NO_FATAL_FAILURE( 649 ASSERT_NO_FATAL_FAILURE(
629 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); 650 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH));
630 651
631 // Close second session, should revert to original key. 652 // Close second session, should revert to original key.
632 ReleaseSession(session_id2); 653 ReleaseSession(session_id2);
633 ASSERT_NO_FATAL_FAILURE( 654 ASSERT_NO_FATAL_FAILURE(
634 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); 655 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
635 } 656 }
636 657
637 TEST_F(AesDecryptorTest, JWKKey) { 658 TEST_F(AesDecryptorTest, JWKKey) {
638 uint32 session_id = CreateSession(key_id_); 659 std::string session_id = CreateSession(key_id_);
639 660
640 // Try a simple JWK key (i.e. not in a set) 661 // Try a simple JWK key (i.e. not in a set)
641 const std::string kJwkSimple = 662 const std::string kJwkSimple =
642 "{" 663 "{"
643 " \"kty\": \"oct\"," 664 " \"kty\": \"oct\","
644 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," 665 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
645 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 666 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
646 "}"; 667 "}";
647 UpdateSessionAndExpect(session_id, kJwkSimple, SESSION_ERROR); 668 UpdateSessionAndExpect(session_id, kJwkSimple, REJECTED);
648 669
649 // Try a key list with multiple entries. 670 // Try a key list with multiple entries.
650 const std::string kJwksMultipleEntries = 671 const std::string kJwksMultipleEntries =
651 "{" 672 "{"
652 " \"keys\": [" 673 " \"keys\": ["
653 " {" 674 " {"
654 " \"kty\": \"oct\"," 675 " \"kty\": \"oct\","
655 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," 676 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
656 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 677 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
657 " }," 678 " },"
658 " {" 679 " {"
659 " \"kty\": \"oct\"," 680 " \"kty\": \"oct\","
660 " \"kid\": \"JCUmJygpKissLS4vMA\"," 681 " \"kid\": \"JCUmJygpKissLS4vMA\","
661 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" 682 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\""
662 " }" 683 " }"
663 " ]" 684 " ]"
664 "}"; 685 "}";
665 UpdateSessionAndExpect(session_id, kJwksMultipleEntries, SESSION_READY); 686 UpdateSessionAndExpect(session_id, kJwksMultipleEntries, RESOLVED);
666 687
667 // Try a key with no spaces and some \n plus additional fields. 688 // Try a key with no spaces and some \n plus additional fields.
668 const std::string kJwksNoSpaces = 689 const std::string kJwksNoSpaces =
669 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," 690 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\","
670 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg" 691 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg"
671 "\",\"foo\":\"bar\"}]}\n\n"; 692 "\",\"foo\":\"bar\"}]}\n\n";
672 UpdateSessionAndExpect(session_id, kJwksNoSpaces, SESSION_READY); 693 UpdateSessionAndExpect(session_id, kJwksNoSpaces, RESOLVED);
673 694
674 // Try some non-ASCII characters. 695 // Try some non-ASCII characters.
675 UpdateSessionAndExpect(session_id, 696 UpdateSessionAndExpect(
676 "This is not ASCII due to \xff\xfe\xfd in it.", 697 session_id, "This is not ASCII due to \xff\xfe\xfd in it.", REJECTED);
677 SESSION_ERROR);
678 698
679 // Try a badly formatted key. Assume that the JSON parser is fully tested, 699 // Try a badly formatted key. Assume that the JSON parser is fully tested,
680 // so we won't try a lot of combinations. However, need a test to ensure 700 // so we won't try a lot of combinations. However, need a test to ensure
681 // that the code doesn't crash if invalid JSON received. 701 // that the code doesn't crash if invalid JSON received.
682 UpdateSessionAndExpect(session_id, "This is not a JSON key.", SESSION_ERROR); 702 UpdateSessionAndExpect(session_id, "This is not a JSON key.", REJECTED);
683 703
684 // Try passing some valid JSON that is not a dictionary at the top level. 704 // Try passing some valid JSON that is not a dictionary at the top level.
685 UpdateSessionAndExpect(session_id, "40", SESSION_ERROR); 705 UpdateSessionAndExpect(session_id, "40", REJECTED);
686 706
687 // Try an empty dictionary. 707 // Try an empty dictionary.
688 UpdateSessionAndExpect(session_id, "{ }", SESSION_ERROR); 708 UpdateSessionAndExpect(session_id, "{ }", REJECTED);
689 709
690 // Try an empty 'keys' dictionary. 710 // Try an empty 'keys' dictionary.
691 UpdateSessionAndExpect(session_id, "{ \"keys\": [] }", SESSION_ERROR); 711 UpdateSessionAndExpect(session_id, "{ \"keys\": [] }", REJECTED);
692 712
693 // Try with 'keys' not a dictionary. 713 // Try with 'keys' not a dictionary.
694 UpdateSessionAndExpect(session_id, "{ \"keys\":\"1\" }", SESSION_ERROR); 714 UpdateSessionAndExpect(session_id, "{ \"keys\":\"1\" }", REJECTED);
695 715
696 // Try with 'keys' a list of integers. 716 // Try with 'keys' a list of integers.
697 UpdateSessionAndExpect( 717 UpdateSessionAndExpect(session_id, "{ \"keys\": [ 1, 2, 3 ] }", REJECTED);
698 session_id, "{ \"keys\": [ 1, 2, 3 ] }", SESSION_ERROR);
699 718
700 // Try padding(=) at end of 'k' base64 string. 719 // Try padding(=) at end of 'k' base64 string.
701 const std::string kJwksWithPaddedKey = 720 const std::string kJwksWithPaddedKey =
702 "{" 721 "{"
703 " \"keys\": [" 722 " \"keys\": ["
704 " {" 723 " {"
705 " \"kty\": \"oct\"," 724 " \"kty\": \"oct\","
706 " \"kid\": \"AAECAw\"," 725 " \"kid\": \"AAECAw\","
707 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" 726 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
708 " }" 727 " }"
709 " ]" 728 " ]"
710 "}"; 729 "}";
711 UpdateSessionAndExpect(session_id, kJwksWithPaddedKey, SESSION_ERROR); 730 UpdateSessionAndExpect(session_id, kJwksWithPaddedKey, REJECTED);
712 731
713 // Try padding(=) at end of 'kid' base64 string. 732 // Try padding(=) at end of 'kid' base64 string.
714 const std::string kJwksWithPaddedKeyId = 733 const std::string kJwksWithPaddedKeyId =
715 "{" 734 "{"
716 " \"keys\": [" 735 " \"keys\": ["
717 " {" 736 " {"
718 " \"kty\": \"oct\"," 737 " \"kty\": \"oct\","
719 " \"kid\": \"AAECAw==\"," 738 " \"kid\": \"AAECAw==\","
720 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 739 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
721 " }" 740 " }"
722 " ]" 741 " ]"
723 "}"; 742 "}";
724 UpdateSessionAndExpect(session_id, kJwksWithPaddedKeyId, SESSION_ERROR); 743 UpdateSessionAndExpect(session_id, kJwksWithPaddedKeyId, REJECTED);
725 744
726 // Try a key with invalid base64 encoding. 745 // Try a key with invalid base64 encoding.
727 const std::string kJwksWithInvalidBase64 = 746 const std::string kJwksWithInvalidBase64 =
728 "{" 747 "{"
729 " \"keys\": [" 748 " \"keys\": ["
730 " {" 749 " {"
731 " \"kty\": \"oct\"," 750 " \"kty\": \"oct\","
732 " \"kid\": \"!@#$%^&*()\"," 751 " \"kid\": \"!@#$%^&*()\","
733 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 752 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
734 " }" 753 " }"
735 " ]" 754 " ]"
736 "}"; 755 "}";
737 UpdateSessionAndExpect(session_id, kJwksWithInvalidBase64, SESSION_ERROR); 756 UpdateSessionAndExpect(session_id, kJwksWithInvalidBase64, REJECTED);
738 757
739 // Try a 3-byte 'kid' where no base64 padding is required. 758 // Try a 3-byte 'kid' where no base64 padding is required.
740 // |kJwksMultipleEntries| above has 2 'kid's that require 1 and 2 padding 759 // |kJwksMultipleEntries| above has 2 'kid's that require 1 and 2 padding
741 // bytes. Note that 'k' has to be 16 bytes, so it will always require padding. 760 // bytes. Note that 'k' has to be 16 bytes, so it will always require padding.
742 const std::string kJwksWithNoPadding = 761 const std::string kJwksWithNoPadding =
743 "{" 762 "{"
744 " \"keys\": [" 763 " \"keys\": ["
745 " {" 764 " {"
746 " \"kty\": \"oct\"," 765 " \"kty\": \"oct\","
747 " \"kid\": \"Kiss\"," 766 " \"kid\": \"Kiss\","
748 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 767 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
749 " }" 768 " }"
750 " ]" 769 " ]"
751 "}"; 770 "}";
752 UpdateSessionAndExpect(session_id, kJwksWithNoPadding, SESSION_READY); 771 UpdateSessionAndExpect(session_id, kJwksWithNoPadding, RESOLVED);
753 772
754 // Empty key id. 773 // Empty key id.
755 const std::string kJwksWithEmptyKeyId = 774 const std::string kJwksWithEmptyKeyId =
756 "{" 775 "{"
757 " \"keys\": [" 776 " \"keys\": ["
758 " {" 777 " {"
759 " \"kty\": \"oct\"," 778 " \"kty\": \"oct\","
760 " \"kid\": \"\"," 779 " \"kid\": \"\","
761 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 780 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
762 " }" 781 " }"
763 " ]" 782 " ]"
764 "}"; 783 "}";
765 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, SESSION_ERROR); 784 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, REJECTED);
766 ReleaseSession(session_id); 785 ReleaseSession(session_id);
767 } 786 }
768 787
769 } // namespace media 788 } // namespace media
OLDNEW
« no previous file with comments | « media/cdm/aes_decryptor.cc ('k') | media/cdm/ppapi/cdm_adapter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698