/*
 * =====================================================================================
 *
 *  Filename:  process_cmd.c
 *
 *  Description:  KG process command
 *
 *  Version:  1.0
 *  Created:  02/26/2020 14:40:00 PM
 *  Revision:  none
 *  Compiler:  gcc
 *
 *  Company:  Samsung Electronics
 *  Copyright (c) 2020 by Samsung Electronics, All rights reserved.
 *
 * =====================================================================================
 */
#include "process_cmd.h"
#include "kg_policy_cmd.h"
#include "kg_dh_cmd.h"
#include "kg_hotp_cmd.h"
#include "kg_lock_cmd.h"
#include "kg_state_cmd.h"
#include "kg_hdm_cmd.h"

#ifdef KG_ENG_MODE
#include "kg_test.h"
#endif


uint32_t process_blcmd(uint32_t commandId, tci_message_t *tci_req, tci_message_t *tci_resp) {
    KG_LOG("process_blcmd()");

    uint32_t ret = KG_SUCCESS;

    if (tci_req->header.id == KG_CMD_GET_STATUS) {
        KG_LOG("from BL\n");
        ret = KGBL_get_ta_status(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
    } else {
        ret = KG_CMD_FAIL;
    }
    return ret;
}

/**
 * @brief
 * process_cmd
 * Process command
 *
 * @param[in] commandId - command id
 * @param[in] tci_msg   - tci message
 *
 * @return KG status code
 */
uint32_t process_cmd(uint32_t commandId, tci_message_t *tci_req, tci_message_t *tci_resp) {
    
    KG_LOG("process_cmd()");

    uint32_t ret = KG_SUCCESS;

    switch (commandId) {
        case KG_CMD_GET_STATUS:
            ret = KG_get_ta_status(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_VERIFY_REGISTRATION_INFO:
            ret = KG_verify_registration_info(&tci_req->payload.msg_verify_reg_info, &tci_resp->payload.msg_verify_reg_info);
            break;
        case KG_CMD_GENERATE_HOTP_CHALLENGE:
            ret = KG_generate_hotp_challenge(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GENERATE_DH_REQUEST:
            ret = KG_generate_dh_request(&tci_req->payload.msg_dh_req, &tci_resp->payload.msg_dh_req);
            break;
        case KG_CMD_VERIFY_DH_RESPONSE:
            ret = KG_verify_dh_response(&tci_req->payload.msg_dh_verify, &tci_resp->payload.msg_dh_verify);
            break;
        case KG_CMD_VERIFY_HOTP_SECRET:
            ret = KG_verify_hotp_secret(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_VERIFY_POLICY:
            ret = KG_verify_policy(&tci_req->payload.msg_verify_policy, &tci_resp->payload.msg_verify_policy);
            break;
        case KG_CMD_GET_POLICY:
            ret = KG_get_policy(&tci_req->payload.msg_get_policy, &tci_resp->payload.msg_get_policy);
            break;
        case KG_CMD_LOCK:
            ret = KG_lock(&tci_req->payload.msg_lock, &tci_resp->payload.msg_lock);
            break;
        case KG_CMD_UNLOCK:
            ret = KG_unlock(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GET_LOCK_OBJECT:
            ret = KG_get_lock_object(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GET_LOCK_ACTION:
            ret = KG_get_lock_action(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_SET_CLIENT_DATA:
            ret = KG_set_client_data(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GET_CLIENT_DATA:
            ret = KG_get_client_data(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_VERIFY_COMPLETETOKEN:
            ret = KG_verify_complete_token(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GET_KGID:
            ret = KG_get_kgid(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_CHECKING:
            ret = KG_checking(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_RPMB_RESET:
            ret = KG_reset_rpmb(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GET_HDM_POLICY:
            ret = KG_get_hdm_policy(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_PROCESS_KG_ROT:
            ret = KG_rot_process(&tci_req->payload.msg_common, &tci_resp->payload.msg_common);
            break;
        case KG_CMD_GET_NONCE:
            ret = KG_get_nonce(&tci_req->payload.msg_nonce, &tci_resp->payload.msg_nonce);
            break;
#ifdef __DEBUG_KG__
        case KG_CMD_TEST:
            KG_LOG("Calling KG Module test\n");
            //kg_hmac_sha256_test();
            //kg_hotp_test();
            //kg_rpmb_test();
            //kg_x509_test();
            //kg_sign_verify_test();
            ret = KG_SUCCESS;
            break;
        case KG_CMD_TEST_DH_GEN:
          //  ret = kg_dh_gen_test(tci_req, tci_resp);
            break;
        case KG_CMD_TEST_DH_VERIFY:
            break;
#endif
#ifdef KG_ENG_MODE
        case KG_CHANGE_RPMB_MAGIC:
            KG_LOG("Changing magic number on rpmb\n");
            kg_change_rpmb(CHANGE_RPMB_MAGIC);
            ret = KG_SUCCESS;
            break;
        case KG_CHANGE_RPMB_HASH:
            KG_LOG("Changing hash on rpmb\n");
            kg_change_rpmb(CHANGE_RPMB_HASH);
            ret = KG_SUCCESS;
            break;
        case KG_INIT_RPMB:
            KG_LOG("Init KG rpmb\n");
            kg_init_for_test();
            ret = KG_SUCCESS;
            break;
#endif
        default:
            ret = KG_CMD_FAIL;
    }
exit:
    return ret;
}
