Index: media/webm/webm_crypto_helpers.cc |
diff --git a/media/webm/webm_crypto_helpers.cc b/media/webm/webm_crypto_helpers.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7a7a1413558362d6893ab2321d6584c691472680 |
--- /dev/null |
+++ b/media/webm/webm_crypto_helpers.cc |
@@ -0,0 +1,51 @@ |
+// Copyright (c) 2013 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/webm/webm_crypto_helpers.h" |
+ |
+#include "base/logging.h" |
+#include "base/sys_byteorder.h" |
+#include "media/base/decrypt_config.h" |
+#include "media/webm/webm_constants.h" |
+ |
+namespace media { |
+ |
+std::string GenerateWebMCounterBlock(const uint8* iv, int iv_size) { |
+ std::string counter_block(reinterpret_cast<const char*>(iv), iv_size); |
+ counter_block.append(DecryptConfig::kDecryptionKeySize - iv_size, 0); |
+ return counter_block; |
+} |
+ |
+scoped_ptr<DecryptConfig> WebMCreateDecryptConfig( |
+ const uint8* data, int data_size, |
+ const uint8* key_id, int key_id_size) { |
+ CHECK(data_size >= kWebMSignalByteSize) |
ddorwin
2013/03/10 21:29:39
Is this a programming or media error?
fgalligan1
2013/03/12 00:42:42
Could be either I guess. But most likely a media e
|
+ << "Got an encrypted block with not enough data " |
ddorwin
2013/03/10 21:29:39
I assume this is included in the prod binary. Shou
fgalligan1
2013/03/12 00:42:42
I copied this from media source. Should I change i
ddorwin
2013/03/12 04:40:06
It's only non-D CHECK strings that (might) remain
|
+ << data_size; |
+ uint8 signal_byte = data[0]; |
+ int frame_offset = sizeof(signal_byte); |
+ |
+ // Setting the DecryptConfig object of the buffer while leaving the |
+ // initialization vector empty will tell the decryptor that the frame is |
+ // unencrypted. |
+ std::string counter_block; |
+ |
+ if (signal_byte & kWebMFlagEncryptedFrame) { |
ddorwin
2013/03/10 21:29:39
Should we DLOG_IF(unsupported bits set) somewhere?
fgalligan1
2013/03/12 00:42:42
I changed this up to return a NULL scoped_ptr so w
|
+ // IVs are only present on encrypted frames. |
+ CHECK(data_size >= kWebMSignalByteSize + kWebMIvSize) |
ddorwin
2013/03/10 21:29:39
same
fgalligan1
2013/03/12 00:42:42
ditto
|
+ << "Got an encrypted block with not enough data " |
+ << data_size; |
+ counter_block = GenerateWebMCounterBlock(data + frame_offset, kWebMIvSize); |
+ frame_offset += kWebMIvSize; |
+ } |
+ |
+ scoped_ptr<DecryptConfig> config(new DecryptConfig( |
+ std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
+ counter_block, |
+ frame_offset, |
+ std::vector<SubsampleEntry>())); |
+ return config.Pass(); |
+} |
+ |
+} // namespace media |