/*
 * 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 <drivers/auth/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 */
