[coreboot] r3352 - in trunk/payloads/libpayload: include libc

svn at coreboot.org svn at coreboot.org
Tue May 27 21:57:53 CEST 2008


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 at amd.com>
Acked-by: Peter Stuge <peter at 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;





More information about the coreboot mailing list