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 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 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