/*
 * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef IMG_PARSER_MOD_H
#define IMG_PARSER_MOD_H

#include <auth_common.h>

/*
 * Return values
 */
enum img_parser_ret_value {
	IMG_PARSER_OK,
	IMG_PARSER_ERR,			/* Parser internal error */
	IMG_PARSER_ERR_FORMAT,		/* Malformed image */
	IMG_PARSER_ERR_NOT_FOUND	/* Authentication data not found */
};

/*
 * Image types. A parser should be instantiated and registered for each type
 */
typedef enum img_type_enum {
	IMG_RAW,			/* Binary image */
	IMG_PLAT,			/* Platform specific format */
	IMG_CERT,			/* X509v3 certificate */
	IMG_MAX_TYPES,
} img_type_t;

/* Image parser library structure */
typedef struct img_parser_lib_desc_s {
	img_type_t img_type;
	const char *name;

	void (*init)(void);
	int (*check_integrity)(void *img, unsigned int img_len);
	int (*get_auth_param)(const auth_param_type_desc_t *type_desc,
			void *img, unsigned int img_len,
			void **param, unsigned int *param_len);
} img_parser_lib_desc_t;

/* Exported functions */
void img_parser_init(void);
int img_parser_check_integrity(img_type_t img_type,
		void *img_ptr, unsigned int img_len);
int img_parser_get_auth_param(img_type_t img_type,
		const auth_param_type_desc_t *type_desc,
		void *img_ptr, unsigned int img_len,
		void **param_ptr, unsigned int *param_len);

/* Macro to register an image parser library */
#define REGISTER_IMG_PARSER_LIB(_type, _name, _init, _check_int, _get_param) \
	static const img_parser_lib_desc_t __img_parser_lib_desc_##_type \
	__section(".img_parser_lib_descs") __used = { \
		.img_type = _type, \
		.name = _name, \
		.init = _init, \
		.check_integrity = _check_int, \
		.get_auth_param = _get_param \
	}

#endif /* IMG_PARSER_MOD_H */
