Author: jcrouse Date: 2008-05-27 21:57:53 +0200 (Tue, 27 May 2008) New Revision: 3352
Modified: trunk/payloads/libpayload/include/libpayload.h trunk/payloads/libpayload/libc/lar.c Log: 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
Modified: trunk/payloads/libpayload/include/libpayload.h =================================================================== --- trunk/payloads/libpayload/include/libpayload.h 2008-05-27 18:29:26 UTC (rev 3351) +++ trunk/payloads/libpayload/include/libpayload.h 2008-05-27 19:57:53 UTC (rev 3352) @@ -251,6 +251,7 @@ void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); 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); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
Modified: trunk/payloads/libpayload/libc/lar.c =================================================================== --- trunk/payloads/libpayload/libc/lar.c 2008-05-27 18:29:26 UTC (rev 3351) +++ trunk/payloads/libpayload/libc/lar.c 2008-05-27 19:57:53 UTC (rev 3352) @@ -228,6 +228,41 @@ 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 *file;