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