json_web_key_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "media/cdm/json_web_key.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/logging.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace media { 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class JSONWebKeyTest : public testing::Test { 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) JSONWebKeyTest() {} 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) protected: 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExtractJWKKeysAndExpect(const std::string& jwk, 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool expected_result, 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) size_t expected_number_of_keys) { 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!jwk.empty()); 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) KeyIdAndKeyPairs keys; 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::SessionType session_type; 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_result, 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeysFromJWKSet(jwk, &keys, &session_type)); 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_number_of_keys, keys.size()); 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExtractSessionTypeAndExpect(const std::string& jwk, 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool expected_result, 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::SessionType expected_type) { 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(!jwk.empty()); 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) KeyIdAndKeyPairs keys; 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::SessionType session_type; 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_result, 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeysFromJWKSet(jwk, &keys, &session_type)); 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (expected_result) { 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Only check if successful. 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_type, session_type); 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void CreateLicenseAndExpect(const uint8* key_id, 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int key_id_length, 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::SessionType session_type, 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& expected_result) { 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<uint8> result; 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CreateLicenseRequest(key_id, key_id_length, session_type, &result); 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string s(result.begin(), result.end()); 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_result, s); 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExtractKeyFromLicenseAndExpect(const std::string& license, 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool expected_result, 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8* expected_key, 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int expected_key_length) { 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<uint8> license_vector(license.begin(), license.end()); 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<uint8> key; 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_result, 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractFirstKeyIdFromLicenseRequest(license_vector, &key)); 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (expected_result) { 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<uint8> key_result(expected_key, 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_key + expected_key_length); 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(key_result, key); 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(JSONWebKeyTest, GenerateJWKSet) { 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data1[] = { 0x01, 0x02 }; 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ( 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GenerateJWKSet(data2, arraysize(data2), data2, arraysize(data2))); 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GenerateJWKSet(data1, arraysize(data1), data2, arraysize(data2))); 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GenerateJWKSet(data2, arraysize(data2), data1, arraysize(data1))); 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ( 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":" 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kty\":\"oct\"}]}", 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GenerateJWKSet(data3, arraysize(data3), data3, arraysize(data3))); 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(JSONWebKeyTest, ExtractJWKKeys) { 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try a simple JWK key (i.e. not in a set) 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwkSimple = 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwkSimple, false, 0); 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try a key list with multiple entries. 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksMultipleEntries = 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"keys\": [" 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }," 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"JCUmJygpKissLS4vMA\"," 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }" 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " ]" 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksMultipleEntries, true, 2); 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try a key with no spaces and some \n plus additional fields. 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksNoSpaces = 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg" 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\",\"foo\":\"bar\"}]}\n\n"; 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksNoSpaces, true, 1); 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try some non-ASCII characters. 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect( 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "This is not ASCII due to \xff\xfe\xfd in it.", false, 0); 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try some non-ASCII characters in an otherwise valid JWK. 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksInvalidCharacters = 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"\xff\xfe\xfd" 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\",\"foo\":\"bar\"}]}\n\n"; 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksInvalidCharacters, false, 0); 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try a badly formatted key. Assume that the JSON parser is fully tested, 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // so we won't try a lot of combinations. However, need a test to ensure 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // that the code doesn't crash if invalid JSON received. 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect("This is not a JSON key.", false, 0); 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try passing some valid JSON that is not a dictionary at the top level. 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect("40", false, 0); 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try an empty dictionary. 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect("{ }", false, 0); 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try an empty 'keys' dictionary. 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect("{ \"keys\": [] }", true, 0); 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try with 'keys' not a dictionary. 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect("{ \"keys\":\"1\" }", false, 0); 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try with 'keys' a list of integers. 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect("{ \"keys\": [ 1, 2, 3 ] }", false, 0); 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try padding(=) at end of 'k' base64 string. 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksWithPaddedKey = 15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"keys\": [" 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"AAECAw\"," 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }" 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " ]" 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithPaddedKey, false, 0); 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try padding(=) at end of 'kid' base64 string. 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksWithPaddedKeyId = 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"keys\": [" 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"AAECAw==\"," 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }" 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " ]" 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithPaddedKeyId, false, 0); 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try a key with invalid base64 encoding. 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksWithInvalidBase64 = 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"keys\": [" 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"!@#$%^&*()\"," 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }" 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " ]" 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithInvalidBase64, false, 0); 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Empty key id. 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksWithEmptyKeyId = 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"keys\": [" 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"\"," 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }" 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " ]" 20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithEmptyKeyId, false, 0); 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try a list with multiple keys with the same kid. 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string kJwksDuplicateKids = 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{" 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"keys\": [" 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"JCUmJygpKissLS4vMA\"," 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }," 21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " {" 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kty\": \"oct\"," 21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"kid\": \"JCUmJygpKissLS4vMA\"," 21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " }" 22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) " ]" 22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "}"; 22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(JSONWebKeyTest, SessionType) { 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractSessionTypeAndExpect( 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) true, 23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION); 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractSessionTypeAndExpect( 23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\"temporary\"}", 23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) true, 23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION); 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractSessionTypeAndExpect( 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\"persistent\"}", 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) true, 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::PERSISTENT_SESSION); 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractSessionTypeAndExpect( 24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" 24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "\"unknown\"}", 24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) false, 24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION); 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractSessionTypeAndExpect( 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", 24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) false, 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION); 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(JSONWebKeyTest, CreateLicense) { 25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data1[] = { 0x01, 0x02 }; 25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; 25503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; 25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CreateLicenseAndExpect(data1, 25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data1), 26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION, 26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQI\"],\"type\":\"temporary\"}"); 26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CreateLicenseAndExpect(data1, 26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data1), 26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::PERSISTENT_SESSION, 26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQI\"],\"type\":\"persistent\"}"); 26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CreateLicenseAndExpect(data2, 26703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data2), 26803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::TEMPORARY_SESSION, 26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}"); 27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CreateLicenseAndExpect( 27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data3, 27203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data3), 27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaKeys::PERSISTENT_SESSION, 27403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":\"persistent\"}"); 27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 27603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(JSONWebKeyTest, ExtractLicense) { 27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data1[] = { 0x01, 0x02 }; 27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; 28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; 28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect( 28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQI\"],\"type\":\"temporary\"}", 28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) true, 28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data1, 28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data1)); 28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect( 28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQIDBA\"],\"type\":\"temporary\"}", 29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) true, 29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data2, 29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data2)); 29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect( 29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "{\"kids\":[\"AQIDBAUGBwgJCgsMDQ4PEA\"],\"type\":\"persistent\"}", 29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) true, 29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data3, 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) arraysize(data3)); 29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Try some incorrect JSON. 30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("", false, NULL, 0); 30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("!@#$%^&*()", false, NULL, 0); 30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Valid JSON, but not a dictionary. 30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("6", false, NULL, 0); 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("[\"AQI\"]", false, NULL, 0); 30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Dictionary, but missing expected tag. 30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("{\"kid\":[\"AQI\"]}", false, NULL, 0); 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Correct tag, but empty list. 31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("{\"kids\":[]}", false, NULL, 0); 31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Correct tag, but list doesn't contain a string. 31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("{\"kids\":[[\"AQI\"]]}", false, NULL, 0); 31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Correct tag, but invalid base64 encoding. 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtractKeyFromLicenseAndExpect("{\"kids\":[\"!@#$%^&*()\"]}", false, NULL, 0); 31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace media 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)