Chromium Code Reviews| 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 |