pskey.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*====================================================================*
  2. *
  3. * Copyright (c) 2013 Qualcomm Atheros, Inc.
  4. *
  5. * All rights reserved.
  6. *
  7. *====================================================================*/
  8. /*====================================================================*
  9. *
  10. * pskey.c -
  11. *
  12. * Contributor(s):
  13. * Charles Maier <cmaier@qca.qualcomm.com>
  14. *
  15. *--------------------------------------------------------------------*/
  16. /*====================================================================*
  17. * system header files;
  18. *--------------------------------------------------------------------*/
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <unistd.h>
  22. #include <errno.h>
  23. #include <sys/stat.h>
  24. /*====================================================================*
  25. * custom header files;
  26. *--------------------------------------------------------------------*/
  27. #include "../tools/getoptv.h"
  28. #include "../tools/number.h"
  29. #include "../tools/types.h"
  30. #include "../tools/error.h"
  31. #include "../tools/files.h"
  32. #include "../tools/flags.h"
  33. #include "../key/HPAVKey.h"
  34. #include "../key/SHA256.h"
  35. #include "../plc/plc.h"
  36. #include "../pib/pib.h"
  37. /*====================================================================*
  38. * custom source files;
  39. *--------------------------------------------------------------------*/
  40. #ifndef MAKEFILE
  41. #include "../tools/getoptv.c"
  42. #include "../tools/putoptv.c"
  43. #include "../tools/version.c"
  44. #include "../tools/fdchecksum32.c"
  45. #include "../tools/hexdecode.c"
  46. #include "../tools/hexstring.c"
  47. #include "../tools/hexout.c"
  48. #include "../tools/error.c"
  49. #endif
  50. #ifndef MAKEFILE
  51. #include "../pib/lightning_pib_file.c"
  52. #endif
  53. #ifndef MAKEFILE
  54. #include "../key/SHA256Reset.c"
  55. #include "../key/SHA256Write.c"
  56. #include "../key/SHA256Block.c"
  57. #include "../key/SHA256Fetch.c"
  58. #include "../pib/pib.h"
  59. #include "../key/keys.c"
  60. #endif
  61. /*====================================================================*
  62. * program constants;
  63. *--------------------------------------------------------------------*/
  64. #define PSKEY_VERBOSE (1 << 0)
  65. #define PSKEY_SILENCE (1 << 1)
  66. /*====================================================================*
  67. *
  68. * static signed pskey (struct _file_ * pib);
  69. *
  70. * compute the SHA256 digest of the PIB file prescalers and print
  71. * the key with optional filename on stdout; the digest acts like
  72. * a fingerprint;
  73. *
  74. * assume that offset and extent are for ar7400 and change to 6400
  75. * offset and extent when the PIB requires it;
  76. *
  77. *--------------------------------------------------------------------*/
  78. static signed pskey (struct _file_ * pib, off_t offset, void * memory, ssize_t extent, flag_t flags)
  79. {
  80. struct sha256 sha256;
  81. byte digest [SHA256_DIGEST_LENGTH];
  82. struct pib_header pib_header;
  83. if (read (pib->file, & pib_header, sizeof (pib_header)) != sizeof (pib_header))
  84. {
  85. return (- 1);
  86. }
  87. if (pib_header.FWVERSION < 0x05)
  88. {
  89. offset = INT_PRESCALER_OFFSET;
  90. extent = INT_PRESCALER_LENGTH;
  91. }
  92. if (lseek (pib->file, offset, SEEK_SET) != offset)
  93. {
  94. error (0, errno, FILE_CANTSEEK, pib->name);
  95. return (- 1);
  96. }
  97. if (read (pib->file, memory, extent) != extent)
  98. {
  99. error (0, errno, FILE_CANTREAD, pib->name);
  100. return (- 1);
  101. }
  102. SHA256Reset (& sha256);
  103. SHA256Write (& sha256, memory, extent);
  104. SHA256Fetch (& sha256, digest);
  105. hexout (digest, sizeof (digest), '\0', 0, stdout);
  106. if (_allclr (flags, PSKEY_SILENCE))
  107. {
  108. printf (" %s", pib->name);
  109. }
  110. printf ("\n");
  111. return (0);
  112. }
  113. /*====================================================================*
  114. *
  115. * int main (int argc, char const * argv [])
  116. *
  117. *
  118. *--------------------------------------------------------------------*/
  119. int main (int argc, char const * argv [])
  120. {
  121. static char const * optv [] =
  122. {
  123. "lqrsv",
  124. "file [file] [...]",
  125. "print prescaler finger-print on stdout",
  126. "q\tquiet mode",
  127. "v\tverbose mode",
  128. (char const *) (0)
  129. };
  130. struct _file_ pib;
  131. uint8_t buffer [INT_PRESCALER_LENGTH];
  132. signed state = 0;
  133. flag_t flags = (flag_t) (0);
  134. signed c;
  135. optind = 1;
  136. while (~ (c = getoptv (argc, argv, optv)))
  137. {
  138. switch ((char) (c))
  139. {
  140. case 'q':
  141. _setbits (flags, PSKEY_SILENCE);
  142. break;
  143. case 'v':
  144. _setbits (flags, PSKEY_VERBOSE);
  145. break;
  146. default:
  147. break;
  148. }
  149. }
  150. argc -= optind;
  151. argv += optind;
  152. while ((argc) && (* argv))
  153. {
  154. pib.name = * argv;
  155. if ((pib.file = open (pib.name, O_BINARY | O_RDONLY)) == - 1)
  156. {
  157. error (0, errno, "Can't open: %s", pib.name);
  158. state = 1;
  159. errno = 0;
  160. }
  161. else if (lightning_pib_file (& pib))
  162. {
  163. error (0, errno, "Bad PIB: %s", pib.name);
  164. state = 1;
  165. }
  166. else if (pskey (& pib, INT_PRESCALER_OFFSET, buffer, sizeof (buffer), flags))
  167. {
  168. state = 1;
  169. }
  170. close (pib.file);
  171. argc--;
  172. argv++;
  173. }
  174. return (state);
  175. }