| 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 const std::string& expected_result) { |
| 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 void ExtractKeyFromLicenseAndExpect(const std::string& license, |
| 53 bool expected_result, |
| 54 const uint8* expected_key, |
| 55 int expected_key_length) { |
| 56 std::vector<uint8> license_vector(license.begin(), license.end()); |
| 57 std::vector<uint8> key; |
| 58 EXPECT_EQ(expected_result, |
| 59 ExtractFirstKeyIdFromLicenseRequest(license_vector, &key)); |
| 60 if (expected_result) { |
| 61 std::vector<uint8> key_result(expected_key, |
| 62 expected_key + expected_key_length); |
| 63 EXPECT_EQ(key_result, key); |
| 64 } |
| 65 } |
| 25 }; | 66 }; |
| 26 | 67 |
| 27 TEST_F(JSONWebKeyTest, GenerateJWKSet) { | 68 TEST_F(JSONWebKeyTest, GenerateJWKSet) { |
| 28 const uint8 data1[] = { 0x01, 0x02 }; | 69 const uint8 data1[] = { 0x01, 0x02 }; |
| 29 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; | 70 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; |
| 30 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | 71 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
| 31 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; | 72 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
| 32 | 73 |
| 33 EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", | 74 EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
| 34 GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); | 75 GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 " {" | 216 " {" |
| 176 " \"kty\": \"oct\"," | 217 " \"kty\": \"oct\"," |
| 177 " \"kid\": \"JCUmJygpKissLS4vMA\"," | 218 " \"kid\": \"JCUmJygpKissLS4vMA\"," |
| 178 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" | 219 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" |
| 179 " }" | 220 " }" |
| 180 " ]" | 221 " ]" |
| 181 "}"; | 222 "}"; |
| 182 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); | 223 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); |
| 183 } | 224 } |
| 184 | 225 |
| 226 TEST_F(JSONWebKeyTest, SessionType) { |
| 227 ExtractSessionTypeAndExpect( |
| 228 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
| 229 true, |
| 230 MediaKeys::TEMPORARY_SESSION); |
| 231 ExtractSessionTypeAndExpect( |
| 232 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
| 233 "\"temporary\"}", |
| 234 true, |
| 235 MediaKeys::TEMPORARY_SESSION); |
| 236 ExtractSessionTypeAndExpect( |
| 237 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
| 238 "\"persistent\"}", |
| 239 true, |
| 240 MediaKeys::PERSISTENT_SESSION); |
| 241 ExtractSessionTypeAndExpect( |
| 242 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
| 243 "\"unknown\"}", |
| 244 false, |
| 245 MediaKeys::TEMPORARY_SESSION); |
| 246 ExtractSessionTypeAndExpect( |
| 247 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", |
| 248 false, |
| 249 MediaKeys::TEMPORARY_SESSION); |
| 250 } |
| 251 |
| 252 TEST_F(JSONWebKeyTest, CreateLicense) { |
| 253 const uint8 data1[] = { 0x01, 0x02 }; |
| 254 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; |
| 255 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
| 256 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
| 257 |
| 258 CreateLicenseAndExpect(data1, |
| 259 arraysize(data1), |
| 260 MediaKeys::TEMPORARY_SESSION, |
| 261 "{\"kids\":[\"AQI\"],\"type\":\"temporary\"}"); |
| 262 CreateLicenseAndExpect(data1, |
| 263 arraysize(data1), |
| 264 MediaKeys::PERSISTENT_SESSION, |
| 265 "{\"kids\":[\"AQI\"],\"type\":\"persistent\"}"); |
| 266 CreateLicenseAndExpect(data2, |
| 267 arraysize(data2), |
| 268 MediaKeys::TEMPORARY_SESSION, |
| 269 "{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}"); |
| 270 CreateLicenseAndExpect( |
| 271 data3, |
| 272 arraysize(data3), |
| 273 MediaKeys::PERSISTENT_SESSION, |
| 274 "{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":\"persistent\"}"); |
| 275 } |
| 276 |
| 277 TEST_F(JSONWebKeyTest, ExtractLicense) { |
| 278 const uint8 data1[] = { 0x01, 0x02 }; |
| 279 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; |
| 280 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
| 281 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
| 282 |
| 283 ExtractKeyFromLicenseAndExpect( |
| 284 "{\"kids\":[\"AQI\"],\"type\":\"temporary\"}", |
| 285 true, |
| 286 data1, |
| 287 arraysize(data1)); |
| 288 ExtractKeyFromLicenseAndExpect( |
| 289 "{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}", |
| 290 true, |
| 291 data2, |
| 292 arraysize(data2)); |
| 293 ExtractKeyFromLicenseAndExpect( |
| 294 "{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":\"persistent\"}", |
| 295 true, |
| 296 data3, |
| 297 arraysize(data3)); |
| 298 |
| 299 // Try some incorrect JSON. |
| 300 ExtractKeyFromLicenseAndExpect("", false, NULL, 0); |
| 301 ExtractKeyFromLicenseAndExpect("!@#$%^&*()", false, NULL, 0); |
| 302 |
| 303 // Valid JSON, but not a dictionary. |
| 304 ExtractKeyFromLicenseAndExpect("6", false, NULL, 0); |
| 305 ExtractKeyFromLicenseAndExpect("[\"AQI\"]", false, NULL, 0); |
| 306 |
| 307 // Dictionary, but missing expected tag. |
| 308 ExtractKeyFromLicenseAndExpect("{\"kid\":[\"AQI\"]}", false, NULL, 0); |
| 309 |
| 310 // Correct tag, but empty list. |
| 311 ExtractKeyFromLicenseAndExpect("{\"kids\":[]}", false, NULL, 0); |
| 312 |
| 313 // Correct tag, but list doesn't contain a string. |
| 314 ExtractKeyFromLicenseAndExpect("{\"kids\":[[\"AQI\"]]}", false, NULL, 0); |
| 315 |
| 316 // Correct tag, but invalid base64 encoding. |
| 317 ExtractKeyFromLicenseAndExpect("{\"kids\":[\"!@#$%^&*()\"]}", false, NULL, 0); |
| 318 } |
| 319 |
| 185 } // namespace media | 320 } // namespace media |
| 186 | 321 |
| OLD | NEW |