#include "tl_handler.h"

#include "mz_types.h"

#include "mz_log.h"
#include "mz_command.h"

#include "mz_wb_aes_ctr.h"


struct tci_msg_mz {
    uint32_t cmd;
    uint32_t pid;
	uint8_t encrypt[8];
	uint8_t iv[16];
} __attribute__((packed));

// ************************************
int TZ_COMMAND(void *buffer)
{
    int ret = MZ_RET_SUC;
    struct tci_msg_mz *request_arg = (struct tci_msg_mz *)buffer;

    MZ_LOG(err_level_info, LOG_TAG, "[%s] Received command 0x%x\n", __func__, request_arg->cmd);

    switch (request_arg->cmd)
    {
        case CMD_MZ_WB_ENCRYPT:
        {
    		MZ_LOG(err_level_info, LOG_TAG, "[%s] MZ Received command 0x%x\n", __func__, request_arg->cmd);
			uint8_t enc[8];
			unsigned int pt_len;
			int wb_ret = mz_wb_aes_ctr_encrypt((unsigned char *)(request_arg->encrypt), sizeof(uint64_t), (unsigned char *)enc, &pt_len, request_arg->iv);
			if (wb_ret != MZWB_SUCCESS) {
	    		MZ_LOG(err_level_info, LOG_TAG, "[%s] MZ wb encrypt fail 0x%x\n", __func__, wb_ret);
			}
			else{
	    		MZ_LOG(err_level_info, LOG_TAG, "[%s] MZ wb encrypt %llx %llx\n", __func__, *(uint64_t *)request_arg->encrypt, *(uint64_t *)enc);
				memcpy(request_arg->encrypt, enc, 8);
			}
            break;
        }	

        default:
        {
            ret = MZ_RET_E_GENERAL_ERROR;
            MZ_LOG(err_level_warning, LOG_TAG, "Unsupported command: 0x%x\n",
                    request_arg->cmd);
            break;
        }
    }

    return ret;
}
