123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <errno.h>
- #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"
- #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/pibpeek1.c"
- #include "../pib/pibpeek2.c"
- #endif
- #ifndef MAKEFILE
- #include "../nvm/manifest.c"
- #include "../nvm/fdmanifest.c"
- #endif
- 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 (pibpeek1 (&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);
- }
- 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 (pibpeek2 (&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);
- }
- static signed pibchain2 (signed fd, char const * filename, flag_t flags)
- {
- struct nvm_header2 nvm_header;
- uint32_t origin = ~0;
- uint32_t offset = 0;
- unsigned module = 0;
- do
- {
- if (read (fd, &nvm_header, sizeof (nvm_header)) != sizeof (nvm_header))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, errno, NVM_HDR_CANTREAD, filename, module);
- }
- return (-1);
- }
- if (LE16TOH (nvm_header.MajorVersion) != 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_VERSION, filename, module);
- }
- return (-1);
- }
- if (LE16TOH (nvm_header.MinorVersion) != 1)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_VERSION, filename, module);
- }
- return (-1);
- }
- if (checksum32 (&nvm_header, sizeof (nvm_header), 0))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_CHECKSUM, filename, module);
- }
- return (-1);
- }
- if (LE32TOH (nvm_header.PrevHeader) != origin)
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_HDR_LINK, filename, module);
- }
- return (-1);
- }
- if (LE32TOH (nvm_header.ImageType) == NVM_IMAGE_PIB)
- {
- return (pibimage2 (fd, filename, LE32TOH (nvm_header.ImageLength), nvm_header.ImageChecksum, flags));
- }
- if (LE32TOH (nvm_header.ImageType) == NVM_IMAGE_MANIFEST)
- {
- if (_anyset (flags, PIB_MANIFEST))
- {
- fdmanifest (fd, filename, &nvm_header, module);
- }
- }
- if (fdchecksum32 (fd, LE32TOH (nvm_header.ImageLength), nvm_header.ImageChecksum))
- {
- if (_allclr (flags, PIB_SILENCE))
- {
- error (0, 0, NVM_IMG_CHECKSUM, filename, module);
- }
- return (-1);
- }
- origin = offset;
- offset = LE32TOH (nvm_header.NextHeader);
- module++;
- }
- while (~nvm_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);
- }
- 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 [])
- {
- static char const * optv [] =
- {
- "mqv",
- "file [file] [...]",
- "Qualcomm Atheros PLC Parameter File Inspector",
- "m\tdisplay manifest",
- "q\tquiet",
- "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)) != -1)
- {
- switch (c)
- {
- case 'm':
- _setbits (flags, PIB_MANIFEST);
- break;
- case 'q':
- _setbits (flags, PIB_SILENCE);
- 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);
- }
|