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 23 matching lines...) Expand all Loading... | |
34 int key_id_size; | 34 int key_id_size; |
35 uint8 key[32]; | 35 uint8 key[32]; |
36 int key_size; | 36 int key_size; |
37 uint8 encrypted_data[64]; | 37 uint8 encrypted_data[64]; |
38 int encrypted_data_size; | 38 int encrypted_data_size; |
39 }; | 39 }; |
40 | 40 |
41 static const char kClearKeySystem[] = "org.w3.clearkey"; | 41 static const char kClearKeySystem[] = "org.w3.clearkey"; |
42 | 42 |
43 // Frames 0 & 1 are encrypted with the same key. Frame 2 is encrypted with a | 43 // Frames 0 & 1 are encrypted with the same key. Frame 2 is encrypted with a |
44 // different key. Frame 3 has the same HMAC key as frame 2, but frame 3 is | 44 // different key. Frame 3 is unencrypted. |
45 // unencrypted. | |
46 const WebmEncryptedData kWebmEncryptedFrames[] = { | 45 const WebmEncryptedData kWebmEncryptedFrames[] = { |
47 { | 46 { |
48 // plaintext | 47 // plaintext |
49 "Original data.", 14, | 48 "Original data.", 14, |
50 // key_id | 49 // key_id |
51 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | 50 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
52 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | 51 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, |
53 0x10, 0x11, 0x12, 0x13 | 52 0x10, 0x11, 0x12, 0x13, |
xhwang
2012/09/18 00:37:11
Nit: why do we want these trailing commas?
fgalligan1
2012/09/18 01:11:36
Done.
| |
54 }, 20, | 53 }, 20, |
55 // key | 54 // key |
56 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | 55 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, |
57 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 | 56 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, |
58 }, 16, | 57 }, 16, |
59 // encrypted_data | 58 // encrypted_data |
60 { 0x3c, 0x4e, 0xb8, 0xd9, 0x5c, 0x20, 0x48, 0x18, | 59 { 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
61 0x4f, 0x03, 0x74, 0xa1, 0x01, 0xff, 0xff, 0xff, | 60 0xff, 0xf0, 0xd1, 0x12, 0xd5, 0x24, 0x81, 0x96, |
62 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xaa, 0xff, | 61 0x55, 0x1b, 0x68, 0x9f, 0x38, 0x91, 0x85, |
63 0xb7, 0x74, 0x02, 0x4e, 0x1c, 0x75, 0x3d, 0xee, | 62 }, 23, |
64 0xcb, 0x64, 0xf7 | |
65 }, 35 | |
66 }, | 63 }, |
67 { | 64 { |
68 // plaintext | 65 // plaintext |
69 "Changed Original data.", 22, | 66 "Changed Original data.", 22, |
70 // key_id | 67 // key_id |
71 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | 68 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
72 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | 69 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, |
73 0x10, 0x11, 0x12, 0x13 | 70 0x10, 0x11, 0x12, 0x13, |
74 }, 20, | 71 }, 20, |
75 // key | 72 // key |
76 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | 73 { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, |
77 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 | 74 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, |
78 }, 16, | 75 }, 16, |
79 // encrypted_data | 76 // encrypted_data |
80 { 0xe8, 0x4c, 0x51, 0x33, 0x14, 0x0d, 0xc7, 0x17, | 77 { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
81 0x32, 0x60, 0xc9, 0xd0, 0x01, 0x00, 0x00, 0x00, | 78 0x00, 0x57, 0x66, 0xf4, 0x12, 0x1a, 0xed, 0xb5, |
82 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x8e, 0x87, | 79 0x79, 0x1c, 0x8e, 0x25, 0xd7, 0x17, 0xe7, 0x5e, |
83 0x21, 0xd3, 0xb9, 0x1c, 0x61, 0xf6, 0x5a, 0x60, | 80 0x16, 0xe3, 0x40, 0x08, 0x27, 0x11, 0xe9, |
84 0xaa, 0x07, 0x0e, 0x96, 0xd0, 0x54, 0x5d, 0x35, | 81 }, 31, |
85 0x9a, 0x4a, 0xd3 | |
86 }, 43 | |
87 }, | 82 }, |
88 { | 83 { |
89 // plaintext | 84 // plaintext |
90 "Original data.", 14, | 85 "Original data.", 14, |
91 // key_id | 86 // key_id |
92 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, | 87 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, |
93 0x2c, 0x2d, 0x2e, 0x2f, 0x30 | 88 0x2c, 0x2d, 0x2e, 0x2f, 0x30, |
94 }, 13, | 89 }, 13, |
95 // key | 90 // key |
96 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, | 91 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, |
97 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 | 92 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, |
98 }, 16, | 93 }, 16, |
99 // encrypted_data | 94 // encrypted_data |
100 { 0x46, 0x93, 0x8c, 0x93, 0x48, 0xf9, 0xeb, 0x30, | 95 { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
101 0x74, 0x55, 0x6b, 0xf2, 0x01, 0x00, 0x00, 0x00, | 96 0x01, 0x9c, 0x71, 0x26, 0x57, 0x3e, 0x25, 0x37, |
102 0x00, 0x00, 0x00, 0x00, 0x01, 0x48, 0x5e, 0x4a, | 97 0xf7, 0x31, 0x81, 0x19, 0x64, 0xce, 0xbc, |
103 0x41, 0x2a, 0x8b, 0xf4, 0xc6, 0x47, 0x54, 0x90, | 98 }, 23, |
104 0x34, 0xf4, 0x8b | |
105 }, 35 | |
106 }, | 99 }, |
107 { | 100 { |
108 // plaintext | 101 // plaintext |
109 "Changed Original data.", 22, | 102 "Changed Original data.", 22, |
110 // key_id | 103 // key_id |
111 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, | 104 { 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, |
112 0x2c, 0x2d, 0x2e, 0x2f, 0x30 | 105 0x2c, 0x2d, 0x2e, 0x2f, 0x30, |
113 }, 13, | 106 }, 13, |
114 // key | 107 // key |
115 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, | 108 { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, |
116 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 | 109 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, |
117 }, 16, | 110 }, 16, |
118 // encrypted_data | 111 // encrypted_data |
119 { 0xee, 0xd6, 0xf5, 0x64, 0x5f, 0xe0, 0x6a, 0xa2, | 112 { 0x00, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, |
120 0x9e, 0xd6, 0xce, 0x34, 0x00, 0x43, 0x68, 0x61, | 113 0x20, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, |
121 0x6e, 0x67, 0x65, 0x64, 0x20, 0x4f, 0x72, 0x69, | 114 0x6c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, |
122 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x61, | 115 }, 23, |
123 0x74, 0x61, 0x2e | |
124 }, 35 | |
125 } | 116 } |
126 }; | 117 }; |
127 | 118 |
119 | |
120 | |
128 static const uint8 kWebmWrongSizedKey[] = { 0x20, 0x20 }; | 121 static const uint8 kWebmWrongSizedKey[] = { 0x20, 0x20 }; |
129 | 122 |
130 static const uint8 kSubsampleOriginalData[] = "Original subsample data."; | 123 static const uint8 kSubsampleOriginalData[] = "Original subsample data."; |
131 static const int kSubsampleOriginalDataSize = 24; | 124 static const int kSubsampleOriginalDataSize = 24; |
132 | 125 |
133 static const uint8 kSubsampleKeyId[] = { 0x00, 0x01, 0x02, 0x03 }; | 126 static const uint8 kSubsampleKeyId[] = { 0x00, 0x01, 0x02, 0x03 }; |
134 | 127 |
135 static const uint8 kSubsampleKey[] = { | 128 static const uint8 kSubsampleKey[] = { |
136 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, | 129 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, |
137 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 | 130 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 CHECK_LE(iv_size, kDecryptionKeySize); | 170 CHECK_LE(iv_size, kDecryptionKeySize); |
178 | 171 |
179 std::string counter_block(reinterpret_cast<const char*>(iv), iv_size); | 172 std::string counter_block(reinterpret_cast<const char*>(iv), iv_size); |
180 counter_block.append(kDecryptionKeySize - iv_size, 0); | 173 counter_block.append(kDecryptionKeySize - iv_size, 0); |
181 return counter_block; | 174 return counter_block; |
182 } | 175 } |
183 | 176 |
184 // Creates a WebM encrypted buffer that the demuxer would pass to the | 177 // Creates a WebM encrypted buffer that the demuxer would pass to the |
185 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is | 178 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is |
186 // initialization data from the WebM file. Every encrypted Block has | 179 // initialization data from the WebM file. Every encrypted Block has |
187 // an HMAC and a signal byte prepended to a frame. If the frame is encrypted | 180 // a signal byte prepended to a frame. If the frame is encrypted then an IV is |
188 // then an IV is prepended to the Block. Current encrypted WebM request for | 181 // prepended to the Block. Current encrypted WebM request for comments |
189 // comments specification is here | 182 // specification is here |
190 // http://wiki.webmproject.org/encryption/webm-encryption-rfc | 183 // http://wiki.webmproject.org/encryption/webm-encryption-rfc |
191 static scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer( | 184 static scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer( |
192 const uint8* data, int data_size, | 185 const uint8* data, int data_size, |
193 const uint8* key_id, int key_id_size) { | 186 const uint8* key_id, int key_id_size) { |
194 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( | 187 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( |
195 data + kWebMHmacSize, data_size - kWebMHmacSize); | 188 data, data_size); |
196 CHECK(encrypted_buffer); | 189 CHECK(encrypted_buffer); |
197 | 190 |
198 uint8 signal_byte = data[kWebMHmacSize]; | 191 uint8 signal_byte = data[0]; |
199 int data_offset = sizeof(signal_byte); | 192 int data_offset = sizeof(signal_byte); |
200 | 193 |
201 // Setting the DecryptConfig object of the buffer while leaving the | 194 // Setting the DecryptConfig object of the buffer while leaving the |
202 // initialization vector empty will tell the decryptor that the frame is | 195 // initialization vector empty will tell the decryptor that the frame is |
203 // unencrypted but integrity should still be checked. | 196 // unencrypted. |
204 std::string counter_block_str; | 197 std::string counter_block_str; |
205 | 198 |
206 if (signal_byte & kWebMFlagEncryptedFrame) { | 199 if (signal_byte & kWebMFlagEncryptedFrame) { |
207 uint64 network_iv; | 200 uint64 network_iv; |
208 memcpy(&network_iv, data + kWebMHmacSize + data_offset, sizeof(network_iv)); | 201 memcpy(&network_iv, data + data_offset, sizeof(network_iv)); |
209 const uint64 iv = base::NetToHost64(network_iv); | 202 const uint64 iv = base::NetToHost64(network_iv); |
210 counter_block_str = | 203 counter_block_str = |
211 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); | 204 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); |
212 data_offset += sizeof(iv); | 205 data_offset += sizeof(iv); |
213 } | 206 } |
214 | 207 |
215 encrypted_buffer->SetDecryptConfig( | 208 encrypted_buffer->SetDecryptConfig( |
216 scoped_ptr<DecryptConfig>(new DecryptConfig( | 209 scoped_ptr<DecryptConfig>(new DecryptConfig( |
217 std::string(reinterpret_cast<const char*>(key_id), key_id_size), | 210 std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
218 counter_block_str, | 211 counter_block_str, |
219 std::string(reinterpret_cast<const char*>(data), kWebMHmacSize), | |
220 data_offset, | 212 data_offset, |
221 std::vector<SubsampleEntry>()))); | 213 std::vector<SubsampleEntry>()))); |
222 return encrypted_buffer; | 214 return encrypted_buffer; |
223 } | 215 } |
224 | 216 |
225 static scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer( | 217 static scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer( |
226 const uint8* data, int data_size, | 218 const uint8* data, int data_size, |
227 const uint8* key_id, int key_id_size, | 219 const uint8* key_id, int key_id_size, |
228 const uint8* iv, int iv_size, | 220 const uint8* iv, int iv_size, |
229 int data_offset, | 221 int data_offset, |
230 const std::vector<SubsampleEntry>& subsample_entries) { | 222 const std::vector<SubsampleEntry>& subsample_entries) { |
231 scoped_refptr<DecoderBuffer> encrypted_buffer = | 223 scoped_refptr<DecoderBuffer> encrypted_buffer = |
232 DecoderBuffer::CopyFrom(data, data_size); | 224 DecoderBuffer::CopyFrom(data, data_size); |
233 CHECK(encrypted_buffer); | 225 CHECK(encrypted_buffer); |
234 encrypted_buffer->SetDecryptConfig( | 226 encrypted_buffer->SetDecryptConfig( |
235 scoped_ptr<DecryptConfig>(new DecryptConfig( | 227 scoped_ptr<DecryptConfig>(new DecryptConfig( |
236 std::string(reinterpret_cast<const char*>(key_id), key_id_size), | 228 std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
237 std::string(reinterpret_cast<const char*>(iv), iv_size), | 229 std::string(reinterpret_cast<const char*>(iv), iv_size), |
238 std::string(), | |
239 data_offset, | 230 data_offset, |
240 subsample_entries))); | 231 subsample_entries))); |
241 return encrypted_buffer; | 232 return encrypted_buffer; |
242 } | 233 } |
243 | 234 |
244 class AesDecryptorTest : public testing::Test { | 235 class AesDecryptorTest : public testing::Test { |
245 public: | 236 public: |
246 AesDecryptorTest() | 237 AesDecryptorTest() |
247 : decryptor_(&client_), | 238 : decryptor_(&client_), |
248 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, | 239 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
283 scoped_refptr<DecoderBuffer> decrypted; | 274 scoped_refptr<DecoderBuffer> decrypted; |
284 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) | 275 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) |
285 .WillOnce(SaveArg<1>(&decrypted)); | 276 .WillOnce(SaveArg<1>(&decrypted)); |
286 | 277 |
287 decryptor_.Decrypt(encrypted, decrypt_cb_); | 278 decryptor_.Decrypt(encrypted, decrypt_cb_); |
288 ASSERT_TRUE(decrypted); | 279 ASSERT_TRUE(decrypted); |
289 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); | 280 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); |
290 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); | 281 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); |
291 } | 282 } |
292 | 283 |
284 void DecryptAndExpectDataMismatch( | |
xhwang
2012/09/18 00:37:11
For these two new functions. From the perspective
fgalligan1
2012/09/18 01:11:36
I think from a blackbox point of view we are good.
xhwang
2012/09/18 01:22:42
If it's determined behavior then it's fine. Thanks
| |
285 const scoped_refptr<DecoderBuffer>& encrypted, | |
286 const uint8* plain_text, int plain_text_size) { | |
287 scoped_refptr<DecoderBuffer> decrypted; | |
288 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) | |
289 .WillOnce(SaveArg<1>(&decrypted)); | |
290 | |
291 decryptor_.Decrypt(encrypted, decrypt_cb_); | |
292 ASSERT_TRUE(decrypted); | |
293 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); | |
294 EXPECT_NE(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); | |
295 } | |
296 | |
297 void DecryptAndExpectSizeDataMismatch( | |
298 const scoped_refptr<DecoderBuffer>& encrypted, | |
299 const uint8* plain_text, int plain_text_size) { | |
300 scoped_refptr<DecoderBuffer> decrypted; | |
301 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) | |
302 .WillOnce(SaveArg<1>(&decrypted)); | |
303 | |
304 decryptor_.Decrypt(encrypted, decrypt_cb_); | |
305 ASSERT_TRUE(decrypted); | |
306 EXPECT_NE(plain_text_size, decrypted->GetDataSize()); | |
307 EXPECT_NE(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); | |
308 } | |
309 | |
293 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted) { | 310 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted) { |
294 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); | 311 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); |
295 decryptor_.Decrypt(encrypted, decrypt_cb_); | 312 decryptor_.Decrypt(encrypted, decrypt_cb_); |
296 } | 313 } |
297 | 314 |
298 MockDecryptorClient client_; | 315 MockDecryptorClient client_; |
299 AesDecryptor decryptor_; | 316 AesDecryptor decryptor_; |
300 std::string session_id_string_; | 317 std::string session_id_string_; |
301 AesDecryptor::DecryptCB decrypt_cb_; | 318 AesDecryptor::DecryptCB decrypt_cb_; |
302 std::vector<SubsampleEntry> subsample_entries_; | 319 std::vector<SubsampleEntry> subsample_entries_; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
337 // Change the first byte of the key. | 354 // Change the first byte of the key. |
338 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size); | 355 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size); |
339 wrong_key[0]++; | 356 wrong_key[0]++; |
340 | 357 |
341 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 358 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
342 &wrong_key[0], frame.key_size); | 359 &wrong_key[0], frame.key_size); |
343 scoped_refptr<DecoderBuffer> encrypted_data = | 360 scoped_refptr<DecoderBuffer> encrypted_data = |
344 CreateWebMEncryptedBuffer(frame.encrypted_data, | 361 CreateWebMEncryptedBuffer(frame.encrypted_data, |
345 frame.encrypted_data_size, | 362 frame.encrypted_data_size, |
346 frame.key_id, frame.key_id_size); | 363 frame.key_id, frame.key_id_size); |
347 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 364 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data, |
365 frame.plain_text, | |
366 frame.plain_text_size)); | |
348 } | 367 } |
349 | 368 |
350 TEST_F(AesDecryptorTest, NoKey) { | 369 TEST_F(AesDecryptorTest, NoKey) { |
351 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 370 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
352 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 371 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
353 | 372 |
354 scoped_refptr<DecoderBuffer> encrypted_data = | 373 scoped_refptr<DecoderBuffer> encrypted_data = |
355 CreateWebMEncryptedBuffer(frame.encrypted_data, frame.encrypted_data_size, | 374 CreateWebMEncryptedBuffer(frame.encrypted_data, frame.encrypted_data_size, |
356 frame.key_id, frame.key_id_size); | 375 frame.key_id, frame.key_id_size); |
357 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); | 376 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); |
358 decryptor_.Decrypt(encrypted_data, decrypt_cb_); | 377 decryptor_.Decrypt(encrypted_data, decrypt_cb_); |
359 } | 378 } |
360 | 379 |
361 TEST_F(AesDecryptorTest, KeyReplacement) { | 380 TEST_F(AesDecryptorTest, KeyReplacement) { |
362 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 381 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
363 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 382 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
364 | 383 |
365 // Change the first byte of the key. | 384 // Change the first byte of the key. |
366 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size); | 385 std::vector<uint8> wrong_key(frame.key, frame.key + frame.key_size); |
367 wrong_key[0]++; | 386 wrong_key[0]++; |
368 | 387 |
369 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 388 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
370 &wrong_key[0], frame.key_size); | 389 &wrong_key[0], frame.key_size); |
371 scoped_refptr<DecoderBuffer> encrypted_data = | 390 scoped_refptr<DecoderBuffer> encrypted_data = |
372 CreateWebMEncryptedBuffer(frame.encrypted_data, | 391 CreateWebMEncryptedBuffer(frame.encrypted_data, |
373 frame.encrypted_data_size, | 392 frame.encrypted_data_size, |
374 frame.key_id, frame.key_id_size); | 393 frame.key_id, frame.key_id_size); |
375 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 394 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data, |
395 frame.plain_text, | |
396 frame.plain_text_size)); | |
376 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 397 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
377 frame.key, frame.key_size); | 398 frame.key, frame.key_size); |
378 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, | 399 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, |
379 frame.plain_text, | 400 frame.plain_text, |
380 frame.plain_text_size)); | 401 frame.plain_text_size)); |
381 } | 402 } |
382 | 403 |
383 TEST_F(AesDecryptorTest, WrongSizedKey) { | 404 TEST_F(AesDecryptorTest, WrongSizedKey) { |
384 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 405 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
385 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 406 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
(...skipping 30 matching lines...) Expand all Loading... | |
416 | 437 |
417 scoped_refptr<DecoderBuffer> encrypted_data2 = | 438 scoped_refptr<DecoderBuffer> encrypted_data2 = |
418 CreateWebMEncryptedBuffer(frame2.encrypted_data, | 439 CreateWebMEncryptedBuffer(frame2.encrypted_data, |
419 frame2.encrypted_data_size, | 440 frame2.encrypted_data_size, |
420 frame2.key_id, frame2.key_id_size); | 441 frame2.key_id, frame2.key_id_size); |
421 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, | 442 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, |
422 frame2.plain_text, | 443 frame2.plain_text, |
423 frame2.plain_text_size)); | 444 frame2.plain_text_size)); |
424 } | 445 } |
425 | 446 |
426 TEST_F(AesDecryptorTest, HmacCheckFailure) { | |
427 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | |
428 GenerateKeyRequest(frame.key_id, frame.key_id_size); | |
429 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | |
430 frame.key, frame.key_size); | |
431 | |
432 // Change byte 0 to modify the HMAC. Bytes 0-11 of WebM encrypted data | |
433 // contains the HMAC. | |
434 std::vector<uint8> frame_with_bad_hmac( | |
435 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); | |
436 frame_with_bad_hmac[0]++; | |
437 | |
438 scoped_refptr<DecoderBuffer> encrypted_data = | |
439 CreateWebMEncryptedBuffer(&frame_with_bad_hmac[0], | |
440 frame.encrypted_data_size, | |
441 frame.key_id, frame.key_id_size); | |
442 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | |
443 } | |
444 | |
445 TEST_F(AesDecryptorTest, IvCheckFailure) { | 447 TEST_F(AesDecryptorTest, IvCheckFailure) { |
xhwang
2012/09/18 00:37:11
Here and in the next test (DataCheckFailure), we a
fgalligan1
2012/09/18 01:11:36
Done.
| |
446 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 448 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
447 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 449 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
448 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 450 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
449 frame.key, frame.key_size); | 451 frame.key, frame.key_size); |
450 | 452 |
451 // Change byte 13 to modify the IV. Bytes 13-20 of WebM encrypted data | 453 // Change byte 13 to modify the IV. Bytes 13-20 of WebM encrypted data |
452 // contains the IV. | 454 // contains the IV. |
453 std::vector<uint8> frame_with_bad_iv( | 455 std::vector<uint8> frame_with_bad_iv( |
454 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); | 456 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); |
455 frame_with_bad_iv[kWebMHmacSize + 1]++; | 457 frame_with_bad_iv[1]++; |
456 | 458 |
457 scoped_refptr<DecoderBuffer> encrypted_data = | 459 scoped_refptr<DecoderBuffer> encrypted_data = |
458 CreateWebMEncryptedBuffer(&frame_with_bad_iv[0], | 460 CreateWebMEncryptedBuffer(&frame_with_bad_iv[0], |
459 frame.encrypted_data_size, | 461 frame.encrypted_data_size, |
460 frame.key_id, frame.key_id_size); | 462 frame.key_id, frame.key_id_size); |
461 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 463 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data, |
464 frame.plain_text, | |
465 frame.plain_text_size)); | |
462 } | 466 } |
463 | 467 |
464 TEST_F(AesDecryptorTest, DataCheckFailure) { | 468 TEST_F(AesDecryptorTest, DataCheckFailure) { |
465 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 469 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
466 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 470 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
467 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 471 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
468 frame.key, frame.key_size); | 472 frame.key, frame.key_size); |
469 | 473 |
470 // Change last byte to modify the data. Bytes 21+ of WebM encrypted data | 474 // Change last byte to modify the data. Bytes 21+ of WebM encrypted data |
471 // contains the encrypted frame. | 475 // contains the encrypted frame. |
472 std::vector<uint8> frame_with_bad_vp8_data( | 476 std::vector<uint8> frame_with_bad_vp8_data( |
473 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); | 477 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); |
474 frame_with_bad_vp8_data[frame.encrypted_data_size - 1]++; | 478 frame_with_bad_vp8_data[frame.encrypted_data_size - 1]++; |
475 | 479 |
476 scoped_refptr<DecoderBuffer> encrypted_data = | 480 scoped_refptr<DecoderBuffer> encrypted_data = |
477 CreateWebMEncryptedBuffer(&frame_with_bad_vp8_data[0], | 481 CreateWebMEncryptedBuffer(&frame_with_bad_vp8_data[0], |
478 frame.encrypted_data_size, | 482 frame.encrypted_data_size, |
479 frame.key_id, frame.key_id_size); | 483 frame.key_id, frame.key_id_size); |
480 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 484 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectDataMismatch(encrypted_data, |
485 frame.plain_text, | |
486 frame.plain_text_size)); | |
481 } | 487 } |
482 | 488 |
483 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { | 489 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { |
484 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 490 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
485 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 491 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
486 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 492 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
487 frame.key, frame.key_size); | 493 frame.key, frame.key_size); |
488 | 494 |
489 // Change signal byte from an encrypted frame to an unencrypted frame. Byte | 495 // Change signal byte from an encrypted frame to an unencrypted frame. Byte |
490 // 12 of WebM encrypted data contains the signal byte. | 496 // 12 of WebM encrypted data contains the signal byte. |
491 std::vector<uint8> frame_with_wrong_signal_byte( | 497 std::vector<uint8> frame_with_wrong_signal_byte( |
492 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); | 498 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); |
493 frame_with_wrong_signal_byte[kWebMHmacSize] = 0; | 499 frame_with_wrong_signal_byte[0] = 0; |
494 | 500 |
495 scoped_refptr<DecoderBuffer> encrypted_data = | 501 scoped_refptr<DecoderBuffer> encrypted_data = |
496 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0], | 502 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0], |
497 frame.encrypted_data_size, | 503 frame.encrypted_data_size, |
498 frame.key_id, frame.key_id_size); | 504 frame.key_id, frame.key_id_size); |
499 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 505 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectSizeDataMismatch( |
xhwang
2012/09/18 00:37:11
Here and below. Indentation seems weird. Break aft
fgalligan1
2012/09/18 01:11:36
Done.
| |
506 encrypted_data, | |
507 frame.plain_text, | |
508 frame.plain_text_size)); | |
500 } | 509 } |
501 | 510 |
502 TEST_F(AesDecryptorTest, UnencryptedAsEncryptedFailure) { | 511 TEST_F(AesDecryptorTest, UnencryptedAsEncryptedFailure) { |
503 const WebmEncryptedData& frame = kWebmEncryptedFrames[3]; | 512 const WebmEncryptedData& frame = kWebmEncryptedFrames[3]; |
504 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 513 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
505 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 514 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
506 frame.key, frame.key_size); | 515 frame.key, frame.key_size); |
507 | 516 |
508 // Change signal byte from an unencrypted frame to an encrypted frame. Byte | 517 // Change signal byte from an unencrypted frame to an encrypted frame. Byte |
509 // 12 of WebM encrypted data contains the signal byte. | 518 // 0 of WebM encrypted data contains the signal byte. |
510 std::vector<uint8> frame_with_wrong_signal_byte( | 519 std::vector<uint8> frame_with_wrong_signal_byte( |
511 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); | 520 frame.encrypted_data, frame.encrypted_data + frame.encrypted_data_size); |
512 frame_with_wrong_signal_byte[kWebMHmacSize] = kWebMFlagEncryptedFrame; | 521 frame_with_wrong_signal_byte[0] = kWebMFlagEncryptedFrame; |
513 | 522 |
514 scoped_refptr<DecoderBuffer> encrypted_data = | 523 scoped_refptr<DecoderBuffer> encrypted_data = |
515 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0], | 524 CreateWebMEncryptedBuffer(&frame_with_wrong_signal_byte[0], |
516 frame.encrypted_data_size, | 525 frame.encrypted_data_size, |
517 frame.key_id, frame.key_id_size); | 526 frame.key_id, frame.key_id_size); |
518 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 527 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectSizeDataMismatch( |
528 encrypted_data, | |
529 frame.plain_text, | |
530 frame.plain_text_size)); | |
519 } | 531 } |
520 | 532 |
521 TEST_F(AesDecryptorTest, SubsampleDecryption) { | 533 TEST_F(AesDecryptorTest, SubsampleDecryption) { |
522 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); | 534 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); |
523 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), | 535 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), |
524 kSubsampleKey, arraysize(kSubsampleKey)); | 536 kSubsampleKey, arraysize(kSubsampleKey)); |
525 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( | 537 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
526 kSubsampleData, arraysize(kSubsampleData), | 538 kSubsampleData, arraysize(kSubsampleData), |
527 kSubsampleKeyId, arraysize(kSubsampleKeyId), | 539 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
528 kSubsampleIv, arraysize(kSubsampleIv), | 540 kSubsampleIv, arraysize(kSubsampleIv), |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
574 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( | 586 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
575 kSubsampleData, arraysize(kSubsampleData), | 587 kSubsampleData, arraysize(kSubsampleData), |
576 kSubsampleKeyId, arraysize(kSubsampleKeyId), | 588 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
577 kSubsampleIv, arraysize(kSubsampleIv), | 589 kSubsampleIv, arraysize(kSubsampleIv), |
578 0, | 590 0, |
579 entries); | 591 entries); |
580 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); | 592 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
581 } | 593 } |
582 | 594 |
583 } // namespace media | 595 } // namespace media |
OLD | NEW |