#ifndef __EM_TOKEN_MANAGER_H
#define __EM_TOKEN_MANAGER_H

static int em_token_get_meta(const uint8_t *src, em_default_meta *meta, uint32_t *offset, const uint32_t len_max);
static int em_token_get_element(const uint8_t *src, em_default_element *element, uint32_t *offset,
				const uint32_t len_max);
static int em_token_verify(const uint8_t *data, const uint32_t len_data, const uint8_t *cert, const uint32_t len_cert,
			   const uint8_t *signature, const uint32_t len_signature, const uint32_t len_device,
			   const em_device_info *infos, const uint8_t *did_esi, uint64_t *flags);
static int em_token_check_expiration(const char *token_id, const char *date_token_org, const char *date_server_org,
				     const char *priority_data);
static int em_token_parse_token_info(em_token_info *tokeninfo, em_token_ptr *token_ptr);
static int em_token_parse_device_info(em_device_info *device_info, uint16_t num_of_devices, em_token_ptr *token_ptr);
static int em_token_parse_issuer_info(em_issuer_info *issuerinfo, em_token_ptr *token_ptr);
static int em_token_parse_mode_info(em_mode_info *modeinfo, em_token_ptr *token_ptr);
static int em_token_parse_validity_info(em_validity_info *valiinfo, em_token_ptr *token_ptr);
static int em_token_parse_integrity_info(em_integrity_info *integinfo, em_token_ptr *token_ptr);
static int em_token_parse_mode_db(em_mode_db *modedb, em_token_ptr *token_ptr);
static int em_token_parse(const uint8_t *token, em_token_ptr *token_ptr, em_parsed_token *pt);
static int em_token_restore_tuc(uint8_t em_version, em_token_ptr *token_ptr, em_parsed_token *parsed_token,
				void *table_org);
static int em_token_make_tuc(tuc_table *table, em_token_ptr *token_ptr, em_parsed_token *parsed_token);
static int em_token_make_tuc_v20(tuc_table_v20 *table, em_token_ptr *token_ptr, em_parsed_token *parsed_token);
int em_token_is_from_fac(const uint8_t *cert, const int len_cert);
int em_token_is_installed(const uint8_t *token, const uint8_t *esi, uint64_t *flags);
int em_token_get_status(em_context *ctx, const uint8_t *token, uint8_t *esi, const uint16_t mode,
			const uint8_t *server_date, uint64_t *flags, const uint8_t is_provision);
int em_token_install(uint8_t em_version, uint32_t cmd, uint64_t *flags, uint8_t *esi, const uint8_t *token,
		     const uint8_t *did, const uint8_t is_provision, const em_keeping_item *keep, const uint8_t *key);
int em_token_get_usage_count(const uint8_t em_version, const uint8_t *esi, const uint32_t mode, uint32_t *out);
int em_token_get_only_mode(const uint8_t *token, const uint8_t *esi, uint64_t *flags, uint8_t *out, uint32_t *len_out);
int em_token_get_mode_information(const uint8_t *token, const uint8_t *esi, uint64_t *flags, uint8_t *out,
				  uint32_t *len_out);
int em_token_get_mode_information_for_bit(const uint8_t *token, const uint8_t *esi, uint64_t *flags,
					  uint64_t *mode_bits);

int em_token_check_time_msg(uint8_t *message, uint32_t len_message, uint64_t *flags, em_keeping_item *keep);
int em_token_get_expiry_date(em_context *ctx, char *out_date);
#endif
