| 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 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/sys_byteorder.h" | 9 #include "base/sys_byteorder.h" |
| 10 #include "media/base/decoder_buffer.h" | 10 #include "media/base/decoder_buffer.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 // byte 33 is changed from 0xf7 to 0xf8. Bytes 20+ of WebM encrypted data | 136 // byte 33 is changed from 0xf7 to 0xf8. Bytes 20+ of WebM encrypted data |
| 137 // contains the encrypted frame. | 137 // contains the encrypted frame. |
| 138 static const unsigned char kWebmFrame0FrameDataChanged[] = { | 138 static const unsigned char kWebmFrame0FrameDataChanged[] = { |
| 139 0xfb, 0xe7, 0x1d, 0xbb, 0x4c, 0x23, 0xce, 0xba, | 139 0xfb, 0xe7, 0x1d, 0xbb, 0x4c, 0x23, 0xce, 0xba, |
| 140 0xcc, 0xf8, 0xda, 0xc0, 0xff, 0xff, 0xff, 0xff, | 140 0xcc, 0xf8, 0xda, 0xc0, 0xff, 0xff, 0xff, 0xff, |
| 141 0xff, 0xff, 0xff, 0xff, 0x99, 0xaa, 0xff, 0xb7, | 141 0xff, 0xff, 0xff, 0xff, 0x99, 0xaa, 0xff, 0xb7, |
| 142 0x74, 0x02, 0x4e, 0x1c, 0x75, 0x3d, 0xee, 0xcb, | 142 0x74, 0x02, 0x4e, 0x1c, 0x75, 0x3d, 0xee, 0xcb, |
| 143 0x64, 0xf8 | 143 0x64, 0xf8 |
| 144 }; | 144 }; |
| 145 | 145 |
| 146 static const uint8 kSubsampleOriginalData[] = "Original subsample data."; |
| 147 static const int kSubsampleOriginalDataSize = 24; |
| 148 |
| 149 static const uint8 kSubsampleKeyId[] = { 0x00, 0x01, 0x02, 0x03 }; |
| 150 |
| 151 static const uint8 kSubsampleKey[] = { |
| 152 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, |
| 153 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 |
| 154 }; |
| 155 |
| 156 static const uint8 kSubsampleIv[] = { |
| 157 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, |
| 158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| 159 }; |
| 160 |
| 161 static const uint8 kSubsampleData[] = { |
| 162 0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad, |
| 163 0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d, |
| 164 0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e |
| 165 }; |
| 166 |
| 167 static const uint8 kPaddedSubsampleData[] = { |
| 168 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
| 169 0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad, |
| 170 0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d, |
| 171 0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e |
| 172 }; |
| 173 |
| 174 // Encrypted with kSubsampleKey and kSubsampleIv but without subsamples. |
| 175 static const uint8 kNoSubsampleData[] = { |
| 176 0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16, |
| 177 0xfa, 0x9d, 0x18, 0x43, 0x1e, 0x96, 0x71, 0xb5, |
| 178 0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95 |
| 179 }; |
| 180 |
| 181 static const SubsampleEntry kSubsampleEntries[] = { |
| 182 { 2, 7 }, |
| 183 { 3, 11 }, |
| 184 { 1, 0 }, |
| 185 }; |
| 186 |
| 146 class AesDecryptorTest : public testing::Test { | 187 class AesDecryptorTest : public testing::Test { |
| 147 public: | 188 public: |
| 148 AesDecryptorTest() | 189 AesDecryptorTest() |
| 149 : decryptor_(&client_), | 190 : decryptor_(&client_), |
| 150 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, | 191 decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted, |
| 151 base::Unretained(this))) { | 192 base::Unretained(this))) { |
| 152 } | 193 } |
| 153 | 194 |
| 154 protected: | 195 protected: |
| 155 // Returns a 16 byte CTR counter block. The CTR counter block format is a | 196 // Returns a 16 byte CTR counter block. The CTR counter block format is a |
| (...skipping 13 matching lines...) Expand all Loading... |
| 169 | 210 |
| 170 return std::string(counter_block_data, kDecryptionKeySize); | 211 return std::string(counter_block_data, kDecryptionKeySize); |
| 171 } | 212 } |
| 172 | 213 |
| 173 // Creates a WebM encrypted buffer that the demuxer would pass to the | 214 // Creates a WebM encrypted buffer that the demuxer would pass to the |
| 174 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is | 215 // decryptor. |data| is the payload of a WebM encrypted Block. |key_id| is |
| 175 // initialization data from the WebM file. Every encrypted Block has | 216 // initialization data from the WebM file. Every encrypted Block has |
| 176 // an HMAC and IV prepended to an encrypted frame. Current encrypted WebM | 217 // an HMAC and IV prepended to an encrypted frame. Current encrypted WebM |
| 177 // request for comments specification is here | 218 // request for comments specification is here |
| 178 // http://wiki.webmproject.org/encryption/webm-encryption-rfc | 219 // http://wiki.webmproject.org/encryption/webm-encryption-rfc |
| 179 scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer(const uint8* data, | 220 scoped_refptr<DecoderBuffer> CreateWebMEncryptedBuffer( |
| 180 int data_size, | 221 const uint8* data, int data_size, |
| 181 const uint8* key_id, | 222 const uint8* key_id, int key_id_size) { |
| 182 int key_id_size) { | |
| 183 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( | 223 scoped_refptr<DecoderBuffer> encrypted_buffer = DecoderBuffer::CopyFrom( |
| 184 data + kWebMHmacSize, data_size - kWebMHmacSize); | 224 data + kWebMHmacSize, data_size - kWebMHmacSize); |
| 185 CHECK(encrypted_buffer); | 225 CHECK(encrypted_buffer); |
| 186 | 226 |
| 187 uint64 network_iv; | 227 uint64 network_iv; |
| 188 memcpy(&network_iv, data + kWebMHmacSize, sizeof(network_iv)); | 228 memcpy(&network_iv, data + kWebMHmacSize, sizeof(network_iv)); |
| 189 const uint64 iv = base::NetToHost64(network_iv); | 229 const uint64 iv = base::NetToHost64(network_iv); |
| 190 std::string webm_iv = | 230 std::string webm_iv = |
| 191 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); | 231 GenerateCounterBlock(reinterpret_cast<const uint8*>(&iv), sizeof(iv)); |
| 192 encrypted_buffer->SetDecryptConfig( | 232 encrypted_buffer->SetDecryptConfig( |
| 193 scoped_ptr<DecryptConfig>(new DecryptConfig( | 233 scoped_ptr<DecryptConfig>(new DecryptConfig( |
| 194 key_id, key_id_size, | 234 std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
| 195 reinterpret_cast<const uint8*>(webm_iv.data()), webm_iv.size(), | 235 webm_iv, |
| 196 data, kWebMHmacSize, | 236 std::string(reinterpret_cast<const char*>(data), kWebMHmacSize), |
| 197 sizeof(iv)))); | 237 sizeof(iv), |
| 238 std::vector<SubsampleEntry>()))); |
| 198 return encrypted_buffer; | 239 return encrypted_buffer; |
| 199 } | 240 } |
| 200 | 241 |
| 242 scoped_refptr<DecoderBuffer> CreateSubsampleEncryptedBuffer( |
| 243 const uint8* data, int data_size, |
| 244 const uint8* key_id, int key_id_size, |
| 245 const uint8* iv, int iv_size, |
| 246 int data_offset, |
| 247 const std::vector<SubsampleEntry>& subsample_entries) { |
| 248 scoped_refptr<DecoderBuffer> encrypted_buffer = |
| 249 DecoderBuffer::CopyFrom(data, data_size); |
| 250 CHECK(encrypted_buffer); |
| 251 encrypted_buffer->SetDecryptConfig( |
| 252 scoped_ptr<DecryptConfig>(new DecryptConfig( |
| 253 std::string(reinterpret_cast<const char*>(key_id), key_id_size), |
| 254 std::string(reinterpret_cast<const char*>(iv), iv_size), |
| 255 std::string(), |
| 256 data_offset, |
| 257 subsample_entries))); |
| 258 return encrypted_buffer; |
| 259 } |
| 260 |
| 201 void GenerateKeyRequest(const uint8* key_id, int key_id_size) { | 261 void GenerateKeyRequest(const uint8* key_id, int key_id_size) { |
| 202 EXPECT_CALL(client_, KeyMessageMock(kClearKeySystem, StrNe(std::string()), | 262 EXPECT_CALL(client_, KeyMessageMock(kClearKeySystem, StrNe(std::string()), |
| 203 NotNull(), Gt(0), "")) | 263 NotNull(), Gt(0), "")) |
| 204 .WillOnce(SaveArg<1>(&session_id_string_)); | 264 .WillOnce(SaveArg<1>(&session_id_string_)); |
| 205 decryptor_.GenerateKeyRequest(kClearKeySystem, key_id, key_id_size); | 265 decryptor_.GenerateKeyRequest(kClearKeySystem, key_id, key_id_size); |
| 206 } | 266 } |
| 207 | 267 |
| 208 void AddKeyAndExpectToSucceed(const uint8* key_id, int key_id_size, | 268 void AddKeyAndExpectToSucceed(const uint8* key_id, int key_id_size, |
| 209 const uint8* key, int key_size) { | 269 const uint8* key, int key_size) { |
| 210 EXPECT_CALL(client_, KeyAdded(kClearKeySystem, session_id_string_)); | 270 EXPECT_CALL(client_, KeyAdded(kClearKeySystem, session_id_string_)); |
| 211 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, | 271 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, |
| 212 session_id_string_); | 272 session_id_string_); |
| 213 } | 273 } |
| 214 | 274 |
| 215 void AddKeyAndExpectToFail(const uint8* key_id, int key_id_size, | 275 void AddKeyAndExpectToFail(const uint8* key_id, int key_id_size, |
| 216 const uint8* key, int key_size) { | 276 const uint8* key, int key_size) { |
| 217 EXPECT_CALL(client_, KeyError(kClearKeySystem, session_id_string_, | 277 EXPECT_CALL(client_, KeyError(kClearKeySystem, session_id_string_, |
| 218 Decryptor::kUnknownError, 0)); | 278 Decryptor::kUnknownError, 0)); |
| 219 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, | 279 decryptor_.AddKey(kClearKeySystem, key, key_size, key_id, key_id_size, |
| 220 session_id_string_); | 280 session_id_string_); |
| 221 } | 281 } |
| 222 | 282 |
| 223 MOCK_METHOD2(BufferDecrypted, void(Decryptor::DecryptStatus, | 283 MOCK_METHOD2(BufferDecrypted, void(Decryptor::DecryptStatus, |
| 224 const scoped_refptr<DecoderBuffer>&)); | 284 const scoped_refptr<DecoderBuffer>&)); |
| 225 | 285 |
| 226 void DecryptAndExpectToSucceed(const uint8* data, int data_size, | 286 void DecryptAndExpectToSucceed(const scoped_refptr<DecoderBuffer>& encrypted, |
| 227 const uint8* plain_text, | 287 const uint8* plain_text, int plain_text_size) { |
| 228 int plain_text_size, | |
| 229 const uint8* key_id, int key_id_size) { | |
| 230 scoped_refptr<DecoderBuffer> encrypted_data = | |
| 231 CreateWebMEncryptedBuffer(data, data_size, key_id, key_id_size); | |
| 232 scoped_refptr<DecoderBuffer> decrypted; | 288 scoped_refptr<DecoderBuffer> decrypted; |
| 233 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) | 289 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kSuccess, NotNull())) |
| 234 .WillOnce(SaveArg<1>(&decrypted)); | 290 .WillOnce(SaveArg<1>(&decrypted)); |
| 235 | 291 |
| 236 decryptor_.Decrypt(encrypted_data, decrypt_cb_); | 292 decryptor_.Decrypt(encrypted, decrypt_cb_); |
| 237 ASSERT_TRUE(decrypted); | 293 ASSERT_TRUE(decrypted); |
| 238 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); | 294 ASSERT_EQ(plain_text_size, decrypted->GetDataSize()); |
| 239 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); | 295 EXPECT_EQ(0, memcmp(plain_text, decrypted->GetData(), plain_text_size)); |
| 240 } | 296 } |
| 241 | 297 |
| 242 void DecryptAndExpectToFail(const uint8* data, int data_size, | 298 void DecryptAndExpectToFail(const scoped_refptr<DecoderBuffer>& encrypted) { |
| 243 const uint8* plain_text, int plain_text_size, | |
| 244 const uint8* key_id, int key_id_size) { | |
| 245 scoped_refptr<DecoderBuffer> encrypted_data = | |
| 246 CreateWebMEncryptedBuffer(data, data_size, key_id, key_id_size); | |
| 247 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); | 299 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kError, IsNull())); |
| 248 decryptor_.Decrypt(encrypted_data, decrypt_cb_); | 300 decryptor_.Decrypt(encrypted, decrypt_cb_); |
| 249 } | 301 } |
| 250 | 302 |
| 251 scoped_refptr<DecoderBuffer> encrypted_data_; | 303 scoped_refptr<DecoderBuffer> encrypted_data_; |
| 252 MockDecryptorClient client_; | 304 MockDecryptorClient client_; |
| 253 AesDecryptor decryptor_; | 305 AesDecryptor decryptor_; |
| 254 std::string session_id_string_; | 306 std::string session_id_string_; |
| 255 AesDecryptor::DecryptCB decrypt_cb_; | 307 AesDecryptor::DecryptCB decrypt_cb_; |
| 256 }; | 308 }; |
| 257 | 309 |
| 258 TEST_F(AesDecryptorTest, NormalDecryption) { | 310 TEST_F(AesDecryptorTest, NormalWebMDecryption) { |
| 259 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 311 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 260 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 312 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 261 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 313 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 262 frame.key, frame.key_size); | 314 frame.key, frame.key_size); |
| 263 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, | 315 scoped_refptr<DecoderBuffer> encrypted_data = |
| 264 frame.encrypted_data_size, | 316 CreateWebMEncryptedBuffer(frame.encrypted_data, |
| 317 frame.encrypted_data_size, |
| 318 frame.key_id, frame.key_id_size); |
| 319 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, |
| 265 frame.plain_text, | 320 frame.plain_text, |
| 266 frame.plain_text_size, | 321 frame.plain_text_size)); |
| 267 frame.key_id, | |
| 268 frame.key_id_size)); | |
| 269 } | 322 } |
| 270 | 323 |
| 271 TEST_F(AesDecryptorTest, WrongKey) { | 324 TEST_F(AesDecryptorTest, WrongKey) { |
| 272 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 325 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 273 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 326 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 274 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 327 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 275 kWebmWrongKey, arraysize(kWebmWrongKey)); | 328 kWebmWrongKey, arraysize(kWebmWrongKey)); |
| 276 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(frame.encrypted_data, | 329 scoped_refptr<DecoderBuffer> encrypted_data = |
| 277 frame.encrypted_data_size, | 330 CreateWebMEncryptedBuffer(frame.encrypted_data, |
| 278 frame.plain_text, | 331 frame.encrypted_data_size, |
| 279 frame.plain_text_size, | 332 frame.key_id, frame.key_id_size); |
| 280 frame.key_id, | 333 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
| 281 frame.key_id_size)); | |
| 282 } | 334 } |
| 283 | 335 |
| 284 TEST_F(AesDecryptorTest, KeyReplacement) { | 336 TEST_F(AesDecryptorTest, KeyReplacement) { |
| 285 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 337 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 286 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 338 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 287 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 339 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 288 kWebmWrongKey, arraysize(kWebmWrongKey)); | 340 kWebmWrongKey, arraysize(kWebmWrongKey)); |
| 289 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(frame.encrypted_data, | 341 scoped_refptr<DecoderBuffer> encrypted_data = |
| 290 frame.encrypted_data_size, | 342 CreateWebMEncryptedBuffer(frame.encrypted_data, |
| 291 frame.plain_text, | 343 frame.encrypted_data_size, |
| 292 frame.plain_text_size, | 344 frame.key_id, frame.key_id_size); |
| 293 frame.key_id, | 345 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
| 294 frame.key_id_size)); | |
| 295 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 346 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 296 frame.key, frame.key_size); | 347 frame.key, frame.key_size); |
| 297 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, | 348 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, |
| 298 frame.encrypted_data_size, | |
| 299 frame.plain_text, | 349 frame.plain_text, |
| 300 frame.plain_text_size, | 350 frame.plain_text_size)); |
| 301 frame.key_id, | |
| 302 frame.key_id_size)); | |
| 303 } | 351 } |
| 304 | 352 |
| 305 TEST_F(AesDecryptorTest, WrongSizedKey) { | 353 TEST_F(AesDecryptorTest, WrongSizedKey) { |
| 306 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 354 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 307 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 355 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 308 AddKeyAndExpectToFail(frame.key_id, frame.key_id_size, | 356 AddKeyAndExpectToFail(frame.key_id, frame.key_id_size, |
| 309 kWebmWrongSizedKey, arraysize(kWebmWrongSizedKey)); | 357 kWebmWrongSizedKey, arraysize(kWebmWrongSizedKey)); |
| 310 } | 358 } |
| 311 | 359 |
| 312 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { | 360 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { |
| 313 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 361 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 314 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 362 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 315 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 363 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 316 frame.key, frame.key_size); | 364 frame.key, frame.key_size); |
| 317 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame.encrypted_data, | 365 scoped_refptr<DecoderBuffer> encrypted_data = |
| 318 frame.encrypted_data_size, | 366 CreateWebMEncryptedBuffer(frame.encrypted_data, |
| 367 frame.encrypted_data_size, |
| 368 frame.key_id, frame.key_id_size); |
| 369 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data, |
| 319 frame.plain_text, | 370 frame.plain_text, |
| 320 frame.plain_text_size, | 371 frame.plain_text_size)); |
| 321 frame.key_id, | |
| 322 frame.key_id_size)); | |
| 323 | 372 |
| 324 const WebmEncryptedData& frame2 = kWebmEncryptedFrames[2]; | 373 const WebmEncryptedData& frame2 = kWebmEncryptedFrames[2]; |
| 325 GenerateKeyRequest(frame2.key_id, frame2.key_id_size); | 374 GenerateKeyRequest(frame2.key_id, frame2.key_id_size); |
| 326 AddKeyAndExpectToSucceed(frame2.key_id, frame2.key_id_size, | 375 AddKeyAndExpectToSucceed(frame2.key_id, frame2.key_id_size, |
| 327 frame2.key, frame2.key_size); | 376 frame2.key, frame2.key_size); |
| 328 | 377 |
| 329 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; | 378 const WebmEncryptedData& frame1 = kWebmEncryptedFrames[1]; |
| 330 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame1.encrypted_data, | 379 scoped_refptr<DecoderBuffer> encrypted_data1 = |
| 331 frame1.encrypted_data_size, | 380 CreateWebMEncryptedBuffer(frame1.encrypted_data, |
| 381 frame1.encrypted_data_size, |
| 382 frame1.key_id, frame1.key_id_size); |
| 383 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data1, |
| 332 frame1.plain_text, | 384 frame1.plain_text, |
| 333 frame1.plain_text_size, | 385 frame1.plain_text_size)); |
| 334 frame1.key_id, | |
| 335 frame1.key_id_size)); | |
| 336 | 386 |
| 337 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(frame2.encrypted_data, | 387 scoped_refptr<DecoderBuffer> encrypted_data2 = |
| 338 frame2.encrypted_data_size, | 388 CreateWebMEncryptedBuffer(frame2.encrypted_data, |
| 389 frame2.encrypted_data_size, |
| 390 frame2.key_id, frame2.key_id_size); |
| 391 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed(encrypted_data2, |
| 339 frame2.plain_text, | 392 frame2.plain_text, |
| 340 frame2.plain_text_size, | 393 frame2.plain_text_size)); |
| 341 frame2.key_id, | |
| 342 frame2.key_id_size)); | |
| 343 } | 394 } |
| 344 | 395 |
| 345 TEST_F(AesDecryptorTest, HmacCheckFailure) { | 396 TEST_F(AesDecryptorTest, HmacCheckFailure) { |
| 346 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 397 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 347 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 398 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 348 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 399 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 349 frame.key, frame.key_size); | 400 frame.key, frame.key_size); |
| 350 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0HmacDataChanged, | 401 scoped_refptr<DecoderBuffer> encrypted_data = |
| 351 frame.encrypted_data_size, | 402 CreateWebMEncryptedBuffer(kWebmFrame0HmacDataChanged, |
| 352 frame.plain_text, | 403 frame.encrypted_data_size, |
| 353 frame.plain_text_size, | 404 frame.key_id, frame.key_id_size); |
| 354 frame.key_id, | 405 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
| 355 frame.key_id_size)); | |
| 356 } | 406 } |
| 357 | 407 |
| 358 TEST_F(AesDecryptorTest, IvCheckFailure) { | 408 TEST_F(AesDecryptorTest, IvCheckFailure) { |
| 359 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 409 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 360 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 410 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 361 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 411 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 362 frame.key, frame.key_size); | 412 frame.key, frame.key_size); |
| 363 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0IvDataChanged, | 413 scoped_refptr<DecoderBuffer> encrypted_data = |
| 364 frame.encrypted_data_size, | 414 CreateWebMEncryptedBuffer(kWebmFrame0IvDataChanged, |
| 365 frame.plain_text, | 415 frame.encrypted_data_size, |
| 366 frame.plain_text_size, | 416 frame.key_id, frame.key_id_size); |
| 367 frame.key_id, | 417 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
| 368 frame.key_id_size)); | |
| 369 } | 418 } |
| 370 | 419 |
| 371 TEST_F(AesDecryptorTest, DataCheckFailure) { | 420 TEST_F(AesDecryptorTest, DataCheckFailure) { |
| 372 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; | 421 const WebmEncryptedData& frame = kWebmEncryptedFrames[0]; |
| 373 GenerateKeyRequest(frame.key_id, frame.key_id_size); | 422 GenerateKeyRequest(frame.key_id, frame.key_id_size); |
| 374 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, | 423 AddKeyAndExpectToSucceed(frame.key_id, frame.key_id_size, |
| 375 frame.key, frame.key_size); | 424 frame.key, frame.key_size); |
| 376 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(kWebmFrame0FrameDataChanged, | 425 scoped_refptr<DecoderBuffer> encrypted_data = |
| 377 frame.encrypted_data_size, | 426 CreateWebMEncryptedBuffer(kWebmFrame0FrameDataChanged, |
| 378 frame.plain_text, | 427 frame.encrypted_data_size, |
| 379 frame.plain_text_size, | 428 frame.key_id, frame.key_id_size); |
| 380 frame.key_id, | 429 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
| 381 frame.key_id_size)); | 430 } |
| 431 |
| 432 TEST_F(AesDecryptorTest, SubsampleDecryption) { |
| 433 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); |
| 434 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 435 kSubsampleKey, arraysize(kSubsampleKey)); |
| 436 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
| 437 kSubsampleData, arraysize(kSubsampleData), |
| 438 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 439 kSubsampleIv, arraysize(kSubsampleIv), |
| 440 0, |
| 441 std::vector<SubsampleEntry>( |
| 442 kSubsampleEntries, |
| 443 kSubsampleEntries + arraysize(kSubsampleEntries))); |
| 444 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed( |
| 445 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize)); |
| 446 } |
| 447 |
| 448 // Ensures noninterference of data offset and subsample mechanisms. We never |
| 449 // expect to encounter this in the wild, but since the DecryptConfig doesn't |
| 450 // disallow such a configuration, it should be covered. |
| 451 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { |
| 452 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); |
| 453 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 454 kSubsampleKey, arraysize(kSubsampleKey)); |
| 455 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
| 456 kPaddedSubsampleData, arraysize(kPaddedSubsampleData), |
| 457 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 458 kSubsampleIv, arraysize(kSubsampleIv), |
| 459 arraysize(kPaddedSubsampleData) - arraysize(kSubsampleData), |
| 460 std::vector<SubsampleEntry>( |
| 461 kSubsampleEntries, |
| 462 kSubsampleEntries + arraysize(kSubsampleEntries))); |
| 463 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed( |
| 464 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize)); |
| 465 } |
| 466 |
| 467 // No subsample or offset. |
| 468 TEST_F(AesDecryptorTest, NormalDecryption) { |
| 469 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); |
| 470 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 471 kSubsampleKey, arraysize(kSubsampleKey)); |
| 472 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
| 473 kNoSubsampleData, arraysize(kNoSubsampleData), |
| 474 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 475 kSubsampleIv, arraysize(kSubsampleIv), |
| 476 0, |
| 477 std::vector<SubsampleEntry>()); |
| 478 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToSucceed( |
| 479 encrypted_data, kSubsampleOriginalData, kSubsampleOriginalDataSize)); |
| 480 } |
| 481 |
| 482 TEST_F(AesDecryptorTest, IncorrectSubsampleSize) { |
| 483 GenerateKeyRequest(kSubsampleKeyId, arraysize(kSubsampleKeyId)); |
| 484 AddKeyAndExpectToSucceed(kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 485 kSubsampleKey, arraysize(kSubsampleKey)); |
| 486 std::vector<SubsampleEntry> entries( |
| 487 kSubsampleEntries, |
| 488 kSubsampleEntries + arraysize(kSubsampleEntries)); |
| 489 entries[2].cypher_bytes += 1; |
| 490 |
| 491 scoped_refptr<DecoderBuffer> encrypted_data = CreateSubsampleEncryptedBuffer( |
| 492 kSubsampleData, arraysize(kSubsampleData), |
| 493 kSubsampleKeyId, arraysize(kSubsampleKeyId), |
| 494 kSubsampleIv, arraysize(kSubsampleIv), |
| 495 0, |
| 496 entries); |
| 497 ASSERT_NO_FATAL_FAILURE(DecryptAndExpectToFail(encrypted_data)); |
| 382 } | 498 } |
| 383 | 499 |
| 384 } // namespace media | 500 } // namespace media |
| OLD | NEW |