OLD | NEW |
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 "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 bool has_additional_usable_key, | 316 bool has_additional_usable_key, |
317 CdmKeysInfo keys_info) { | 317 CdmKeysInfo keys_info) { |
318 keys_info_.swap(keys_info); | 318 keys_info_.swap(keys_info); |
319 OnSessionKeysChangeCalled(session_id, has_additional_usable_key); | 319 OnSessionKeysChangeCalled(session_id, has_additional_usable_key); |
320 } | 320 } |
321 | 321 |
322 // Updates the session specified by |session_id| with |key|. |result| | 322 // Updates the session specified by |session_id| with |key|. |result| |
323 // tests that the update succeeds or generates an error. | 323 // tests that the update succeeds or generates an error. |
324 void UpdateSessionAndExpect(std::string session_id, | 324 void UpdateSessionAndExpect(std::string session_id, |
325 const std::string& key, | 325 const std::string& key, |
326 PromiseResult expected_result) { | 326 PromiseResult expected_result, |
| 327 bool new_key_expected) { |
327 DCHECK(!key.empty()); | 328 DCHECK(!key.empty()); |
328 | 329 |
329 if (expected_result == RESOLVED) { | 330 if (expected_result == RESOLVED) { |
330 EXPECT_CALL(*this, OnSessionKeysChangeCalled(session_id, true)); | 331 EXPECT_CALL(*this, |
| 332 OnSessionKeysChangeCalled(session_id, new_key_expected)); |
331 } else { | 333 } else { |
332 EXPECT_CALL(*this, OnSessionKeysChangeCalled(_, _)).Times(0); | 334 EXPECT_CALL(*this, OnSessionKeysChangeCalled(_, _)).Times(0); |
333 } | 335 } |
334 | 336 |
335 decryptor_.UpdateSession(session_id, | 337 decryptor_.UpdateSession(session_id, |
336 reinterpret_cast<const uint8*>(key.c_str()), | 338 reinterpret_cast<const uint8*>(key.c_str()), |
337 key.length(), | 339 key.length(), |
338 CreatePromise(expected_result)); | 340 CreatePromise(expected_result)); |
339 } | 341 } |
340 | 342 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary(), | 486 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary(), |
485 GURL::EmptyGURL())); | 487 GURL::EmptyGURL())); |
486 decryptor_.CreateSessionAndGenerateRequest( | 488 decryptor_.CreateSessionAndGenerateRequest( |
487 MediaKeys::TEMPORARY_SESSION, "keyids", | 489 MediaKeys::TEMPORARY_SESSION, "keyids", |
488 reinterpret_cast<const uint8*>(init_data), arraysize(init_data) - 1, | 490 reinterpret_cast<const uint8*>(init_data), arraysize(init_data) - 1, |
489 CreateSessionPromise(RESOLVED)); | 491 CreateSessionPromise(RESOLVED)); |
490 } | 492 } |
491 | 493 |
492 TEST_F(AesDecryptorTest, NormalDecryption) { | 494 TEST_F(AesDecryptorTest, NormalDecryption) { |
493 std::string session_id = CreateSession(key_id_); | 495 std::string session_id = CreateSession(key_id_); |
494 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 496 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
495 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 497 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
496 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 498 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
497 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 499 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
498 } | 500 } |
499 | 501 |
500 TEST_F(AesDecryptorTest, UnencryptedFrame) { | 502 TEST_F(AesDecryptorTest, UnencryptedFrame) { |
501 // An empty iv string signals that the frame is unencrypted. | 503 // An empty iv string signals that the frame is unencrypted. |
502 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 504 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
503 original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); | 505 original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); |
504 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 506 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
505 } | 507 } |
506 | 508 |
507 TEST_F(AesDecryptorTest, WrongKey) { | 509 TEST_F(AesDecryptorTest, WrongKey) { |
508 std::string session_id = CreateSession(key_id_); | 510 std::string session_id = CreateSession(key_id_); |
509 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED); | 511 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED, true); |
510 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 512 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
511 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 513 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
512 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 514 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
513 } | 515 } |
514 | 516 |
515 TEST_F(AesDecryptorTest, NoKey) { | 517 TEST_F(AesDecryptorTest, NoKey) { |
516 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 518 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
517 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 519 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
518 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); | 520 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); |
519 decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_); | 521 decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_); |
520 } | 522 } |
521 | 523 |
522 TEST_F(AesDecryptorTest, KeyReplacement) { | 524 TEST_F(AesDecryptorTest, KeyReplacement) { |
523 std::string session_id = CreateSession(key_id_); | 525 std::string session_id = CreateSession(key_id_); |
524 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 526 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
525 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 527 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
526 | 528 |
527 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED); | 529 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED, true); |
528 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( | 530 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( |
529 encrypted_buffer, original_data_, DATA_MISMATCH)); | 531 encrypted_buffer, original_data_, DATA_MISMATCH)); |
530 | 532 |
531 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 533 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, false); |
532 ASSERT_NO_FATAL_FAILURE( | 534 ASSERT_NO_FATAL_FAILURE( |
533 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 535 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
534 } | 536 } |
535 | 537 |
536 TEST_F(AesDecryptorTest, WrongSizedKey) { | 538 TEST_F(AesDecryptorTest, WrongSizedKey) { |
537 std::string session_id = CreateSession(key_id_); | 539 std::string session_id = CreateSession(key_id_); |
538 UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, REJECTED); | 540 UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, REJECTED, true); |
539 } | 541 } |
540 | 542 |
541 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { | 543 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { |
542 std::string session_id = CreateSession(key_id_); | 544 std::string session_id = CreateSession(key_id_); |
543 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 545 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
544 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 546 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
545 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 547 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
546 ASSERT_NO_FATAL_FAILURE( | 548 ASSERT_NO_FATAL_FAILURE( |
547 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 549 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
548 | 550 |
549 UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED); | 551 UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED, true); |
550 | 552 |
551 // The first key is still available after we added a second key. | 553 // The first key is still available after we added a second key. |
552 ASSERT_NO_FATAL_FAILURE( | 554 ASSERT_NO_FATAL_FAILURE( |
553 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 555 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
554 | 556 |
555 // The second key is also available. | 557 // The second key is also available. |
556 encrypted_buffer = CreateEncryptedBuffer( | 558 encrypted_buffer = CreateEncryptedBuffer( |
557 std::vector<uint8>(kEncryptedData2, | 559 std::vector<uint8>(kEncryptedData2, |
558 kEncryptedData2 + arraysize(kEncryptedData2)), | 560 kEncryptedData2 + arraysize(kEncryptedData2)), |
559 std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)), | 561 std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)), |
560 std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)), | 562 std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)), |
561 no_subsample_entries_); | 563 no_subsample_entries_); |
562 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( | 564 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( |
563 encrypted_buffer, | 565 encrypted_buffer, |
564 std::vector<uint8>(kOriginalData2, | 566 std::vector<uint8>(kOriginalData2, |
565 kOriginalData2 + arraysize(kOriginalData2) - 1), | 567 kOriginalData2 + arraysize(kOriginalData2) - 1), |
566 SUCCESS)); | 568 SUCCESS)); |
567 } | 569 } |
568 | 570 |
569 TEST_F(AesDecryptorTest, CorruptedIv) { | 571 TEST_F(AesDecryptorTest, CorruptedIv) { |
570 std::string session_id = CreateSession(key_id_); | 572 std::string session_id = CreateSession(key_id_); |
571 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 573 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
572 | 574 |
573 std::vector<uint8> bad_iv = iv_; | 575 std::vector<uint8> bad_iv = iv_; |
574 bad_iv[1]++; | 576 bad_iv[1]++; |
575 | 577 |
576 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 578 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
577 encrypted_data_, key_id_, bad_iv, no_subsample_entries_); | 579 encrypted_data_, key_id_, bad_iv, no_subsample_entries_); |
578 | 580 |
579 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 581 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
580 } | 582 } |
581 | 583 |
582 TEST_F(AesDecryptorTest, CorruptedData) { | 584 TEST_F(AesDecryptorTest, CorruptedData) { |
583 std::string session_id = CreateSession(key_id_); | 585 std::string session_id = CreateSession(key_id_); |
584 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 586 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
585 | 587 |
586 std::vector<uint8> bad_data = encrypted_data_; | 588 std::vector<uint8> bad_data = encrypted_data_; |
587 bad_data[1]++; | 589 bad_data[1]++; |
588 | 590 |
589 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 591 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
590 bad_data, key_id_, iv_, no_subsample_entries_); | 592 bad_data, key_id_, iv_, no_subsample_entries_); |
591 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 593 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
592 } | 594 } |
593 | 595 |
594 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { | 596 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { |
595 std::string session_id = CreateSession(key_id_); | 597 std::string session_id = CreateSession(key_id_); |
596 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 598 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
597 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 599 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
598 encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); | 600 encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); |
599 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 601 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
600 } | 602 } |
601 | 603 |
602 TEST_F(AesDecryptorTest, SubsampleDecryption) { | 604 TEST_F(AesDecryptorTest, SubsampleDecryption) { |
603 std::string session_id = CreateSession(key_id_); | 605 std::string session_id = CreateSession(key_id_); |
604 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 606 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
605 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 607 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
606 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); | 608 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); |
607 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 609 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
608 } | 610 } |
609 | 611 |
610 // Ensures noninterference of data offset and subsample mechanisms. We never | 612 // Ensures noninterference of data offset and subsample mechanisms. We never |
611 // expect to encounter this in the wild, but since the DecryptConfig doesn't | 613 // expect to encounter this in the wild, but since the DecryptConfig doesn't |
612 // disallow such a configuration, it should be covered. | 614 // disallow such a configuration, it should be covered. |
613 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { | 615 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { |
614 std::string session_id = CreateSession(key_id_); | 616 std::string session_id = CreateSession(key_id_); |
615 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 617 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
616 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 618 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
617 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); | 619 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); |
618 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 620 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
619 } | 621 } |
620 | 622 |
621 TEST_F(AesDecryptorTest, SubsampleWrongSize) { | 623 TEST_F(AesDecryptorTest, SubsampleWrongSize) { |
622 std::string session_id = CreateSession(key_id_); | 624 std::string session_id = CreateSession(key_id_); |
623 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 625 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
624 | 626 |
625 std::vector<SubsampleEntry> subsample_entries_wrong_size( | 627 std::vector<SubsampleEntry> subsample_entries_wrong_size( |
626 kSubsampleEntriesWrongSize, | 628 kSubsampleEntriesWrongSize, |
627 kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize)); | 629 kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize)); |
628 | 630 |
629 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 631 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
630 subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size); | 632 subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size); |
631 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 633 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
632 } | 634 } |
633 | 635 |
634 TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) { | 636 TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) { |
635 std::string session_id = CreateSession(key_id_); | 637 std::string session_id = CreateSession(key_id_); |
636 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 638 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
637 | 639 |
638 std::vector<SubsampleEntry> subsample_entries_invalid_total_size( | 640 std::vector<SubsampleEntry> subsample_entries_invalid_total_size( |
639 kSubsampleEntriesInvalidTotalSize, | 641 kSubsampleEntriesInvalidTotalSize, |
640 kSubsampleEntriesInvalidTotalSize + | 642 kSubsampleEntriesInvalidTotalSize + |
641 arraysize(kSubsampleEntriesInvalidTotalSize)); | 643 arraysize(kSubsampleEntriesInvalidTotalSize)); |
642 | 644 |
643 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 645 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
644 subsample_encrypted_data_, key_id_, iv_, | 646 subsample_encrypted_data_, key_id_, iv_, |
645 subsample_entries_invalid_total_size); | 647 subsample_entries_invalid_total_size); |
646 DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR); | 648 DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR); |
647 } | 649 } |
648 | 650 |
649 // No cypher bytes in any of the subsamples. | 651 // No cypher bytes in any of the subsamples. |
650 TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) { | 652 TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) { |
651 std::string session_id = CreateSession(key_id_); | 653 std::string session_id = CreateSession(key_id_); |
652 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 654 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
653 | 655 |
654 std::vector<SubsampleEntry> clear_only_subsample_entries( | 656 std::vector<SubsampleEntry> clear_only_subsample_entries( |
655 kSubsampleEntriesClearOnly, | 657 kSubsampleEntriesClearOnly, |
656 kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly)); | 658 kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly)); |
657 | 659 |
658 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 660 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
659 original_data_, key_id_, iv_, clear_only_subsample_entries); | 661 original_data_, key_id_, iv_, clear_only_subsample_entries); |
660 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 662 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
661 } | 663 } |
662 | 664 |
663 // No clear bytes in any of the subsamples. | 665 // No clear bytes in any of the subsamples. |
664 TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) { | 666 TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) { |
665 std::string session_id = CreateSession(key_id_); | 667 std::string session_id = CreateSession(key_id_); |
666 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 668 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
667 | 669 |
668 std::vector<SubsampleEntry> cypher_only_subsample_entries( | 670 std::vector<SubsampleEntry> cypher_only_subsample_entries( |
669 kSubsampleEntriesCypherOnly, | 671 kSubsampleEntriesCypherOnly, |
670 kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly)); | 672 kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly)); |
671 | 673 |
672 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 674 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
673 encrypted_data_, key_id_, iv_, cypher_only_subsample_entries); | 675 encrypted_data_, key_id_, iv_, cypher_only_subsample_entries); |
674 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 676 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
675 } | 677 } |
676 | 678 |
677 TEST_F(AesDecryptorTest, CloseSession) { | 679 TEST_F(AesDecryptorTest, CloseSession) { |
678 std::string session_id = CreateSession(key_id_); | 680 std::string session_id = CreateSession(key_id_); |
679 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 681 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
680 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 682 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
681 | 683 |
682 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 684 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
683 ASSERT_NO_FATAL_FAILURE( | 685 ASSERT_NO_FATAL_FAILURE( |
684 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 686 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
685 | 687 |
686 CloseSession(session_id); | 688 CloseSession(session_id); |
687 } | 689 } |
688 | 690 |
689 TEST_F(AesDecryptorTest, RemoveSession) { | 691 TEST_F(AesDecryptorTest, RemoveSession) { |
690 // TODO(jrummell): Clean this up when the prefixed API is removed. | 692 // TODO(jrummell): Clean this up when the prefixed API is removed. |
691 // http://crbug.com/249976. | 693 // http://crbug.com/249976. |
692 std::string session_id = CreateSession(key_id_); | 694 std::string session_id = CreateSession(key_id_); |
693 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 695 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
694 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 696 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
695 | 697 |
696 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 698 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
697 ASSERT_NO_FATAL_FAILURE( | 699 ASSERT_NO_FATAL_FAILURE( |
698 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 700 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
699 | 701 |
700 RemoveSession(session_id); | 702 RemoveSession(session_id); |
701 } | 703 } |
702 | 704 |
703 TEST_F(AesDecryptorTest, NoKeyAfterCloseSession) { | 705 TEST_F(AesDecryptorTest, NoKeyAfterCloseSession) { |
704 std::string session_id = CreateSession(key_id_); | 706 std::string session_id = CreateSession(key_id_); |
705 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 707 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
706 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 708 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
707 | 709 |
708 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 710 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
709 ASSERT_NO_FATAL_FAILURE( | 711 ASSERT_NO_FATAL_FAILURE( |
710 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 712 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
711 | 713 |
712 CloseSession(session_id); | 714 CloseSession(session_id); |
713 ASSERT_NO_FATAL_FAILURE( | 715 ASSERT_NO_FATAL_FAILURE( |
714 DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY)); | 716 DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY)); |
715 } | 717 } |
716 | 718 |
717 TEST_F(AesDecryptorTest, LatestKeyUsed) { | 719 TEST_F(AesDecryptorTest, LatestKeyUsed) { |
718 std::string session_id1 = CreateSession(key_id_); | 720 std::string session_id1 = CreateSession(key_id_); |
719 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 721 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
720 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 722 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
721 | 723 |
722 // Add alternate key, buffer should not be decoded properly. | 724 // Add alternate key, buffer should not be decoded properly. |
723 UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, RESOLVED); | 725 UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, RESOLVED, true); |
724 ASSERT_NO_FATAL_FAILURE( | 726 ASSERT_NO_FATAL_FAILURE( |
725 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); | 727 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); |
726 | 728 |
727 // Create a second session with a correct key value for key_id_. | 729 // Create a second session with a correct key value for key_id_. |
728 std::string session_id2 = CreateSession(key_id_); | 730 std::string session_id2 = CreateSession(key_id_); |
729 UpdateSessionAndExpect(session_id2, kKeyAsJWK, RESOLVED); | 731 UpdateSessionAndExpect(session_id2, kKeyAsJWK, RESOLVED, true); |
730 | 732 |
731 // Should be able to decode with latest key. | 733 // Should be able to decode with latest key. |
732 ASSERT_NO_FATAL_FAILURE( | 734 ASSERT_NO_FATAL_FAILURE( |
733 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 735 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
734 } | 736 } |
735 | 737 |
736 TEST_F(AesDecryptorTest, LatestKeyUsedAfterCloseSession) { | 738 TEST_F(AesDecryptorTest, LatestKeyUsedAfterCloseSession) { |
737 std::string session_id1 = CreateSession(key_id_); | 739 std::string session_id1 = CreateSession(key_id_); |
738 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 740 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
739 encrypted_data_, key_id_, iv_, no_subsample_entries_); | 741 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
740 UpdateSessionAndExpect(session_id1, kKeyAsJWK, RESOLVED); | 742 UpdateSessionAndExpect(session_id1, kKeyAsJWK, RESOLVED, true); |
741 ASSERT_NO_FATAL_FAILURE( | 743 ASSERT_NO_FATAL_FAILURE( |
742 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 744 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
743 | 745 |
744 // Create a second session with a different key value for key_id_. | 746 // Create a second session with a different key value for key_id_. |
745 std::string session_id2 = CreateSession(key_id_); | 747 std::string session_id2 = CreateSession(key_id_); |
746 UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, RESOLVED); | 748 UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, RESOLVED, true); |
747 | 749 |
748 // Should not be able to decode with new key. | 750 // Should not be able to decode with new key. |
749 ASSERT_NO_FATAL_FAILURE( | 751 ASSERT_NO_FATAL_FAILURE( |
750 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); | 752 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); |
751 | 753 |
752 // Close second session, should revert to original key. | 754 // Close second session, should revert to original key. |
753 CloseSession(session_id2); | 755 CloseSession(session_id2); |
754 ASSERT_NO_FATAL_FAILURE( | 756 ASSERT_NO_FATAL_FAILURE( |
755 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 757 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
756 } | 758 } |
757 | 759 |
758 TEST_F(AesDecryptorTest, JWKKey) { | 760 TEST_F(AesDecryptorTest, JWKKey) { |
759 std::string session_id = CreateSession(key_id_); | 761 std::string session_id = CreateSession(key_id_); |
760 | 762 |
761 // Try a simple JWK key (i.e. not in a set) | 763 // Try a simple JWK key (i.e. not in a set) |
762 const std::string kJwkSimple = | 764 const std::string kJwkSimple = |
763 "{" | 765 "{" |
764 " \"kty\": \"oct\"," | 766 " \"kty\": \"oct\"," |
765 " \"alg\": \"A128KW\"," | 767 " \"alg\": \"A128KW\"," |
766 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | 768 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
767 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | 769 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
768 "}"; | 770 "}"; |
769 UpdateSessionAndExpect(session_id, kJwkSimple, REJECTED); | 771 UpdateSessionAndExpect(session_id, kJwkSimple, REJECTED, true); |
770 | 772 |
771 // Try a key list with multiple entries. | 773 // Try a key list with multiple entries. |
772 const std::string kJwksMultipleEntries = | 774 const std::string kJwksMultipleEntries = |
773 "{" | 775 "{" |
774 " \"keys\": [" | 776 " \"keys\": [" |
775 " {" | 777 " {" |
776 " \"kty\": \"oct\"," | 778 " \"kty\": \"oct\"," |
777 " \"alg\": \"A128KW\"," | 779 " \"alg\": \"A128KW\"," |
778 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | 780 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
779 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | 781 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
780 " }," | 782 " }," |
781 " {" | 783 " {" |
782 " \"kty\": \"oct\"," | 784 " \"kty\": \"oct\"," |
783 " \"alg\": \"A128KW\"," | 785 " \"alg\": \"A128KW\"," |
784 " \"kid\": \"JCUmJygpKissLS4vMA\"," | 786 " \"kid\": \"JCUmJygpKissLS4vMA\"," |
785 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4_QA\"" | 787 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4_QA\"" |
786 " }" | 788 " }" |
787 " ]" | 789 " ]" |
788 "}"; | 790 "}"; |
789 UpdateSessionAndExpect(session_id, kJwksMultipleEntries, RESOLVED); | 791 UpdateSessionAndExpect(session_id, kJwksMultipleEntries, RESOLVED, true); |
790 | 792 |
791 // Try a key with no spaces and some \n plus additional fields. | 793 // Try a key with no spaces and some \n plus additional fields. |
792 const std::string kJwksNoSpaces = | 794 const std::string kJwksNoSpaces = |
793 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," | 795 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," |
794 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg" | 796 "\"kid\":\"AQIDBAUGBwgJCgsMCg4PAA\",\"k\":\"GawgguFyGrWKav7AX4VKUg" |
795 "\",\"foo\":\"bar\"}]}\n\n"; | 797 "\",\"foo\":\"bar\"}]}\n\n"; |
796 UpdateSessionAndExpect(session_id, kJwksNoSpaces, RESOLVED); | 798 UpdateSessionAndExpect(session_id, kJwksNoSpaces, RESOLVED, true); |
797 | 799 |
798 // Try some non-ASCII characters. | 800 // Try some non-ASCII characters. |
799 UpdateSessionAndExpect( | 801 UpdateSessionAndExpect(session_id, |
800 session_id, "This is not ASCII due to \xff\xfe\xfd in it.", REJECTED); | 802 "This is not ASCII due to \xff\xfe\xfd in it.", |
| 803 REJECTED, true); |
801 | 804 |
802 // Try a badly formatted key. Assume that the JSON parser is fully tested, | 805 // Try a badly formatted key. Assume that the JSON parser is fully tested, |
803 // so we won't try a lot of combinations. However, need a test to ensure | 806 // so we won't try a lot of combinations. However, need a test to ensure |
804 // that the code doesn't crash if invalid JSON received. | 807 // that the code doesn't crash if invalid JSON received. |
805 UpdateSessionAndExpect(session_id, "This is not a JSON key.", REJECTED); | 808 UpdateSessionAndExpect(session_id, "This is not a JSON key.", REJECTED, true); |
806 | 809 |
807 // Try passing some valid JSON that is not a dictionary at the top level. | 810 // Try passing some valid JSON that is not a dictionary at the top level. |
808 UpdateSessionAndExpect(session_id, "40", REJECTED); | 811 UpdateSessionAndExpect(session_id, "40", REJECTED, true); |
809 | 812 |
810 // Try an empty dictionary. | 813 // Try an empty dictionary. |
811 UpdateSessionAndExpect(session_id, "{ }", REJECTED); | 814 UpdateSessionAndExpect(session_id, "{ }", REJECTED, true); |
812 | 815 |
813 // Try an empty 'keys' dictionary. | 816 // Try an empty 'keys' dictionary. |
814 UpdateSessionAndExpect(session_id, "{ \"keys\": [] }", REJECTED); | 817 UpdateSessionAndExpect(session_id, "{ \"keys\": [] }", REJECTED, true); |
815 | 818 |
816 // Try with 'keys' not a dictionary. | 819 // Try with 'keys' not a dictionary. |
817 UpdateSessionAndExpect(session_id, "{ \"keys\":\"1\" }", REJECTED); | 820 UpdateSessionAndExpect(session_id, "{ \"keys\":\"1\" }", REJECTED, true); |
818 | 821 |
819 // Try with 'keys' a list of integers. | 822 // Try with 'keys' a list of integers. |
820 UpdateSessionAndExpect(session_id, "{ \"keys\": [ 1, 2, 3 ] }", REJECTED); | 823 UpdateSessionAndExpect(session_id, "{ \"keys\": [ 1, 2, 3 ] }", REJECTED, |
| 824 true); |
821 | 825 |
822 // Try padding(=) at end of 'k' base64 string. | 826 // Try padding(=) at end of 'k' base64 string. |
823 const std::string kJwksWithPaddedKey = | 827 const std::string kJwksWithPaddedKey = |
824 "{" | 828 "{" |
825 " \"keys\": [" | 829 " \"keys\": [" |
826 " {" | 830 " {" |
827 " \"kty\": \"oct\"," | 831 " \"kty\": \"oct\"," |
828 " \"alg\": \"A128KW\"," | 832 " \"alg\": \"A128KW\"," |
829 " \"kid\": \"AAECAw\"," | 833 " \"kid\": \"AAECAw\"," |
830 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" | 834 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" |
831 " }" | 835 " }" |
832 " ]" | 836 " ]" |
833 "}"; | 837 "}"; |
834 UpdateSessionAndExpect(session_id, kJwksWithPaddedKey, REJECTED); | 838 UpdateSessionAndExpect(session_id, kJwksWithPaddedKey, REJECTED, true); |
835 | 839 |
836 // Try padding(=) at end of 'kid' base64 string. | 840 // Try padding(=) at end of 'kid' base64 string. |
837 const std::string kJwksWithPaddedKeyId = | 841 const std::string kJwksWithPaddedKeyId = |
838 "{" | 842 "{" |
839 " \"keys\": [" | 843 " \"keys\": [" |
840 " {" | 844 " {" |
841 " \"kty\": \"oct\"," | 845 " \"kty\": \"oct\"," |
842 " \"alg\": \"A128KW\"," | 846 " \"alg\": \"A128KW\"," |
843 " \"kid\": \"AAECAw==\"," | 847 " \"kid\": \"AAECAw==\"," |
844 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 848 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
845 " }" | 849 " }" |
846 " ]" | 850 " ]" |
847 "}"; | 851 "}"; |
848 UpdateSessionAndExpect(session_id, kJwksWithPaddedKeyId, REJECTED); | 852 UpdateSessionAndExpect(session_id, kJwksWithPaddedKeyId, REJECTED, true); |
849 | 853 |
850 // Try a key with invalid base64 encoding. | 854 // Try a key with invalid base64 encoding. |
851 const std::string kJwksWithInvalidBase64 = | 855 const std::string kJwksWithInvalidBase64 = |
852 "{" | 856 "{" |
853 " \"keys\": [" | 857 " \"keys\": [" |
854 " {" | 858 " {" |
855 " \"kty\": \"oct\"," | 859 " \"kty\": \"oct\"," |
856 " \"alg\": \"A128KW\"," | 860 " \"alg\": \"A128KW\"," |
857 " \"kid\": \"!@#$%^&*()\"," | 861 " \"kid\": \"!@#$%^&*()\"," |
858 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 862 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
859 " }" | 863 " }" |
860 " ]" | 864 " ]" |
861 "}"; | 865 "}"; |
862 UpdateSessionAndExpect(session_id, kJwksWithInvalidBase64, REJECTED); | 866 UpdateSessionAndExpect(session_id, kJwksWithInvalidBase64, REJECTED, true); |
863 | 867 |
864 // Try a 3-byte 'kid' where no base64 padding is required. | 868 // Try a 3-byte 'kid' where no base64 padding is required. |
865 // |kJwksMultipleEntries| above has 2 'kid's that require 1 and 2 padding | 869 // |kJwksMultipleEntries| above has 2 'kid's that require 1 and 2 padding |
866 // bytes. Note that 'k' has to be 16 bytes, so it will always require padding. | 870 // bytes. Note that 'k' has to be 16 bytes, so it will always require padding. |
867 const std::string kJwksWithNoPadding = | 871 const std::string kJwksWithNoPadding = |
868 "{" | 872 "{" |
869 " \"keys\": [" | 873 " \"keys\": [" |
870 " {" | 874 " {" |
871 " \"kty\": \"oct\"," | 875 " \"kty\": \"oct\"," |
872 " \"alg\": \"A128KW\"," | 876 " \"alg\": \"A128KW\"," |
873 " \"kid\": \"Kiss\"," | 877 " \"kid\": \"Kiss\"," |
874 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 878 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
875 " }" | 879 " }" |
876 " ]" | 880 " ]" |
877 "}"; | 881 "}"; |
878 UpdateSessionAndExpect(session_id, kJwksWithNoPadding, RESOLVED); | 882 UpdateSessionAndExpect(session_id, kJwksWithNoPadding, RESOLVED, true); |
879 | 883 |
880 // Empty key id. | 884 // Empty key id. |
881 const std::string kJwksWithEmptyKeyId = | 885 const std::string kJwksWithEmptyKeyId = |
882 "{" | 886 "{" |
883 " \"keys\": [" | 887 " \"keys\": [" |
884 " {" | 888 " {" |
885 " \"kty\": \"oct\"," | 889 " \"kty\": \"oct\"," |
886 " \"alg\": \"A128KW\"," | 890 " \"alg\": \"A128KW\"," |
887 " \"kid\": \"\"," | 891 " \"kid\": \"\"," |
888 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 892 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
889 " }" | 893 " }" |
890 " ]" | 894 " ]" |
891 "}"; | 895 "}"; |
892 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, REJECTED); | 896 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, REJECTED, true); |
893 CloseSession(session_id); | 897 CloseSession(session_id); |
894 } | 898 } |
895 | 899 |
896 TEST_F(AesDecryptorTest, GetKeyIds) { | 900 TEST_F(AesDecryptorTest, GetKeyIds) { |
897 std::vector<uint8> key_id1(kKeyId, kKeyId + arraysize(kKeyId)); | 901 std::vector<uint8> key_id1(kKeyId, kKeyId + arraysize(kKeyId)); |
898 std::vector<uint8> key_id2(kKeyId2, kKeyId2 + arraysize(kKeyId2)); | 902 std::vector<uint8> key_id2(kKeyId2, kKeyId2 + arraysize(kKeyId2)); |
899 | 903 |
900 std::string session_id = CreateSession(key_id_); | 904 std::string session_id = CreateSession(key_id_); |
901 EXPECT_FALSE(KeysInfoContains(key_id1)); | 905 EXPECT_FALSE(KeysInfoContains(key_id1)); |
902 EXPECT_FALSE(KeysInfoContains(key_id2)); | 906 EXPECT_FALSE(KeysInfoContains(key_id2)); |
903 | 907 |
904 // Add 1 key, verify it is returned. | 908 // Add 1 key, verify it is returned. |
905 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED); | 909 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
906 EXPECT_TRUE(KeysInfoContains(key_id1)); | 910 EXPECT_TRUE(KeysInfoContains(key_id1)); |
907 EXPECT_FALSE(KeysInfoContains(key_id2)); | 911 EXPECT_FALSE(KeysInfoContains(key_id2)); |
908 | 912 |
909 // Add second key, verify both IDs returned. | 913 // Add second key, verify both IDs returned. |
910 UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED); | 914 UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED, true); |
911 EXPECT_TRUE(KeysInfoContains(key_id1)); | 915 EXPECT_TRUE(KeysInfoContains(key_id1)); |
912 EXPECT_TRUE(KeysInfoContains(key_id2)); | 916 EXPECT_TRUE(KeysInfoContains(key_id2)); |
913 } | 917 } |
914 | 918 |
| 919 TEST_F(AesDecryptorTest, NoKeysChangeForSameKey) { |
| 920 std::vector<uint8> key_id(kKeyId, kKeyId + arraysize(kKeyId)); |
| 921 |
| 922 std::string session_id = CreateSession(key_id_); |
| 923 EXPECT_FALSE(KeysInfoContains(key_id)); |
| 924 |
| 925 // Add key, verify it is returned. |
| 926 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
| 927 EXPECT_TRUE(KeysInfoContains(key_id)); |
| 928 |
| 929 // Add key a second time. |
| 930 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, false); |
| 931 EXPECT_TRUE(KeysInfoContains(key_id)); |
| 932 |
| 933 // Create a new session. Add key, should indicate key added for this session. |
| 934 std::string session_id2 = CreateSession(key_id_); |
| 935 UpdateSessionAndExpect(session_id2, kKeyAsJWK, RESOLVED, true); |
| 936 } |
| 937 |
915 } // namespace media | 938 } // namespace media |
OLD | NEW |