#ifndef _IPXE_ZLIB_H
#define _IPXE_ZLIB_H

/** @file
 *
 * zlib compressed images
 *
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
FILE_SECBOOT ( PERMITTED );

#include <stdint.h>
#include <byteswap.h>
#include <ipxe/image.h>
#include <ipxe/deflate.h>

/** zlib magic header */
union zlib_magic {
	/** Compression method and flags */
	uint8_t cmf;
	/** Check value */
	uint16_t check;
} __attribute__ (( packed ));

/**
 * Check that zlib magic header is valid
 *
 * @v magic		Magic header
 * @ret is_valid	Magic header is valid
 */
static inline int zlib_magic_is_valid ( const union zlib_magic *magic ) {

	/* Check magic value as per RFC 6713 */
	return ( ( ( magic->cmf & 0x8f ) == 0x08 ) &&
		 ( ( be16_to_cpu ( magic->check ) % 31 ) == 0 ) );
}

extern int zlib_deflate ( enum deflate_format format, const void *data,
			  size_t len, struct image *extracted );

extern struct image_type zlib_image_type __image_type ( PROBE_NORMAL );

#endif /* _IPXE_ZLIB_H */
