#ifndef _PROCESS_SCP03LIB_H_
#define _PROCESS_SCP03LIB_H_

#define SCP03_CREDENTIAL_LEN 48

#include "dk_common.h"
#include "tl_dk_ctx.h"
#include "msgs/tz_dk_scp03lib_msg.h"

DK_Result process_scp03_open_session(
    tl_dk_ctx_t *ctx,
    tz_scp03_transceive_cmd_t sendmsg,
    tz_scp03_open_session_payload_t *respmsg
);

DK_Result process_non_scp03_open_session(
    tl_dk_ctx_t *ctx,
    tz_scp03_open_session_payload_t *respmsg
);

DK_Result process_scp03_write_invoke(
    tl_dk_ctx_t *ctx,
    tz_scp03_write_invoke_payload_t *sendmsg,
    tz_scp03_write_invoke_payload_t *respmsg
);

DK_Result process_scp03_write_invoke_read(
    tl_dk_ctx_t *ctx,
    tz_scp03_write_invoke_read_payload_t *sendmsg,
    tz_scp03_write_invoke_read_payload_t *respmsg
);

DK_Result process_scp03_create_ca(
    tl_dk_ctx_t *ctx,
    tz_scp03_create_ca_payload_t *sendmsg,
    tz_scp03_create_ca_payload_t *respmsg
);

DK_Result process_apdu_transceive(
    tl_dk_ctx_t *ctx,
    tz_scp03_transceive_payload_t *sendmsg,
    tz_scp03_transceive_payload_t *respmsg
);

DK_Result process_scp03_set_private_data(
    tl_dk_ctx_t *ctx,
    tz_scp03_set_private_data_payload_t *sendmsg,
    tz_scp03_set_private_data_payload_t *respmsg
);

DK_Result process_scp03_get_private_data(
    tl_dk_ctx_t *ctx,
    tz_scp03_get_private_data_payload_t *sendmsg,
    tz_scp03_get_private_data_payload_t *respmsg
);


DK_Result process_scp03_close_session(
    tl_dk_ctx_t *ctx
);


DK_Result process_non_scp03_close_session(
    tl_dk_ctx_t *ctx,
    tz_scp03_close_session_payload_t *respmsg
);

DK_Result process_scp03_re_wrap(
    tl_dk_ctx_t *ctx,
    tz_scp03_setup_keys_payload_t *sendmsg,
    tz_scp03_setup_keys_payload_t *respmsg
);

DK_Result scp03_credential_un_wrap(
    tl_dk_ctx_t *ctx,
    tz_scp03_credential_t *sendmsg,
    uint8_t* unwrapped_key_blob
);

DK_Result process_scp03_invoke_read(tl_dk_ctx_t *ctx, tz_scp03_invoke_read_payload_t *sendmsg, tz_scp03_invoke_read_payload_t *respmsg);

static DK_Result read_buffer_range(uint8_t id, uint8_t *data, int32_t from, int32_t size, uint16_t *sw);

static DK_Result read_buffer(uint8_t id, uint8_t *data, int32_t start, int32_t size, uint16_t *sw);

static DK_Result send_apdu(uint8_t id, p_secEse_7816_cpdu_t pcpdu, p_secEse_7816_rpdu_t prpdu);

static int32_t invoke_command(uint8_t id, uint32_t command_length, uint8_t *command, uint16_t *sw);

static DK_Result set_private_data_range(uint8_t id, uint8_t *keyid, uint8_t *data, int32_t from, int32_t size, uint16_t *sw);

static DK_Result set_private_data(uint8_t id, uint8_t *keyid, uint8_t *data, int32_t from, int32_t size, uint16_t *sw);

static DK_Result get_private_data_range(uint8_t id, uint8_t *keyid, uint8_t *data, int32_t from, int32_t size, uint16_t *sw);

static DK_Result get_private_data(uint8_t id, uint8_t *keyid, uint8_t *data, int32_t from, int32_t size, uint16_t *sw);

static DK_Result set_size_tlv(uint8_t *data, int32_t idx, uint8_t size);

#endif
