Chromium Code Reviews| Index: media/crypto/aes_decryptor.h |
| diff --git a/media/crypto/aes_decryptor.h b/media/crypto/aes_decryptor.h |
| index 72010526a90323430d716d349f63eec8b56d04cf..b54a91420b4d7e287c881ec3747ee775c72228dd 100644 |
| --- a/media/crypto/aes_decryptor.h |
| +++ b/media/crypto/aes_decryptor.h |
| @@ -10,6 +10,8 @@ |
| #include "base/basictypes.h" |
| #include "base/hash_tables.h" |
| #include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "base/string_piece.h" |
| #include "base/synchronization/lock.h" |
| #include "media/base/decryptor.h" |
| #include "media/base/media_export.h" |
| @@ -22,7 +24,9 @@ namespace media { |
| class DecryptorClient; |
| -// Decryptor implementation that decrypts AES-encrypted buffer. |
| +// Decrypts an AES encrypted buffer into an unencrypted buffer. The AES |
| +// encryption must be CTR with a key size of 128bits. Optionally checks the |
| +// integrity of the encrypted data. |
| class MEDIA_EXPORT AesDecryptor : public Decryptor { |
| public: |
| // The AesDecryptor does not take ownership of the |client|. The |client| |
| @@ -42,13 +46,50 @@ class MEDIA_EXPORT AesDecryptor : public Decryptor { |
| const std::string& session_id) OVERRIDE; |
| virtual void CancelKeyRequest(const std::string& key_system, |
| const std::string& session_id) OVERRIDE; |
| + |
| + // Decrypts |input| buffer. |input| should not be NULL. |input| will signal |
| + // if an integrity check must be performed before decryption. Return a |
| + // DecoderBuffer with the decrypted data if the decryption succeeded. Return |
| + // NULL if the integrity check or decryption failed. |
| virtual scoped_refptr<DecoderBuffer> Decrypt( |
| const scoped_refptr<DecoderBuffer>& input) OVERRIDE; |
| private: |
| - // KeyMap owns the crypto::SymmetricKey* and must delete them when they are |
| + // Helper class that manages the decryption key and HMAC key. The HMAC key |
| + // may be NULL. |
| + class DecryptionKey { |
| + public: |
| + explicit DecryptionKey(const std::string& secret); |
| + ~DecryptionKey(); |
| + |
| + // Creates the HMAC and encryption key. If |derive_webm_keys| is true then |
|
ddorwin
2012/07/14 00:50:31
encryption key and HMAC
fgalligan1
2012/07/16 23:51:42
Done.
|
| + // the object will derive the decryption key and the HMAC key from |
| + // |secret_|. |
| + bool Init(bool derive_webm_keys); |
| + |
| + crypto::SymmetricKey* decryption_key() { return decryption_key_.get(); } |
| + base::StringPiece hmac_key() { return base::StringPiece(hmac_key_); } |
| + |
| + private: |
| + // The base secret that is used to derive the decryption key and optionally |
| + // the HMAC key. |
| + const std::string secret_; |
| + |
| + // The key used to decrypt the data. |
| + scoped_ptr<crypto::SymmetricKey> decryption_key_; |
| + |
| + // The key used to perform the integrity check. Currently the HMAC key is |
| + // defined by the WebM encrypted specification. Current encrypted WebM |
| + // request for comments specification is here |
| + // http://wiki.webmproject.org/encryption/webm-encryption-rfc |
| + std::string hmac_key_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(DecryptionKey); |
| + }; |
| + |
| + // KeyMap owns the DecryptionKey* and must delete them when they are |
| // not needed any more. |
| - typedef base::hash_map<std::string, crypto::SymmetricKey*> KeyMap; |
| + typedef base::hash_map<std::string, DecryptionKey*> KeyMap; |
| // Since only Decrypt() is called off the renderer thread, we only need to |
| // protect |key_map_|, the only member variable that is shared between |