1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string>
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <vector>
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/base64.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/path_service.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/stl_util.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/browser/verified_contents.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/common/extension.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/common/extension_paths.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace extensions {
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string DecodeBase64Url(const std::string& encoded) {
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string fixed_up_base64 = encoded;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!VerifiedContents::FixupBase64Encoding(&fixed_up_base64))
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return std::string();
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string decoded;
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!base::Base64Decode(fixed_up_base64, &decoded))
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return std::string();
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return decoded;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GetPublicKey(const base::FilePath& path, std::string* public_key) {
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string public_key_pem;
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::ReadFileToString(path, &public_key_pem))
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return false;
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!Extension::ParsePEMKeyBytes(public_key_pem, public_key))
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return false;
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return true;
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST(VerifiedContents, Simple) {
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Figure out our test data directory.
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath path;
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PathService::Get(DIR_TEST_DATA, &path);
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  path = path.AppendASCII("content_verifier/");
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Initialize the VerifiedContents object.
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string public_key;
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(GetPublicKey(path.AppendASCII("public_key.pem"), &public_key));
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifiedContents contents(reinterpret_cast<const uint8*>(public_key.data()),
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            public_key.size());
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath verified_contents_path =
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      path.AppendASCII("verified_contents.json");
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(contents.InitFrom(verified_contents_path, false));
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Make sure we get expected values.
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(contents.block_size(), 4096);
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(contents.extension_id(), "abcdefghijklmnopabcdefghijklmnop");
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ("1.2.3", contents.version().GetString());
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("manifest.json"),
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("-vyyIIn7iSCzg7X3ICUI5wZa3tG7w7vyiCckxZdJGfs")));
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("background.js"),
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("txHiG5KQvNoPOSH5FbQo9Zb5gJ23j3oFB0Ru9DOnziw")));
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath foo_bar_html =
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("foo")).AppendASCII("bar.html");
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(foo_bar_html.IsAbsolute());
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      foo_bar_html,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("L37LFbT_hmtxRL7AfGZN9YTpW6yoz_ZiQ1opLJn1NZU")));
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FilePath nonexistent = base::FilePath::FromUTF8Unsafe("nonexistent");
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(contents.HasTreeHashRoot(nonexistent));
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("lowercase.html"),
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("HpLotLGCmmOdKYvGQmD3OkXMKGs458dbanY4WcfAZI0")));
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("Lowercase.Html"),
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("HpLotLGCmmOdKYvGQmD3OkXMKGs458dbanY4WcfAZI0")));
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("LOWERCASE.HTML"),
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("HpLotLGCmmOdKYvGQmD3OkXMKGs458dbanY4WcfAZI0")));
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("ALLCAPS.HTML"),
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("bl-eV8ENowvtw6P14D4X1EP0mlcMoG-_aOx5o9C1364")));
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("AllCaps.Html"),
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("bl-eV8ENowvtw6P14D4X1EP0mlcMoG-_aOx5o9C1364")));
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("allcaps.html"),
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("bl-eV8ENowvtw6P14D4X1EP0mlcMoG-_aOx5o9C1364")));
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("MixedCase.Html"),
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("zEAO9FwciigMNy3NtU2XNb-dS5TQMmVNx0T9h7WvXbQ")));
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("MIXEDCASE.HTML"),
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("zEAO9FwciigMNy3NtU2XNb-dS5TQMmVNx0T9h7WvXbQ")));
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("mixedcase.html"),
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("zEAO9FwciigMNy3NtU2XNb-dS5TQMmVNx0T9h7WvXbQ")));
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("mIxedcAse.Html"),
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("zEAO9FwciigMNy3NtU2XNb-dS5TQMmVNx0T9h7WvXbQ")));
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("mIxedcAse.Html"),
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("nKRqUcJg1_QZWAeCb4uFd5ouC0McuGavKp8TFDRqBgg")));
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("MIXEDCASE.HTML"),
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("nKRqUcJg1_QZWAeCb4uFd5ouC0McuGavKp8TFDRqBgg")));
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("mixedcase.html"),
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("nKRqUcJg1_QZWAeCb4uFd5ouC0McuGavKp8TFDRqBgg")));
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(contents.TreeHashRootEquals(
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FilePath::FromUTF8Unsafe("MixedCase.Html"),
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeBase64Url("nKRqUcJg1_QZWAeCb4uFd5ouC0McuGavKp8TFDRqBgg")));
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace extensions
130