fit_check_sign.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2014
  4. * DENX Software Engineering
  5. * Heiko Schocher <hs@denx.de>
  6. *
  7. * Based on:
  8. * (C) Copyright 2008 Semihalf
  9. *
  10. * (C) Copyright 2000-2004
  11. * DENX Software Engineering
  12. * Wolfgang Denk, wd@denx.de
  13. *
  14. * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
  15. * FIT image specific code abstracted from mkimage.c
  16. * some functions added to address abstraction
  17. *
  18. * All rights reserved.
  19. */
  20. #include "mkimage.h"
  21. #include "fit_common.h"
  22. #include <image.h>
  23. #include <u-boot/crc.h>
  24. void usage(char *cmdname)
  25. {
  26. fprintf(stderr, "Usage: %s -f fit file -k key file -c config name\n"
  27. " -f ==> set fit file which should be checked'\n"
  28. " -k ==> set key file which contains the key'\n"
  29. " -c ==> set the configuration name'\n",
  30. cmdname);
  31. exit(EXIT_FAILURE);
  32. }
  33. int main(int argc, char **argv)
  34. {
  35. int ffd = -1;
  36. int kfd = -1;
  37. struct stat fsbuf;
  38. struct stat ksbuf;
  39. void *fit_blob;
  40. char *fdtfile = NULL;
  41. char *keyfile = NULL;
  42. char *config_name = NULL;
  43. char cmdname[256];
  44. int ret;
  45. void *key_blob;
  46. int c;
  47. strncpy(cmdname, *argv, sizeof(cmdname) - 1);
  48. cmdname[sizeof(cmdname) - 1] = '\0';
  49. while ((c = getopt(argc, argv, "f:k:c:")) != -1)
  50. switch (c) {
  51. case 'f':
  52. fdtfile = optarg;
  53. break;
  54. case 'k':
  55. keyfile = optarg;
  56. break;
  57. case 'c':
  58. config_name = optarg;
  59. break;
  60. default:
  61. usage(cmdname);
  62. break;
  63. }
  64. if (!fdtfile) {
  65. fprintf(stderr, "%s: Missing fdt file\n", *argv);
  66. usage(*argv);
  67. }
  68. if (!keyfile) {
  69. fprintf(stderr, "%s: Missing key file\n", *argv);
  70. usage(*argv);
  71. }
  72. ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false, true);
  73. if (ffd < 0)
  74. return EXIT_FAILURE;
  75. kfd = mmap_fdt(cmdname, keyfile, 0, &key_blob, &ksbuf, false, true);
  76. if (kfd < 0)
  77. return EXIT_FAILURE;
  78. image_set_host_blob(key_blob);
  79. ret = fit_check_sign(fit_blob, key_blob, config_name);
  80. if (!ret) {
  81. ret = EXIT_SUCCESS;
  82. fprintf(stderr, "Signature check OK\n");
  83. } else {
  84. ret = EXIT_FAILURE;
  85. fprintf(stderr, "Signature check Bad (error %d)\n", ret);
  86. }
  87. (void) munmap((void *)fit_blob, fsbuf.st_size);
  88. (void) munmap((void *)key_blob, ksbuf.st_size);
  89. close(ffd);
  90. close(kfd);
  91. exit(ret);
  92. }