Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
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);
}
Ejemplo n.º 4
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);
}
Ejemplo n.º 5
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);
}