OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/sys_byteorder.h" | 10 #include "base/sys_byteorder.h" |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
85 "Original data.", 14, | 85 "Original data.", 14, |
86 // key_id | 86 // key_id |
87 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, | 87 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, |
88 0x2c, 0x2d, 0x2e, 0x2f, 0x30 | 88 0x2c, 0x2d, 0x2e, 0x2f, 0x30 |
89 }, 13, | 89 }, 13, |
90 // key | 90 // key |
91 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, | 91 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, |
92 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 | 92 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 |
93 }, 16, | 93 }, 16, |
94 // encrypted_data | 94 // encrypted_data |
95 { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 95 { 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
96 0x01, 0x9c, 0x71, 0x26, 0x57, 0x3e, 0x25, 0x37, | 96 0x00, 0x9c, 0x71, 0x26, 0x57, 0x3e, 0x25, 0x37, |
97 0xf7, 0x31, 0x81, 0x19, 0x64, 0xce, 0xbc | 97 0xf7, 0x31, 0x81, 0x19, 0x64, 0xce, 0xbc |
98 }, 23 | 98 }, 23 |
99 }, | 99 }, |
100 { | 100 { |
101 // plaintext | 101 // plaintext |
102 "Changed Original data.", 22, | 102 "Changed Original data.", 22, |
103 // key_id | 103 // key_id |
104 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, | 104 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, |
105 0x2c, 0x2d, 0x2e, 0x2f, 0x30 | 105 0x2c, 0x2d, 0x2e, 0x2f, 0x30 |
106 }, 13, | 106 }, 13, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
157 | 157 |
158 static const SubsampleEntry kSubsampleEntries[] = { | 158 static const SubsampleEntry kSubsampleEntries[] = { |
159 { 2, 7 }, | 159 { 2, 7 }, |
160 { 3, 11 }, | 160 { 3, 11 }, |
161 { 1, 0 } | 161 { 1, 0 } |
162 }; | 162 }; |
163 | 163 |
164 // Returns a 16 byte CTR counter block. The CTR counter block format is a | 164 // Returns a 16 byte CTR counter block. The CTR counter block format is a |
165 // CTR IV appended with a CTR block counter. |iv| is a CTR IV. |iv_size| is | 165 // CTR IV appended with a CTR block counter. |iv| is a CTR IV. |iv_size| is |
166 // the size of |iv| in bytes. | 166 // the size of |iv| in bytes. |
167 static std::string GenerateCounterBlock(const uint8* iv, int iv_size) { | 167 static std::string GenerateCounterBlock(const std::string& iv) { |
168 const int kDecryptionKeySize = 16; | 168 CHECK_GT(iv.size(), 0UL); |
169 CHECK_GT(iv_size, 0); | 169 CHECK_LE(iv.size(), static_cast<size_t>(DecryptConfig::kDecryptionKeySize)); |
170 CHECK_LE(iv_size, kDecryptionKeySize); | |
171 | 170 |
172 std::string counter_block(reinterpret_cast<const char*>(iv), iv_size); | 171 std::string counter_block(iv); |
173 counter_block.append(kDecryptionKeySize - iv_size, 0); | 172 counter_block.append(DecryptConfig::kDecryptionKeySize - iv.size(), 0); |
ddorwin
2012/10/13 00:26:17
Why wasn't the scoping necessary before?
fgalligan1
2012/10/13 06:20:31
The old version defined the value at the top of th
| |
174 return counter_block; | 173 return counter_block; |
175 } | 174 } |
176 | 175 |
177 // Creates a WebM encrypted buffer that the demuxer would pass to the | 176 // Creates a WebM encrypted buffer that the demuxer would pass to the |
178 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is | 177 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is |
179 // initialization data from the WebM file. Every encrypted Block has | 178 // initialization data from the WebM file. Every encrypted Block has |
180 // a signal byte prepended to a frame. If the frame is encrypted then an IV is | 179 // a signal byte prepended to a frame. If the frame is encrypted then an IV is |
181 // prepended to the Block. Current encrypted WebM request for comments | 180 // prepended to the Block. Current encrypted WebM request for comments |
182 // specification is here | 181 // specification is here |
183 // http://wiki.webmproject.org/encryption/webm-encryption-rfc | 182 // http://wiki.webmproject.org/encryption/webm-encryption-rfc |
184 static scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer( | 183 static scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer( |
185 const uint8* data, int data_size, | 184 const uint8* data, int data_size, |
186 const uint8* key_id, int key_id_size) { | 185 const uint8* key_id, int key_id_size) { |
187 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( | 186 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( |
188 data, data_size); | 187 data, data_size); |
189 CHECK(encrypted_buffer); | 188 CHECK(encrypted_buffer); |
190 | 189 |
191 uint8 signal_byte = data[0]; | 190 uint8 signal_byte = data[0]; |
192 int data_offset = sizeof(signal_byte); | 191 int data_offset = sizeof(signal_byte); |
193 | 192 |
194 // Setting the DecryptConfig object of the buffer while leaving the | 193 // Setting the DecryptConfig object of the buffer while leaving the |
195 // initialization vector empty will tell the decryptor that the frame is | 194 // initialization vector empty will tell the decryptor that the frame is |
196 // unencrypted. | 195 // unencrypted. |
197 std::string counter_block_str; | 196 std::string counter_block_str; |
198 | 197 |
199 if (signal_byte & kWebMFlagEncryptedFrame) { | 198 if (signal_byte & kWebMFlagEncryptedFrame) { |
200 uint64 network_iv; | 199 const std::string iv(reinterpret_cast<const char*>(data + data_offset), |
201 memcpy(&network_iv, data + data_offset, sizeof(network_iv)); | 200 kWebMIvSize); |
202 const uint64 iv = base::NetToHost64(network_iv); | 201 data_offset += kWebMIvSize; |
203 counter_block_str = | 202 counter_block_str = GenerateCounterBlock(iv); |
204 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); | |
205 data_offset += sizeof(iv); | |
206 } | 203 } |
207 | 204 |
208 encrypted_buffer->SetDecryptConfig( | 205 encrypted_buffer->SetDecryptConfig( |
209 scoped_ptr<DecryptConfig>(new DecryptConfig( | 206 scoped_ptr<DecryptConfig>(new DecryptConfig( |
210 std::string(reinterpret_cast<const char*>(key_id), key_id_size), | 207 std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
211 counter_block_str, | 208 counter_block_str, |
212 data_offset, | 209 data_offset, |
213 std::vector<SubsampleEntry>()))); | 210 std::vector<SubsampleEntry>()))); |
214 return encrypted_buffer; | 211 return encrypted_buffer; |
215 } | 212 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 frame2.key, frame2.key_size); | 424 frame2.key, frame2.key_size); |
428 | 425 |
429 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; | 426 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; |
430 scoped_refptr<DecoderBuffer> encrypted_data1 = | 427 scoped_refptr<DecoderBuffer> encrypted_data1 = |
431 CreateWebMEncryptedBuffer(frame1.encrypted_data, | 428 CreateWebMEncryptedBuffer(frame1.encrypted_data, |
432 frame1.encrypted_data_size, | 429 frame1.encrypted_data_size, |
433 frame1.key_id, frame1.key_id_size); | 430 frame1.key_id, frame1.key_id_size); |
434 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data1, | 431 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data1, |
435 frame1.plain_text, | 432 frame1.plain_text, |
436 frame1.plain_text_size)); | 433 frame1.plain_text_size)); |
437 | |
438 scoped_refptr<DecoderBuffer> encrypted_data2 = | 434 scoped_refptr<DecoderBuffer> encrypted_data2 = |
ddorwin
2012/10/13 00:26:17
Is there a reason the empty line was removed?
fgalligan1
2012/10/13 06:20:31
No. I'll put it back to make less noise.
| |
439 CreateWebMEncryptedBuffer(frame2.encrypted_data, | 435 CreateWebMEncryptedBuffer(frame2.encrypted_data, |
440 frame2.encrypted_data_size, | 436 frame2.encrypted_data_size, |
441 frame2.key_id, frame2.key_id_size); | 437 frame2.key_id, frame2.key_id_size); |
442 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, | 438 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, |
443 frame2.plain_text, | 439 frame2.plain_text, |
444 frame2.plain_text_size)); | 440 frame2.plain_text_size)); |
445 } | 441 } |
446 | 442 |
447 TEST_F(AesDecryptorTest, CorruptedIv) { | 443 TEST_F(AesDecryptorTest, CorruptedIv) { |
448 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 444 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
586 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( | 582 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
587 kSubsampleData, arraysize(kSubsampleData), | 583 kSubsampleData, arraysize(kSubsampleData), |
588 kSubsampleKeyId, arraysize(kSubsampleKeyId), | 584 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
589 kSubsampleIv, arraysize(kSubsampleIv), | 585 kSubsampleIv, arraysize(kSubsampleIv), |
590 0, | 586 0, |
591 entries); | 587 entries); |
592 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 588 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
593 } | 589 } |
594 | 590 |
595 } // namespace media | 591 } // namespace media |
OLD | NEW |