129a23f9dSHeiko Schocher /*
229a23f9dSHeiko Schocher * (C) Copyright 2014
329a23f9dSHeiko Schocher * DENX Software Engineering
429a23f9dSHeiko Schocher * Heiko Schocher <hs@denx.de>
529a23f9dSHeiko Schocher *
629a23f9dSHeiko Schocher * Based on:
729a23f9dSHeiko Schocher * (C) Copyright 2008 Semihalf
829a23f9dSHeiko Schocher *
929a23f9dSHeiko Schocher * (C) Copyright 2000-2004
1029a23f9dSHeiko Schocher * DENX Software Engineering
1129a23f9dSHeiko Schocher * Wolfgang Denk, wd@denx.de
1229a23f9dSHeiko Schocher *
1329a23f9dSHeiko Schocher * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
1429a23f9dSHeiko Schocher * FIT image specific code abstracted from mkimage.c
1529a23f9dSHeiko Schocher * some functions added to address abstraction
1629a23f9dSHeiko Schocher *
1729a23f9dSHeiko Schocher * All rights reserved.
1829a23f9dSHeiko Schocher *
1929a23f9dSHeiko Schocher * SPDX-License-Identifier: GPL-2.0+
2029a23f9dSHeiko Schocher */
2129a23f9dSHeiko Schocher
2229a23f9dSHeiko Schocher #include "mkimage.h"
2329a23f9dSHeiko Schocher #include "fit_common.h"
2429a23f9dSHeiko Schocher #include <image.h>
2529a23f9dSHeiko Schocher #include <u-boot/crc.h>
2629a23f9dSHeiko Schocher
usage(char * cmdname)2729a23f9dSHeiko Schocher void usage(char *cmdname)
2829a23f9dSHeiko Schocher {
2929a23f9dSHeiko Schocher fprintf(stderr, "Usage: %s -f fit file -k key file\n"
3029a23f9dSHeiko Schocher " -f ==> set fit file which should be checked'\n"
3129a23f9dSHeiko Schocher " -k ==> set key file which contains the key'\n",
3229a23f9dSHeiko Schocher cmdname);
3329a23f9dSHeiko Schocher exit(EXIT_FAILURE);
3429a23f9dSHeiko Schocher }
3529a23f9dSHeiko Schocher
main(int argc,char ** argv)3629a23f9dSHeiko Schocher int main(int argc, char **argv)
3729a23f9dSHeiko Schocher {
3829a23f9dSHeiko Schocher int ffd = -1;
3929a23f9dSHeiko Schocher int kfd = -1;
4029a23f9dSHeiko Schocher struct stat fsbuf;
4129a23f9dSHeiko Schocher struct stat ksbuf;
4229a23f9dSHeiko Schocher void *fit_blob;
4329a23f9dSHeiko Schocher char *fdtfile = NULL;
4429a23f9dSHeiko Schocher char *keyfile = NULL;
4564375014SMichael van der Westhuizen char cmdname[256];
4629a23f9dSHeiko Schocher int ret;
4729a23f9dSHeiko Schocher void *key_blob;
4829a23f9dSHeiko Schocher int c;
49*96f5441eSJoseph Chen int is_spl = 0;
5029a23f9dSHeiko Schocher
5164375014SMichael van der Westhuizen strncpy(cmdname, *argv, sizeof(cmdname) - 1);
5264375014SMichael van der Westhuizen cmdname[sizeof(cmdname) - 1] = '\0';
53*96f5441eSJoseph Chen while ((c = getopt(argc, argv, "f:k:s")) != -1)
5429a23f9dSHeiko Schocher switch (c) {
5529a23f9dSHeiko Schocher case 'f':
5629a23f9dSHeiko Schocher fdtfile = optarg;
5729a23f9dSHeiko Schocher break;
5829a23f9dSHeiko Schocher case 'k':
5929a23f9dSHeiko Schocher keyfile = optarg;
6029a23f9dSHeiko Schocher break;
61*96f5441eSJoseph Chen case 's':
62*96f5441eSJoseph Chen is_spl = 1;
63*96f5441eSJoseph Chen break;
6429a23f9dSHeiko Schocher default:
6529a23f9dSHeiko Schocher usage(cmdname);
6629a23f9dSHeiko Schocher break;
6729a23f9dSHeiko Schocher }
6829a23f9dSHeiko Schocher
69ba923cabSSimon Glass if (!fdtfile) {
70ba923cabSSimon Glass fprintf(stderr, "%s: Missing fdt file\n", *argv);
71ba923cabSSimon Glass usage(*argv);
72ba923cabSSimon Glass }
73ba923cabSSimon Glass if (!keyfile) {
74ba923cabSSimon Glass fprintf(stderr, "%s: Missing key file\n", *argv);
75ba923cabSSimon Glass usage(*argv);
76ba923cabSSimon Glass }
77ba923cabSSimon Glass
78a9468115SSimon Glass ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false);
7929a23f9dSHeiko Schocher if (ffd < 0)
8029a23f9dSHeiko Schocher return EXIT_FAILURE;
81a9468115SSimon Glass kfd = mmap_fdt(cmdname, keyfile, 0, &key_blob, &ksbuf, false);
82310ae37eSThomas Huth if (kfd < 0)
8329a23f9dSHeiko Schocher return EXIT_FAILURE;
8429a23f9dSHeiko Schocher
8529a23f9dSHeiko Schocher image_set_host_blob(key_blob);
86*96f5441eSJoseph Chen ret = fit_check_sign(fit_blob, key_blob, is_spl);
87ce1400f6SSimon Glass if (!ret) {
8829a23f9dSHeiko Schocher ret = EXIT_SUCCESS;
89ce1400f6SSimon Glass fprintf(stderr, "Signature check OK\n");
90ce1400f6SSimon Glass } else {
9129a23f9dSHeiko Schocher ret = EXIT_FAILURE;
92ce1400f6SSimon Glass fprintf(stderr, "Signature check Bad (error %d)\n", ret);
93ce1400f6SSimon Glass }
9429a23f9dSHeiko Schocher
9529a23f9dSHeiko Schocher (void) munmap((void *)fit_blob, fsbuf.st_size);
9629a23f9dSHeiko Schocher (void) munmap((void *)key_blob, ksbuf.st_size);
9729a23f9dSHeiko Schocher
9829a23f9dSHeiko Schocher close(ffd);
9929a23f9dSHeiko Schocher close(kfd);
10029a23f9dSHeiko Schocher exit(ret);
10129a23f9dSHeiko Schocher }
102