OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef MEDIA_CRYPTO_AES_DECRYPTOR_H_ | |
6 #define MEDIA_CRYPTO_AES_DECRYPTOR_H_ | |
7 | |
8 #include <string> | |
9 | |
10 #include "base/basictypes.h" | |
11 #include "base/containers/hash_tables.h" | |
12 #include "base/memory/ref_counted.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "base/strings/string_piece.h" | |
15 #include "base/synchronization/lock.h" | |
16 #include "media/base/decryptor.h" | |
17 #include "media/base/media_export.h" | |
18 #include "media/base/media_keys.h" | |
19 | |
20 namespace crypto { | |
21 class SymmetricKey; | |
22 } | |
23 | |
24 namespace media { | |
25 | |
26 // Decrypts an AES encrypted buffer into an unencrypted buffer. The AES | |
27 // encryption must be CTR with a key size of 128bits. | |
28 class MEDIA_EXPORT AesDecryptor : public MediaKeys, public Decryptor { | |
29 public: | |
30 AesDecryptor(const KeyAddedCB& key_added_cb, | |
31 const KeyErrorCB& key_error_cb, | |
32 const KeyMessageCB& key_message_cb); | |
33 virtual ~AesDecryptor(); | |
34 | |
35 // MediaKeys implementation. | |
36 virtual bool GenerateKeyRequest(const std::string& type, | |
37 const uint8* init_data, | |
38 int init_data_length) OVERRIDE; | |
39 virtual void AddKey(const uint8* key, int key_length, | |
40 const uint8* init_data, int init_data_length, | |
41 const std::string& session_id) OVERRIDE; | |
42 virtual void CancelKeyRequest(const std::string& session_id) OVERRIDE; | |
43 virtual Decryptor* GetDecryptor() OVERRIDE; | |
44 | |
45 // Decryptor implementation. | |
46 virtual void RegisterNewKeyCB(StreamType stream_type, | |
47 const NewKeyCB& key_added_cb) OVERRIDE; | |
48 virtual void Decrypt(StreamType stream_type, | |
49 const scoped_refptr<DecoderBuffer>& encrypted, | |
50 const DecryptCB& decrypt_cb) OVERRIDE; | |
51 virtual void CancelDecrypt(StreamType stream_type) OVERRIDE; | |
52 virtual void InitializeAudioDecoder(const AudioDecoderConfig& config, | |
53 const DecoderInitCB& init_cb) OVERRIDE; | |
54 virtual void InitializeVideoDecoder(const VideoDecoderConfig& config, | |
55 const DecoderInitCB& init_cb) OVERRIDE; | |
56 virtual void DecryptAndDecodeAudio( | |
57 const scoped_refptr<DecoderBuffer>& encrypted, | |
58 const AudioDecodeCB& audio_decode_cb) OVERRIDE; | |
59 virtual void DecryptAndDecodeVideo( | |
60 const scoped_refptr<DecoderBuffer>& encrypted, | |
61 const VideoDecodeCB& video_decode_cb) OVERRIDE; | |
62 virtual void ResetDecoder(StreamType stream_type) OVERRIDE; | |
63 virtual void DeinitializeDecoder(StreamType stream_type) OVERRIDE; | |
64 | |
65 private: | |
66 // TODO(fgalligan): Remove this and change KeyMap to use crypto::SymmetricKey | |
67 // as there are no decryptors that are performing an integrity check. | |
68 // Helper class that manages the decryption key. | |
69 class DecryptionKey { | |
70 public: | |
71 explicit DecryptionKey(const std::string& secret); | |
72 ~DecryptionKey(); | |
73 | |
74 // Creates the encryption key. | |
75 bool Init(); | |
76 | |
77 crypto::SymmetricKey* decryption_key() { return decryption_key_.get(); } | |
78 | |
79 private: | |
80 // The base secret that is used to create the decryption key. | |
81 const std::string secret_; | |
82 | |
83 // The key used to decrypt the data. | |
84 scoped_ptr<crypto::SymmetricKey> decryption_key_; | |
85 | |
86 DISALLOW_COPY_AND_ASSIGN(DecryptionKey); | |
87 }; | |
88 | |
89 // Sets |key| for |key_id|. The AesDecryptor takes the ownership of the |key|. | |
90 void SetKey(const std::string& key_id, scoped_ptr<DecryptionKey> key); | |
91 | |
92 // Gets a DecryptionKey associated with |key_id|. The AesDecryptor still owns | |
93 // the key. Returns NULL if no key is associated with |key_id|. | |
94 DecryptionKey* GetKey(const std::string& key_id) const; | |
95 | |
96 // Callbacks for firing key events. | |
97 KeyAddedCB key_added_cb_; | |
98 KeyErrorCB key_error_cb_; | |
99 KeyMessageCB key_message_cb_; | |
100 | |
101 // KeyMap owns the DecryptionKey* and must delete them when they are | |
102 // not needed any more. | |
103 typedef base::hash_map<std::string, DecryptionKey*> KeyMap; | |
104 | |
105 // Since only Decrypt() is called off the renderer thread, we only need to | |
106 // protect |key_map_|, the only member variable that is shared between | |
107 // Decrypt() and other methods. | |
108 KeyMap key_map_; // Protected by the |key_map_lock_|. | |
109 mutable base::Lock key_map_lock_; // Protects the |key_map_|. | |
110 | |
111 // Make session ID unique per renderer by making it static. | |
112 // TODO(xhwang): Make session ID more strictly defined if needed: | |
113 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=16739#c0 | |
114 static uint32 next_session_id_; | |
115 | |
116 NewKeyCB new_audio_key_cb_; | |
117 NewKeyCB new_video_key_cb_; | |
118 | |
119 DISALLOW_COPY_AND_ASSIGN(AesDecryptor); | |
120 }; | |
121 | |
122 } // namespace media | |
123 | |
124 #endif // MEDIA_CRYPTO_AES_DECRYPTOR_H_ | |
OLD | NEW |