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 "media/cdm/aes_decryptor.h" | 5 #include "media/cdm/aes_decryptor.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | |
9 #include <list> | 8 #include <list> |
| 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
16 #include "crypto/encryptor.h" | 16 #include "crypto/encryptor.h" |
17 #include "crypto/symmetric_key.h" | 17 #include "crypto/symmetric_key.h" |
18 #include "media/base/audio_decoder_config.h" | 18 #include "media/base/audio_decoder_config.h" |
19 #include "media/base/cdm_key_information.h" | 19 #include "media/base/cdm_key_information.h" |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 { | 389 { |
390 base::AutoLock auto_lock(key_map_lock_); | 390 base::AutoLock auto_lock(key_map_lock_); |
391 for (const auto& item : key_map_) { | 391 for (const auto& item : key_map_) { |
392 if (item.second->Contains(session_id)) { | 392 if (item.second->Contains(session_id)) { |
393 keys_info.push_back( | 393 keys_info.push_back( |
394 new CdmKeyInformation(item.first, CdmKeyInformation::USABLE, 0)); | 394 new CdmKeyInformation(item.first, CdmKeyInformation::USABLE, 0)); |
395 } | 395 } |
396 } | 396 } |
397 } | 397 } |
398 | 398 |
399 session_keys_change_cb_.Run(session_id, key_added, keys_info.Pass()); | 399 session_keys_change_cb_.Run(session_id, key_added, std::move(keys_info)); |
400 } | 400 } |
401 | 401 |
402 void AesDecryptor::CloseSession(const std::string& session_id, | 402 void AesDecryptor::CloseSession(const std::string& session_id, |
403 scoped_ptr<SimpleCdmPromise> promise) { | 403 scoped_ptr<SimpleCdmPromise> promise) { |
404 // Validate that this is a reference to an active session and then forget it. | 404 // Validate that this is a reference to an active session and then forget it. |
405 std::set<std::string>::iterator it = valid_sessions_.find(session_id); | 405 std::set<std::string>::iterator it = valid_sessions_.find(session_id); |
406 DCHECK(it != valid_sessions_.end()); | 406 DCHECK(it != valid_sessions_.end()); |
407 | 407 |
408 valid_sessions_.erase(it); | 408 valid_sessions_.erase(it); |
409 | 409 |
410 // Close the session. | 410 // Close the session. |
411 DeleteKeysForSession(session_id); | 411 DeleteKeysForSession(session_id); |
412 promise->resolve(); | 412 promise->resolve(); |
413 session_closed_cb_.Run(session_id); | 413 session_closed_cb_.Run(session_id); |
414 } | 414 } |
415 | 415 |
416 void AesDecryptor::RemoveSession(const std::string& session_id, | 416 void AesDecryptor::RemoveSession(const std::string& session_id, |
417 scoped_ptr<SimpleCdmPromise> promise) { | 417 scoped_ptr<SimpleCdmPromise> promise) { |
418 // AesDecryptor doesn't keep any persistent data, so this should be | 418 // AesDecryptor doesn't keep any persistent data, so this should be |
419 // NOT_REACHED(). | 419 // NOT_REACHED(). |
420 // TODO(jrummell): Make sure persistent session types are rejected. | 420 // TODO(jrummell): Make sure persistent session types are rejected. |
421 // http://crbug.com/384152. | 421 // http://crbug.com/384152. |
422 // | 422 // |
423 // However, v0.1b calls to CancelKeyRequest() will call this, so close the | 423 // However, v0.1b calls to CancelKeyRequest() will call this, so close the |
424 // session, if it exists. | 424 // session, if it exists. |
425 // TODO(jrummell): Remove the close() call when prefixed EME is removed. | 425 // TODO(jrummell): Remove the close() call when prefixed EME is removed. |
426 // http://crbug.com/249976. | 426 // http://crbug.com/249976. |
427 if (valid_sessions_.find(session_id) != valid_sessions_.end()) { | 427 if (valid_sessions_.find(session_id) != valid_sessions_.end()) { |
428 CloseSession(session_id, promise.Pass()); | 428 CloseSession(session_id, std::move(promise)); |
429 return; | 429 return; |
430 } | 430 } |
431 | 431 |
432 promise->reject(INVALID_ACCESS_ERROR, 0, "Session does not exist."); | 432 promise->reject(INVALID_ACCESS_ERROR, 0, "Session does not exist."); |
433 } | 433 } |
434 | 434 |
435 CdmContext* AesDecryptor::GetCdmContext() { | 435 CdmContext* AesDecryptor::GetCdmContext() { |
436 return this; | 436 return this; |
437 } | 437 } |
438 | 438 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 const std::string& key_string) { | 537 const std::string& key_string) { |
538 scoped_ptr<DecryptionKey> decryption_key(new DecryptionKey(key_string)); | 538 scoped_ptr<DecryptionKey> decryption_key(new DecryptionKey(key_string)); |
539 if (!decryption_key->Init()) { | 539 if (!decryption_key->Init()) { |
540 DVLOG(1) << "Could not initialize decryption key."; | 540 DVLOG(1) << "Could not initialize decryption key."; |
541 return false; | 541 return false; |
542 } | 542 } |
543 | 543 |
544 base::AutoLock auto_lock(key_map_lock_); | 544 base::AutoLock auto_lock(key_map_lock_); |
545 KeyIdToSessionKeysMap::iterator key_id_entry = key_map_.find(key_id); | 545 KeyIdToSessionKeysMap::iterator key_id_entry = key_map_.find(key_id); |
546 if (key_id_entry != key_map_.end()) { | 546 if (key_id_entry != key_map_.end()) { |
547 key_id_entry->second->Insert(session_id, decryption_key.Pass()); | 547 key_id_entry->second->Insert(session_id, std::move(decryption_key)); |
548 return true; | 548 return true; |
549 } | 549 } |
550 | 550 |
551 // |key_id| not found, so need to create new entry. | 551 // |key_id| not found, so need to create new entry. |
552 scoped_ptr<SessionIdDecryptionKeyMap> inner_map( | 552 scoped_ptr<SessionIdDecryptionKeyMap> inner_map( |
553 new SessionIdDecryptionKeyMap()); | 553 new SessionIdDecryptionKeyMap()); |
554 inner_map->Insert(session_id, decryption_key.Pass()); | 554 inner_map->Insert(session_id, std::move(decryption_key)); |
555 key_map_.add(key_id, inner_map.Pass()); | 555 key_map_.add(key_id, std::move(inner_map)); |
556 return true; | 556 return true; |
557 } | 557 } |
558 | 558 |
559 AesDecryptor::DecryptionKey* AesDecryptor::GetKey_Locked( | 559 AesDecryptor::DecryptionKey* AesDecryptor::GetKey_Locked( |
560 const std::string& key_id) const { | 560 const std::string& key_id) const { |
561 key_map_lock_.AssertAcquired(); | 561 key_map_lock_.AssertAcquired(); |
562 KeyIdToSessionKeysMap::const_iterator key_id_found = key_map_.find(key_id); | 562 KeyIdToSessionKeysMap::const_iterator key_id_found = key_map_.find(key_id); |
563 if (key_id_found == key_map_.end()) | 563 if (key_id_found == key_map_.end()) |
564 return NULL; | 564 return NULL; |
565 | 565 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 bool AesDecryptor::DecryptionKey::Init() { | 607 bool AesDecryptor::DecryptionKey::Init() { |
608 CHECK(!secret_.empty()); | 608 CHECK(!secret_.empty()); |
609 decryption_key_.reset(crypto::SymmetricKey::Import( | 609 decryption_key_.reset(crypto::SymmetricKey::Import( |
610 crypto::SymmetricKey::AES, secret_)); | 610 crypto::SymmetricKey::AES, secret_)); |
611 if (!decryption_key_) | 611 if (!decryption_key_) |
612 return false; | 612 return false; |
613 return true; | 613 return true; |
614 } | 614 } |
615 | 615 |
616 } // namespace media | 616 } // namespace media |
OLD | NEW |