[coreboot] libpayload: verify LAR checksum

Jordan Crouse jordan.crouse at amd.com
Tue May 27 21:59:48 CEST 2008


On 27/05/08 21:52 +0200, Peter Stuge wrote:
> On Tue, May 27, 2008 at 01:44:01PM -0600, Jordan Crouse wrote:
> > 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>

r3352.  Thanks.

> 
> > Index: libpayload/include/libpayload.h
> > ===================================================================
> > --- libpayload.orig/include/libpayload.h	2008-05-14 09:23:10.000000000 -0600
> > +++ libpayload/include/libpayload.h	2008-05-14 09:28:39.000000000 -0600
> > @@ -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);
> >  
> > Index: libpayload/libc/lar.c
> > ===================================================================
> > --- libpayload.orig/libc/lar.c	2008-05-14 09:18:30.000000000 -0600
> > +++ libpayload/libc/lar.c	2008-05-14 10:52:39.000000000 -0600
> > @@ -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;
> 
> -- 
> coreboot mailing list
> coreboot at coreboot.org
> http://www.coreboot.org/mailman/listinfo/coreboot
> 

-- 
Jordan Crouse
Systems Software Development Engineer 
Advanced Micro Devices, Inc.





More information about the coreboot mailing list