173ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker/*
273ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * Copyright (C) 2009 The Android Open Source Project
373ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker *
473ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * Licensed under the Apache License, Version 2.0 (the "License");
573ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * you may not use this file except in compliance with the License.
673ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * You may obtain a copy of the License at
773ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker *
873ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker *      http://www.apache.org/licenses/LICENSE-2.0
973ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker *
1073ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * Unless required by applicable law or agreed to in writing, software
1173ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * distributed under the License is distributed on an "AS IS" BASIS,
1273ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * See the License for the specific language governing permissions and
1473ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker * limitations under the License.
1573ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker */
1673ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
1773ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker#include <stdio.h>
1873ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker#include <stdlib.h>
1973ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker#include <stdarg.h>
2099916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker#include <sys/types.h>
2199916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker#include <sys/stat.h>
2299916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker#include <fcntl.h>
2373ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
247c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker#include "common.h"
2573ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker#include "verifier.h"
26daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker#include "ui.h"
2730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker#include "mincrypt/sha.h"
2830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker#include "mincrypt/sha256.h"
2999916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker#include "minzip/SysUtil.h"
3073ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
3173ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker// This is build/target/product/security/testkey.x509.pem after being
3273ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker// dumped out by dumpkey.jar.
3373ae31ce0ac09c0e45924d817644261c87ab1a60Doug ZongkerRSAPublicKey test_key =
3473ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    { 64, 0xc926ad21,
3530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker      { 0x6afee91fu, 0x7fa31d5bu, 0x38a0b217u, 0x99df9baeu,
3630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xfe72991du, 0x727d3c04u, 0x20943f99u, 0xd08e7826u,
3730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x69e7c8a2u, 0xdeeccc8eu, 0x6b9af76fu, 0x553311c4u,
3830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x07b9e247u, 0x54c8bbcau, 0x6a540d81u, 0x48dbf567u,
3930362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x98c92877u, 0x134fbfdeu, 0x01b32564u, 0x24581948u,
4030362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x6cddc3b8u, 0x0cd444dau, 0xfe0381ccu, 0xf15818dfu,
4130362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xc06e6d42u, 0x2e2f6412u, 0x093a6737u, 0x94d83b31u,
4230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xa466c87au, 0xb3f284a0u, 0xa694ec2cu, 0x053359e6u,
4330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x9717ee6au, 0x0732e080u, 0x220d5008u, 0xdc4af350u,
4430362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x93d0a7c3u, 0xe330c9eau, 0xcac3da1eu, 0x8ebecf8fu,
4530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xc2be387fu, 0x38a14e89u, 0x211586f0u, 0x18b846f5u,
4630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x43be4c72u, 0xb578c204u, 0x1bbfb230u, 0xf1e267a8u,
4730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xa2d3e656u, 0x64b8e4feu, 0xe7e83d4bu, 0x3e77a943u,
4830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x3559ffd9u, 0x0ebb0f99u, 0x0aa76ce6u, 0xd3786ea7u,
4930362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xbca8cd6bu, 0x068ca8e8u, 0xeb1de2ffu, 0x3e3ecd6cu,
5030362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xe0d9d825u, 0xb1edc762u, 0xdec60b24u, 0xd6931904u},
5130362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker      { 0xccdcb989u, 0xe19281f9u, 0xa6e80accu, 0xb7f40560u,
5230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x0efb0bccu, 0x7f12b0bbu, 0x1e90531au, 0x136d95d0u,
5330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x9e660665u, 0x7d54918fu, 0xe3b93ea2u, 0x2f415d10u,
5430362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x3d2df6e6u, 0x7a627ecfu, 0xa6f22d70u, 0xb995907au,
5530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x09de16b2u, 0xfeb8bd61u, 0xf24ec294u, 0x716a427fu,
5630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x2e12046fu, 0xeaf3d56au, 0xd9b873adu, 0x0ced340bu,
5730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xbc9cec09u, 0x73c65903u, 0xee39ce9bu, 0x3eede25au,
5830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x397633b7u, 0x2583c165u, 0x8514f97du, 0xe9166510u,
5930362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x0b6fae99u, 0xa47139fdu, 0xdb8352f0u, 0xb2ad7f2cu,
6030362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xa11552e2u, 0xd4d490a7u, 0xe11e8568u, 0xe9e484dau,
6130362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xd3ef8449u, 0xa47055dau, 0x4edd9557u, 0x03a78ba1u,
6230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x770e130du, 0x16762facu, 0x0cbdfcc4u, 0xf3070540u,
6330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x008b6515u, 0x60e7e1b7u, 0xa72cf7f9u, 0xaff86e39u,
6430362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x4296faadu, 0xfc90430eu, 0x6cc8f377u, 0xb398fd43u,
6530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x423c5997u, 0x991d59c4u, 0x6464bf73u, 0x96431575u,
6630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x15e3d207u, 0x30532a7au, 0x8c4be618u, 0x460a4d76u },
6717495277b1a6328f5cae68523ad00be1f1107950Doug Zongker      3
6817495277b1a6328f5cae68523ad00be1f1107950Doug Zongker    };
6917495277b1a6328f5cae68523ad00be1f1107950Doug Zongker
7017495277b1a6328f5cae68523ad00be1f1107950Doug ZongkerRSAPublicKey test_f4_key =
7117495277b1a6328f5cae68523ad00be1f1107950Doug Zongker    { 64, 0xc9bd1f21,
7230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker      { 0x1178db1fu, 0xbf5d0e55u, 0x3393a165u, 0x0ef4c287u,
7330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xbc472a4au, 0x383fc5a1u, 0x4a13b7d2u, 0xb1ff2ac3u,
7430362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xaf66b4d9u, 0x9280acefu, 0xa2165bdbu, 0x6a4d6e5cu,
7530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x08ea676bu, 0xb7ac70c7u, 0xcd158139u, 0xa635ccfeu,
7630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xa46ab8a8u, 0x445a3e8bu, 0xdc81d9bbu, 0x91ce1a20u,
7730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x68021cdeu, 0x4516eda9u, 0x8d43c30cu, 0xed1eff14u,
7830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xca387e4cu, 0x58adc233u, 0x4657ab27u, 0xa95b521eu,
7930362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xdfc0e30cu, 0x394d64a1u, 0xc6b321a1u, 0x2ca22cb8u,
8030362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xb1892d5cu, 0x5d605f3eu, 0x6025483cu, 0x9afd5181u,
8130362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x6e1a7105u, 0x03010593u, 0x70acd304u, 0xab957cbfu,
8230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x8844abbbu, 0x53846837u, 0x24e98a43u, 0x2ba060c1u,
8330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x8b88b88eu, 0x44eea405u, 0xb259fc41u, 0x0907ad9cu,
8430362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x13003adau, 0xcf79634eu, 0x7d314ec9u, 0xfbbe4c2bu,
8530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xd84d0823u, 0xfd30fd88u, 0x68d8a909u, 0xfb4572d9u,
8630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xa21301c2u, 0xd00a4785u, 0x6862b50cu, 0xcfe49796u,
8730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xdaacbd83u, 0xfb620906u, 0xdf71e0ccu, 0xbbc5b030u },
8830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker      { 0x69a82189u, 0x1a8b22f4u, 0xcf49207bu, 0x68cc056au,
8930362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xb206b7d2u, 0x1d449bbdu, 0xe9d342f2u, 0x29daea58u,
9030362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xb19d011au, 0xc62f15e4u, 0x9452697au, 0xb62bb87eu,
9130362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x60f95cc2u, 0x279ebb2du, 0x17c1efd8u, 0xec47558bu,
9230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xc81334d1u, 0x88fe7601u, 0x79992eb1u, 0xb4555615u,
9330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x2022ac8cu, 0xc79a4b8cu, 0xb288b034u, 0xd6b942f0u,
9430362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x0caa32fbu, 0xa065ba51u, 0x4de9f154u, 0x29f64f6cu,
9530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x7910af5eu, 0x3ed4636au, 0xe4c81911u, 0x9183f37du,
9630362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x5811e1c4u, 0x29c7a58cu, 0x9715d4d3u, 0xc7e2dce3u,
9730362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x140972ebu, 0xf4c8a69eu, 0xa104d424u, 0x5dabbdfbu,
9830362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x41cb4c6bu, 0xd7f44717u, 0x61785ff7u, 0x5e0bc273u,
9930362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x36426c70u, 0x2aa6f08eu, 0x083badbfu, 0x3cab941bu,
10030362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x8871da23u, 0x1ab3dbaeu, 0x7115a21du, 0xf5aa0965u,
10130362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xf766f562u, 0x7f110225u, 0x86d96a04u, 0xc50a120eu,
10230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0x3a751ca3u, 0xc21aa186u, 0xba7359d0u, 0x3ff2b257u,
10330362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        0xd116e8bbu, 0xfc1318c0u, 0x070e5b1du, 0x83b759a6u },
10417495277b1a6328f5cae68523ad00be1f1107950Doug Zongker      65537
10573ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    };
10673ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
1077a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny RootECPublicKey test_ec_key =
1087a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    {
1097a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root       {
1107a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root         {0xd656fa24u, 0x931416cau, 0x1c0278c6u, 0x174ebe4cu,
1117a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root          0x6018236au, 0x45ba1656u, 0xe8c05d84u, 0x670ed500u}
1127a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root      },
1137a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root      {
1147a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        {0x0d179adeu, 0x4c16827du, 0x9f8cb992u, 0x8f69ff8au,
1157a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root         0x481b1020u, 0x798d91afu, 0x184db8e9u, 0xb5848dd9u}
1167a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root      }
1177a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    };
1187a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root
119daefc1d442fb421606680feb9aeb59c133f4c427Doug ZongkerRecoveryUI* ui = NULL;
12073ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
121daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker// verifier expects to find a UI object; we provide one that does
122daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker// nothing but print.
123daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongkerclass FakeUI : public RecoveryUI {
124daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void Init() { }
125daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void SetBackground(Icon icon) { }
12673ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
127daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void SetProgressType(ProgressType determinate) { }
128daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void ShowProgress(float portion, float seconds) { }
129daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void SetProgress(float fraction) { }
130daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker
131daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void ShowText(bool visible) { }
132daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    bool IsTextVisible() { return false; }
133daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    bool WasTextEverVisible() { return false; }
134daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void Print(const char* fmt, ...) {
135daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker        va_list ap;
136daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker        va_start(ap, fmt);
1377c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker        vfprintf(stderr, fmt, ap);
138daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker        va_end(ap);
139daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    }
140daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker
141daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void StartMenu(const char* const * headers, const char* const * items,
142daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker                           int initial_selection) { }
143daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    int SelectMenu(int sel) { return 0; }
144daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    void EndMenu() { }
145daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker};
14673ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
1477c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongkervoid
1487c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongkerui_print(const char* format, ...) {
1497c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker    va_list ap;
1507c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker    va_start(ap, format);
1517c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker    vfprintf(stdout, format, ap);
1527c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker    va_end(ap);
1537c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker}
1547c3ae45ef9306d2ff4b491e0488c8849bf15ce90Doug Zongker
1557a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Rootstatic Certificate* add_certificate(Certificate** certsp, int* num_keys,
1567a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        Certificate::KeyType key_type) {
1577a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    int i = *num_keys;
1587a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    *num_keys = *num_keys + 1;
1597a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    *certsp = (Certificate*) realloc(*certsp, *num_keys * sizeof(Certificate));
1607a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    Certificate* certs = *certsp;
1617a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    certs[i].rsa = NULL;
1627a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    certs[i].ec = NULL;
1637a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    certs[i].key_type = key_type;
1647a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    certs[i].hash_len = SHA_DIGEST_SIZE;
1657a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    return &certs[i];
1667a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root}
1677a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root
16873ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongkerint main(int argc, char **argv) {
1697a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    if (argc < 2) {
1707a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        fprintf(stderr, "Usage: %s [-sha256] [-ec | -f4 | -file <keys>] <package>\n", argv[0]);
17173ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker        return 2;
17273ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    }
1737a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    Certificate* certs = NULL;
1747a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    int num_keys = 0;
17573ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker
1767a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    int argn = 1;
1777a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    while (argn < argc) {
1787a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        if (strcmp(argv[argn], "-sha256") == 0) {
1797a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            if (num_keys == 0) {
1807a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root                fprintf(stderr, "May only specify -sha256 after key type\n");
1817a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root                return 2;
1827a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            }
1837a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            ++argn;
1847a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            Certificate* cert = &certs[num_keys - 1];
1857a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            cert->hash_len = SHA256_DIGEST_SIZE;
1867a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        } else if (strcmp(argv[argn], "-ec") == 0) {
1877a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            ++argn;
1887a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            Certificate* cert = add_certificate(&certs, &num_keys, Certificate::EC);
1897a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            cert->ec = &test_ec_key;
1907a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        } else if (strcmp(argv[argn], "-e3") == 0) {
1917a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            ++argn;
1927a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            Certificate* cert = add_certificate(&certs, &num_keys, Certificate::RSA);
1937a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            cert->rsa = &test_key;
1947a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        } else if (strcmp(argv[argn], "-f4") == 0) {
1957a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            ++argn;
1967a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            Certificate* cert = add_certificate(&certs, &num_keys, Certificate::RSA);
1977a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            cert->rsa = &test_f4_key;
1987a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        } else if (strcmp(argv[argn], "-file") == 0) {
1997a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            if (certs != NULL) {
2007a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root                fprintf(stderr, "Cannot specify -file with other certs specified\n");
2017a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root                return 2;
2027a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            }
2037a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            ++argn;
2047a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            certs = load_keys(argv[argn], &num_keys);
2057a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            ++argn;
2067a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        } else if (argv[argn][0] == '-') {
2077a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            fprintf(stderr, "Unknown argument %s\n", argv[argn]);
2087a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            return 2;
2097a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        } else {
2107a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            break;
2117a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        }
21230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker    }
2137a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root
2147a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    if (argn == argc) {
2157a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        fprintf(stderr, "Must specify package to verify\n");
2167a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        return 2;
2177a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    }
2187a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root
2197a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root    if (num_keys == 0) {
2207a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        certs = (Certificate*) calloc(1, sizeof(Certificate));
2217a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        if (certs == NULL) {
2227a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            fprintf(stderr, "Failure allocating memory for default certificate\n");
2237a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root            return 1;
2247a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        }
2257a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        certs->key_type = Certificate::RSA;
2267a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        certs->rsa = &test_key;
2277a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        certs->ec = NULL;
2287a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        certs->hash_len = SHA_DIGEST_SIZE;
2297a4adb5268ae71260c86788ccdeb7a699c80ee0aKenny Root        num_keys = 1;
23017495277b1a6328f5cae68523ad00be1f1107950Doug Zongker    }
23117495277b1a6328f5cae68523ad00be1f1107950Doug Zongker
232daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker    ui = new FakeUI();
233daefc1d442fb421606680feb9aeb59c133f4c427Doug Zongker
23499916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker    MemMapping map;
23599916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker    if (sysMapFile(argv[argn], &map) != 0) {
23699916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker        fprintf(stderr, "failed to mmap %s: %s\n", argv[argn], strerror(errno));
23799916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker        return 4;
23899916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker    }
23999916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker
24099916f0496cfe37891d40f21a9a0e387620a8a60Doug Zongker    int result = verify_file(map.addr, map.length, certs, num_keys);
24173ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    if (result == VERIFY_SUCCESS) {
24230362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        printf("VERIFIED\n");
24373ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker        return 0;
24473ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    } else if (result == VERIFY_FAILURE) {
24530362a6ad132cbafde82cc57293e00679d4f86c2Doug Zongker        printf("NOT VERIFIED\n");
24673ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker        return 1;
24773ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    } else {
24873ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker        printf("bad return value\n");
24973ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker        return 3;
25073ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker    }
25173ae31ce0ac09c0e45924d817644261c87ab1a60Doug Zongker}
252