Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "media/cdm/json_web_key.h" | 5 #include "media/cdm/json_web_key.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace media { | 10 namespace media { |
| 11 | 11 |
| 12 class JSONWebKeyTest : public testing::Test { | 12 class JSONWebKeyTest : public testing::Test { |
| 13 public: | 13 public: |
| 14 JSONWebKeyTest() {} | 14 JSONWebKeyTest() {} |
| 15 | 15 |
| 16 protected: | 16 protected: |
| 17 void ExtractJWKKeysAndExpect(const std::string& jwk, | 17 void ExtractJWKKeysAndExpect(const std::string& jwk, |
| 18 bool expected_result, | 18 bool expected_result, |
| 19 size_t expected_number_of_keys) { | 19 size_t expected_number_of_keys) { |
| 20 DCHECK(!jwk.empty()); | 20 DCHECK(!jwk.empty()); |
| 21 KeyIdAndKeyPairs keys; | 21 KeyIdAndKeyPairs keys; |
| 22 EXPECT_EQ(expected_result, ExtractKeysFromJWKSet(jwk, &keys)); | 22 MediaKeys::SessionType session_type; |
| 23 EXPECT_EQ(expected_result, | |
| 24 ExtractKeysFromJWKSet(jwk, &keys, &session_type)); | |
| 23 EXPECT_EQ(expected_number_of_keys, keys.size()); | 25 EXPECT_EQ(expected_number_of_keys, keys.size()); |
| 24 } | 26 } |
| 27 | |
| 28 void ExtractSessionTypeAndExpect(const std::string& jwk, | |
| 29 bool expected_result, | |
| 30 MediaKeys::SessionType expected_type) { | |
| 31 DCHECK(!jwk.empty()); | |
| 32 KeyIdAndKeyPairs keys; | |
| 33 MediaKeys::SessionType session_type; | |
| 34 EXPECT_EQ(expected_result, | |
| 35 ExtractKeysFromJWKSet(jwk, &keys, &session_type)); | |
| 36 if (expected_result) { | |
| 37 // Only check if successful. | |
| 38 EXPECT_EQ(expected_type, session_type); | |
| 39 } | |
| 40 } | |
| 41 | |
| 42 void CreateLicenseAndExpect(const uint8* key_id, | |
| 43 int key_id_length, | |
| 44 MediaKeys::SessionType session_type, | |
| 45 std::string expected_result) { | |
|
xhwang
2014/07/30 05:56:08
pass by const ref
jrummell
2014/07/30 18:44:16
Done.
| |
| 46 std::vector<uint8> result; | |
| 47 CreateLicenseRequest(key_id, key_id_length, session_type, result); | |
| 48 std::string s(result.begin(), result.end()); | |
| 49 EXPECT_EQ(expected_result, s); | |
| 50 } | |
| 51 | |
| 52 std::string HexString(const uint8* data, int length) { | |
|
xhwang
2014/07/30 05:56:08
Can you use HexEncode?
https://code.google.com/p
jrummell
2014/07/30 18:44:16
No longer needed.
| |
| 53 std::stringstream ss; | |
| 54 for (int i = 0; i < length; ++i, ++data) { | |
| 55 ss << std::hex << *data; | |
| 56 } | |
| 57 return ss.str(); | |
| 58 } | |
| 59 | |
| 60 void ExtractKeyFromLicenseAndExpect(const std::string license, | |
|
xhwang
2014/07/30 05:56:08
pass by const ref
jrummell
2014/07/30 18:44:16
Done.
| |
| 61 bool expected_result, | |
| 62 const uint8* expected_key, | |
| 63 int expected_key_length) { | |
| 64 std::vector<uint8> expanded_license(license.begin(), license.end()); | |
|
xhwang
2014/07/30 05:56:08
what do you mean by "expanded"? If we just convert
jrummell
2014/07/30 18:44:16
Done.
| |
| 65 std::vector<uint8> key; | |
| 66 EXPECT_EQ(expected_result, ExtractLicenseKey(expanded_license, key)); | |
| 67 if (expected_result) { | |
| 68 EXPECT_EQ(HexString(expected_key, expected_key_length), | |
| 69 HexString(key.data(), key.size())); | |
|
xhwang
2014/07/30 05:56:08
Why do you need to HexString() and then compare? C
jrummell
2014/07/30 18:44:16
Didn't realize that EXPECT_EQ displays the vector
| |
| 70 } | |
| 71 } | |
| 25 }; | 72 }; |
| 26 | 73 |
| 27 TEST_F(JSONWebKeyTest, GenerateJWKSet) { | 74 TEST_F(JSONWebKeyTest, GenerateJWKSet) { |
| 28 const uint8 data1[] = { 0x01, 0x02 }; | 75 const uint8 data1[] = { 0x01, 0x02 }; |
| 29 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; | 76 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; |
| 30 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | 77 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
| 31 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; | 78 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
| 32 | 79 |
| 33 EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", | 80 EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
| 34 GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); | 81 GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 " {" | 222 " {" |
| 176 " \"kty\": \"oct\"," | 223 " \"kty\": \"oct\"," |
| 177 " \"kid\": \"JCUmJygpKissLS4vMA\"," | 224 " \"kid\": \"JCUmJygpKissLS4vMA\"," |
| 178 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" | 225 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" |
| 179 " }" | 226 " }" |
| 180 " ]" | 227 " ]" |
| 181 "}"; | 228 "}"; |
| 182 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); | 229 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); |
| 183 } | 230 } |
| 184 | 231 |
| 232 TEST_F(JSONWebKeyTest, SessionType) { | |
| 233 ExtractSessionTypeAndExpect( | |
| 234 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", | |
| 235 true, | |
| 236 MediaKeys::TEMPORARY_SESSION); | |
| 237 ExtractSessionTypeAndExpect( | |
| 238 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | |
| 239 "\"temporary\"}", | |
| 240 true, | |
| 241 MediaKeys::TEMPORARY_SESSION); | |
| 242 ExtractSessionTypeAndExpect( | |
| 243 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | |
| 244 "\"persistent\"}", | |
| 245 true, | |
| 246 MediaKeys::PERSISTENT_SESSION); | |
| 247 ExtractSessionTypeAndExpect( | |
| 248 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | |
| 249 "\"unknown\"}", | |
| 250 false, | |
| 251 MediaKeys::TEMPORARY_SESSION); | |
| 252 ExtractSessionTypeAndExpect( | |
| 253 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", | |
| 254 false, | |
| 255 MediaKeys::TEMPORARY_SESSION); | |
| 256 } | |
| 257 | |
| 258 TEST_F(JSONWebKeyTest, CreateLicense) { | |
| 259 const uint8 data1[] = { 0x01, 0x02 }; | |
| 260 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; | |
| 261 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | |
| 262 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; | |
| 263 | |
| 264 CreateLicenseAndExpect(data1, | |
| 265 arraysize(data1), | |
| 266 MediaKeys::TEMPORARY_SESSION, | |
| 267 "{\"kids\":[\"AQI\"],\"type\":\"temporary\"}"); | |
| 268 CreateLicenseAndExpect(data1, | |
| 269 arraysize(data1), | |
| 270 MediaKeys::PERSISTENT_SESSION, | |
| 271 "{\"kids\":[\"AQI\"],\"type\":\"persistent\"}"); | |
| 272 CreateLicenseAndExpect(data2, | |
| 273 arraysize(data2), | |
| 274 MediaKeys::TEMPORARY_SESSION, | |
| 275 "{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}"); | |
| 276 CreateLicenseAndExpect( | |
| 277 data3, | |
| 278 arraysize(data3), | |
| 279 MediaKeys::PERSISTENT_SESSION, | |
| 280 "{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":\"persistent\"}"); | |
| 281 } | |
| 282 | |
| 283 TEST_F(JSONWebKeyTest, ExtractLicense) { | |
| 284 const uint8 data1[] = { 0x01, 0x02 }; | |
| 285 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; | |
| 286 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | |
| 287 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; | |
| 288 | |
| 289 ExtractKeyFromLicenseAndExpect( | |
| 290 "{\"kids\":[\"AQI\"],\"type\":\"temporary\"}", | |
| 291 true, | |
| 292 data1, | |
| 293 arraysize(data1)); | |
| 294 ExtractKeyFromLicenseAndExpect( | |
| 295 "{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}", | |
| 296 true, | |
| 297 data2, | |
| 298 arraysize(data2)); | |
| 299 ExtractKeyFromLicenseAndExpect( | |
| 300 "{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":\"persistent\"}", | |
| 301 true, | |
| 302 data3, | |
| 303 arraysize(data3)); | |
| 304 | |
| 305 // Try some incorrect JSON. | |
| 306 ExtractKeyFromLicenseAndExpect("", false, NULL, 0); | |
| 307 ExtractKeyFromLicenseAndExpect("!@#$%^&*()", false, NULL, 0); | |
| 308 | |
| 309 // Valid JSON, but not a dictionary. | |
| 310 ExtractKeyFromLicenseAndExpect("6", false, NULL, 0); | |
| 311 ExtractKeyFromLicenseAndExpect("[\"AQI\"]", false, NULL, 0); | |
| 312 | |
| 313 // Dictionary, but missing expected tag. | |
| 314 ExtractKeyFromLicenseAndExpect("{\"kid\":[\"AQI\"]}", false, NULL, 0); | |
| 315 | |
| 316 // Correct tag, but empty list. | |
| 317 ExtractKeyFromLicenseAndExpect("{\"kids\":[]}", false, NULL, 0); | |
| 318 | |
| 319 // Correct tag, but list doesn't contain a string. | |
| 320 ExtractKeyFromLicenseAndExpect("{\"kids\":[[\"AQI\"]]}", false, NULL, 0); | |
| 321 | |
| 322 // Correct tag, but invalid base64 encoding. | |
| 323 ExtractKeyFromLicenseAndExpect("{\"kids\":[\"!@#$%^&*()\"]}", false, NULL, 0); | |
| 324 } | |
| 325 | |
| 185 } // namespace media | 326 } // namespace media |
| 186 | 327 |
| OLD | NEW |