fit_check_sign.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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\n"
  27. " -f ==> set fit file which should be checked'\n"
  28. " -k ==> set key file which contains the key'\n",
  29. cmdname);
  30. exit(EXIT_FAILURE);
  31. }
  32. int main(int argc, char **argv)
  33. {
  34. int ffd = -1;
  35. int kfd = -1;
  36. struct stat fsbuf;
  37. struct stat ksbuf;
  38. void *fit_blob;
  39. char *fdtfile = NULL;
  40. char *keyfile = NULL;
  41. char *config_name = NULL;
  42. char cmdname[256];
  43. int ret;
  44. void *key_blob;
  45. int c;
  46. strncpy(cmdname, *argv, sizeof(cmdname) - 1);
  47. cmdname[sizeof(cmdname) - 1] = '\0';
  48. while ((c = getopt(argc, argv, "f:k:c:")) != -1)
  49. switch (c) {
  50. case 'f':
  51. fdtfile = optarg;
  52. break;
  53. case 'k':
  54. keyfile = optarg;
  55. break;
  56. case 'c':
  57. config_name = optarg;
  58. break;
  59. default:
  60. usage(cmdname);
  61. break;
  62. }
  63. if (!fdtfile) {
  64. fprintf(stderr, "%s: Missing fdt file\n", *argv);
  65. usage(*argv);
  66. }
  67. if (!keyfile) {
  68. fprintf(stderr, "%s: Missing key file\n", *argv);
  69. usage(*argv);
  70. }
  71. ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false, true);
  72. if (ffd < 0)
  73. return EXIT_FAILURE;
  74. kfd = mmap_fdt(cmdname, keyfile, 0, &key_blob, &ksbuf, false, true);
  75. if (kfd < 0)
  76. return EXIT_FAILURE;
  77. image_set_host_blob(key_blob);
  78. ret = fit_check_sign(fit_blob, key_blob, config_name);
  79. if (!ret) {
  80. ret = EXIT_SUCCESS;
  81. fprintf(stderr, "Signature check OK\n");
  82. } else {
  83. ret = EXIT_FAILURE;
  84. fprintf(stderr, "Signature check Bad (error %d)\n", ret);
  85. }
  86. (void) munmap((void *)fit_blob, fsbuf.st_size);
  87. (void) munmap((void *)key_blob, ksbuf.st_size);
  88. close(ffd);
  89. close(kfd);
  90. exit(ret);
  91. }