Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: media/crypto/decryptor.cc

Issue 10535029: Add support for encrypted WebM files as defined in the RFC. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Updated encrypted WebM test data. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/crypto/decryptor.cc
diff --git a/media/crypto/decryptor.cc b/media/crypto/decryptor.cc
new file mode 100755
index 0000000000000000000000000000000000000000..f6a2170e0e1d63da71281edb935a8bb8ec50c122
--- /dev/null
+++ b/media/crypto/decryptor.cc
@@ -0,0 +1,74 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/crypto/decryptor.h"
+
+#include "base/logging.h"
+#include "crypto/encryptor.h"
+#include "media/base/decoder_buffer.h"
+#include "media/base/decrypt_config.h"
+
+namespace media {
+
+Decryptor::Decryptor() {}
+
+Decryptor::~Decryptor() {}
+
+scoped_refptr<DecoderBuffer> Decryptor::DecryptData(const DecoderBuffer& input,
+ crypto::SymmetricKey* key,
+ int offset) {
+ CHECK(input.GetDataSize());
+ CHECK(input.GetDecryptConfig());
+ CHECK(key);
+
+ // Initialize encryption data.
+ crypto::Encryptor encryptor;
+ if (!encryptor.Init(key, crypto::Encryptor::CTR, "")) {
+ DVLOG(1) << "Could not initialize encryptor.";
+ return NULL;
+ }
+
+ // Set the counter block.
+ std::string counter_block =
+ Decryptor::GenerateCounterBlock(input.GetDecryptConfig()->iv());
+ if (counter_block.empty()) {
+ DVLOG(1) << "Could not generate counter block.";
+ return NULL;
+ }
+ if (!encryptor.SetCounter(counter_block)) {
+ DVLOG(1) << "Could not set counter block.";
+ return NULL;
+ }
+
+ std::string decrypted_text;
+ const char* frame = reinterpret_cast<const char*>(input.GetData() + offset);
+ int frame_size = input.GetDataSize() - offset;
+ base::StringPiece encrypted_text(frame, frame_size);
+ if (!encryptor.Decrypt(encrypted_text, &decrypted_text)) {
+ DVLOG(1) << "Could not decrypt data.";
+ return NULL;
+ }
+
+ // TODO(xhwang): Find a way to avoid this data copy.
+ return DecoderBuffer::CopyFrom(
+ reinterpret_cast<const uint8*>(decrypted_text.data()),
+ decrypted_text.size());
+}
+
+std::string Decryptor::GenerateCounterBlock(uint64 iv) {
+ char counter_block_data[DecryptConfig::kKeySize];
+
+ // Set the IV.
+ memcpy(counter_block_data, &iv, sizeof(iv));
+
+ // Set block counter to all 0's.
+ memset(counter_block_data + sizeof(iv),
+ 0,
+ DecryptConfig::kKeySize - sizeof(iv));
+
+ std::string counter_block(counter_block_data, DecryptConfig::kKeySize);
+ return counter_block;
+}
+
+} // namespace media

Powered by Google App Engine
This is Rietveld 408576698