#include "skpm_cmd_handler.h"

#include "skpm.h"
#include "skpm_tls.h"
#include "skpm_test.h"
#include "skpm_service_key.h"
#include "skpm_crypto_util.h"

void cmdHandler(int32_t commandId, p_cmd_t pCmd, p_rsp_t pRsp) {
    LOGD("SKPM Trusted Application is entering with commandId : %d", commandId);

    /* Process command message */
    switch (commandId) {
        case CMD_SKPM_SERVICEKEY_REWRAP:
            rewrapSKPMServiceKey(pCmd, pRsp);
            break;
        case CMD_SKPM_UNWRAP_REWAPPED_SERVICEKEY:
            unwrapRewrappedSKPMServiceKey(pCmd, pRsp);
            break;
        case CMD_SKPM_CHECK_KEY_LIST:
            check_key_list(pCmd, pRsp);
            break;
        case CMD_SKPM_CHECK_CALLER_LIST:
            check_caller_list(pCmd, pRsp);
            break;
        case CMD_SKPM_FACTORY_KEY_INJECTION:
            factoryKeyInjection(pCmd, pRsp);
            break;
        case CMD_SKPM_OTA_KEY_INJECTION:
            otaKeyInjection(pCmd, pRsp);
            break;
        case CMD_SKPM_INJECTED_KEY_VERIFICATION:
            injectedKeyVerification(pCmd, pRsp);
            break;
        case CMD_SKPM_READ_INJECTED_KEY_UID:
            readInjectedKeyUID(pCmd, pRsp);
            break;
        case CMD_SKPM_INJECTED_KEY_SHARING:
            injectedKeySharing(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_SET_SERVER_PUBKEY:
            setTlsSessionServerPubkey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GET_CLIENT_PUBKEY:
            getTlsSessionClientPubkey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_SIGN_WITH_CLIENT_KEY:
            signWithClientKey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_PREMASTER_KEY:
            generateTlsSessionPremasterKey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_MASTER_SECRET_KEY:
            generateTlsSessionMasterSecretKey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_KEY_BLOBS:
            generateTlsSessionKeyBlobs(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_FINISH_HASH:
            generateTlsSessionFinishHash(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_SET_KEY_INFOS:
            setTlsSessionKeyInfos(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_CIHPER_MAC_KEY:
            generateTlsSessionCipherAndMacKeys(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_ENCRYPT_BUF:
            encryptTlsSessionBuf(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_DECRYPT_BUF:
            decryptTlsSessionBuf(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_LEAF_ECC_KEYPAIR:
            generateLeafEccKeyPair(pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GET_LEAF_ECC_PUBKEY:
            getLeafEccPubkey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_SIGN_WITH_LEAF_ECC_KEY:
            signWithLeafEccKey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GENERATE_LEAF_RSA_KEYPAIR:
            generateLeafRsaKeyPair(pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_GET_LEAF_RSA_PUBKEY:
            getLeafRsaPubkey(pCmd, pRsp);
            break;
        case CMD_SKPM_TLS_SESSION_OTA_PROVISON_SIGN_WITH_LEAF_RSA_KEY:
            signWithLeafRsaKey(pCmd, pRsp);
            break;
        case CMD_SKPM_READ_BOARD_NAME:
            readBoardName(pRsp);
            break;
        case CMD_SKPM_GENERATE_CSR:
            generateCsr(pCmd, pRsp);
            break;
#ifdef SUPPORT_GUARDIAN_M
        case CMD_SKPM_GUARDIAN_M_GET_TLS_SESSION_INFO:
            guardianmGetTlsSessionInfo(pRsp);
            break;
        case CMD_SKPM_GUARDIAN_M_GET_CERTS:
            guardianmGetCertificates(pRsp);
            break;
#endif
#ifdef DEBUG_LOW
        case CMD_SKPM_CRYPTO_TEST:
            crypto_test();
            break;
        case CMD_SKPM_UNWRAP_TEST:
            unwrap_test(pCmd);
            break;
#endif
        default :
            LOGE("Matched command is not exist !!!");
            break;
    }

    LOGD("SKPM Trusted Application is exiting with return : %x, status : %x", pRsp->ret, pRsp->status);
}
