/*
 * tz_digitalkey_msg.h
 */

#ifndef TZ_DK_MSG_H
#define TZ_DK_MSG_H

#include <tz_msg.h> /* providing tz_msg_header_t definition */
#include <tz_init_msg.h>

#include "tz_dk_finalize_msg.h"
#include "tz_dk_open_secure_channel_msg.h"
#include "tz_dk_send_apdu_msg.h"
#include "tz_dk_close_secure_channel_msg.h"
#include "tz_dk_scp03lib_msg.h"

#define DK_MAX_MAGICNUM_SIZE 4

typedef struct dk_msg_hdr
{
	tz_msg_header_t header;
	int32_t version;
	uint8_t magicnum[DK_MAX_MAGICNUM_SIZE];
} __attribute__((packed)) dk_msg_hdr_t;

typedef struct tz_digitalkey_message
{
	dk_msg_hdr_t dkheader;

	union digitalkey_message_u {
		// tz_init_payload_t init;
		// tz_dk_finalize_payload_t finalize;
#ifdef DK_DEBUG
		tz_dk_open_secure_channel_payload_t open_secure_channel;
		tz_dk_send_apdu_payload_t send_apdu;		
#endif
		tz_dk_close_secure_channel_payload_t close_secure_channel;
		tz_scp03_open_session_payload_t scp03_open_session;
		tz_scp03_transceive_payload_t scp03_transceive;
		tz_scp03_create_ca_payload_t scp03_create_ca;
		tz_scp03_invoke_read_payload_t scp03_invoke_read;
		tz_scp03_write_invoke_read_payload_t scp03_write_invoke_read;
		tz_scp03_set_private_data_payload_t scp03_set_private_data;
		tz_scp03_get_private_data_payload_t scp03_get_private_data;
		tz_scp03_write_invoke_payload_t scp03_write_invoke;
		tz_scp03_close_session_payload_t scp03_close_session;
		tz_scp03_setup_keys_payload_t scp03_setup_keys;
	} __attribute__((packed)) payload;
} __attribute__((packed)) tz_dk_message_t;

typedef tz_dk_message_t tciMessage_t;

#endif /* TZ_DIGITALKEY_MSG_H_ */
