123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- /*====================================================================*
- *
- * Copyright (c) 2013 Qualcomm Atheros, Inc.
- *
- * All rights reserved.
- *
- *====================================================================*/
- /*====================================================================*
- * system header files;
- *--------------------------------------------------------------------*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <errno.h>
- /*====================================================================*
- * custom header files;
- *--------------------------------------------------------------------*/
- #include "../tools/getoptv.h"
- #include "../tools/flags.h"
- #include "../tools/error.h"
- #include "../tools/files.h"
- #include "../key/HPAVKey.h"
- #include "../nvm/nvm.h"
- #include "../pib/pib.h"
- /*====================================================================*
- * custom source files;
- *--------------------------------------------------------------------*/
- #ifndef MAKEFILE
- #include "../tools/getoptv.c"
- #include "../tools/putoptv.c"
- #include "../tools/version.c"
- #include "../tools/checksum32.c"
- #include "../tools/fdchecksum32.c"
- #include "../tools/checksum32.c"
- #include "../tools/hexstring.c"
- #include "../tools/hexdecode.c"
- #include "../tools/strfbits.c"
- #include "../tools/error.c"
- #endif
- #ifndef MAKEFILE
- #include "../key/SHA256Reset.c"
- #include "../key/SHA256Block.c"
- #include "../key/SHA256Write.c"
- #include "../key/SHA256Fetch.c"
- #include "../key/HPAVKeyNID.c"
- #include "../key/keys.c"
- #endif
- #ifndef MAKEFILE
- #include "../pib/lightning_pib_peek.c"
- #include "../pib/panther_pib_peek.c"
- #endif
- #ifndef MAKEFILE
- #include "../nvm/fdmanifest.c"
- #include "../nvm/fdrevision.c"
- #include "../nvm/panther_nvm_manifest.c"
- #include "../nvm/panther_nvm_revision.c"
- #endif
- /*====================================================================*
- *
- * signed pibimage1 (signed fd, char const * filename, flag_t flags);
- *
- * validate a disk-resident lightning/thunderbolt PIB image; read
- * the header then verify the checksum and preferred Network
- * Identifier (NID); return 0 on success or -1 on error;
- *
- * this is not a thorough check but it detects non-PIB images;
- *
- * Contributor(s):
- * Charles Maier <cmaier@qca.qualcomm.com>
- *
- *--------------------------------------------------------------------*/
- static signed pibimage1 (signed fd, char const * filename, flag_t flags)
- {
- struct simple_pib simple_pib;
- uint8_t NID [HPAVKEY_NID_LEN];
- if (read (fd, & simple_pib, sizeof (simple_pib)) != sizeof (simple_pib))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTREAD, filename);
- }
- return (- 1);
- }
- if (_anyset (flags, PIB_VERBOSE))
- {
- printf ("------- %s -------\n", filename);
- if (lightning_pib_peek (& simple_pib))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, PIB_BADVERSION, filename);
- }
- return (- 1);
- }
- }
- if (lseek (fd, (off_t) (0) - sizeof (simple_pib), SEEK_CUR) == - 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTSEEK, filename);
- }
- return (- 1);
- }
- if (fdchecksum32 (fd, LE16TOH (simple_pib.PIBLENGTH), 0))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, PIB_BADCHECKSUM, filename);
- }
- return (- 1);
- }
- HPAVKeyNID (NID, simple_pib.NMK, simple_pib.PreferredNID [HPAVKEY_NID_LEN - 1] >> 4);
- if (memcmp (NID, simple_pib.PreferredNID, sizeof (NID)))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, PIB_BADNID, filename);
- }
- return (- 1);
- }
- return (0);
- }
- /*====================================================================*
- *
- * signed pibimage2 (signed fd, char const * filename, uint32_t length, uint32_t checksum, flag_t flags);
- *
- * validate a disk-resident panther/lynxPIB image; read the header
- * then verify the checksum and preferred Network Identifuier (NID);
- * return 0 on success or -1 on error;
- *
- * this is not a thorough check but it detects non-PIB images;
- *
- * Contributor(s):
- * Charles Maier <cmaier@qca.qualcomm.com>
- *
- *--------------------------------------------------------------------*/
- static signed pibimage2 (signed fd, char const * filename, uint32_t length, uint32_t checksum, flag_t flags)
- {
- struct simple_pib simple_pib;
- struct pib_header pib_header;
- uint8_t NID [HPAVKEY_NID_LEN];
- memset (& pib_header, 0, sizeof (pib_header));
- if (read (fd, & simple_pib, sizeof (simple_pib)) != sizeof (simple_pib))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTREAD, filename);
- }
- return (- 1);
- }
- if (_anyset (flags, PIB_VERBOSE))
- {
- struct pib_header * pib_header = (struct pib_header *) (& simple_pib);
- pib_header->PIBLENGTH = HTOLE16 ((uint16_t) (length));
- printf ("------- %s -------\n", filename);
- if (panther_pib_peek (& simple_pib))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, PIB_BADVERSION, filename);
- }
- return (- 1);
- }
- memset (pib_header, 0, sizeof (* pib_header));
- }
- if (lseek (fd, (off_t) (0) - sizeof (simple_pib), SEEK_CUR) == - 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTHOME, filename);
- }
- return (- 1);
- }
- if (fdchecksum32 (fd, length, checksum))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, PIB_BADCHECKSUM, filename);
- }
- return (- 1);
- }
- HPAVKeyNID (NID, simple_pib.NMK, simple_pib.PreferredNID [HPAVKEY_NID_LEN - 1] >> 4);
- if (memcmp (NID, simple_pib.PreferredNID, sizeof (NID)))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, PIB_BADNID, filename);
- }
- return (- 1);
- }
- return (0);
- }
- /*====================================================================*
- *
- * signed pibchain2 (signed fd, char const * filename, flag_t flags);
- *
- * open a panther/lynx parameter file and validate it;
- *
- * traverse a panther/lynx image file looking for PIB images and
- * validate each one; return 0 on success or -1 on error; errors
- * occur due to an invalid image chain or a bad parameter block;
- *
- * this implementation checks the parameter block without reading
- * the entire block into memory;
- *
- *
- * Contributor(s):
- * Charles Maier <cmaier@qca.qualcomm.com>
- *
- *--------------------------------------------------------------------*/
- static signed pibchain2 (signed fd, char const * filename, flag_t flags)
- {
- struct panther_nvm_header header;
- uint32_t origin = ~ 0;
- uint32_t offset = 0;
- unsigned module = 0;
- do
- {
- if (read (fd, & header, sizeof (header)) != sizeof (header))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, NVM_HDR_CANTREAD, filename, module);
- }
- return (- 1);
- }
- if (LE16TOH (header.MajorVersion) != 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_VERSION, filename, module);
- }
- return (- 1);
- }
- if (LE16TOH (header.MinorVersion) != 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_VERSION, filename, module);
- }
- return (- 1);
- }
- if (checksum32 (& header, sizeof (header), 0))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_CHECKSUM, filename, module);
- }
- return (- 1);
- }
- if (LE32TOH (header.PrevHeader) != origin)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_LINK, filename, module);
- }
- return (- 1);
- }
- if (LE32TOH (header.ImageType) == NVM_IMAGE_PIB)
- {
- return (pibimage2 (fd, filename, LE32TOH (header.ImageLength), header.ImageChecksum, flags));
- }
- if (LE32TOH (header.ImageType) == NVM_IMAGE_MANIFEST)
- {
- if (_anyset (flags, PIB_MANIFEST))
- {
- fdmanifest (fd, filename, & header);
- return (0);
- }
- if (_anyset (flags, PIB_REVISION))
- {
- fdrevision (fd, filename, & header);
- return (0);
- }
- }
- if (fdchecksum32 (fd, LE32TOH (header.ImageLength), header.ImageChecksum))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_IMG_CHECKSUM, filename, module);
- }
- return (- 1);
- }
- origin = offset;
- offset = LE32TOH (header.NextHeader);
- module++;
- }
- while (~ header.NextHeader);
- if (lseek (fd, 0, SEEK_CUR) != lseek (fd, 0, SEEK_END))
- {
- if (_allclr (flags, NVM_SILENCE))
- {
- error (0, errno, NVM_HDR_LINK, filename, module);
- }
- return (- 1);
- }
- error (0, 0, "%s has no PIB", filename);
- return (- 1);
- }
- /*====================================================================*
- *
- * signed chkpib (char const * filename, flag_t flags);
- *
- * open a named file and determine if it is a valid thunderbolt,
- * lightning, panther or lynx PIB;
- *
- *
- * Contributor(s):
- * Charles Maier <cmaier@qca.qualcomm.com>
- *
- *--------------------------------------------------------------------*/
- static signed chkpib (char const * filename, flag_t flags)
- {
- uint32_t version;
- signed status = 0;
- signed fd;
- if ((fd = open (filename, O_BINARY | O_RDONLY)) == - 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTOPEN, filename);
- }
- return (- 1);
- }
- if (read (fd, & version, sizeof (version)) != sizeof (version))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTREAD, filename);
- }
- return (- 1);
- }
- if (lseek (fd, 0, SEEK_SET))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_CANTHOME, filename);
- }
- return (- 1);
- }
- if (LE32TOH (version) == 0x60000000)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, FILE_WONTREAD, filename);
- }
- status = - 1; ;
- }
- else if (LE32TOH (version) == 0x00010001)
- {
- status = pibchain2 (fd, filename, flags);
- }
- else
- {
- status = pibimage1 (fd, filename, flags);
- }
- close (fd);
- return (status);
- }
- /*====================================================================*
- *
- * int main (int argc, char const * argv []);
- *
- *
- * Contributor(s):
- * Charles Maier <cmaier@qca.qualcomm.com>
- *
- *--------------------------------------------------------------------*/
- int main (int argc, char const * argv [])
- {
- static char const * optv [] =
- {
- "mqrv",
- "file [file] [...]",
- "Qualcomm Atheros PLC Parameter File Inspector",
- "m\tdisplay manifest",
- "q\tquiet",
- "r\tprint firmware revision string",
- "v\tverbose messages",
- (char const *) (0)
- };
- flag_t flags = (flag_t) (0);
- signed state = 0;
- signed c;
- optind = 1;
- while (~ (c = getoptv (argc, argv, optv)))
- {
- switch (c)
- {
- case 'm':
- _setbits (flags, PIB_MANIFEST);
- break;
- case 'q':
- _setbits (flags, PIB_SILENCE);
- break;
- case 'r':
- _setbits (flags, PIB_REVISION);
- break;
- case 'v':
- _setbits (flags, PIB_VERBOSE);
- break;
- default:
- break;
- }
- }
- argc -= optind;
- argv += optind;
- while ((argc) && (* argv))
- {
- errno = 0;
- if (chkpib (* argv, flags))
- {
- state = 1;
- }
- else if (_allclr (flags, (PIB_VERBOSE | PIB_SILENCE | PIB_MANIFEST)))
- {
- printf ("%s looks good\n", * argv);
- }
- argc--;
- argv++;
- }
- return (state);
- }
|