summaryrefslogtreecommitdiffstats
path: root/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h')
-rw-r--r--media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h b/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h
new file mode 100644
index 000000000..7a6c9a560
--- /dev/null
+++ b/media/gmp-clearkey/0.1/ClearKeyDecryptionManager.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2015, Mozilla Foundation and contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ClearKeyDecryptionManager_h__
+#define __ClearKeyDecryptionManager_h__
+
+#include <map>
+
+#include "ClearKeyUtils.h"
+#include "RefCounted.h"
+
+class ClearKeyDecryptor;
+
+class CryptoMetaData {
+public:
+ CryptoMetaData() {}
+
+ explicit CryptoMetaData(const GMPEncryptedBufferMetadata* aCrypto)
+ {
+ Init(aCrypto);
+ }
+
+ void Init(const GMPEncryptedBufferMetadata* aCrypto)
+ {
+ if (!aCrypto) {
+ assert(!IsValid());
+ return;
+ }
+ Assign(mKeyId, aCrypto->KeyId(), aCrypto->KeyIdSize());
+ Assign(mIV, aCrypto->IV(), aCrypto->IVSize());
+ Assign(mClearBytes, aCrypto->ClearBytes(), aCrypto->NumSubsamples());
+ Assign(mCipherBytes, aCrypto->CipherBytes(), aCrypto->NumSubsamples());
+ }
+
+ bool IsValid() const {
+ return !mKeyId.empty() &&
+ !mIV.empty() &&
+ !mCipherBytes.empty() &&
+ !mClearBytes.empty();
+ }
+
+ size_t NumSubsamples() const {
+ assert(mClearBytes.size() == mCipherBytes.size());
+ return mClearBytes.size();
+ }
+
+ std::vector<uint8_t> mKeyId;
+ std::vector<uint8_t> mIV;
+ std::vector<uint16_t> mClearBytes;
+ std::vector<uint32_t> mCipherBytes;
+};
+
+class ClearKeyDecryptionManager : public RefCounted
+{
+private:
+ ClearKeyDecryptionManager();
+ ~ClearKeyDecryptionManager();
+
+ static ClearKeyDecryptionManager* sInstance;
+
+public:
+ static ClearKeyDecryptionManager* Get();
+
+ bool HasSeenKeyId(const KeyId& aKeyId) const;
+ bool HasKeyForKeyId(const KeyId& aKeyId) const;
+
+ const Key& GetDecryptionKey(const KeyId& aKeyId);
+
+ // Create a decryptor for the given KeyId if one does not already exist.
+ void InitKey(KeyId aKeyId, Key aKey);
+ void ExpectKeyId(KeyId aKeyId);
+ void ReleaseKeyId(KeyId aKeyId);
+
+ // Decrypts buffer *in place*.
+ GMPErr Decrypt(uint8_t* aBuffer, uint32_t aBufferSize,
+ const CryptoMetaData& aMetadata);
+ GMPErr Decrypt(std::vector<uint8_t>& aBuffer,
+ const CryptoMetaData& aMetadata);
+
+ void Shutdown();
+
+private:
+ bool IsExpectingKeyForKeyId(const KeyId& aKeyId) const;
+
+ std::map<KeyId, ClearKeyDecryptor*> mDecryptors;
+};
+
+#endif // __ClearKeyDecryptionManager_h__