blob: b32ffc95b49f8c655069961d3b8a3b0764bacea9 [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Andrew de los Reyes09e56d62010-04-23 13:45:53 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymo8427b4a2014-11-05 14:00:32 -08005#include "update_engine/delta_performer.h"
6
Andrew de los Reyes09e56d62010-04-23 13:45:53 -07007#include <inttypes.h>
Alex Deymo161c4a12014-05-16 15:56:21 -07008#include <sys/mount.h>
Andrew de los Reyes09e56d62010-04-23 13:45:53 -07009
10#include <algorithm>
11#include <string>
12#include <vector>
13
Ben Chan06c76a42014-09-05 08:21:06 -070014#include <base/files/file_util.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070015#include <base/strings/string_util.h>
16#include <base/strings/stringprintf.h>
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070017#include <google/protobuf/repeated_field.h>
18#include <gtest/gtest.h>
19
Jay Srinivasand29695d2013-04-08 15:08:05 -070020#include "update_engine/constants.h"
Andrew de los Reyes353777c2010-10-08 10:34:30 -070021#include "update_engine/extent_ranges.h"
David Zeuthene7f89172013-10-31 10:21:04 -070022#include "update_engine/fake_hardware.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070023#include "update_engine/fake_system_state.h"
Alex Deymo8427b4a2014-11-05 14:00:32 -080024#include "update_engine/mock_prefs.h"
Alex Deymo161c4a12014-05-16 15:56:21 -070025#include "update_engine/payload_constants.h"
26#include "update_engine/payload_generator/delta_diff_generator.h"
Alex Deymo923d8fa2014-07-15 17:58:51 -070027#include "update_engine/payload_generator/payload_signer.h"
28#include "update_engine/payload_verifier.h"
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070029#include "update_engine/test_utils.h"
30#include "update_engine/update_metadata.pb.h"
31#include "update_engine/utils.h"
32
33namespace chromeos_update_engine {
34
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070035using std::string;
36using std::vector;
Darin Petkov73058b42010-10-06 16:32:19 -070037using testing::Return;
Alex Deymo161c4a12014-05-16 15:56:21 -070038using testing::_;
Alex Deymo10875d92014-11-10 21:52:57 -080039using test_utils::kRandomString;
40using test_utils::ScopedLoopMounter;
41using test_utils::System;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070042
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070043extern const char* kUnittestPrivateKeyPath;
Darin Petkovd7061ab2010-10-06 14:37:09 -070044extern const char* kUnittestPublicKeyPath;
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -070045extern const char* kUnittestPrivateKey2Path;
46extern const char* kUnittestPublicKey2Path;
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070047
Jay Srinivasan738fdf32012-12-07 17:40:54 -080048static const size_t kBlockSize = 4096;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070049static const char* kBogusMetadataSignature1 =
50 "awSFIUdUZz2VWFiR+ku0Pj00V7bPQPQFYQSXjEXr3vaw3TE4xHV5CraY3/YrZpBv"
51 "J5z4dSBskoeuaO1TNC/S6E05t+yt36tE4Fh79tMnJ/z9fogBDXWgXLEUyG78IEQr"
52 "YH6/eBsQGT2RJtBgXIXbZ9W+5G9KmGDoPOoiaeNsDuqHiBc/58OFsrxskH8E6vMS"
53 "BmMGGk82mvgzic7ApcoURbCGey1b3Mwne/hPZ/bb9CIyky8Og9IfFMdL2uAweOIR"
54 "fjoTeLYZpt+WN65Vu7jJ0cQN8e1y+2yka5112wpRf/LLtPgiAjEZnsoYpLUd7CoV"
55 "pLRtClp97kN2+tXGNBQqkA==";
Jay Srinivasan738fdf32012-12-07 17:40:54 -080056
Alex Vakulenkod2779df2014-06-16 13:19:00 -070057static const int kDefaultKernelSize = 4096; // Something small for a test
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080058static const uint8_t kNewData[] = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ',
59 'n', 'e', 'w', ' ', 'd', 'a', 't', 'a', '.'};
Jay Srinivasan738fdf32012-12-07 17:40:54 -080060
Andrew de los Reyes27f7d372010-10-07 11:26:07 -070061namespace {
Jay Srinivasan738fdf32012-12-07 17:40:54 -080062struct DeltaState {
63 string a_img;
64 string b_img;
65 int image_size;
Andrew de los Reyes27f7d372010-10-07 11:26:07 -070066
Jay Srinivasan738fdf32012-12-07 17:40:54 -080067 string delta_path;
68 uint64_t metadata_size;
Andrew de los Reyes27f7d372010-10-07 11:26:07 -070069
Jay Srinivasan738fdf32012-12-07 17:40:54 -080070 string old_kernel;
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080071 chromeos::Blob old_kernel_data;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070072
Jay Srinivasan738fdf32012-12-07 17:40:54 -080073 string new_kernel;
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080074 chromeos::Blob new_kernel_data;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070075
Jay Srinivasan738fdf32012-12-07 17:40:54 -080076 // The in-memory copy of delta file.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -080077 chromeos::Blob delta;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080078
79 // The mock system state object with which we initialize the
80 // delta performer.
Gilad Arnold5bb4c902014-04-10 12:32:13 -070081 FakeSystemState fake_system_state;
Jay Srinivasan738fdf32012-12-07 17:40:54 -080082};
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070083
Jay Srinivasan738fdf32012-12-07 17:40:54 -080084enum SignatureTest {
85 kSignatureNone, // No payload signing.
86 kSignatureGenerator, // Sign the payload at generation time.
87 kSignatureGenerated, // Sign the payload after it's generated.
Don Garrett2ae37872013-10-25 13:33:20 -070088 kSignatureGeneratedPlaceholder, // Insert placeholder signatures, then real.
Alex Vakulenkod2779df2014-06-16 13:19:00 -070089 kSignatureGeneratedPlaceholderMismatch, // Insert a wrong sized placeholder.
Jay Srinivasan738fdf32012-12-07 17:40:54 -080090 kSignatureGeneratedShell, // Sign the generated payload through shell cmds.
91 kSignatureGeneratedShellBadKey, // Sign with a bad key through shell cmds.
92 kSignatureGeneratedShellRotateCl1, // Rotate key, test client v1
93 kSignatureGeneratedShellRotateCl2, // Rotate key, test client v2
94};
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070095
Jay Srinivasan738fdf32012-12-07 17:40:54 -080096// Different options that determine what we should fill into the
97// install_plan.metadata_signature to simulate the contents received in the
98// Omaha response.
99enum MetadataSignatureTest {
100 kEmptyMetadataSignature,
101 kInvalidMetadataSignature,
102 kValidMetadataSignature,
103};
104
105enum OperationHashTest {
106 kInvalidOperationData,
107 kValidOperationData,
108};
109
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700110} // namespace
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800111
112static void CompareFilesByBlock(const string& a_file, const string& b_file) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800113 chromeos::Blob a_data, b_data;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700114 EXPECT_TRUE(utils::ReadFile(a_file, &a_data)) << "file failed: " << a_file;
115 EXPECT_TRUE(utils::ReadFile(b_file, &b_data)) << "file failed: " << b_file;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700116
117 EXPECT_EQ(a_data.size(), b_data.size());
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700118 EXPECT_EQ(0, a_data.size() % kBlockSize);
119 for (size_t i = 0; i < a_data.size(); i += kBlockSize) {
120 EXPECT_EQ(0, i % kBlockSize);
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800121 chromeos::Blob a_sub(&a_data[i], &a_data[i + kBlockSize]);
122 chromeos::Blob b_sub(&b_data[i], &b_data[i + kBlockSize]);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700123 EXPECT_TRUE(a_sub == b_sub) << "Block " << (i/kBlockSize) << " differs";
124 }
125}
126
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800127static bool WriteSparseFile(const string& path, off_t size) {
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700128 int fd = open(path.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0644);
129 TEST_AND_RETURN_FALSE_ERRNO(fd >= 0);
130 ScopedFdCloser fd_closer(&fd);
131 off_t rc = lseek(fd, size + 1, SEEK_SET);
132 TEST_AND_RETURN_FALSE_ERRNO(rc != static_cast<off_t>(-1));
133 int return_code = ftruncate(fd, size);
134 TEST_AND_RETURN_FALSE_ERRNO(return_code == 0);
135 return true;
136}
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700137
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800138static size_t GetSignatureSize(const string& private_key_path) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800139 const chromeos::Blob data(1, 'x');
140 chromeos::Blob hash;
Darin Petkovcbfb0172011-01-14 15:24:45 -0800141 EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(data, &hash));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800142 chromeos::Blob signature;
Darin Petkovcbfb0172011-01-14 15:24:45 -0800143 EXPECT_TRUE(PayloadSigner::SignHash(hash,
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800144 private_key_path,
Darin Petkovcbfb0172011-01-14 15:24:45 -0800145 &signature));
146 return signature.size();
147}
148
Don Garrett2ae37872013-10-25 13:33:20 -0700149static bool InsertSignaturePlaceholder(int signature_size,
150 const string& payload_path,
151 uint64_t* out_metadata_size) {
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800152 vector<chromeos::Blob> signatures;
153 signatures.push_back(chromeos::Blob(signature_size, 0));
Don Garrett2ae37872013-10-25 13:33:20 -0700154
155 return PayloadSigner::AddSignatureToPayload(
156 payload_path,
157 signatures,
158 payload_path,
159 out_metadata_size);
160}
161
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800162static void SignGeneratedPayload(const string& payload_path,
163 uint64_t* out_metadata_size) {
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800164 int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800165 chromeos::Blob hash;
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700166 ASSERT_TRUE(PayloadSigner::HashPayloadForSigning(
167 payload_path,
168 vector<int>(1, signature_size),
169 &hash));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800170 chromeos::Blob signature;
Darin Petkovcbfb0172011-01-14 15:24:45 -0800171 ASSERT_TRUE(PayloadSigner::SignHash(hash,
172 kUnittestPrivateKeyPath,
173 &signature));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700174 ASSERT_TRUE(PayloadSigner::AddSignatureToPayload(
175 payload_path,
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800176 vector<chromeos::Blob>(1, signature),
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800177 payload_path,
178 out_metadata_size));
Alex Deymo923d8fa2014-07-15 17:58:51 -0700179 EXPECT_TRUE(PayloadVerifier::VerifySignedPayload(
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700180 payload_path,
181 kUnittestPublicKeyPath,
182 kSignatureMessageOriginalVersion));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800183}
184
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800185static void SignGeneratedShellPayload(SignatureTest signature_test,
186 const string& payload_path) {
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800187 string private_key_path = kUnittestPrivateKeyPath;
188 if (signature_test == kSignatureGeneratedShellBadKey) {
Gilad Arnolda6742b32014-01-11 00:18:34 -0800189 ASSERT_TRUE(utils::MakeTempFile("key.XXXXXX",
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800190 &private_key_path,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700191 nullptr));
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800192 } else {
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700193 ASSERT_TRUE(signature_test == kSignatureGeneratedShell ||
194 signature_test == kSignatureGeneratedShellRotateCl1 ||
195 signature_test == kSignatureGeneratedShellRotateCl2);
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800196 }
197 ScopedPathUnlinker key_unlinker(private_key_path);
198 key_unlinker.set_should_remove(signature_test ==
199 kSignatureGeneratedShellBadKey);
200 // Generates a new private key that will not match the public key.
201 if (signature_test == kSignatureGeneratedShellBadKey) {
202 LOG(INFO) << "Generating a mismatched private key.";
Alex Deymo719bfff2014-07-11 12:12:32 -0700203 ASSERT_EQ(0, System(base::StringPrintf(
204 "%s genrsa -out %s 2048",
205 utils::GetPathOnBoard("openssl").c_str(), private_key_path.c_str())));
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800206 }
207 int signature_size = GetSignatureSize(private_key_path);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800208 string hash_file;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700209 ASSERT_TRUE(utils::MakeTempFile("hash.XXXXXX", &hash_file, nullptr));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800210 ScopedPathUnlinker hash_unlinker(hash_file);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700211 string signature_size_string;
212 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
213 signature_test == kSignatureGeneratedShellRotateCl2)
Alex Vakulenko75039d72014-03-25 12:36:28 -0700214 signature_size_string = base::StringPrintf("%d:%d",
215 signature_size, signature_size);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700216 else
Alex Vakulenko75039d72014-03-25 12:36:28 -0700217 signature_size_string = base::StringPrintf("%d", signature_size);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800218 ASSERT_EQ(0,
Alex Vakulenko75039d72014-03-25 12:36:28 -0700219 System(base::StringPrintf(
Steve Fung97b6f5a2014-10-07 12:39:51 -0700220 "./delta_generator -in_file=%s -signature_size=%s "
221 "-out_hash_file=%s",
Darin Petkovcbfb0172011-01-14 15:24:45 -0800222 payload_path.c_str(),
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700223 signature_size_string.c_str(),
Darin Petkovcbfb0172011-01-14 15:24:45 -0800224 hash_file.c_str())));
225
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -0700226 // Pad the hash
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800227 chromeos::Blob hash;
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -0700228 ASSERT_TRUE(utils::ReadFile(hash_file, &hash));
Alex Deymo923d8fa2014-07-15 17:58:51 -0700229 ASSERT_TRUE(PayloadVerifier::PadRSA2048SHA256Hash(&hash));
Alex Deymo10875d92014-11-10 21:52:57 -0800230 ASSERT_TRUE(test_utils::WriteFileVector(hash_file, hash));
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -0700231
Darin Petkovcbfb0172011-01-14 15:24:45 -0800232 string sig_file;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700233 ASSERT_TRUE(utils::MakeTempFile("signature.XXXXXX", &sig_file, nullptr));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800234 ScopedPathUnlinker sig_unlinker(sig_file);
235 ASSERT_EQ(0,
Alex Vakulenko75039d72014-03-25 12:36:28 -0700236 System(base::StringPrintf(
Alex Deymo719bfff2014-07-11 12:12:32 -0700237 "%s rsautl -raw -sign -inkey %s -in %s -out %s",
238 utils::GetPathOnBoard("openssl").c_str(),
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800239 private_key_path.c_str(),
Darin Petkovcbfb0172011-01-14 15:24:45 -0800240 hash_file.c_str(),
241 sig_file.c_str())));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700242 string sig_file2;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700243 ASSERT_TRUE(utils::MakeTempFile("signature.XXXXXX", &sig_file2, nullptr));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700244 ScopedPathUnlinker sig2_unlinker(sig_file2);
245 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
246 signature_test == kSignatureGeneratedShellRotateCl2) {
247 ASSERT_EQ(0,
Alex Vakulenko75039d72014-03-25 12:36:28 -0700248 System(base::StringPrintf(
Alex Deymo719bfff2014-07-11 12:12:32 -0700249 "%s rsautl -raw -sign -inkey %s -in %s -out %s",
250 utils::GetPathOnBoard("openssl").c_str(),
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700251 kUnittestPrivateKey2Path,
252 hash_file.c_str(),
253 sig_file2.c_str())));
254 // Append second sig file to first path
255 sig_file += ":" + sig_file2;
256 }
257
Darin Petkovcbfb0172011-01-14 15:24:45 -0800258 ASSERT_EQ(0,
Alex Vakulenko75039d72014-03-25 12:36:28 -0700259 System(base::StringPrintf(
Steve Fung97b6f5a2014-10-07 12:39:51 -0700260 "./delta_generator -in_file=%s -signature_file=%s "
261 "-out_file=%s",
Darin Petkovcbfb0172011-01-14 15:24:45 -0800262 payload_path.c_str(),
263 sig_file.c_str(),
264 payload_path.c_str())));
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800265 int verify_result =
Alex Vakulenko75039d72014-03-25 12:36:28 -0700266 System(base::StringPrintf(
Steve Fung97b6f5a2014-10-07 12:39:51 -0700267 "./delta_generator -in_file=%s -public_key=%s -public_key_version=%d",
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700268 payload_path.c_str(),
269 signature_test == kSignatureGeneratedShellRotateCl2 ?
270 kUnittestPublicKey2Path : kUnittestPublicKeyPath,
271 signature_test == kSignatureGeneratedShellRotateCl2 ? 2 : 1));
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800272 if (signature_test == kSignatureGeneratedShellBadKey) {
273 ASSERT_NE(0, verify_result);
274 } else {
275 ASSERT_EQ(0, verify_result);
276 }
Darin Petkovcbfb0172011-01-14 15:24:45 -0800277}
278
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800279static void GenerateDeltaFile(bool full_kernel,
280 bool full_rootfs,
281 bool noop,
Darin Petkov8e447e02013-04-16 16:23:50 +0200282 off_t chunk_size,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800283 SignatureTest signature_test,
284 DeltaState *state) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700285 EXPECT_TRUE(utils::MakeTempFile("a_img.XXXXXX", &state->a_img, nullptr));
286 EXPECT_TRUE(utils::MakeTempFile("b_img.XXXXXX", &state->b_img, nullptr));
Alex Deymo10875d92014-11-10 21:52:57 -0800287 test_utils::CreateExtImageAtPath(state->a_img, nullptr);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700288
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800289 state->image_size = static_cast<int>(utils::FileSize(state->a_img));
Darin Petkov7ea32332010-10-13 10:46:11 -0700290
291 // Extend the "partitions" holding the file system a bit.
292 EXPECT_EQ(0, System(base::StringPrintf(
293 "dd if=/dev/zero of=%s seek=%d bs=1 count=1",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800294 state->a_img.c_str(),
295 state->image_size + 1024 * 1024 - 1)));
296 EXPECT_EQ(state->image_size + 1024 * 1024, utils::FileSize(state->a_img));
Darin Petkov7ea32332010-10-13 10:46:11 -0700297
Don Garrett0dd39852013-04-03 16:55:42 -0700298 // Create ImageInfo A & B
299 ImageInfo old_image_info;
300 ImageInfo new_image_info;
301
302 if (!full_rootfs) {
303 old_image_info.set_channel("src-channel");
304 old_image_info.set_board("src-board");
305 old_image_info.set_version("src-version");
306 old_image_info.set_key("src-key");
307 old_image_info.set_build_channel("src-build-channel");
308 old_image_info.set_build_version("src-build-version");
309 }
310
311 new_image_info.set_channel("test-channel");
312 new_image_info.set_board("test-board");
313 new_image_info.set_version("test-version");
314 new_image_info.set_key("test-key");
315 new_image_info.set_build_channel("test-build-channel");
316 new_image_info.set_build_version("test-build-version");
317
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700318 // Make some changes to the A image.
319 {
320 string a_mnt;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800321 ScopedLoopMounter b_mounter(state->a_img, &a_mnt, 0);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700322
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800323 chromeos::Blob hardtocompress;
Darin Petkov8e447e02013-04-16 16:23:50 +0200324 while (hardtocompress.size() < 3 * kBlockSize) {
325 hardtocompress.insert(hardtocompress.end(),
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800326 std::begin(kRandomString), std::end(kRandomString));
Darin Petkov8e447e02013-04-16 16:23:50 +0200327 }
Alex Vakulenko75039d72014-03-25 12:36:28 -0700328 EXPECT_TRUE(utils::WriteFile(base::StringPrintf("%s/hardtocompress",
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800329 a_mnt.c_str()).c_str(),
Alex Vakulenko75039d72014-03-25 12:36:28 -0700330 hardtocompress.data(),
Darin Petkov8e447e02013-04-16 16:23:50 +0200331 hardtocompress.size()));
332
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800333 chromeos::Blob zeros(16 * 1024, 0);
Darin Petkov8a075a72013-04-25 14:46:09 +0200334 EXPECT_EQ(zeros.size(),
Ben Chan736fcb52014-05-21 18:28:22 -0700335 base::WriteFile(base::FilePath(base::StringPrintf(
336 "%s/move-to-sparse", a_mnt.c_str())),
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800337 reinterpret_cast<const char*>(zeros.data()),
338 zeros.size()));
Darin Petkov8a075a72013-04-25 14:46:09 +0200339
340 EXPECT_TRUE(
Alex Vakulenko75039d72014-03-25 12:36:28 -0700341 WriteSparseFile(base::StringPrintf("%s/move-from-sparse",
342 a_mnt.c_str()), 16 * 1024));
Darin Petkov8a075a72013-04-25 14:46:09 +0200343
Alex Vakulenko75039d72014-03-25 12:36:28 -0700344 EXPECT_EQ(0,
Alex Deymo10875d92014-11-10 21:52:57 -0800345 System(base::StringPrintf("dd if=/dev/zero of=%s/move-semi-sparse"
346 " bs=1 seek=4096 count=1",
347 a_mnt.c_str()).c_str()));
Darin Petkov8a075a72013-04-25 14:46:09 +0200348
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700349 // Write 1 MiB of 0xff to try to catch the case where writing a bsdiff
350 // patch fails to zero out the final block.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800351 chromeos::Blob ones(1024 * 1024, 0xff);
Alex Vakulenko75039d72014-03-25 12:36:28 -0700352 EXPECT_TRUE(utils::WriteFile(base::StringPrintf("%s/ones",
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800353 a_mnt.c_str()).c_str(),
Alex Vakulenko75039d72014-03-25 12:36:28 -0700354 ones.data(),
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700355 ones.size()));
356 }
357
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700358 if (noop) {
Alex Vakulenko75039d72014-03-25 12:36:28 -0700359 EXPECT_TRUE(base::CopyFile(base::FilePath(state->a_img),
360 base::FilePath(state->b_img)));
Don Garrett0dd39852013-04-03 16:55:42 -0700361 old_image_info = new_image_info;
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700362 } else {
Alex Deymo10875d92014-11-10 21:52:57 -0800363 test_utils::CreateExtImageAtPath(state->b_img, nullptr);
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700364 EXPECT_EQ(0, System(base::StringPrintf(
365 "dd if=/dev/zero of=%s seek=%d bs=1 count=1",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800366 state->b_img.c_str(),
367 state->image_size + 1024 * 1024 - 1)));
368 EXPECT_EQ(state->image_size + 1024 * 1024, utils::FileSize(state->b_img));
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700369
370 // Make some changes to the B image.
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700371 string b_mnt;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800372 ScopedLoopMounter b_mounter(state->b_img, &b_mnt, 0);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700373
Alex Deymo10875d92014-11-10 21:52:57 -0800374 EXPECT_EQ(0, System(base::StringPrintf("cp %s/hello %s/hello2",
Alex Vakulenko75039d72014-03-25 12:36:28 -0700375 b_mnt.c_str(),
376 b_mnt.c_str()).c_str()));
Alex Deymo10875d92014-11-10 21:52:57 -0800377 EXPECT_EQ(0, System(base::StringPrintf("rm %s/hello",
Alex Vakulenko75039d72014-03-25 12:36:28 -0700378 b_mnt.c_str()).c_str()));
Alex Deymo10875d92014-11-10 21:52:57 -0800379 EXPECT_EQ(0, System(base::StringPrintf("mv %s/hello2 %s/hello",
Alex Vakulenko75039d72014-03-25 12:36:28 -0700380 b_mnt.c_str(),
381 b_mnt.c_str()).c_str()));
Alex Deymo10875d92014-11-10 21:52:57 -0800382 EXPECT_EQ(0, System(base::StringPrintf("echo foo > %s/foo",
Alex Vakulenko75039d72014-03-25 12:36:28 -0700383 b_mnt.c_str()).c_str()));
Alex Deymo10875d92014-11-10 21:52:57 -0800384 EXPECT_EQ(0, System(base::StringPrintf("touch %s/emptyfile",
Alex Vakulenko75039d72014-03-25 12:36:28 -0700385 b_mnt.c_str()).c_str()));
386 EXPECT_TRUE(WriteSparseFile(base::StringPrintf("%s/fullsparse",
387 b_mnt.c_str()),
388 1024 * 1024));
Darin Petkov8a075a72013-04-25 14:46:09 +0200389
390 EXPECT_TRUE(
Alex Vakulenko75039d72014-03-25 12:36:28 -0700391 WriteSparseFile(base::StringPrintf("%s/move-to-sparse", b_mnt.c_str()),
Darin Petkov8a075a72013-04-25 14:46:09 +0200392 16 * 1024));
393
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800394 chromeos::Blob zeros(16 * 1024, 0);
Darin Petkov8a075a72013-04-25 14:46:09 +0200395 EXPECT_EQ(zeros.size(),
Ben Chan736fcb52014-05-21 18:28:22 -0700396 base::WriteFile(base::FilePath(base::StringPrintf(
397 "%s/move-from-sparse", b_mnt.c_str())),
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800398 reinterpret_cast<const char*>(zeros.data()),
399 zeros.size()));
Darin Petkov8a075a72013-04-25 14:46:09 +0200400
Alex Deymo10875d92014-11-10 21:52:57 -0800401 EXPECT_EQ(0, System(base::StringPrintf("dd if=/dev/zero "
Alex Vakulenko75039d72014-03-25 12:36:28 -0700402 "of=%s/move-semi-sparse "
403 "bs=1 seek=4096 count=1",
404 b_mnt.c_str()).c_str()));
Darin Petkov8a075a72013-04-25 14:46:09 +0200405
Alex Deymo10875d92014-11-10 21:52:57 -0800406 EXPECT_EQ(0, System(base::StringPrintf("dd if=/dev/zero "
Alex Vakulenko75039d72014-03-25 12:36:28 -0700407 "of=%s/partsparse bs=1 "
408 "seek=4096 count=1",
409 b_mnt.c_str()).c_str()));
Alex Deymo10875d92014-11-10 21:52:57 -0800410 EXPECT_EQ(0, System(base::StringPrintf("cp %s/srchardlink0 %s/tmp && "
Alex Vakulenko75039d72014-03-25 12:36:28 -0700411 "mv %s/tmp %s/srchardlink1",
412 b_mnt.c_str(),
413 b_mnt.c_str(),
414 b_mnt.c_str(),
415 b_mnt.c_str()).c_str()));
Alex Deymo10875d92014-11-10 21:52:57 -0800416 EXPECT_EQ(0, System(
417 base::StringPrintf("rm %s/boguslink && echo foobar > %s/boguslink",
418 b_mnt.c_str(), b_mnt.c_str()).c_str()));
Darin Petkov8e447e02013-04-16 16:23:50 +0200419
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800420 chromeos::Blob hardtocompress;
Darin Petkov8e447e02013-04-16 16:23:50 +0200421 while (hardtocompress.size() < 3 * kBlockSize) {
422 hardtocompress.insert(hardtocompress.end(),
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800423 std::begin(kRandomString), std::end(kRandomString));
Darin Petkov8e447e02013-04-16 16:23:50 +0200424 }
Alex Vakulenko75039d72014-03-25 12:36:28 -0700425 EXPECT_TRUE(utils::WriteFile(base::StringPrintf("%s/hardtocompress",
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700426 b_mnt.c_str()).c_str(),
Alex Vakulenko75039d72014-03-25 12:36:28 -0700427 hardtocompress.data(),
Darin Petkov8e447e02013-04-16 16:23:50 +0200428 hardtocompress.size()));
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700429 }
430
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700431 string old_kernel;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800432 EXPECT_TRUE(utils::MakeTempFile("old_kernel.XXXXXX",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800433 &state->old_kernel,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700434 nullptr));
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700435
436 string new_kernel;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800437 EXPECT_TRUE(utils::MakeTempFile("new_kernel.XXXXXX",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800438 &state->new_kernel,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700439 nullptr));
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700440
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800441 state->old_kernel_data.resize(kDefaultKernelSize);
442 state->new_kernel_data.resize(state->old_kernel_data.size());
Alex Deymo10875d92014-11-10 21:52:57 -0800443 test_utils::FillWithData(&state->old_kernel_data);
444 test_utils::FillWithData(&state->new_kernel_data);
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700445
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700446 // change the new kernel data
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800447 std::copy(std::begin(kNewData), std::end(kNewData),
448 state->new_kernel_data.begin());
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700449
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700450 if (noop) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800451 state->old_kernel_data = state->new_kernel_data;
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700452 }
453
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700454 // Write kernels to disk
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800455 EXPECT_TRUE(utils::WriteFile(state->old_kernel.c_str(),
Alex Vakulenko75039d72014-03-25 12:36:28 -0700456 state->old_kernel_data.data(),
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800457 state->old_kernel_data.size()));
458 EXPECT_TRUE(utils::WriteFile(state->new_kernel.c_str(),
Alex Vakulenko75039d72014-03-25 12:36:28 -0700459 state->new_kernel_data.data(),
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800460 state->new_kernel_data.size()));
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700461
Gilad Arnolda6742b32014-01-11 00:18:34 -0800462 EXPECT_TRUE(utils::MakeTempFile("delta.XXXXXX",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800463 &state->delta_path,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700464 nullptr));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800465 LOG(INFO) << "delta path: " << state->delta_path;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700466 {
467 string a_mnt, b_mnt;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800468 ScopedLoopMounter a_mounter(state->a_img, &a_mnt, MS_RDONLY);
469 ScopedLoopMounter b_mounter(state->b_img, &b_mnt, MS_RDONLY);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800470 const string private_key =
471 signature_test == kSignatureGenerator ? kUnittestPrivateKeyPath : "";
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700472 EXPECT_TRUE(
Darin Petkov68c10d12010-10-14 09:24:37 -0700473 DeltaDiffGenerator::GenerateDeltaUpdateFile(
Darin Petkov7a22d792010-11-08 14:10:00 -0800474 full_rootfs ? "" : a_mnt,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800475 full_rootfs ? "" : state->a_img,
Darin Petkov68c10d12010-10-14 09:24:37 -0700476 b_mnt,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800477 state->b_img,
478 full_kernel ? "" : state->old_kernel,
479 state->new_kernel,
480 state->delta_path,
481 private_key,
Darin Petkov8e447e02013-04-16 16:23:50 +0200482 chunk_size,
Chris Sosad5ae1562013-04-23 13:20:18 -0700483 kRootFSPartitionSize,
Allie Woodb8ccad02015-02-09 14:33:40 -0800484 DeltaPerformer::kSupportedMinorPayloadVersion,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700485 full_rootfs ? nullptr : &old_image_info,
Don Garrett0dd39852013-04-03 16:55:42 -0700486 &new_image_info,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800487 &state->metadata_size));
Darin Petkov9574f7e2011-01-13 10:48:12 -0800488 }
489
Don Garrett2ae37872013-10-25 13:33:20 -0700490 if (signature_test == kSignatureGeneratedPlaceholder ||
491 signature_test == kSignatureGeneratedPlaceholderMismatch) {
Don Garrett2ae37872013-10-25 13:33:20 -0700492 int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
493 LOG(INFO) << "Inserting placeholder signature.";
494 ASSERT_TRUE(InsertSignaturePlaceholder(signature_size, state->delta_path,
495 &state->metadata_size));
496
497 if (signature_test == kSignatureGeneratedPlaceholderMismatch) {
498 signature_size -= 1;
499 LOG(INFO) << "Inserting mismatched placeholder signature.";
500 ASSERT_FALSE(InsertSignaturePlaceholder(signature_size, state->delta_path,
501 &state->metadata_size));
502 return;
503 }
504 }
505
506 if (signature_test == kSignatureGenerated ||
507 signature_test == kSignatureGeneratedPlaceholder ||
508 signature_test == kSignatureGeneratedPlaceholderMismatch) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800509 // Generate the signed payload and update the metadata size in state to
510 // reflect the new size after adding the signature operation to the
511 // manifest.
Don Garrett2ae37872013-10-25 13:33:20 -0700512 LOG(INFO) << "Signing payload.";
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800513 SignGeneratedPayload(state->delta_path, &state->metadata_size);
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800514 } else if (signature_test == kSignatureGeneratedShell ||
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700515 signature_test == kSignatureGeneratedShellBadKey ||
516 signature_test == kSignatureGeneratedShellRotateCl1 ||
517 signature_test == kSignatureGeneratedShellRotateCl2) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800518 SignGeneratedShellPayload(signature_test, state->delta_path);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700519 }
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800520}
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700521
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800522static void ApplyDeltaFile(bool full_kernel, bool full_rootfs, bool noop,
523 SignatureTest signature_test, DeltaState* state,
524 bool hash_checks_mandatory,
525 OperationHashTest op_hash_test,
526 DeltaPerformer** performer) {
Darin Petkov36a58222010-10-07 22:00:09 -0700527 // Check the metadata.
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700528 {
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700529 DeltaArchiveManifest manifest;
Alex Deymo923d8fa2014-07-15 17:58:51 -0700530 EXPECT_TRUE(PayloadVerifier::LoadPayload(state->delta_path,
531 &state->delta,
532 &manifest,
533 &state->metadata_size));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800534 LOG(INFO) << "Metadata size: " << state->metadata_size;
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700535
Don Garrett0dd39852013-04-03 16:55:42 -0700536
537
Darin Petkovcbfb0172011-01-14 15:24:45 -0800538 if (signature_test == kSignatureNone) {
539 EXPECT_FALSE(manifest.has_signatures_offset());
540 EXPECT_FALSE(manifest.has_signatures_size());
541 } else {
542 EXPECT_TRUE(manifest.has_signatures_offset());
543 EXPECT_TRUE(manifest.has_signatures_size());
544 Signatures sigs_message;
545 EXPECT_TRUE(sigs_message.ParseFromArray(
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800546 &state->delta[state->metadata_size + manifest.signatures_offset()],
Darin Petkovcbfb0172011-01-14 15:24:45 -0800547 manifest.signatures_size()));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700548 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
549 signature_test == kSignatureGeneratedShellRotateCl2)
550 EXPECT_EQ(2, sigs_message.signatures_size());
551 else
552 EXPECT_EQ(1, sigs_message.signatures_size());
Darin Petkovcbfb0172011-01-14 15:24:45 -0800553 const Signatures_Signature& signature = sigs_message.signatures(0);
554 EXPECT_EQ(1, signature.version());
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700555
Darin Petkovcbfb0172011-01-14 15:24:45 -0800556 uint64_t expected_sig_data_length = 0;
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700557 vector<string> key_paths{kUnittestPrivateKeyPath};
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700558 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
559 signature_test == kSignatureGeneratedShellRotateCl2) {
560 key_paths.push_back(kUnittestPrivateKey2Path);
561 }
Darin Petkovcbfb0172011-01-14 15:24:45 -0800562 EXPECT_TRUE(PayloadSigner::SignatureBlobLength(
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700563 key_paths,
564 &expected_sig_data_length));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800565 EXPECT_EQ(expected_sig_data_length, manifest.signatures_size());
566 EXPECT_FALSE(signature.data().empty());
567 }
Darin Petkov36a58222010-10-07 22:00:09 -0700568
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700569 if (noop) {
Gilad Arnold063181c2015-02-05 12:24:49 -0800570 EXPECT_EQ(0, manifest.install_operations_size());
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700571 EXPECT_EQ(1, manifest.kernel_install_operations_size());
572 }
573
Darin Petkovd43d6902010-10-14 11:17:50 -0700574 if (full_kernel) {
575 EXPECT_FALSE(manifest.has_old_kernel_info());
576 } else {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800577 EXPECT_EQ(state->old_kernel_data.size(),
578 manifest.old_kernel_info().size());
Darin Petkovd43d6902010-10-14 11:17:50 -0700579 EXPECT_FALSE(manifest.old_kernel_info().hash().empty());
580 }
Darin Petkov698d0412010-10-13 10:59:44 -0700581
Don Garrett0dd39852013-04-03 16:55:42 -0700582 EXPECT_EQ(manifest.new_image_info().channel(), "test-channel");
583 EXPECT_EQ(manifest.new_image_info().board(), "test-board");
584 EXPECT_EQ(manifest.new_image_info().version(), "test-version");
585 EXPECT_EQ(manifest.new_image_info().key(), "test-key");
586 EXPECT_EQ(manifest.new_image_info().build_channel(), "test-build-channel");
587 EXPECT_EQ(manifest.new_image_info().build_version(), "test-build-version");
588
589 if (!full_rootfs) {
Don Garrett0dd39852013-04-03 16:55:42 -0700590 if (noop) {
591 EXPECT_EQ(manifest.old_image_info().channel(), "test-channel");
592 EXPECT_EQ(manifest.old_image_info().board(), "test-board");
593 EXPECT_EQ(manifest.old_image_info().version(), "test-version");
594 EXPECT_EQ(manifest.old_image_info().key(), "test-key");
595 EXPECT_EQ(manifest.old_image_info().build_channel(),
596 "test-build-channel");
597 EXPECT_EQ(manifest.old_image_info().build_version(),
598 "test-build-version");
599 } else {
600 EXPECT_EQ(manifest.old_image_info().channel(), "src-channel");
601 EXPECT_EQ(manifest.old_image_info().board(), "src-board");
602 EXPECT_EQ(manifest.old_image_info().version(), "src-version");
603 EXPECT_EQ(manifest.old_image_info().key(), "src-key");
604 EXPECT_EQ(manifest.old_image_info().build_channel(),
605 "src-build-channel");
606 EXPECT_EQ(manifest.old_image_info().build_version(),
607 "src-build-version");
608 }
609 }
610
611
Darin Petkov7a22d792010-11-08 14:10:00 -0800612 if (full_rootfs) {
613 EXPECT_FALSE(manifest.has_old_rootfs_info());
Don Garrett0dd39852013-04-03 16:55:42 -0700614 EXPECT_FALSE(manifest.has_old_image_info());
615 EXPECT_TRUE(manifest.has_new_image_info());
Darin Petkov7a22d792010-11-08 14:10:00 -0800616 } else {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800617 EXPECT_EQ(state->image_size, manifest.old_rootfs_info().size());
Darin Petkov7a22d792010-11-08 14:10:00 -0800618 EXPECT_FALSE(manifest.old_rootfs_info().hash().empty());
619 }
620
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800621 EXPECT_EQ(state->new_kernel_data.size(), manifest.new_kernel_info().size());
622 EXPECT_EQ(state->image_size, manifest.new_rootfs_info().size());
Darin Petkov36a58222010-10-07 22:00:09 -0700623
Darin Petkov36a58222010-10-07 22:00:09 -0700624 EXPECT_FALSE(manifest.new_kernel_info().hash().empty());
Darin Petkov36a58222010-10-07 22:00:09 -0700625 EXPECT_FALSE(manifest.new_rootfs_info().hash().empty());
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700626 }
627
Alex Deymo8427b4a2014-11-05 14:00:32 -0800628 MockPrefs prefs;
Darin Petkov73058b42010-10-06 16:32:19 -0700629 EXPECT_CALL(prefs, SetInt64(kPrefsManifestMetadataSize,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800630 state->metadata_size)).WillOnce(Return(true));
Darin Petkov73058b42010-10-06 16:32:19 -0700631 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextOperation, _))
632 .WillRepeatedly(Return(true));
Darin Petkov9b230572010-10-08 10:20:09 -0700633 EXPECT_CALL(prefs, GetInt64(kPrefsUpdateStateNextOperation, _))
634 .WillOnce(Return(false));
Darin Petkov73058b42010-10-06 16:32:19 -0700635 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextDataOffset, _))
636 .WillRepeatedly(Return(true));
David Zeuthen41996ad2013-09-24 15:43:24 -0700637 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextDataLength, _))
638 .WillRepeatedly(Return(true));
Darin Petkov437adc42010-10-07 13:12:24 -0700639 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSHA256Context, _))
Darin Petkov73058b42010-10-06 16:32:19 -0700640 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800641 if (op_hash_test == kValidOperationData && signature_test != kSignatureNone) {
Darin Petkovcbfb0172011-01-14 15:24:45 -0800642 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSignedSHA256Context, _))
643 .WillOnce(Return(true));
Darin Petkov4f0a07b2011-05-25 16:47:20 -0700644 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSignatureBlob, _))
645 .WillOnce(Return(true));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800646 }
Darin Petkov73058b42010-10-06 16:32:19 -0700647
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700648 // Update the A image in place.
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700649 InstallPlan install_plan;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800650 install_plan.hash_checks_mandatory = hash_checks_mandatory;
651 install_plan.metadata_size = state->metadata_size;
Don Garrettb8dd1d92013-11-22 17:40:02 -0800652 install_plan.is_full_update = full_kernel && full_rootfs;
653
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800654 LOG(INFO) << "Setting payload metadata size in Omaha = "
655 << state->metadata_size;
Jay Srinivasanf4318702012-09-24 11:56:24 -0700656 ASSERT_TRUE(PayloadSigner::GetMetadataSignature(
Alex Vakulenko75039d72014-03-25 12:36:28 -0700657 state->delta.data(),
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800658 state->metadata_size,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700659 kUnittestPrivateKeyPath,
Jay Srinivasanf4318702012-09-24 11:56:24 -0700660 &install_plan.metadata_signature));
661 EXPECT_FALSE(install_plan.metadata_signature.empty());
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700662
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800663 *performer = new DeltaPerformer(&prefs,
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700664 &state->fake_system_state,
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800665 &install_plan);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700666 EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800667 (*performer)->set_public_key_path(kUnittestPublicKeyPath);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700668
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800669 EXPECT_EQ(state->image_size,
670 OmahaHashCalculator::RawHashOfFile(state->a_img,
671 state->image_size,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700672 &install_plan.rootfs_hash));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800673 EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(state->old_kernel_data,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700674 &install_plan.kernel_hash));
675
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800676 EXPECT_EQ(0, (*performer)->Open(state->a_img.c_str(), 0, 0));
677 EXPECT_TRUE((*performer)->OpenKernel(state->old_kernel.c_str()));
678
David Zeuthena99981f2013-04-29 13:42:47 -0700679 ErrorCode expected_error, actual_error;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800680 bool continue_writing;
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700681 switch (op_hash_test) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800682 case kInvalidOperationData: {
683 // Muck with some random offset post the metadata size so that
684 // some operation hash will result in a mismatch.
685 int some_offset = state->metadata_size + 300;
686 LOG(INFO) << "Tampered value at offset: " << some_offset;
687 state->delta[some_offset]++;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700688 expected_error = ErrorCode::kDownloadOperationHashMismatch;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800689 continue_writing = false;
690 break;
691 }
692
693 case kValidOperationData:
694 default:
695 // no change.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700696 expected_error = ErrorCode::kSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800697 continue_writing = true;
698 break;
699 }
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700700
701 // Write at some number of bytes per operation. Arbitrarily chose 5.
702 const size_t kBytesPerWrite = 5;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800703 for (size_t i = 0; i < state->delta.size(); i += kBytesPerWrite) {
Alex Deymof329b932014-10-30 01:37:48 -0700704 size_t count = std::min(state->delta.size() - i, kBytesPerWrite);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800705 bool write_succeeded = ((*performer)->Write(&state->delta[i],
706 count,
707 &actual_error));
708 // Normally write_succeeded should be true every time and
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700709 // actual_error should be ErrorCode::kSuccess. If so, continue the loop.
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800710 // But if we seeded an operation hash error above, then write_succeeded
711 // will be false. The failure may happen at any operation n. So, all
712 // Writes until n-1 should succeed and the nth operation will fail with
713 // actual_error. In this case, we should bail out of the loop because
714 // we cannot proceed applying the delta.
715 if (!write_succeeded) {
716 LOG(INFO) << "Write failed. Checking if it failed with expected error";
717 EXPECT_EQ(expected_error, actual_error);
718 if (!continue_writing) {
719 LOG(INFO) << "Cannot continue writing. Bailing out.";
720 break;
721 }
722 }
723
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700724 EXPECT_EQ(ErrorCode::kSuccess, actual_error);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700725 }
726
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800727 // If we had continued all the way through, Close should succeed.
728 // Otherwise, it should fail. Check appropriately.
729 bool close_result = (*performer)->Close();
730 if (continue_writing)
731 EXPECT_EQ(0, close_result);
732 else
733 EXPECT_LE(0, close_result);
734}
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700735
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800736void VerifyPayloadResult(DeltaPerformer* performer,
737 DeltaState* state,
David Zeuthena99981f2013-04-29 13:42:47 -0700738 ErrorCode expected_result) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800739 if (!performer) {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700740 EXPECT_TRUE(!"Skipping payload verification since performer is null.");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800741 return;
742 }
743
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700744 int expected_times = (expected_result == ErrorCode::kSuccess) ? 1 : 0;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700745 EXPECT_CALL(*(state->fake_system_state.mock_payload_state()),
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800746 DownloadComplete()).Times(expected_times);
747
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800748 LOG(INFO) << "Verifying payload for expected result "
749 << expected_result;
750 EXPECT_EQ(expected_result, performer->VerifyPayload(
751 OmahaHashCalculator::OmahaHashOfData(state->delta),
752 state->delta.size()));
753 LOG(INFO) << "Verified payload.";
754
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700755 if (expected_result != ErrorCode::kSuccess) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800756 // no need to verify new partition if VerifyPayload failed.
757 return;
758 }
759
760 CompareFilesByBlock(state->old_kernel, state->new_kernel);
761 CompareFilesByBlock(state->a_img, state->b_img);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700762
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800763 chromeos::Blob updated_kernel_partition;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800764 EXPECT_TRUE(utils::ReadFile(state->old_kernel, &updated_kernel_partition));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800765 ASSERT_GE(updated_kernel_partition.size(), arraysize(kNewData));
766 EXPECT_TRUE(std::equal(std::begin(kNewData), std::end(kNewData),
767 updated_kernel_partition.begin()));
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700768
769 uint64_t new_kernel_size;
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800770 chromeos::Blob new_kernel_hash;
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700771 uint64_t new_rootfs_size;
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800772 chromeos::Blob new_rootfs_hash;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800773 EXPECT_TRUE(performer->GetNewPartitionInfo(&new_kernel_size,
Don Garrett0dd39852013-04-03 16:55:42 -0700774 &new_kernel_hash,
775 &new_rootfs_size,
776 &new_rootfs_hash));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800777 EXPECT_EQ(kDefaultKernelSize, new_kernel_size);
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800778 chromeos::Blob expected_new_kernel_hash;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800779 EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(state->new_kernel_data,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700780 &expected_new_kernel_hash));
781 EXPECT_TRUE(expected_new_kernel_hash == new_kernel_hash);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800782 EXPECT_EQ(state->image_size, new_rootfs_size);
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800783 chromeos::Blob expected_new_rootfs_hash;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800784 EXPECT_EQ(state->image_size,
785 OmahaHashCalculator::RawHashOfFile(state->b_img,
786 state->image_size,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700787 &expected_new_rootfs_hash));
788 EXPECT_TRUE(expected_new_rootfs_hash == new_rootfs_hash);
789}
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800790
791void VerifyPayload(DeltaPerformer* performer,
792 DeltaState* state,
793 SignatureTest signature_test) {
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700794 ErrorCode expected_result = ErrorCode::kSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800795 switch (signature_test) {
796 case kSignatureNone:
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700797 expected_result = ErrorCode::kSignedDeltaPayloadExpectedError;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800798 break;
799 case kSignatureGeneratedShellBadKey:
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700800 expected_result = ErrorCode::kDownloadPayloadPubKeyVerificationError;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800801 break;
802 default: break; // appease gcc
803 }
804
805 VerifyPayloadResult(performer, state, expected_result);
806}
807
808void DoSmallImageTest(bool full_kernel, bool full_rootfs, bool noop,
Darin Petkov8e447e02013-04-16 16:23:50 +0200809 off_t chunk_size,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800810 SignatureTest signature_test,
811 bool hash_checks_mandatory) {
812 DeltaState state;
Alex Deymo52146ce2014-05-29 11:09:45 -0700813 DeltaPerformer *performer = nullptr;
Darin Petkov8e447e02013-04-16 16:23:50 +0200814 GenerateDeltaFile(full_kernel, full_rootfs, noop, chunk_size,
815 signature_test, &state);
Don Garrett0dd39852013-04-03 16:55:42 -0700816
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800817 ScopedPathUnlinker a_img_unlinker(state.a_img);
818 ScopedPathUnlinker b_img_unlinker(state.b_img);
819 ScopedPathUnlinker delta_unlinker(state.delta_path);
820 ScopedPathUnlinker old_kernel_unlinker(state.old_kernel);
821 ScopedPathUnlinker new_kernel_unlinker(state.new_kernel);
822 ApplyDeltaFile(full_kernel, full_rootfs, noop, signature_test,
823 &state, hash_checks_mandatory, kValidOperationData,
824 &performer);
825 VerifyPayload(performer, &state, signature_test);
Alex Deymo52146ce2014-05-29 11:09:45 -0700826 delete performer;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800827}
828
829// Calls delta performer's Write method by pretending to pass in bytes from a
830// delta file whose metadata size is actual_metadata_size and tests if all
831// checks are correctly performed if the install plan contains
832// expected_metadata_size and that the result of the parsing are as per
833// hash_checks_mandatory flag.
834void DoMetadataSizeTest(uint64_t expected_metadata_size,
835 uint64_t actual_metadata_size,
836 bool hash_checks_mandatory) {
Alex Deymo8427b4a2014-11-05 14:00:32 -0800837 MockPrefs prefs;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800838 InstallPlan install_plan;
839 install_plan.hash_checks_mandatory = hash_checks_mandatory;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700840 FakeSystemState fake_system_state;
841 DeltaPerformer performer(&prefs, &fake_system_state, &install_plan);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800842 EXPECT_EQ(0, performer.Open("/dev/null", 0, 0));
843 EXPECT_TRUE(performer.OpenKernel("/dev/null"));
844
845 // Set a valid magic string and version number 1.
846 EXPECT_TRUE(performer.Write("CrAU", 4));
847 uint64_t version = htobe64(1);
848 EXPECT_TRUE(performer.Write(&version, 8));
849
850 install_plan.metadata_size = expected_metadata_size;
David Zeuthena99981f2013-04-29 13:42:47 -0700851 ErrorCode error_code;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800852 // When filling in size in manifest, exclude the size of the 20-byte header.
853 uint64_t size_in_manifest = htobe64(actual_metadata_size - 20);
854 bool result = performer.Write(&size_in_manifest, 8, &error_code);
855 if (expected_metadata_size == actual_metadata_size ||
856 !hash_checks_mandatory) {
857 EXPECT_TRUE(result);
858 } else {
859 EXPECT_FALSE(result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700860 EXPECT_EQ(ErrorCode::kDownloadInvalidMetadataSize, error_code);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800861 }
862
863 EXPECT_LT(performer.Close(), 0);
864}
865
866// Generates a valid delta file but tests the delta performer by suppling
867// different metadata signatures as per omaha_metadata_signature flag and
868// sees if the result of the parsing are as per hash_checks_mandatory flag.
869void DoMetadataSignatureTest(MetadataSignatureTest metadata_signature_test,
870 SignatureTest signature_test,
871 bool hash_checks_mandatory) {
872 DeltaState state;
873
874 // Using kSignatureNone since it doesn't affect the results of our test.
875 // If we've to use other signature options, then we'd have to get the
876 // metadata size again after adding the signing operation to the manifest.
Darin Petkov8e447e02013-04-16 16:23:50 +0200877 GenerateDeltaFile(true, true, false, -1, signature_test, &state);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800878
879 ScopedPathUnlinker a_img_unlinker(state.a_img);
880 ScopedPathUnlinker b_img_unlinker(state.b_img);
881 ScopedPathUnlinker delta_unlinker(state.delta_path);
882 ScopedPathUnlinker old_kernel_unlinker(state.old_kernel);
883 ScopedPathUnlinker new_kernel_unlinker(state.new_kernel);
884
885 // Loads the payload and parses the manifest.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800886 chromeos::Blob payload;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800887 EXPECT_TRUE(utils::ReadFile(state.delta_path, &payload));
888 LOG(INFO) << "Payload size: " << payload.size();
889
890 InstallPlan install_plan;
891 install_plan.hash_checks_mandatory = hash_checks_mandatory;
892 install_plan.metadata_size = state.metadata_size;
893
894 DeltaPerformer::MetadataParseResult expected_result, actual_result;
David Zeuthena99981f2013-04-29 13:42:47 -0700895 ErrorCode expected_error, actual_error;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800896
897 // Fill up the metadata signature in install plan according to the test.
898 switch (metadata_signature_test) {
899 case kEmptyMetadataSignature:
900 install_plan.metadata_signature.clear();
901 expected_result = DeltaPerformer::kMetadataParseError;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700902 expected_error = ErrorCode::kDownloadMetadataSignatureMissingError;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800903 break;
904
905 case kInvalidMetadataSignature:
906 install_plan.metadata_signature = kBogusMetadataSignature1;
907 expected_result = DeltaPerformer::kMetadataParseError;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700908 expected_error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800909 break;
910
911 case kValidMetadataSignature:
912 default:
913 // Set the install plan's metadata size to be the same as the one
914 // in the manifest so that we pass the metadata size checks. Only
915 // then we can get to manifest signature checks.
916 ASSERT_TRUE(PayloadSigner::GetMetadataSignature(
Alex Vakulenko75039d72014-03-25 12:36:28 -0700917 payload.data(),
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800918 state.metadata_size,
919 kUnittestPrivateKeyPath,
920 &install_plan.metadata_signature));
921 EXPECT_FALSE(install_plan.metadata_signature.empty());
922 expected_result = DeltaPerformer::kMetadataParseSuccess;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700923 expected_error = ErrorCode::kSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800924 break;
925 }
926
927 // Ignore the expected result/error if hash checks are not mandatory.
928 if (!hash_checks_mandatory) {
929 expected_result = DeltaPerformer::kMetadataParseSuccess;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700930 expected_error = ErrorCode::kSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800931 }
932
933 // Create the delta performer object.
Alex Deymo8427b4a2014-11-05 14:00:32 -0800934 MockPrefs prefs;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800935 DeltaPerformer delta_performer(&prefs,
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700936 &state.fake_system_state,
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800937 &install_plan);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800938
939 // Use the public key corresponding to the private key used above to
940 // sign the metadata.
941 EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath));
942 delta_performer.set_public_key_path(kUnittestPublicKeyPath);
943
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800944 // Init actual_error with an invalid value so that we make sure
945 // ParsePayloadMetadata properly populates it in all cases.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700946 actual_error = ErrorCode::kUmaReportedMax;
Gilad Arnolddaa27402014-01-23 11:56:17 -0800947 actual_result = delta_performer.ParsePayloadMetadata(payload, &actual_error);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800948
949 EXPECT_EQ(expected_result, actual_result);
950 EXPECT_EQ(expected_error, actual_error);
951
952 // Check that the parsed metadata size is what's expected. This test
953 // implicitly confirms that the metadata signature is valid, if required.
Gilad Arnoldfe133932014-01-14 12:25:50 -0800954 EXPECT_EQ(state.metadata_size, delta_performer.GetMetadataSize());
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800955}
956
957void DoOperationHashMismatchTest(OperationHashTest op_hash_test,
958 bool hash_checks_mandatory) {
959 DeltaState state;
Darin Petkov8e447e02013-04-16 16:23:50 +0200960 GenerateDeltaFile(true, true, false, -1, kSignatureGenerated, &state);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800961 ScopedPathUnlinker a_img_unlinker(state.a_img);
962 ScopedPathUnlinker b_img_unlinker(state.b_img);
963 ScopedPathUnlinker delta_unlinker(state.delta_path);
964 ScopedPathUnlinker old_kernel_unlinker(state.old_kernel);
965 ScopedPathUnlinker new_kernel_unlinker(state.new_kernel);
Alex Deymo52146ce2014-05-29 11:09:45 -0700966 DeltaPerformer *performer = nullptr;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800967 ApplyDeltaFile(true, true, false, kSignatureGenerated,
968 &state, hash_checks_mandatory, op_hash_test, &performer);
Alex Deymo52146ce2014-05-29 11:09:45 -0700969 delete performer;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800970}
971
Don Garrettb8dd1d92013-11-22 17:40:02 -0800972
973class DeltaPerformerTest : public ::testing::Test {
Don Garrettb8dd1d92013-11-22 17:40:02 -0800974 public:
975 // Test helper placed where it can easily be friended from DeltaPerformer.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700976 static void RunManifestValidation(const DeltaArchiveManifest& manifest,
Don Garrettb8dd1d92013-11-22 17:40:02 -0800977 bool full_payload,
978 ErrorCode expected) {
Alex Deymo8427b4a2014-11-05 14:00:32 -0800979 MockPrefs prefs;
Don Garrettb8dd1d92013-11-22 17:40:02 -0800980 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700981 FakeSystemState fake_system_state;
982 DeltaPerformer performer(&prefs, &fake_system_state, &install_plan);
Don Garrettb8dd1d92013-11-22 17:40:02 -0800983
984 // The install plan is for Full or Delta.
985 install_plan.is_full_update = full_payload;
986
987 // The Manifest we are validating.
988 performer.manifest_.CopyFrom(manifest);
989
990 EXPECT_EQ(expected, performer.ValidateManifest());
991 }
992};
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800993
994TEST(DeltaPerformerTest, ExtentsToByteStringTest) {
995 uint64_t test[] = {1, 1, 4, 2, kSparseHole, 1, 0, 1};
996 COMPILE_ASSERT(arraysize(test) % 2 == 0, array_size_uneven);
997 const uint64_t block_size = 4096;
998 const uint64_t file_length = 5 * block_size - 13;
999
1000 google::protobuf::RepeatedPtrField<Extent> extents;
1001 for (size_t i = 0; i < arraysize(test); i += 2) {
1002 Extent* extent = extents.Add();
1003 extent->set_start_block(test[i]);
1004 extent->set_num_blocks(test[i + 1]);
1005 }
1006
1007 string expected_output = "4096:4096,16384:8192,-1:4096,0:4083";
1008 string actual_output;
1009 EXPECT_TRUE(DeltaPerformer::ExtentsToBsdiffPositionsString(extents,
1010 block_size,
1011 file_length,
1012 &actual_output));
1013 EXPECT_EQ(expected_output, actual_output);
1014}
Darin Petkov68c10d12010-10-14 09:24:37 -07001015
Don Garrettb8dd1d92013-11-22 17:40:02 -08001016TEST(DeltaPerformerTest, ValidateManifestFullGoodTest) {
1017 // The Manifest we are validating.
1018 DeltaArchiveManifest manifest;
1019 manifest.mutable_new_kernel_info();
1020 manifest.mutable_new_rootfs_info();
1021 manifest.set_minor_version(DeltaPerformer::kFullPayloadMinorVersion);
1022
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001023 DeltaPerformerTest::RunManifestValidation(manifest, true,
1024 ErrorCode::kSuccess);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001025}
1026
1027TEST(DeltaPerformerTest, ValidateManifestDeltaGoodTest) {
1028 // The Manifest we are validating.
1029 DeltaArchiveManifest manifest;
1030 manifest.mutable_old_kernel_info();
1031 manifest.mutable_old_rootfs_info();
1032 manifest.mutable_new_kernel_info();
1033 manifest.mutable_new_rootfs_info();
1034 manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion);
1035
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001036 DeltaPerformerTest::RunManifestValidation(manifest, false,
1037 ErrorCode::kSuccess);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001038}
1039
1040TEST(DeltaPerformerTest, ValidateManifestFullUnsetMinorVersion) {
1041 // The Manifest we are validating.
1042 DeltaArchiveManifest manifest;
1043
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001044 DeltaPerformerTest::RunManifestValidation(manifest, true,
1045 ErrorCode::kSuccess);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001046}
1047
1048TEST(DeltaPerformerTest, ValidateManifestDeltaUnsetMinorVersion) {
1049 // The Manifest we are validating.
1050 DeltaArchiveManifest manifest;
1051
1052 DeltaPerformerTest::RunManifestValidation(
1053 manifest, false,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001054 ErrorCode::kUnsupportedMinorPayloadVersion);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001055}
1056
1057TEST(DeltaPerformerTest, ValidateManifestFullOldKernelTest) {
1058 // The Manifest we are validating.
1059 DeltaArchiveManifest manifest;
1060 manifest.mutable_old_kernel_info();
1061 manifest.mutable_new_kernel_info();
1062 manifest.mutable_new_rootfs_info();
1063 manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion);
1064
1065 DeltaPerformerTest::RunManifestValidation(
1066 manifest, true,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001067 ErrorCode::kPayloadMismatchedType);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001068}
1069
1070TEST(DeltaPerformerTest, ValidateManifestFullOldRootfsTest) {
1071 // The Manifest we are validating.
1072 DeltaArchiveManifest manifest;
1073 manifest.mutable_old_rootfs_info();
1074 manifest.mutable_new_kernel_info();
1075 manifest.mutable_new_rootfs_info();
1076 manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion);
1077
1078 DeltaPerformerTest::RunManifestValidation(
1079 manifest, true,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001080 ErrorCode::kPayloadMismatchedType);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001081}
1082
1083TEST(DeltaPerformerTest, ValidateManifestBadMinorVersion) {
1084 // The Manifest we are validating.
1085 DeltaArchiveManifest manifest;
1086
1087 // Generate a bad version number.
1088 manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion +
1089 10000);
1090
1091 DeltaPerformerTest::RunManifestValidation(
1092 manifest, false,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001093 ErrorCode::kUnsupportedMinorPayloadVersion);
Don Garrettb8dd1d92013-11-22 17:40:02 -08001094}
1095
Darin Petkov68c10d12010-10-14 09:24:37 -07001096TEST(DeltaPerformerTest, RunAsRootSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001097 DoSmallImageTest(false, false, false, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001098 false);
Darin Petkov8e447e02013-04-16 16:23:50 +02001099}
1100
Don Garrett2ae37872013-10-25 13:33:20 -07001101TEST(DeltaPerformerTest, RunAsRootSmallImageSignaturePlaceholderTest) {
1102 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedPlaceholder,
1103 false);
1104}
1105
1106TEST(DeltaPerformerTest, RunAsRootSmallImageSignaturePlaceholderMismatchTest) {
1107 DeltaState state;
1108 GenerateDeltaFile(false, false, false, -1,
1109 kSignatureGeneratedPlaceholderMismatch, &state);
1110}
1111
Darin Petkov8e447e02013-04-16 16:23:50 +02001112TEST(DeltaPerformerTest, RunAsRootSmallImageChunksTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001113 DoSmallImageTest(false, false, false, kBlockSize, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001114 false);
Darin Petkov68c10d12010-10-14 09:24:37 -07001115}
1116
1117TEST(DeltaPerformerTest, RunAsRootFullKernelSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001118 DoSmallImageTest(true, false, false, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001119 false);
Darin Petkov7a22d792010-11-08 14:10:00 -08001120}
1121
1122TEST(DeltaPerformerTest, RunAsRootFullSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001123 DoSmallImageTest(true, true, false, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001124 true);
Darin Petkov9fa7ec52010-10-18 11:45:23 -07001125}
1126
1127TEST(DeltaPerformerTest, RunAsRootNoopSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001128 DoSmallImageTest(false, false, true, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001129 false);
Darin Petkov9574f7e2011-01-13 10:48:12 -08001130}
1131
Darin Petkovcbfb0172011-01-14 15:24:45 -08001132TEST(DeltaPerformerTest, RunAsRootSmallImageSignNoneTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001133 DoSmallImageTest(false, false, false, -1, kSignatureNone,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001134 false);
Darin Petkovcbfb0172011-01-14 15:24:45 -08001135}
1136
1137TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001138 DoSmallImageTest(false, false, false, -1, kSignatureGenerated,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001139 true);
Darin Petkovcbfb0172011-01-14 15:24:45 -08001140}
1141
1142TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001143 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShell,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001144 false);
Andrew de los Reyes27f7d372010-10-07 11:26:07 -07001145}
1146
Darin Petkov52dcaeb2011-01-14 15:33:06 -08001147TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellBadKeyTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001148 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShellBadKey,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001149 false);
Darin Petkov52dcaeb2011-01-14 15:33:06 -08001150}
1151
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -07001152TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellRotateCl1Test) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001153 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShellRotateCl1,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001154 false);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -07001155}
1156
1157TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellRotateCl2Test) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001158 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShellRotateCl2,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001159 false);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -07001160}
1161
Darin Petkov934bb412010-11-18 11:21:35 -08001162TEST(DeltaPerformerTest, BadDeltaMagicTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001163 MockPrefs prefs;
Jay Srinivasan51dcf262012-09-13 17:24:32 -07001164 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001165 FakeSystemState fake_system_state;
1166 DeltaPerformer performer(&prefs, &fake_system_state, &install_plan);
Darin Petkov934bb412010-11-18 11:21:35 -08001167 EXPECT_EQ(0, performer.Open("/dev/null", 0, 0));
1168 EXPECT_TRUE(performer.OpenKernel("/dev/null"));
Don Garrette410e0f2011-11-10 15:39:01 -08001169 EXPECT_TRUE(performer.Write("junk", 4));
1170 EXPECT_TRUE(performer.Write("morejunk", 8));
1171 EXPECT_FALSE(performer.Write("morejunk", 8));
Darin Petkov934bb412010-11-18 11:21:35 -08001172 EXPECT_LT(performer.Close(), 0);
1173}
1174
Andrew de los Reyes353777c2010-10-08 10:34:30 -07001175TEST(DeltaPerformerTest, IsIdempotentOperationTest) {
1176 DeltaArchiveManifest_InstallOperation op;
1177 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1178 *(op.add_dst_extents()) = ExtentForRange(0, 5);
1179 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1180 *(op.add_src_extents()) = ExtentForRange(4, 1);
1181 EXPECT_FALSE(DeltaPerformer::IsIdempotentOperation(op));
1182 op.clear_src_extents();
1183 *(op.add_src_extents()) = ExtentForRange(5, 3);
1184 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1185 *(op.add_dst_extents()) = ExtentForRange(20, 6);
1186 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1187 *(op.add_src_extents()) = ExtentForRange(19, 2);
1188 EXPECT_FALSE(DeltaPerformer::IsIdempotentOperation(op));
1189}
1190
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08001191TEST(DeltaPerformerTest, WriteUpdatesPayloadState) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001192 MockPrefs prefs;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08001193 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001194 FakeSystemState fake_system_state;
1195 DeltaPerformer performer(&prefs, &fake_system_state, &install_plan);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08001196 EXPECT_EQ(0, performer.Open("/dev/null", 0, 0));
1197 EXPECT_TRUE(performer.OpenKernel("/dev/null"));
1198
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001199 EXPECT_CALL(*(fake_system_state.mock_payload_state()),
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08001200 DownloadProgress(4)).Times(1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001201 EXPECT_CALL(*(fake_system_state.mock_payload_state()),
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08001202 DownloadProgress(8)).Times(2);
1203
1204 EXPECT_TRUE(performer.Write("junk", 4));
1205 EXPECT_TRUE(performer.Write("morejunk", 8));
1206 EXPECT_FALSE(performer.Write("morejunk", 8));
1207 EXPECT_LT(performer.Close(), 0);
1208}
1209
Jay Srinivasan738fdf32012-12-07 17:40:54 -08001210TEST(DeltaPerformerTest, MissingMandatoryMetadataSizeTest) {
1211 DoMetadataSizeTest(0, 75456, true);
Jay Srinivasan51dcf262012-09-13 17:24:32 -07001212}
1213
Jay Srinivasan738fdf32012-12-07 17:40:54 -08001214TEST(DeltaPerformerTest, MissingNonMandatoryMetadataSizeTest) {
1215 DoMetadataSizeTest(0, 123456, false);
1216}
1217
1218TEST(DeltaPerformerTest, InvalidMandatoryMetadataSizeTest) {
1219 DoMetadataSizeTest(13000, 140000, true);
1220}
1221
1222TEST(DeltaPerformerTest, InvalidNonMandatoryMetadataSizeTest) {
1223 DoMetadataSizeTest(40000, 50000, false);
1224}
1225
1226TEST(DeltaPerformerTest, ValidMandatoryMetadataSizeTest) {
1227 DoMetadataSizeTest(85376, 85376, true);
1228}
1229
1230TEST(DeltaPerformerTest, RunAsRootMandatoryEmptyMetadataSignatureTest) {
1231 DoMetadataSignatureTest(kEmptyMetadataSignature, kSignatureGenerated, true);
1232}
1233
1234TEST(DeltaPerformerTest, RunAsRootNonMandatoryEmptyMetadataSignatureTest) {
1235 DoMetadataSignatureTest(kEmptyMetadataSignature, kSignatureGenerated, false);
1236}
1237
1238TEST(DeltaPerformerTest, RunAsRootMandatoryInvalidMetadataSignatureTest) {
1239 DoMetadataSignatureTest(kInvalidMetadataSignature, kSignatureGenerated, true);
1240}
1241
1242TEST(DeltaPerformerTest, RunAsRootNonMandatoryInvalidMetadataSignatureTest) {
1243 DoMetadataSignatureTest(kInvalidMetadataSignature, kSignatureGenerated,
1244 false);
1245}
1246
1247TEST(DeltaPerformerTest, RunAsRootMandatoryValidMetadataSignature1Test) {
1248 DoMetadataSignatureTest(kValidMetadataSignature, kSignatureNone, true);
1249}
1250
1251TEST(DeltaPerformerTest, RunAsRootMandatoryValidMetadataSignature2Test) {
1252 DoMetadataSignatureTest(kValidMetadataSignature, kSignatureGenerated, true);
1253}
1254
1255TEST(DeltaPerformerTest, RunAsRootNonMandatoryValidMetadataSignatureTest) {
1256 DoMetadataSignatureTest(kValidMetadataSignature, kSignatureGenerated, false);
1257}
1258
1259TEST(DeltaPerformerTest, RunAsRootMandatoryOperationHashMismatchTest) {
1260 DoOperationHashMismatchTest(kInvalidOperationData, true);
1261}
Jay Srinivasan51dcf262012-09-13 17:24:32 -07001262
David Zeuthene7f89172013-10-31 10:21:04 -07001263TEST(DeltaPerformerTest, UsePublicKeyFromResponse) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001264 MockPrefs prefs;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001265 FakeSystemState fake_system_state;
David Zeuthene7f89172013-10-31 10:21:04 -07001266 InstallPlan install_plan;
1267 base::FilePath key_path;
1268
1269 // The result of the GetPublicKeyResponse() method is based on three things
1270 //
1271 // 1. Whether it's an official build; and
1272 // 2. Whether the Public RSA key to be used is in the root filesystem; and
Alex Vakulenko072359c2014-07-18 11:41:07 -07001273 // 3. Whether the response has a public key
David Zeuthene7f89172013-10-31 10:21:04 -07001274 //
1275 // We test all eight combinations to ensure that we only use the
1276 // public key in the response if
1277 //
1278 // a. it's not an official build; and
1279 // b. there is no key in the root filesystem.
1280
1281 DeltaPerformer *performer = new DeltaPerformer(&prefs,
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001282 &fake_system_state,
David Zeuthene7f89172013-10-31 10:21:04 -07001283 &install_plan);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001284 FakeHardware* fake_hardware = fake_system_state.fake_hardware();
David Zeuthene7f89172013-10-31 10:21:04 -07001285
1286 string temp_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001287 EXPECT_TRUE(utils::MakeTempDirectory("PublicKeyFromResponseTests.XXXXXX",
David Zeuthene7f89172013-10-31 10:21:04 -07001288 &temp_dir));
1289 string non_existing_file = temp_dir + "/non-existing";
1290 string existing_file = temp_dir + "/existing";
Alex Vakulenko75039d72014-03-25 12:36:28 -07001291 EXPECT_EQ(0, System(base::StringPrintf("touch %s", existing_file.c_str())));
David Zeuthene7f89172013-10-31 10:21:04 -07001292
1293 // Non-official build, non-existing public-key, key in response -> true
Don Garrett6646b442013-11-13 15:29:11 -08001294 fake_hardware->SetIsOfficialBuild(false);
David Zeuthene7f89172013-10-31 10:21:04 -07001295 performer->public_key_path_ = non_existing_file;
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001296 install_plan.public_key_rsa = "VGVzdAo="; // result of 'echo "Test" | base64'
David Zeuthene7f89172013-10-31 10:21:04 -07001297 EXPECT_TRUE(performer->GetPublicKeyFromResponse(&key_path));
1298 EXPECT_FALSE(key_path.empty());
1299 EXPECT_EQ(unlink(key_path.value().c_str()), 0);
1300 // Same with official build -> false
Don Garrett6646b442013-11-13 15:29:11 -08001301 fake_hardware->SetIsOfficialBuild(true);
David Zeuthene7f89172013-10-31 10:21:04 -07001302 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1303
1304 // Non-official build, existing public-key, key in response -> false
Don Garrett6646b442013-11-13 15:29:11 -08001305 fake_hardware->SetIsOfficialBuild(false);
David Zeuthene7f89172013-10-31 10:21:04 -07001306 performer->public_key_path_ = existing_file;
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001307 install_plan.public_key_rsa = "VGVzdAo="; // result of 'echo "Test" | base64'
David Zeuthene7f89172013-10-31 10:21:04 -07001308 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1309 // Same with official build -> false
Don Garrett6646b442013-11-13 15:29:11 -08001310 fake_hardware->SetIsOfficialBuild(true);
David Zeuthene7f89172013-10-31 10:21:04 -07001311 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1312
1313 // Non-official build, non-existing public-key, no key in response -> false
Don Garrett6646b442013-11-13 15:29:11 -08001314 fake_hardware->SetIsOfficialBuild(false);
David Zeuthene7f89172013-10-31 10:21:04 -07001315 performer->public_key_path_ = non_existing_file;
1316 install_plan.public_key_rsa = "";
1317 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1318 // Same with official build -> false
Don Garrett6646b442013-11-13 15:29:11 -08001319 fake_hardware->SetIsOfficialBuild(true);
David Zeuthene7f89172013-10-31 10:21:04 -07001320 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1321
1322 // Non-official build, existing public-key, no key in response -> false
Don Garrett6646b442013-11-13 15:29:11 -08001323 fake_hardware->SetIsOfficialBuild(false);
David Zeuthene7f89172013-10-31 10:21:04 -07001324 performer->public_key_path_ = existing_file;
1325 install_plan.public_key_rsa = "";
1326 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1327 // Same with official build -> false
Don Garrett6646b442013-11-13 15:29:11 -08001328 fake_hardware->SetIsOfficialBuild(true);
David Zeuthene7f89172013-10-31 10:21:04 -07001329 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1330
1331 // Non-official build, non-existing public-key, key in response
1332 // but invalid base64 -> false
Don Garrett6646b442013-11-13 15:29:11 -08001333 fake_hardware->SetIsOfficialBuild(false);
David Zeuthene7f89172013-10-31 10:21:04 -07001334 performer->public_key_path_ = non_existing_file;
1335 install_plan.public_key_rsa = "not-valid-base64";
1336 EXPECT_FALSE(performer->GetPublicKeyFromResponse(&key_path));
1337
1338 delete performer;
Alex Deymo10875d92014-11-10 21:52:57 -08001339 EXPECT_TRUE(test_utils::RecursiveUnlinkDir(temp_dir));
David Zeuthene7f89172013-10-31 10:21:04 -07001340}
1341
Andrew de los Reyes09e56d62010-04-23 13:45:53 -07001342} // namespace chromeos_update_engine