OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <sys/types.h> | 5 #include <sys/types.h> |
6 #include <sys/stat.h> | 6 #include <sys/stat.h> |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <unistd.h> | 9 #include <unistd.h> |
10 | 10 |
(...skipping 22 matching lines...) Expand all Loading... |
33 DEFINE_string(old_image, "", "Path to the old rootfs"); | 33 DEFINE_string(old_image, "", "Path to the old rootfs"); |
34 DEFINE_string(new_image, "", "Path to the new rootfs"); | 34 DEFINE_string(new_image, "", "Path to the new rootfs"); |
35 DEFINE_string(old_kernel, "", "Path to the old kernel partition image"); | 35 DEFINE_string(old_kernel, "", "Path to the old kernel partition image"); |
36 DEFINE_string(new_kernel, "", "Path to the new kernel partition image"); | 36 DEFINE_string(new_kernel, "", "Path to the new kernel partition image"); |
37 DEFINE_string(in_file, "", | 37 DEFINE_string(in_file, "", |
38 "Path to input delta payload file used to hash/sign payloads " | 38 "Path to input delta payload file used to hash/sign payloads " |
39 "and apply delta over old_image (for debugging)"); | 39 "and apply delta over old_image (for debugging)"); |
40 DEFINE_string(out_file, "", "Path to output delta payload file"); | 40 DEFINE_string(out_file, "", "Path to output delta payload file"); |
41 DEFINE_string(out_hash_file, "", "Path to output hash file"); | 41 DEFINE_string(out_hash_file, "", "Path to output hash file"); |
42 DEFINE_string(private_key, "", "Path to private key in .pem format"); | 42 DEFINE_string(private_key, "", "Path to private key in .pem format"); |
| 43 DEFINE_string(public_key, "", "Path to public key in .pem format"); |
43 DEFINE_string(prefs_dir, "/tmp/update_engine_prefs", | 44 DEFINE_string(prefs_dir, "/tmp/update_engine_prefs", |
44 "Preferences directory, used with apply_delta"); | 45 "Preferences directory, used with apply_delta"); |
45 DEFINE_int32(signature_size, 0, "Raw signature size used for hash calculation"); | 46 DEFINE_int32(signature_size, 0, "Raw signature size used for hash calculation"); |
46 DEFINE_string(signature_file, "", "Raw signature file to sign payload with"); | 47 DEFINE_string(signature_file, "", "Raw signature file to sign payload with"); |
47 | 48 |
48 // This file contains a simple program that takes an old path, a new path, | 49 // This file contains a simple program that takes an old path, a new path, |
49 // and an output file as arguments and the path to an output file and | 50 // and an output file as arguments and the path to an output file and |
50 // generates a delta that can be sent to Chrome OS clients. | 51 // generates a delta that can be sent to Chrome OS clients. |
51 | 52 |
52 using std::set; | 53 using std::set; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 << "Must pass --out_file to sign payload."; | 88 << "Must pass --out_file to sign payload."; |
88 LOG_IF(FATAL, FLAGS_signature_file.empty()) | 89 LOG_IF(FATAL, FLAGS_signature_file.empty()) |
89 << "Must pass --signature_file to sign payload."; | 90 << "Must pass --signature_file to sign payload."; |
90 vector<char> signature; | 91 vector<char> signature; |
91 CHECK(utils::ReadFile(FLAGS_signature_file, &signature)); | 92 CHECK(utils::ReadFile(FLAGS_signature_file, &signature)); |
92 CHECK(PayloadSigner::AddSignatureToPayload( | 93 CHECK(PayloadSigner::AddSignatureToPayload( |
93 FLAGS_in_file, signature, FLAGS_out_file)); | 94 FLAGS_in_file, signature, FLAGS_out_file)); |
94 LOG(INFO) << "Done signing payload."; | 95 LOG(INFO) << "Done signing payload."; |
95 } | 96 } |
96 | 97 |
| 98 void VerifySignedPayload() { |
| 99 LOG(INFO) << "Verifying signed payload."; |
| 100 LOG_IF(FATAL, FLAGS_in_file.empty()) |
| 101 << "Must pass --in_file to verify signed payload."; |
| 102 LOG_IF(FATAL, FLAGS_public_key.empty()) |
| 103 << "Must pass --public_key to verify signed payload."; |
| 104 CHECK(PayloadSigner::VerifySignedPayload(FLAGS_in_file, FLAGS_public_key)); |
| 105 LOG(INFO) << "Done verifying signed payload."; |
| 106 } |
| 107 |
97 void ApplyDelta() { | 108 void ApplyDelta() { |
98 LOG(INFO) << "Applying delta."; | 109 LOG(INFO) << "Applying delta."; |
99 LOG_IF(FATAL, FLAGS_old_image.empty()) | 110 LOG_IF(FATAL, FLAGS_old_image.empty()) |
100 << "Must pass --old_image to apply delta."; | 111 << "Must pass --old_image to apply delta."; |
101 Prefs prefs; | 112 Prefs prefs; |
102 LOG(INFO) << "Setting up preferences under: " << FLAGS_prefs_dir; | 113 LOG(INFO) << "Setting up preferences under: " << FLAGS_prefs_dir; |
103 LOG_IF(ERROR, !prefs.Init(FilePath(FLAGS_prefs_dir))) | 114 LOG_IF(ERROR, !prefs.Init(FilePath(FLAGS_prefs_dir))) |
104 << "Failed to initialize preferences."; | 115 << "Failed to initialize preferences."; |
105 // Get original checksums | 116 // Get original checksums |
106 LOG(INFO) << "Calculating original checksums"; | 117 LOG(INFO) << "Calculating original checksums"; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 logging::DONT_LOCK_LOG_FILE, | 158 logging::DONT_LOCK_LOG_FILE, |
148 logging::APPEND_TO_OLD_LOG_FILE); | 159 logging::APPEND_TO_OLD_LOG_FILE); |
149 if (FLAGS_signature_size > 0 || !FLAGS_out_hash_file.empty()) { | 160 if (FLAGS_signature_size > 0 || !FLAGS_out_hash_file.empty()) { |
150 CalculatePayloadHashForSigning(); | 161 CalculatePayloadHashForSigning(); |
151 return 0; | 162 return 0; |
152 } | 163 } |
153 if (!FLAGS_signature_file.empty()) { | 164 if (!FLAGS_signature_file.empty()) { |
154 SignPayload(); | 165 SignPayload(); |
155 return 0; | 166 return 0; |
156 } | 167 } |
| 168 if (!FLAGS_public_key.empty()) { |
| 169 VerifySignedPayload(); |
| 170 return 0; |
| 171 } |
157 if (!FLAGS_in_file.empty()) { | 172 if (!FLAGS_in_file.empty()) { |
158 ApplyDelta(); | 173 ApplyDelta(); |
159 return 0; | 174 return 0; |
160 } | 175 } |
161 CHECK(!FLAGS_new_image.empty()); | 176 CHECK(!FLAGS_new_image.empty()); |
162 CHECK(!FLAGS_out_file.empty()); | 177 CHECK(!FLAGS_out_file.empty()); |
163 CHECK(!FLAGS_new_kernel.empty()); | 178 CHECK(!FLAGS_new_kernel.empty()); |
164 if (FLAGS_old_image.empty()) { | 179 if (FLAGS_old_image.empty()) { |
165 LOG(INFO) << "Generating full update"; | 180 LOG(INFO) << "Generating full update"; |
166 } else { | 181 } else { |
(...skipping 16 matching lines...) Expand all Loading... |
183 return 0; | 198 return 0; |
184 } | 199 } |
185 | 200 |
186 } // namespace {} | 201 } // namespace {} |
187 | 202 |
188 } // namespace chromeos_update_engine | 203 } // namespace chromeos_update_engine |
189 | 204 |
190 int main(int argc, char** argv) { | 205 int main(int argc, char** argv) { |
191 return chromeos_update_engine::Main(argc, argv); | 206 return chromeos_update_engine::Main(argc, argv); |
192 } | 207 } |
OLD | NEW |