forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdigest_verifier.cc
104 lines (87 loc) · 3.36 KB
/
digest_verifier.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/chrome_cleaner/os/digest_verifier.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/chrome_cleaner/os/disk_util.h"
#include "chrome/chrome_cleaner/os/file_path_sanitization.h"
#include "chrome/chrome_cleaner/os/resource_util.h"
#include "chrome/chrome_cleaner/proto/file_digest.pb.h"
namespace chrome_cleaner {
// static
scoped_refptr<DigestVerifier> DigestVerifier::CreateFromResource(
int resource_id) {
// MakeRefCounted does not work with private constructor
auto instance = base::WrapRefCounted(new DigestVerifier());
if (!instance->InitializeFromResource(resource_id)) {
LOG(ERROR) << "Failed to initialize DigestVerifier from resource "
<< resource_id;
return nullptr;
}
return instance;
}
scoped_refptr<DigestVerifier> DigestVerifier::CreateFromFile(
const base::FilePath& file) {
// MakeRefCounted does not work with private constructor
auto instance = base::WrapRefCounted(new DigestVerifier());
if (!instance->InitializeFromFile(file))
return nullptr;
return instance;
}
bool DigestVerifier::IsKnownFile(const base::FilePath& file) const {
const auto digest_entry =
digests_.find(base::ToLowerASCII(file.BaseName().value()));
if (digest_entry == digests_.end())
return false;
std::string actual_digest;
if (!chrome_cleaner::ComputeSHA256DigestOfPath(file, &actual_digest)) {
LOG(ERROR) << "Failed to compute digest for " << SanitizePath(file);
return false;
}
return (base::ToLowerASCII(actual_digest) == digest_entry->second);
}
std::vector<base::FilePath::StringType> DigestVerifier::GetKnownFileNames()
const {
std::vector<base::FilePath::StringType> result;
result.reserve(digests_.size());
for (auto iter = digests_.begin(); iter != digests_.end(); ++iter) {
result.push_back(iter->first);
}
return result;
}
DigestVerifier::DigestVerifier() = default;
DigestVerifier::~DigestVerifier() = default;
bool DigestVerifier::InitializeFromResource(int resource_id) {
base::StringPiece serialized_digest_pb;
if (!chrome_cleaner::LoadResourceOfKind(resource_id, L"TEXT",
&serialized_digest_pb)) {
LOG(DFATAL) << "Failed to load expected digests from resources";
return false;
}
chrome_cleaner::FileDigests digests_pb;
if (!digests_pb.ParseFromString(serialized_digest_pb.as_string())) {
LOG(ERROR) << "Failed to parse digests protobuf";
return false;
}
for (const chrome_cleaner::FileDigest& digest : digests_pb.file_digests()) {
const std::wstring filename = base::UTF8ToWide(digest.filename());
digests_[base::ToLowerASCII(filename)] =
base::ToLowerASCII(digest.digest());
}
return true;
}
bool DigestVerifier::InitializeFromFile(const base::FilePath& file) {
std::string digest;
if (!chrome_cleaner::ComputeSHA256DigestOfPath(file, &digest)) {
LOG(ERROR) << "Failed to compute digest for " << SanitizePath(file);
return false;
}
digests_[base::ToLowerASCII(file.BaseName().value())] =
base::ToLowerASCII(digest);
return true;
}
} // namespace chrome_cleaner