17bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong/*
27bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * Copyright (C) 2014 The Android Open Source Project
37bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong *
47bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * Licensed under the Apache License, Version 2.0 (the "License");
57bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * you may not use this file except in compliance with the License.
67bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * You may obtain a copy of the License at
77bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong *
87bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong *      http://www.apache.org/licenses/LICENSE-2.0
97bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong *
107bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * Unless required by applicable law or agreed to in writing, software
117bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * distributed under the License is distributed on an "AS IS" BASIS,
127bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * See the License for the specific language governing permissions and
147bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong * limitations under the License.
157bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong */
167bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong#include <utils/Log.h>
177bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
187bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong#include "JsonWebKey.h"
197bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
207bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong#include "gtest/gtest.h"
217bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong#include "Utils.h"
227bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
237bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wongnamespace clearkeydrm {
247bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wongusing android::String8;
257bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wongusing android::Vector;
267bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
277bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wongclass JsonWebKeyTest : public ::testing::Test {
287bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong protected:
297bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    JsonWebKey* jwk;
307bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
317bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    JsonWebKeyTest() {
327bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        jwk = new JsonWebKey;
337bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    }
347bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
357bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    virtual ~JsonWebKeyTest() {
367bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        if (jwk)
377bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            delete jwk;
387bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    }
397bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong};
407bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
417bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wongvoid stringFromVector(const Vector<uint8_t>& input,
427bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        String8* converted) {
437bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    converted->clear();
447bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    if (input.isEmpty()) {
457bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        return;
467bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    }
477bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
487bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    for (size_t i = 0; i < input.size(); ++i) {
497bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        converted->appendFormat("%c", input.itemAt(i));
507bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    }
517bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
527bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
537bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wongvoid verifyKeys(const KeyMap& keys, const String8* clearKeys) {
547bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    if (keys.isEmpty()) {
557bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        return;
567bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    }
577bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
587bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    String8 keyString;
597bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    for (size_t i = 0; i < keys.size(); ++i) {
607bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        stringFromVector(keys.valueAt(i), &keyString);
617bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong        EXPECT_EQ(keyString, clearKeys[i]);
627bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    }
637bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
647bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
657bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, NoSymmetricKey) {
667bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
677bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
687bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "[{"
697bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"kty\":\"rsa\","
707bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"alg\":\"A128KW1\","
717bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"kid\":\"Y2xlYXJrZXlrZXlpZDAx\","
727bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"k\":\"1-GawgguFyGrWKav7AX4VKUg\""
737bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "}]"
747bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong          "}");
757bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
767bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
777bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_FALSE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
787bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.isEmpty());
797bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
807bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
817bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, NoKeysTag) {
827bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
837bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
847bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "[{"
857bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"kty\":\"oct\","
867bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"alg\":\"A128KW1\","
877bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"kid\":\"Y2xlYXJrZXlrZXlpZDAx\","
887bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"k\":\"1-GawgguFyGrWKav7AX4VKUg\""
897bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "},"
907bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "{"
917bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"kty\":\"oct\","
927bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"alg\":\"A128KW2\","
937bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"k\":\"R29vZCBkYXkh\","
947bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "\"kid\":\"Y2xlYXJrZXlrZXlpZDAy\""
957bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "}]"
967bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
977bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
987bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
997bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_FALSE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
1007bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.isEmpty());
1017bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
1027bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1037bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, NoKeyId) {
1047bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
1057bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
1067bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
1077bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "[{"
1087bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1097bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
1107bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"SGVsbG8gRnJpZW5kISE=\""
1117bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
1127bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
1137bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1147bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW2\""
1157bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
1167bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAy\""
1177bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}]"
1187bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
1197bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1207bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
1217bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
1227bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.size() == 1);
1237bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1247bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 clearKeys("Good day!");
1257bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    verifyKeys(keys, &clearKeys);
1267bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
1277bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1287bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, NoKey) {
1297bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
1307bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
1317bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
1327bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "[{"
1337bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1347bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
1357bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"`\""
1367bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
1377bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
1387bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1397bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW2\""
1407bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
1417bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAy\""
1427bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}]"
1437bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
1447bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1457bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
1467bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
1477bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.size() == 1);
1487bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1497bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 clearKeys("Good day!");
1507bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    verifyKeys(keys, &clearKeys);
1517bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
1527bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1537bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, MalformedKey) {
1547bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
1557bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
1567bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
1577bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "[{"
1587bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1597bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
1607bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"GawgguFyGrWKav7AX4V???\""
1617bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"67ef0gd8pvfd0=\""
1627bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
1637bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
1647bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1657bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
1667bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"GawgguFyGrWKav7AX4V???\""
1677bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":"
1687bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
1697bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
1707bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1717bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
1727bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        ":\"GawgguFyGrWKav7AX4V???\""
1737bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"67ef0gd8pvfd0=\""
1747bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
1757bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
1767bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
1777bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW3\""
1787bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAz\""
1797bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
1807bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}]"
1817bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
1827bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1837bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
1847bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
1857bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.size() == 1);
1867bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1877bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 clearKeys("Good day!");
1887bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    verifyKeys(keys, &clearKeys);
1897bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
1907bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1917bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, EmptyJsonWebKey) {
1927bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js;
1937bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
1947bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_FALSE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
1957bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.isEmpty());
1967bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
1977bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
1987bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, MalformedJsonWebKey) {
1997bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    // Missing begin array '['
2007bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
2017bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
2027bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
2037bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2047bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2057bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
2067bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"GawgguFyGrWKav7AX4VKUg\""
2077bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"67ef0gd8pvfd0=\""
2087bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2097bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "]"
2107bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
2117bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2127bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
2137bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_FALSE(jwk->extractKeysFromJsonWebKeySet(js, &keys));
2147bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.isEmpty());
2157bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
2167bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2177bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, SameKeyId) {
2187bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
2197bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
2207bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
2217bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "[{"
2227bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2237bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
2247bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAx\""
2257bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"SGVsbG8gRnJpZW5kISE\""
2267bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2277bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2287bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2297bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
2307bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"SGVsbG8gRnJpZW5kIQ\""
2317bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAx\""
2327bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2337bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2347bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2357bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW3\""
2367bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAz\""
2377bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
2387bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}]"
2397bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
2407bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2417bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
2427bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    jwk->extractKeysFromJsonWebKeySet(js, &keys);
2437bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.size() == 2);
2447bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2457bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 clearKeys[] =
2467bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            { String8("Hello Friend!"), String8("Good day!") };
2477bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    verifyKeys(keys, clearKeys);
2487bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
2497bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2507bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, ExtractWellFormedKeys) {
2517bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
2527bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
2537bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
2547bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "[{"
2557bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2567bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
2577bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2587bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2597bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2607bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW2\""
2617bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"SGVsbG8gRnJpZW5kIQ\""
2627bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAy\""
2637bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2647bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2657bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2667bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW3\""
2677bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAz\""
2687bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
2697bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}]"
2707bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
2717bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2727bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
2737bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    jwk->extractKeysFromJsonWebKeySet(js, &keys);
2747bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.size() == 2);
2757bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2767bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 clearKeys[] =
2777bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            { String8("Hello Friend!"), String8("Good day!") };
2787bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    verifyKeys(keys, clearKeys);
2797bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
2807bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
2817bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin WongTEST_F(JsonWebKeyTest, ExtractKeys) {
2827bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 js(
2837bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "{"
2847bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                "\"keys\":"
2857bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "[{"
2867bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAx\""
2877bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"SGVsbG8gRnJpZW5kISE\""
2887bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2897bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW1\""
2907bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2917bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2927bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
2937bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW2\""
2947bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"SGVsbG8gRnJpZW5kIQ\""
2957bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAy\""
2967bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
2977bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
2987bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"rsa\""
2997bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW-rsa\""
3007bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
3017bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"rsa-67ef0gd8pvfd0=\""
3027bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}"
3037bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "{"
3047bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"alg\":\"A128KW3\""
3057bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kid\":\"Y2xlYXJrZXlrZXlpZDAz\""
3067bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"k\":\"R29vZCBkYXkh\""
3077bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                        "\"kty\":\"oct\""
3087bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong                    "}]"
3097bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            "}");
3107bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
3117bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    KeyMap keys;
3127bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    jwk->extractKeysFromJsonWebKeySet(js, &keys);
3137bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    EXPECT_TRUE(keys.size() == 3);
3147bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
3157bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    const String8 clearKeys[] =
3167bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong            { String8("Hello Friend!!"), String8("Hello Friend!"),
3177bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong              String8("Good day!") };
3187bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong    verifyKeys(keys, clearKeys);
3197bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}
3207bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong
3217bdf28d2b83e527f474e96b0984d6a3f5eb457f7Edwin Wong}  // namespace clearkeydrm
322