libpayload: Add a function to verify the checksum on a LAR file
This function verifies the checksum on a LAR file. Signed-off-by: Jordan Crouse <jordan.crouse@amd.com> Acked-by: Peter Stuge <peter@stuge.se> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3352 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
02a4e7f6f8
commit
9e734c29cf
|
@ -251,6 +251,7 @@ struct larent *readlar(struct LAR *lar);
|
||||||
void rewindlar(struct LAR *lar);
|
void rewindlar(struct LAR *lar);
|
||||||
int larstat(struct LAR *lar, const char *path, struct larstat *buf);
|
int larstat(struct LAR *lar, const char *path, struct larstat *buf);
|
||||||
void *larfptr(struct LAR *lar, const char *filename);
|
void *larfptr(struct LAR *lar, const char *filename);
|
||||||
|
int lfverify(struct LAR *lar, const char *filename);
|
||||||
struct LFILE * lfopen(struct LAR *lar, const char *filename);
|
struct LFILE * lfopen(struct LAR *lar, const char *filename);
|
||||||
int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
|
int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
|
||||||
|
|
||||||
|
|
|
@ -228,6 +228,41 @@ void * larfptr(struct LAR *lar, const char *filename)
|
||||||
return (void *) ((u8 *) header + ntohl(header->offset));
|
return (void *) ((u8 *) header + ntohl(header->offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify the checksum on a particular LAR entry
|
||||||
|
*
|
||||||
|
* @param lar A pointer to the LAR stream
|
||||||
|
* @param filename The lar entry to verify
|
||||||
|
* @return Return 1 if the entry is valid, 0 if it is not, or -1
|
||||||
|
* on error
|
||||||
|
*/
|
||||||
|
|
||||||
|
int lfverify(struct LAR *lar, const char *filename)
|
||||||
|
{
|
||||||
|
struct lar_header *header = get_header_by_name(lar, filename);
|
||||||
|
|
||||||
|
u8 *ptr = (u8 *) header;
|
||||||
|
int len = ntohl(header->len) + ntohl(header->offset);
|
||||||
|
int offset;
|
||||||
|
u32 csum = 0;
|
||||||
|
|
||||||
|
if (header == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* The checksum needs to be calulated on entire data section,
|
||||||
|
* including any padding for the 16 byte alignment (which should
|
||||||
|
* be zeros
|
||||||
|
*/
|
||||||
|
|
||||||
|
len = (len + 15) & 0xFFFFFFF0;
|
||||||
|
|
||||||
|
for(offset = 0; offset < len; offset += 4) {
|
||||||
|
csum += *((u32 *) (ptr + offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (csum == 0xFFFFFFFF) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct LFILE * lfopen(struct LAR *lar, const char *filename)
|
struct LFILE * lfopen(struct LAR *lar, const char *filename)
|
||||||
{
|
{
|
||||||
struct LFILE *file;
|
struct LFILE *file;
|
||||||
|
|
Loading…
Reference in New Issue