#include <string.h>
#include "DrkCmdHandler.h"


namespace vendor   {
namespace samsung  {
namespace hardware {
namespace security {
namespace drk      {

int32_t DrkCmdHandler::CmdHandler(int32_t cmd, uint32_t cpid, Bytes& req, Bytes& resp)
{
    int32_t  ret = NOT_ERROR;
    PRINT_FUNC_START(cmd);
    if ((ret = mlockGuard.Enter(cmd, cpid)) != NOT_ERROR) {
        LOGMD("To try to get lock in CmdHandler but returned with : %d", ret);
        PRINT_FUNC_END(cmd, ret);
        return ret;
    }

    switch (cmd) {
        /* prov command */
        case CMD_UNWRAP_GAK_BLOB:
            ret = UnwrapKeyBlob(cmd, req, resp);
            break;
        case CMD_MAKE_DRK_CSR:
        case CMD_ENCRYPT_SAK_CSR:
            ret = GenerateEncryptedCSR(cmd, req, resp);
            break;
        case CMD_MAKE_TBS_CSR:
            ret = GenerateSignedCSR(req, resp);
            break;
        case CMD_IS_SUPPORTED_DRK_V2:
            ret = IsSupportDRKv2();
            break;
#ifndef USE_RELEASE
        /* selftest command */
        case CMD_VERIFY_SERVICE_KEY:
            ret = VerifyDRKforSelfTest(req, resp);
            break;
#endif
        /* skm command */
        case CMD_INSTALL_DRK_CERT:
            ret = InstallBoundKey(req);
            break;
        case CMD_GENERATE_SERVICE_KEY:
            ret = CreateServiceKey(req, resp);
            break;
        case CMD_RELEASE_GEN_SERV_KEY:
            ReleaseServiceKey();
            ret = NOT_ERROR;
            break;
        case CMD_VERIFY_DRK_KEY:
            ret = VerifyDRK();
            break;
        case CMD_GET_DRK_UID:
            ret = ReadUID(resp);
            break;
        case CMD_GET_DRK_CERT:
            ret = ReadDRKCert(resp);
            break;
        case CMD_GET_DEV_INFO :
            ret = GetDeviceInfo(resp);
            break;
        default :
            LOGME("Not supported command : %X", cmd);
            ret = ERR_COMMON_NOT_SUPPORT_CMD;
            break;
    }

    mlockGuard.Leave(cmd, ret);
    PRINT_FUNC_END(cmd, ret);
    return ret;
}

}  // namespace drk
}  // namespace security
}  // namespace hardware
}  // namespace samsung
}  // namespace vendor
