blob: 0c4503f4440945c91f768d7ff73264a67359b501 [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
Dees Troyd63c7642013-11-03 13:03:55 +000026/*
Doug Zongker596b3422013-05-14 11:03:02 -070027#include "common.h"
Dees Troyd63c7642013-11-03 13:03:55 +000028*/
Doug Zongker73ae31c2009-12-09 17:01:45 -080029#include "verifier.h"
Doug Zongkerdaefc1d2011-10-31 09:34:15 -070030#include "ui.h"
Doug Zongkerbac7fba2013-04-10 11:32:17 -070031#include "mincrypt/sha.h"
32#include "mincrypt/sha256.h"
Doug Zongker99916f02014-01-13 14:16:58 -080033#include "minzip/SysUtil.h"
Doug Zongker73ae31c2009-12-09 17:01:45 -080034
35// This is build/target/product/security/testkey.x509.pem after being
36// dumped out by dumpkey.jar.
37RSAPublicKey test_key =
38 { 64, 0xc926ad21,
Doug Zongkerbac7fba2013-04-10 11:32:17 -070039 { 0x6afee91fu, 0x7fa31d5bu, 0x38a0b217u, 0x99df9baeu,
40 0xfe72991du, 0x727d3c04u, 0x20943f99u, 0xd08e7826u,
41 0x69e7c8a2u, 0xdeeccc8eu, 0x6b9af76fu, 0x553311c4u,
42 0x07b9e247u, 0x54c8bbcau, 0x6a540d81u, 0x48dbf567u,
43 0x98c92877u, 0x134fbfdeu, 0x01b32564u, 0x24581948u,
44 0x6cddc3b8u, 0x0cd444dau, 0xfe0381ccu, 0xf15818dfu,
45 0xc06e6d42u, 0x2e2f6412u, 0x093a6737u, 0x94d83b31u,
46 0xa466c87au, 0xb3f284a0u, 0xa694ec2cu, 0x053359e6u,
47 0x9717ee6au, 0x0732e080u, 0x220d5008u, 0xdc4af350u,
48 0x93d0a7c3u, 0xe330c9eau, 0xcac3da1eu, 0x8ebecf8fu,
49 0xc2be387fu, 0x38a14e89u, 0x211586f0u, 0x18b846f5u,
50 0x43be4c72u, 0xb578c204u, 0x1bbfb230u, 0xf1e267a8u,
51 0xa2d3e656u, 0x64b8e4feu, 0xe7e83d4bu, 0x3e77a943u,
52 0x3559ffd9u, 0x0ebb0f99u, 0x0aa76ce6u, 0xd3786ea7u,
53 0xbca8cd6bu, 0x068ca8e8u, 0xeb1de2ffu, 0x3e3ecd6cu,
54 0xe0d9d825u, 0xb1edc762u, 0xdec60b24u, 0xd6931904u},
55 { 0xccdcb989u, 0xe19281f9u, 0xa6e80accu, 0xb7f40560u,
56 0x0efb0bccu, 0x7f12b0bbu, 0x1e90531au, 0x136d95d0u,
57 0x9e660665u, 0x7d54918fu, 0xe3b93ea2u, 0x2f415d10u,
58 0x3d2df6e6u, 0x7a627ecfu, 0xa6f22d70u, 0xb995907au,
59 0x09de16b2u, 0xfeb8bd61u, 0xf24ec294u, 0x716a427fu,
60 0x2e12046fu, 0xeaf3d56au, 0xd9b873adu, 0x0ced340bu,
61 0xbc9cec09u, 0x73c65903u, 0xee39ce9bu, 0x3eede25au,
62 0x397633b7u, 0x2583c165u, 0x8514f97du, 0xe9166510u,
63 0x0b6fae99u, 0xa47139fdu, 0xdb8352f0u, 0xb2ad7f2cu,
64 0xa11552e2u, 0xd4d490a7u, 0xe11e8568u, 0xe9e484dau,
65 0xd3ef8449u, 0xa47055dau, 0x4edd9557u, 0x03a78ba1u,
66 0x770e130du, 0x16762facu, 0x0cbdfcc4u, 0xf3070540u,
67 0x008b6515u, 0x60e7e1b7u, 0xa72cf7f9u, 0xaff86e39u,
68 0x4296faadu, 0xfc90430eu, 0x6cc8f377u, 0xb398fd43u,
69 0x423c5997u, 0x991d59c4u, 0x6464bf73u, 0x96431575u,
70 0x15e3d207u, 0x30532a7au, 0x8c4be618u, 0x460a4d76u },
Doug Zongker17495272012-07-25 13:10:58 -070071 3
72 };
73
74RSAPublicKey test_f4_key =
75 { 64, 0xc9bd1f21,
Doug Zongkerbac7fba2013-04-10 11:32:17 -070076 { 0x1178db1fu, 0xbf5d0e55u, 0x3393a165u, 0x0ef4c287u,
77 0xbc472a4au, 0x383fc5a1u, 0x4a13b7d2u, 0xb1ff2ac3u,
78 0xaf66b4d9u, 0x9280acefu, 0xa2165bdbu, 0x6a4d6e5cu,
79 0x08ea676bu, 0xb7ac70c7u, 0xcd158139u, 0xa635ccfeu,
80 0xa46ab8a8u, 0x445a3e8bu, 0xdc81d9bbu, 0x91ce1a20u,
81 0x68021cdeu, 0x4516eda9u, 0x8d43c30cu, 0xed1eff14u,
82 0xca387e4cu, 0x58adc233u, 0x4657ab27u, 0xa95b521eu,
83 0xdfc0e30cu, 0x394d64a1u, 0xc6b321a1u, 0x2ca22cb8u,
84 0xb1892d5cu, 0x5d605f3eu, 0x6025483cu, 0x9afd5181u,
85 0x6e1a7105u, 0x03010593u, 0x70acd304u, 0xab957cbfu,
86 0x8844abbbu, 0x53846837u, 0x24e98a43u, 0x2ba060c1u,
87 0x8b88b88eu, 0x44eea405u, 0xb259fc41u, 0x0907ad9cu,
88 0x13003adau, 0xcf79634eu, 0x7d314ec9u, 0xfbbe4c2bu,
89 0xd84d0823u, 0xfd30fd88u, 0x68d8a909u, 0xfb4572d9u,
90 0xa21301c2u, 0xd00a4785u, 0x6862b50cu, 0xcfe49796u,
91 0xdaacbd83u, 0xfb620906u, 0xdf71e0ccu, 0xbbc5b030u },
92 { 0x69a82189u, 0x1a8b22f4u, 0xcf49207bu, 0x68cc056au,
93 0xb206b7d2u, 0x1d449bbdu, 0xe9d342f2u, 0x29daea58u,
94 0xb19d011au, 0xc62f15e4u, 0x9452697au, 0xb62bb87eu,
95 0x60f95cc2u, 0x279ebb2du, 0x17c1efd8u, 0xec47558bu,
96 0xc81334d1u, 0x88fe7601u, 0x79992eb1u, 0xb4555615u,
97 0x2022ac8cu, 0xc79a4b8cu, 0xb288b034u, 0xd6b942f0u,
98 0x0caa32fbu, 0xa065ba51u, 0x4de9f154u, 0x29f64f6cu,
99 0x7910af5eu, 0x3ed4636au, 0xe4c81911u, 0x9183f37du,
100 0x5811e1c4u, 0x29c7a58cu, 0x9715d4d3u, 0xc7e2dce3u,
101 0x140972ebu, 0xf4c8a69eu, 0xa104d424u, 0x5dabbdfbu,
102 0x41cb4c6bu, 0xd7f44717u, 0x61785ff7u, 0x5e0bc273u,
103 0x36426c70u, 0x2aa6f08eu, 0x083badbfu, 0x3cab941bu,
104 0x8871da23u, 0x1ab3dbaeu, 0x7115a21du, 0xf5aa0965u,
105 0xf766f562u, 0x7f110225u, 0x86d96a04u, 0xc50a120eu,
106 0x3a751ca3u, 0xc21aa186u, 0xba7359d0u, 0x3ff2b257u,
107 0xd116e8bbu, 0xfc1318c0u, 0x070e5b1du, 0x83b759a6u },
Doug Zongker17495272012-07-25 13:10:58 -0700108 65537
Doug Zongker73ae31c2009-12-09 17:01:45 -0800109 };
110
Kenny Root7a4adb52013-10-09 10:14:35 -0700111ECPublicKey test_ec_key =
112 {
113 {
114 {0xd656fa24u, 0x931416cau, 0x1c0278c6u, 0x174ebe4cu,
115 0x6018236au, 0x45ba1656u, 0xe8c05d84u, 0x670ed500u}
116 },
117 {
118 {0x0d179adeu, 0x4c16827du, 0x9f8cb992u, 0x8f69ff8au,
119 0x481b1020u, 0x798d91afu, 0x184db8e9u, 0xb5848dd9u}
120 }
121 };
122
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700123RecoveryUI* ui = NULL;
Doug Zongker73ae31c2009-12-09 17:01:45 -0800124
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700125// verifier expects to find a UI object; we provide one that does
126// nothing but print.
127class FakeUI : public RecoveryUI {
128 void Init() { }
Elliott Hughes8de52072015-04-08 20:06:50 -0700129 void SetStage(int, int) { }
130 void SetLocale(const char*) { }
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700131 void SetBackground(Icon icon) { }
Doug Zongker73ae31c2009-12-09 17:01:45 -0800132
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700133 void SetProgressType(ProgressType determinate) { }
134 void ShowProgress(float portion, float seconds) { }
135 void SetProgress(float fraction) { }
136
137 void ShowText(bool visible) { }
138 bool IsTextVisible() { return false; }
139 bool WasTextEverVisible() { return false; }
140 void Print(const char* fmt, ...) {
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700141 va_list ap;
142 va_start(ap, fmt);
Doug Zongker596b3422013-05-14 11:03:02 -0700143 vfprintf(stderr, fmt, ap);
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700144 va_end(ap);
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700145 }
Elliott Hughes8de52072015-04-08 20:06:50 -0700146 void ShowFile(const char*) { }
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700147
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700148 void StartMenu(const char* const * headers, const char* const * items,
149 int initial_selection) { }
150 int SelectMenu(int sel) { return 0; }
151 void EndMenu() { }
152};
Doug Zongker73ae31c2009-12-09 17:01:45 -0800153
Doug Zongker596b3422013-05-14 11:03:02 -0700154void
155ui_print(const char* format, ...) {
156 va_list ap;
157 va_start(ap, format);
158 vfprintf(stdout, format, ap);
159 va_end(ap);
160}
161
Kenny Root7a4adb52013-10-09 10:14:35 -0700162static Certificate* add_certificate(Certificate** certsp, int* num_keys,
163 Certificate::KeyType key_type) {
164 int i = *num_keys;
165 *num_keys = *num_keys + 1;
166 *certsp = (Certificate*) realloc(*certsp, *num_keys * sizeof(Certificate));
167 Certificate* certs = *certsp;
168 certs[i].rsa = NULL;
169 certs[i].ec = NULL;
170 certs[i].key_type = key_type;
171 certs[i].hash_len = SHA_DIGEST_SIZE;
172 return &certs[i];
173}
174
Doug Zongker73ae31c2009-12-09 17:01:45 -0800175int main(int argc, char **argv) {
Kenny Root7a4adb52013-10-09 10:14:35 -0700176 if (argc < 2) {
177 fprintf(stderr, "Usage: %s [-sha256] [-ec | -f4 | -file <keys>] <package>\n", argv[0]);
178 return 2;
179 }
180 Certificate* certs = NULL;
181 int num_keys = 0;
182
183 int argn = 1;
184 while (argn < argc) {
185 if (strcmp(argv[argn], "-sha256") == 0) {
186 if (num_keys == 0) {
187 fprintf(stderr, "May only specify -sha256 after key type\n");
188 return 2;
189 }
190 ++argn;
191 Certificate* cert = &certs[num_keys - 1];
192 cert->hash_len = SHA256_DIGEST_SIZE;
193 } else if (strcmp(argv[argn], "-ec") == 0) {
194 ++argn;
195 Certificate* cert = add_certificate(&certs, &num_keys, Certificate::EC);
196 cert->ec = &test_ec_key;
197 } else if (strcmp(argv[argn], "-e3") == 0) {
198 ++argn;
199 Certificate* cert = add_certificate(&certs, &num_keys, Certificate::RSA);
200 cert->rsa = &test_key;
201 } else if (strcmp(argv[argn], "-f4") == 0) {
202 ++argn;
203 Certificate* cert = add_certificate(&certs, &num_keys, Certificate::RSA);
204 cert->rsa = &test_f4_key;
205 } else if (strcmp(argv[argn], "-file") == 0) {
206 if (certs != NULL) {
207 fprintf(stderr, "Cannot specify -file with other certs specified\n");
208 return 2;
209 }
210 ++argn;
211 certs = load_keys(argv[argn], &num_keys);
212 ++argn;
213 } else if (argv[argn][0] == '-') {
214 fprintf(stderr, "Unknown argument %s\n", argv[argn]);
215 return 2;
216 } else {
217 break;
218 }
219 }
220
221 if (argn == argc) {
222 fprintf(stderr, "Must specify package to verify\n");
Doug Zongker73ae31c2009-12-09 17:01:45 -0800223 return 2;
224 }
225
Kenny Root7a4adb52013-10-09 10:14:35 -0700226 if (num_keys == 0) {
227 certs = (Certificate*) calloc(1, sizeof(Certificate));
228 if (certs == NULL) {
229 fprintf(stderr, "Failure allocating memory for default certificate\n");
230 return 1;
231 }
232 certs->key_type = Certificate::RSA;
233 certs->rsa = &test_key;
234 certs->ec = NULL;
235 certs->hash_len = SHA_DIGEST_SIZE;
236 num_keys = 1;
Doug Zongker17495272012-07-25 13:10:58 -0700237 }
238
Doug Zongkerdaefc1d2011-10-31 09:34:15 -0700239 ui = new FakeUI();
240
Doug Zongker99916f02014-01-13 14:16:58 -0800241 MemMapping map;
242 if (sysMapFile(argv[argn], &map) != 0) {
243 fprintf(stderr, "failed to mmap %s: %s\n", argv[argn], strerror(errno));
244 return 4;
245 }
246
Ethan Yonkera1674162014-11-06 08:35:10 -0600247 int result = verify_file(map.addr, map.length);
248
Doug Zongker73ae31c2009-12-09 17:01:45 -0800249 if (result == VERIFY_SUCCESS) {
Doug Zongkerbac7fba2013-04-10 11:32:17 -0700250 printf("VERIFIED\n");
Doug Zongker73ae31c2009-12-09 17:01:45 -0800251 return 0;
252 } else if (result == VERIFY_FAILURE) {
Doug Zongkerbac7fba2013-04-10 11:32:17 -0700253 printf("NOT VERIFIED\n");
Doug Zongker73ae31c2009-12-09 17:01:45 -0800254 return 1;
255 } else {
256 printf("bad return value\n");
257 return 3;
258 }
259}