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)