1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifndef CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_ 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/containers/hash_tables.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decryptor.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/media_keys.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_PEPPER_CDMS) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/crypto/pepper_cdm_wrapper.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GURL; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content { 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class RendererCdmManager; 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(ENABLE_BROWSER_CDMS) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// ProxyDecryptor is for EME v0.1b only. It should not be used for the WD API. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A decryptor proxy that creates a real decryptor object on demand and 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forwards decryptor calls to it. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(xhwang): Currently we don't support run-time switching among decryptor 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// objects. Fix this when needed. 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(xhwang): The ProxyDecryptor is not a Decryptor. Find a better name! 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProxyDecryptor { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // These are similar to the callbacks in media_keys.h, but pass back the 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // web session ID rather than the internal session ID. 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::Callback<void(const std::string& session_id)> KeyAddedCB; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::Callback<void(const std::string& session_id, 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media::MediaKeys::KeyError error_code, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32 system_code)> KeyErrorCB; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::Callback<void(const std::string& session_id, 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<uint8>& message, 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GURL& destination_url)> KeyMessageCB; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProxyDecryptor( 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_PEPPER_CDMS) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const CreatePepperCdmCB& create_pepper_cdm_cb, 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#elif defined(ENABLE_BROWSER_CDMS) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererCdmManager* manager, 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(ENABLE_PEPPER_CDMS) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const KeyAddedCB& key_added_cb, 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const KeyErrorCB& key_error_cb, 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const KeyMessageCB& key_message_cb); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProxyDecryptor(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the Decryptor associated with this object. May be NULL if no 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Decryptor is associated. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::Decryptor* GetDecryptor(); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Returns the CDM ID associated with this object. May be kInvalidCdmId if no 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // CDM ID is associated, such as when Clear Key is used. 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int GetCdmId(); 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Only call this once. 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool InitializeCDM(const std::string& key_system, 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GURL& security_origin); 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // May only be called after InitializeCDM() succeeds. 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool GenerateKeyRequest(const std::string& type, 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const uint8* init_data, 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int init_data_length); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void AddKey(const uint8* key, int key_length, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const uint8* init_data, int init_data_length, 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& session_id); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CancelKeyRequest(const std::string& session_id); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Helper function to create MediaKeys to handle the given |key_system|. 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<media::MediaKeys> CreateMediaKeys(const std::string& key_system, 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GURL& security_origin); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Callbacks for firing session events. 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionMessage(const std::string& web_session_id, 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<uint8>& message, 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& default_url); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnSessionKeysChange(const std::string& web_session_id, 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_additional_usable_key); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnSessionExpirationUpdate(const std::string& web_session_id, 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Time& new_expiry_time); 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionReady(const std::string& web_session_id); 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionClosed(const std::string& web_session_id); 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void OnSessionError(const std::string& web_session_id, 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media::MediaKeys::Exception exception_code, 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message); 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) enum SessionCreationType { 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TemporarySession, 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PersistentSession, 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadSession 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) }; 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Called when a session is actually created or loaded. 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void SetSessionId(SessionCreationType session_type, 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string& web_session_id); 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_PEPPER_CDMS) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Callback to create the Pepper plugin. 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreatePepperCdmCB create_pepper_cdm_cb_; 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#elif defined(ENABLE_BROWSER_CDMS) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererCdmManager* manager_; 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int cdm_id_; 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(ENABLE_PEPPER_CDMS) 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The real MediaKeys that manages key operations for the ProxyDecryptor. 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<media::MediaKeys> media_keys_; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callbacks for firing key events. 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) KeyAddedCB key_added_cb_; 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) KeyErrorCB key_error_cb_; 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) KeyMessageCB key_message_cb_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Keep track of both persistent and non-persistent sessions. 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::hash_map<std::string, bool> active_sessions_; 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_clear_key_; 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // NOTE: Weak pointers must be invalidated before all other member variables. 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::WeakPtrFactory<ProxyDecryptor> weak_ptr_factory_; 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProxyDecryptor); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace content 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_ 143