blob: 2367e0052ed47b6ea8c491e1faca57972f55bc51 [file] [log] [blame]
Doug Zongker73ae31c2009-12-09 17:01:45 -08001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Elliott Hughesd4d4c242014-12-29 12:46:43 -080017#include <errno.h>
18#include <fcntl.h>
19#include <stdarg.h>
Doug Zongker73ae31c2009-12-09 17:01:45 -080020#include <stdio.h>
21#include <stdlib.h>
Elliott Hughese01d9de2015-01-24 22:21:24 -080022#include <string.h>
Doug Zongker99916f02014-01-13 14:16:58 -080023#include <sys/types.h>
24#include <sys/stat.h>
Doug Zongker73ae31c2009-12-09 17:01:45 -080025
Tao Bao71e3e092016-02-02 14:02:27 -080026#include <memory>
27#include <vector>
28
Doug Zongker7c3ae452013-05-14 11:03:02 -070029#include "common.h"
Doug Zongker73ae31c2009-12-09 17:01:45 -080030#include "verifier.h"
Doug Zongkerdaefc1d2011-10-31 09:34:15 -070031#include "ui.h"
Doug Zongker30362a62013-04-10 11:32:17 -070032#include "mincrypt/sha.h"
33#include "mincrypt/sha256.h"
Doug Zongker99916f02014-01-13 14:16:58 -080034#include "minzip/SysUtil.h"
Doug Zongker73ae31c2009-12-09 17:01:45 -080035
36// This is build/target/product/security/testkey.x509.pem after being
37// dumped out by dumpkey.jar.
38RSAPublicKey test_key =
39 { 64, 0xc926ad21,
Doug Zongker30362a62013-04-10 11:32:17 -070040 { 0x6afee91fu, 0x7fa31d5bu, 0x38a0b217u, 0x99df9baeu,
41 0xfe72991du, 0x727d3c04u, 0x20943f99u, 0xd08e7826u,
42 0x69e7c8a2u, 0xdeeccc8eu, 0x6b9af76fu, 0x553311c4u,
43 0x07b9e247u, 0x54c8bbcau, 0x6a540d81u, 0x48dbf567u,
44 0x98c92877u, 0x134fbfdeu, 0x01b32564u, 0x24581948u,
45 0x6cddc3b8u, 0x0cd444dau, 0xfe0381ccu, 0xf15818dfu,
46 0xc06e6d42u, 0x2e2f6412u, 0x093a6737u, 0x94d83b31u,
47 0xa466c87au, 0xb3f284a0u, 0xa694ec2cu, 0x053359e6u,
48 0x9717ee6au, 0x0732e080u, 0x220d5008u, 0xdc4af350u,
49 0x93d0a7c3u, 0xe330c9eau, 0xcac3da1eu, 0x8ebecf8fu,
50 0xc2be387fu, 0x38a14e89u, 0x211586f0u, 0x18b846f5u,
51 0x43be4c72u, 0xb578c204u, 0x1bbfb230u, 0xf1e267a8u,
52 0xa2d3e656u, 0x64b8e4feu, 0xe7e83d4bu, 0x3e77a943u,
53 0x3559ffd9u, 0x0ebb0f99u, 0x0aa76ce6u, 0xd3786ea7u,
54 0xbca8cd6bu, 0x068ca8e8u, 0xeb1de2ffu, 0x3e3ecd6cu,
55 0xe0d9d825u, 0xb1edc762u, 0xdec60b24u, 0xd6931904u},
56 { 0xccdcb989u, 0xe19281f9u, 0xa6e80accu, 0xb7f40560u,
57 0x0efb0bccu, 0x7f12b0bbu, 0x1e90531au, 0x136d95d0u,
58 0x9e660665u, 0x7d54918fu, 0xe3b93ea2u, 0x2f415d10u,
59 0x3d2df6e6u, 0x7a627ecfu, 0xa6f22d70u, 0xb995907au,
60 0x09de16b2u, 0xfeb8bd61u, 0xf24ec294u, 0x716a427fu,
61 0x2e12046fu, 0xeaf3d56au, 0xd9b873adu, 0x0ced340bu,
62 0xbc9cec09u, 0x73c65903u, 0xee39ce9bu, 0x3eede25au,
63 0x397633b7u, 0x2583c165u, 0x8514f97du, 0xe9166510u,
64 0x0b6fae99u, 0xa47139fdu, 0xdb8352f0u, 0xb2ad7f2cu,
65 0xa11552e2u, 0xd4d490a7u, 0xe11e8568u, 0xe9e484dau,
66 0xd3ef8449u, 0xa47055dau, 0x4edd9557u, 0x03a78ba1u,
67 0x770e130du, 0x16762facu, 0x0cbdfcc4u, 0xf3070540u,
68 0x008b6515u, 0x60e7e1b7u, 0xa72cf7f9u, 0xaff86e39u,
69 0x4296faadu, 0xfc90430eu, 0x6cc8f377u, 0xb398fd43u,
70 0x423c5997u, 0x991d59c4u, 0x6464bf73u, 0x96431575u,
71 0x15e3d207u, 0x30532a7au, 0x8c4be618u, 0x460a4d76u },
Doug Zongker17495272012-07-25 13:10:58 -070072 3
73 };
74
75RSAPublicKey test_f4_key =
76 { 64, 0xc9bd1f21,
Doug Zongker30362a62013-04-10 11:32:17 -070077 { 0x1178db1fu, 0xbf5d0e55u, 0x3393a165u, 0x0ef4c287u,
78 0xbc472a4au, 0x383fc5a1u, 0x4a13b7d2u, 0xb1ff2ac3u,
79 0xaf66b4d9u, 0x9280acefu, 0xa2165bdbu, 0x6a4d6e5cu,
80 0x08ea676bu, 0xb7ac70c7u, 0xcd158139u, 0xa635ccfeu,
81 0xa46ab8a8u, 0x445a3e8bu, 0xdc81d9bbu, 0x91ce1a20u,
82 0x68021cdeu, 0x4516eda9u, 0x8d43c30cu, 0xed1eff14u,
83 0xca387e4cu, 0x58adc233u, 0x4657ab27u, 0xa95b521eu,
84 0xdfc0e30cu, 0x394d64a1u, 0xc6b321a1u, 0x2ca22cb8u,
85 0xb1892d5cu, 0x5d605f3eu, 0x6025483cu, 0x9afd5181u,
86 0x6e1a7105u, 0x03010593u, 0x70acd304u, 0xab957cbfu,
87 0x8844abbbu, 0x53846837u, 0x24e98a43u, 0x2ba060c1u,
88 0x8b88b88eu, 0x44eea405u, 0xb259fc41u, 0x0907ad9cu,
89 0x13003adau, 0xcf79634eu, 0x7d314ec9u, 0xfbbe4c2bu,
90 0xd84d0823u, 0xfd30fd88u, 0x68d8a909u, 0xfb4572d9u,
91 0xa21301c2u, 0xd00a4785u, 0x6862b50cu, 0xcfe49796u,
92 0xdaacbd83u, 0xfb620906u, 0xdf71e0ccu, 0xbbc5b030u },
93 { 0x69a82189u, 0x1a8b22f4u, 0xcf49207bu, 0x68cc056au,
94 0xb206b7d2u, 0x1d449bbdu, 0xe9d342f2u, 0x29daea58u,
95 0xb19d011au, 0xc62f15e4u, 0x9452697au, 0xb62bb87eu,
96 0x60f95cc2u, 0x279ebb2du, 0x17c1efd8u, 0xec47558bu,
97 0xc81334d1u, 0x88fe7601u, 0x79992eb1u, 0xb4555615u,
98 0x2022ac8cu, 0xc79a4b8cu, 0xb288b034u, 0xd6b942f0u,
99 0x0caa32fbu, 0xa065ba51u, 0x4de9f154u, 0x29f64f6cu,
100 0x7910af5eu, 0x3ed4636au, 0xe4c81911u, 0x9183f37du,
101 0x5811e1c4u, 0x29c7a58cu, 0x9715d4d3u, 0xc7e2dce3u,
102 0x140972ebu, 0xf4c8a69eu, 0xa104d424u, 0x5dabbdfbu,
103 0x41cb4c6bu, 0xd7f44717u, 0x61785ff7u, 0x5e0bc273u,
104 0x36426c70u, 0x2aa6f08eu, 0x083badbfu, 0x3cab941bu,
105 0x8871da23u, 0x1ab3dbaeu, 0x7115a21du, 0xf5aa0965u,
106 0xf766f562u, 0x7f110225u, 0x86d96a04u, 0xc50a120eu,
107 0x3a751ca3u, 0xc21aa186u, 0xba7359d0u, 0x3ff2b257u,
108 0xd116e8bbu, 0xfc1318c0u, 0x070e5b1du, 0x83b759a6u },
Doug Zongker17495272012-07-25 13:10:58 -0700109 65537
Doug Zongker73ae31c2009-12-09 17:01:45 -0800110 };
111
Kenny Root7a4adb52013-10-09 10:14:35 -0700112ECPublicKey test_ec_key =
113 {
114 {
115 {0xd656fa24u, 0x931416cau, 0x1c0278c6u, 0x174ebe4cu,
116 0x6018236au, 0x45ba1656u, 0xe8c05d84u, 0x670ed500u}
117 },
118 {
119 {0x0d179adeu, 0x4c16827du, 0x9f8cb992u, 0x8f69ff8au,
120 0x481b1020u, 0x798d91afu, 0x184db8e9u, 0xb5848dd9u}
121 }
122 };
123
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700124RecoveryUI* ui = NULL;
Doug Zongker73ae31c2009-12-09 17:01:45 -0800125
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700126// verifier expects to find a UI object; we provide one that does
127// nothing but print.
128class FakeUI : public RecoveryUI {
129 void Init() { }
Elliott Hughes8de52072015-04-08 20:06:50 -0700130 void SetStage(int, int) { }
131 void SetLocale(const char*) { }
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700132 void SetBackground(Icon icon) { }
Doug Zongker73ae31c2009-12-09 17:01:45 -0800133
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700134 void SetProgressType(ProgressType determinate) { }
135 void ShowProgress(float portion, float seconds) { }
136 void SetProgress(float fraction) { }
137
138 void ShowText(bool visible) { }
139 bool IsTextVisible() { return false; }
140 bool WasTextEverVisible() { return false; }
141 void Print(const char* fmt, ...) {
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700142 va_list ap;
143 va_start(ap, fmt);
Doug Zongker7c3ae452013-05-14 11:03:02 -0700144 vfprintf(stderr, fmt, ap);
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700145 va_end(ap);
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700146 }
Tao Baob6918c72015-05-19 17:02:16 -0700147 void PrintOnScreenOnly(const char* fmt, ...) {
148 va_list ap;
149 va_start(ap, fmt);
150 vfprintf(stderr, fmt, ap);
151 va_end(ap);
152 }
Elliott Hughes8de52072015-04-08 20:06:50 -0700153 void ShowFile(const char*) { }
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700154
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700155 void StartMenu(const char* const * headers, const char* const * items,
156 int initial_selection) { }
157 int SelectMenu(int sel) { return 0; }
158 void EndMenu() { }
159};
Doug Zongker73ae31c2009-12-09 17:01:45 -0800160
Doug Zongker7c3ae452013-05-14 11:03:02 -0700161void
162ui_print(const char* format, ...) {
163 va_list ap;
164 va_start(ap, format);
165 vfprintf(stdout, format, ap);
166 va_end(ap);
167}
168
Tao Bao71e3e092016-02-02 14:02:27 -0800169int main(int argc, char** argv) {
Kenny Root7a4adb52013-10-09 10:14:35 -0700170 if (argc < 2) {
171 fprintf(stderr, "Usage: %s [-sha256] [-ec | -f4 | -file <keys>] <package>\n", argv[0]);
172 return 2;
173 }
Kenny Root7a4adb52013-10-09 10:14:35 -0700174
Tao Bao71e3e092016-02-02 14:02:27 -0800175 std::vector<Certificate> certs;
Kenny Root7a4adb52013-10-09 10:14:35 -0700176 int argn = 1;
177 while (argn < argc) {
178 if (strcmp(argv[argn], "-sha256") == 0) {
Tao Bao71e3e092016-02-02 14:02:27 -0800179 if (certs.empty()) {
Kenny Root7a4adb52013-10-09 10:14:35 -0700180 fprintf(stderr, "May only specify -sha256 after key type\n");
181 return 2;
182 }
183 ++argn;
Tao Bao71e3e092016-02-02 14:02:27 -0800184 certs.back().hash_len = SHA256_DIGEST_SIZE;
Kenny Root7a4adb52013-10-09 10:14:35 -0700185 } else if (strcmp(argv[argn], "-ec") == 0) {
186 ++argn;
Tao Bao71e3e092016-02-02 14:02:27 -0800187 certs.emplace_back(SHA_DIGEST_SIZE, Certificate::EC,
188 nullptr, std::unique_ptr<ECPublicKey>(new ECPublicKey(test_ec_key)));
Kenny Root7a4adb52013-10-09 10:14:35 -0700189 } else if (strcmp(argv[argn], "-e3") == 0) {
190 ++argn;
Tao Bao71e3e092016-02-02 14:02:27 -0800191 certs.emplace_back(SHA_DIGEST_SIZE, Certificate::RSA,
192 std::unique_ptr<RSAPublicKey>(new RSAPublicKey(test_key)), nullptr);
Kenny Root7a4adb52013-10-09 10:14:35 -0700193 } else if (strcmp(argv[argn], "-f4") == 0) {
194 ++argn;
Tao Bao71e3e092016-02-02 14:02:27 -0800195 certs.emplace_back(SHA_DIGEST_SIZE, Certificate::RSA,
196 std::unique_ptr<RSAPublicKey>(new RSAPublicKey(test_f4_key)), nullptr);
Kenny Root7a4adb52013-10-09 10:14:35 -0700197 } else if (strcmp(argv[argn], "-file") == 0) {
Tao Bao71e3e092016-02-02 14:02:27 -0800198 if (!certs.empty()) {
Kenny Root7a4adb52013-10-09 10:14:35 -0700199 fprintf(stderr, "Cannot specify -file with other certs specified\n");
200 return 2;
201 }
202 ++argn;
Tao Bao71e3e092016-02-02 14:02:27 -0800203 if (!load_keys(argv[argn], certs)) {
204 fprintf(stderr, "Cannot load keys from %s\n", argv[argn]);
205 }
Kenny Root7a4adb52013-10-09 10:14:35 -0700206 ++argn;
207 } else if (argv[argn][0] == '-') {
208 fprintf(stderr, "Unknown argument %s\n", argv[argn]);
209 return 2;
210 } else {
211 break;
212 }
213 }
214
215 if (argn == argc) {
216 fprintf(stderr, "Must specify package to verify\n");
Doug Zongker73ae31c2009-12-09 17:01:45 -0800217 return 2;
218 }
219
Tao Bao71e3e092016-02-02 14:02:27 -0800220 if (certs.empty()) {
221 certs.emplace_back(SHA_DIGEST_SIZE, Certificate::RSA,
222 std::unique_ptr<RSAPublicKey>(new RSAPublicKey(test_key)), nullptr);
Doug Zongker17495272012-07-25 13:10:58 -0700223 }
224
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700225 ui = new FakeUI();
226
Doug Zongker99916f02014-01-13 14:16:58 -0800227 MemMapping map;
228 if (sysMapFile(argv[argn], &map) != 0) {
229 fprintf(stderr, "failed to mmap %s: %s\n", argv[argn], strerror(errno));
230 return 4;
231 }
232
Tao Bao71e3e092016-02-02 14:02:27 -0800233 int result = verify_file(map.addr, map.length, certs);
Doug Zongker73ae31c2009-12-09 17:01:45 -0800234 if (result == VERIFY_SUCCESS) {
Doug Zongker30362a62013-04-10 11:32:17 -0700235 printf("VERIFIED\n");
Doug Zongker73ae31c2009-12-09 17:01:45 -0800236 return 0;
237 } else if (result == VERIFY_FAILURE) {
Doug Zongker30362a62013-04-10 11:32:17 -0700238 printf("NOT VERIFIED\n");
Doug Zongker73ae31c2009-12-09 17:01:45 -0800239 return 1;
240 } else {
241 printf("bad return value\n");
242 return 3;
243 }
244}