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