signed pibfile2 (struct _file_ const * file) { struct nvm_header2 nvm_header; uint32_t origin = ~0; uint32_t offset = 0; unsigned module = 0; if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } do { if (read (file->file, &nvm_header, sizeof (nvm_header)) != sizeof (nvm_header)) { error (1, errno, NVM_HDR_CANTREAD, file->name, module); } if (LE16TOH (nvm_header.MajorVersion) != 1) { error (1, errno, NVM_HDR_VERSION, file->name, module); } if (LE16TOH (nvm_header.MinorVersion) != 1) { error (1, errno, NVM_HDR_VERSION, file->name, module); } if (checksum32 (&nvm_header, sizeof (nvm_header), 0)) { error (1, errno, NVM_HDR_CHECKSUM, file->name, module); } if (LE32TOH (nvm_header.PrevHeader) != origin) { error (1, errno, NVM_HDR_LINK, file->name, module); } if (LE32TOH (nvm_header.ImageType) == NVM_IMAGE_PIB) { if (fdchecksum32 (file->file, LE32TOH (nvm_header.ImageLength), nvm_header.ImageChecksum)) { error (1, errno, NVM_IMG_CHECKSUM, file->name, module); } if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } return (0); } if (fdchecksum32 (file->file, LE32TOH (nvm_header.ImageLength), nvm_header.ImageChecksum)) { error (1, errno, NVM_IMG_CHECKSUM, file->name, module); } origin = offset; offset = LE32TOH (nvm_header.NextHeader); module++; } while (~nvm_header.NextHeader); if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } return (-1); }
signed ModuleSpec (struct _file_ * file, struct vs_module_spec * spec) { off_t length; if ((length = lseek (file->file, 0, SEEK_END)) == -1) { error (1, errno, FILE_CANTSIZE, file->name); } #if 1 if (length % sizeof (uint32_t)) { error (1, ENOTSUP, "%s not multiple of " SIZE_T_SPEC " bytes", file->name, sizeof (uint32_t)); } #endif if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } spec->MODULE_LENGTH = length; spec->MODULE_CHKSUM = fdchecksum32 (file->file, length, 0); if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } return (0); }
signed piblock (struct _file_ const * file) { struct simple_pib simple_pib; if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, "1 " FILE_CANTHOME, file->name); } if (read (file->file, &simple_pib, sizeof (simple_pib)) != sizeof (simple_pib)) { error (1, errno, FILE_CANTREAD, file->name); } if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } simple_pib.CHECKSUM = fdchecksum32 (file->file, LE16TOH (simple_pib.PIBLENGTH), simple_pib.CHECKSUM); if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, "2 " FILE_CANTHOME, file->name); } if (write (file->file, &simple_pib, sizeof (simple_pib)) != sizeof (simple_pib)) { error (1, errno, FILE_CANTSAVE, file->name); } if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } return (0); }
signed pibfile1 (struct _file_ const * file) { struct simple_pib simple_pib; if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } if (read (file->file, &simple_pib, sizeof (simple_pib)) != sizeof (simple_pib)) { error (1, errno, FILE_CANTREAD, file->name); } if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } if ((simple_pib.RESERVED1) || (simple_pib.RESERVED2)) { error (1, errno, PIB_BADCONTENT, file->name); } if (fdchecksum32 (file->file, LE16TOH (simple_pib.PIBLENGTH), 0)) { error (1, errno, PIB_BADCHECKSUM, file->name); } if (lseek (file->file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, file->name); } return (0); }
signed ChangeIdent (struct plc * plc) { struct simple_pib simple_pib; memset (&simple_pib, 0, sizeof (simple_pib)); if (lseek (plc->PIB.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->PIB.name); } if (read (plc->PIB.file, &simple_pib, sizeof (simple_pib)) != sizeof (simple_pib)) { error (1, errno, FILE_CANTREAD, plc->PIB.name); } memcpy (simple_pib.MAC, plc->MAC, sizeof (simple_pib.MAC)); memcpy (simple_pib.DAK, plc->DAK, sizeof (simple_pib.DAK)); memcpy (simple_pib.NMK, plc->NMK, sizeof (simple_pib.NMK)); { uint8_t level = simple_pib.PreferredNID [HPAVKEY_NID_LEN-1] >> 4; HPAVKeyNID (simple_pib.PreferredNID, simple_pib.NMK, level & 1); } simple_pib.CHECKSUM = 0; if (lseek (plc->PIB.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->PIB.name); } if (write (plc->PIB.file, &simple_pib, sizeof (simple_pib)) != sizeof (simple_pib)) { error (1, errno, FILE_CANTSAVE, plc->PIB.name); } if (lseek (plc->PIB.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->PIB.name); } simple_pib.CHECKSUM = fdchecksum32 (plc->PIB.file, LE16TOH (simple_pib.PIBLENGTH), 0); if (lseek (plc->PIB.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->PIB.name); } if (write (plc->PIB.file, &simple_pib, sizeof (simple_pib)) != sizeof (simple_pib)) { error (1, errno, FILE_CANTSAVE, plc->PIB.name); } return (0); }