json_web_key_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// found in the LICENSE file. 4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "media/cdm/json_web_key.h" 6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "base/logging.h" 8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace media { 11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class JSONWebKeyTest : public testing::Test { 13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) public: 14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) JSONWebKeyTest() {} 15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) protected: 17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void ExtractJWKKeysAndExpect(const std::string& jwk, 18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool expected_result, 19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t expected_number_of_keys) { 20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DCHECK(!jwk.empty()); 21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) KeyIdAndKeyPairs keys; 22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) EXPECT_EQ(expected_result, ExtractKeysFromJWKSet(jwk, &keys)); 23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) EXPECT_EQ(expected_number_of_keys, keys.size()); 24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(JSONWebKeyTest, GenerateJWKSet) { 28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const uint8 data1[] = { 0x01, 0x02 }; 29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; 30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 31926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; 32926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", 34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); 35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) EXPECT_EQ( 36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", 37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) GenerateJWKSet(data2, arraysize(data2), data2, arraysize(data2))); 38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", 39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) GenerateJWKSet(data1, arraysize(data1), data2, arraysize(data2))); 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) EXPECT_EQ("{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", 41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) GenerateJWKSet(data2, arraysize(data2), data1, arraysize(data1))); 42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) EXPECT_EQ( 43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{\"keys\":[{\"k\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":" 44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kty\":\"oct\"}]}", 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) GenerateJWKSet(data3, arraysize(data3), data3, arraysize(data3))); 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(JSONWebKeyTest, ExtractJWKKeys) { 49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try a simple JWK key (i.e. not in a set) 50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwkSimple = 51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{" 525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) " \"kty\": \"oct\"," 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "}"; 56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwkSimple, false, 0); 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try a key list with multiple entries. 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksMultipleEntries = 60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{" 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"keys\": [" 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " {" 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kty\": \"oct\"," 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " }," 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " {" 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kty\": \"oct\"," 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"JCUmJygpKissLS4vMA\"," 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " }" 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " ]" 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "}"; 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksMultipleEntries, true, 2); 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try a key with no spaces and some \n plus additional fields. 77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksNoSpaces = 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg" 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\",\"foo\":\"bar\"}]}\n\n"; 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksNoSpaces, true, 1); 82fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try some non-ASCII characters. 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect( 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "This is not ASCII due to \xff\xfe\xfd in it.", false, 0); 86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try some non-ASCII characters in an otherwise valid JWK. 88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksInvalidCharacters = 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"\xff\xfe\xfd" 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "\",\"foo\":\"bar\"}]}\n\n"; 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksInvalidCharacters, false, 0); 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try a badly formatted key. Assume that the JSON parser is fully tested, 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // so we won't try a lot of combinations. However, need a test to ensure 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // that the code doesn't crash if invalid JSON received. 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect("This is not a JSON key.", false, 0); 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try passing some valid JSON that is not a dictionary at the top level. 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect("40", false, 0); 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try an empty dictionary. 10381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ExtractJWKKeysAndExpect("{ }", false, 0); 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try an empty 'keys' dictionary. 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect("{ \"keys\": [] }", true, 0); 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try with 'keys' not a dictionary. 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect("{ \"keys\":\"1\" }", false, 0); 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try with 'keys' a list of integers. 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect("{ \"keys\": [ 1, 2, 3 ] }", false, 0); 113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try padding(=) at end of 'k' base64 string. 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksWithPaddedKey = 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{" 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"keys\": [" 118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " {" 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kty\": \"oct\"," 120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"AAECAw\"," 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" 122e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch " }" 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " ]" 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "}"; 125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithPaddedKey, false, 0); 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try padding(=) at end of 'kid' base64 string. 128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksWithPaddedKeyId = 129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{" 130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"keys\": [" 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " {" 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kty\": \"oct\"," 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"AAECAw==\"," 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " }" 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " ]" 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "}"; 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithPaddedKeyId, false, 0); 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Try a key with invalid base64 encoding. 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksWithInvalidBase64 = 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{" 143e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch " \"keys\": [" 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " {" 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kty\": \"oct\"," 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"!@#$%^&*()\"," 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " }" 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " ]" 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "}"; 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithInvalidBase64, false, 0); 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Empty key id. 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const std::string kJwksWithEmptyKeyId = 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "{" 156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"keys\": [" 157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " {" 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kty\": \"oct\"," 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"kid\": \"\"," 160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " }" 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) " ]" 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "}"; 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ExtractJWKKeysAndExpect(kJwksWithEmptyKeyId, false, 0); 165 166 // Try a list with multiple keys with the same kid. 167 const std::string kJwksDuplicateKids = 168 "{" 169 " \"keys\": [" 170 " {" 171 " \"kty\": \"oct\"," 172 " \"kid\": \"JCUmJygpKissLS4vMA\"," 173 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" 174 " }," 175 " {" 176 " \"kty\": \"oct\"," 177 " \"kid\": \"JCUmJygpKissLS4vMA\"," 178 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" 179 " }" 180 " ]" 181 "}"; 182 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); 183} 184 185} // namespace media 186 187