/**
 * \file tl_handler.s
 * \brief WSM SWd commands handler.
 * \author Vladyslav Figol (v.figol@samsung.com)
 * \author Sergey Sidorov (s.sidorov@samsung.com)
 * \version 0.1
 * \date Created Apr 03, 2015
 * \par In Samsung Ukraine R&D Center (SURC) under a contract between
 * \par LLC "Samsung Electronics Ukraine Company" (Kyiv, Ukraine) and
 * \par "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
 * \par Copyright: (c) Samsung Electronics Co, Ltd 2015. All rights reserved.
 */

#include "tl_handler.h"

#include "wsm_types.h"
#include "wsm_swd.h"

#include "wsm_log.h"
#include "wsm_command.h"
#include "wsm_command_v3.h"

#include "perform.h"
#include "esap_v1/ta_cmd.h"
#include "protocol_v2/ta_cmd.h"
#include "cm_ta_cmd.h"

#include "km_ta_cmd.h"

#if defined(ECLIPSE_DEBUG)
    #include "memmgrs.h"
// Reserve HEAP
static uint8_t  heap[1024 * 16];
static uint8_t  is_heap_inited = 0;
#endif /* if defined(ECLIPSE_DEBUG) */

// Setup test ID
void setup_test_id(void *req_buffer)
{
    request_WSM_Server_init_args_t *default_wrapper = (request_WSM_Server_init_args_t *)req_buffer;

    switch (default_wrapper->wsm_command)
    {
        case ESAP_v1_CLIENT_INIT:
        case ESAP_v1_SERVER_INIT:
        case PROT_v2_CLIENT_INIT:
        case PROT_v2_SERVER_INIT:
        {
            req_init_t *wrapper = (req_init_t *)req_buffer;
            set_test_suite_identity(wrapper->test_id, wrapper->case_no);
            break;
        }

        case CMD_TOKEN_CLIENT_INIT:
        case CMD_TOKEN_SERVER_INIT:
        {
            req_token_init_t *wrapper = (req_token_init_t *)req_buffer;
            set_test_suite_identity(wrapper->test_id, wrapper->case_no);
            break;
        }

        case CMD_WSM_CLIENT_INIT:
        case CMD_WSM_SERVER_INIT:
        case CMD_WSM_CLIENT_INIT_EX:
        case CMD_WSM_SERVER_INIT_EX:
        {
            set_test_suite_identity(default_wrapper->test_id, default_wrapper->case_no);
            break;
        }

        default:
        {
            break;
        }
    }
}

// ************************************
int TZ_COMMAND(void *buffer)
{
    int ret = WSM_RET_SUC;
    int cmd = ((request_WSM_Server_init_args_t *)buffer)->wsm_command;

    WSM_LOG(err_level_info, LOG_TAG, "[%s] Received command 0x%x\n", __func__, cmd);

    // Setup test_id and case_number
    // TODO: In case performance issue pass here special debug option to enable/disable setup_test_id api call
    //       it only required for debug puporses: print test_id in TA
    setup_test_id(buffer);

    PERFORM_START(__func__);

    switch (cmd)
    {
        case CMD_WSM_GET_RAND:
        {
            request_WSM_get_rand_t *request_arg = (request_WSM_get_rand_t *)buffer;
            request_arg->args.ret = WSM_SWD_get_rand(request_arg->args.rand);
            break;
        }

        case CMD_WSM_SERVER_SET_SPSK_AND_SRND:
        {
            request_WSM_set_psk_and_rnd_t *request_arg = (request_WSM_set_psk_and_rnd_t *)buffer;
            request_arg->args.ret = WSM_SWD_Server_set_spsk_and_srnd(request_arg->args.id,
                                                                     request_arg->args.rnd,
                                                                     request_arg->args.psk);
            break;
        }

        case CMD_WSM_SERVER_SET_CPSK_AND_CRND:
        {
            request_WSM_set_psk_and_rnd_t *request_arg = (request_WSM_set_psk_and_rnd_t *)buffer;
            request_arg->args.ret = WSM_SWD_Server_set_cpsk_and_crnd(request_arg->args.id,
                                                                     request_arg->args.rnd,
                                                                     request_arg->args.psk);
            break;
        }

        case CMD_WSM_CLIENT_SET_SPSK_AND_SRND:
        {
            request_WSM_set_psk_and_rnd_t *request_arg = (request_WSM_set_psk_and_rnd_t *)buffer;
            request_arg->args.ret = WSM_SWD_Client_set_spsk_and_srnd(request_arg->args.id,
                                                                     request_arg->args.rnd,
                                                                     request_arg->args.psk);
            break;
        }

        case CMD_WSM_CLIENT_SET_CPSK_AND_CRND:
        {
            request_WSM_set_psk_and_rnd_t *request_arg = (request_WSM_set_psk_and_rnd_t *)buffer;
            request_arg->args.ret = WSM_SWD_Client_set_cpsk_and_crnd(request_arg->args.id,
                                                                     request_arg->args.rnd,
                                                                     request_arg->args.psk);
            break;
        }

        case CMD_WSM_SERVER_INIT:
        {
            request_WSM_Server_init_args_t  *request_arg = (request_WSM_Server_init_args_t *)buffer;
            uint8_t     cmp_temp[sizeof(request_arg->args.pESAPKey)] = { 0 };
            uint8_t     *temp_esap_key = 0;

            if (0 == memcmp(request_arg->args.pESAPKey, cmp_temp, sizeof(cmp_temp)))
                temp_esap_key = NULL;
            else
                temp_esap_key = request_arg->args.pESAPKey;
            request_arg->args.wsm_id = WSM_SWD_Server_init(request_arg->args.pServerID,
                                                           request_arg->args.pClientID,
                                                           temp_esap_key);
            break;
        }

        case CMD_WSM_CLIENT_INIT:
        {
            request_WSM_Client_init_args_t  *request_arg = (request_WSM_Client_init_args_t *)buffer;
            uint8_t     cmp_temp[sizeof(request_arg->args.pESAPKey)] = { 0 };
            uint8_t     *temp_esap_key = 0;

            if (0 == memcmp(request_arg->args.pESAPKey, cmp_temp, sizeof(cmp_temp)))
                temp_esap_key = NULL;
            else
                temp_esap_key = request_arg->args.pESAPKey;
            request_arg->args.wsm_id = WSM_SWD_Client_init(request_arg->args.pServerID,
                                                           request_arg->args.pClientID,
                                                           temp_esap_key);
            break;
        }

        case CMD_WSM_DESTROY:
        {
            request_WSM_destroy_arg_t   *request_arg = (request_WSM_destroy_arg_t *)buffer;

            request_arg->args.ret =  WSM_SWD_destroy(request_arg->args.wsm_id);
            break;
        }

        case CMD_WSM_SERVER_GENERATECLIENTCHALLENGE:
        {
            request_WSM_Server_generateClientChallenge_t    *request_arg =
                (request_WSM_Server_generateClientChallenge_t *)buffer;

            request_arg->args.ret = WSM_SWD_Server_generateClientChallenge(request_arg->args.id,
                                                                           (uint8_t *)&request_arg->args.pClientChallenge);
            break;
        }

        case CMD_WSM_CLIENT_CHECKANDGENERATESERVERCHALLENGE:
        {
            request_WSM_Client_checkAndGenerateServerChallenge_t    *request_arg =
                (request_WSM_Client_checkAndGenerateServerChallenge_t *)buffer;

            request_arg->args.ret = WSM_SWD_Client_checkAndGenerateServerChallenge(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pClientChallenge,
                (uint8_t *)&request_arg->args.pServerChallenge);
            break;
        }

        case CMD_WSM_SERVER_CHECKANDGENERATECLIENTRESPONSE:
        {
            request_WSM_Server_checkAndGenerateClientResponse_t     *request_arg =
                (request_WSM_Server_checkAndGenerateClientResponse_t *)buffer;

            request_arg->args.ret = WSM_SWD_Server_checkAndGenerateClientResponse(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pServerChallenge,
                (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_CLIENT_CHECKCLIENTRESPONSE:
        {
            request_WSM_Client_checkClientResponse_t    *request_arg =
                (request_WSM_Client_checkClientResponse_t *)buffer;

            request_arg->args.ret = WSM_SWD_Client_checkClientResponse(request_arg->args.id,
                                                                       (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_GENERATECONFIRMMESSAGE:
        {
            request_WSM_generateConfirmMessage_t    *request_arg =
                (request_WSM_generateConfirmMessage_t *)buffer;

            request_arg->args.ret = WSM_SWD_generateConfirmMessage(request_arg->args.id,
                                                                   request_arg->args.pConfirmMessage);
            break;
        }

        case CMD_WSM_GETESAPKEY:
        {
            request_WSM_getESAPKey_t    *request_arg = (request_WSM_getESAPKey_t *)buffer;
            unsigned char *dst = WSM_SWD_getESAPKey(request_arg->args.id);

            if (dst != NULL)
            {
                memcpy(request_arg->args.pESAPKey,
                       (void *)dst,
                       sizeof(request_arg->args.pESAPKey));
            }
            else
            {
                WSM_LOG_E(LOG_TAG, WSM_RET_E_NULL_POINTER,
                          "[%s] null pointer dereference in CMD_WSM_GETESAPKEY \n", __func__);
                ret = WSM_RET_E_NULL_POINTER;
            }

            break;
        }

        case CMD_WSM_REAUTH_SERVER_GENERATECLIENTCHALLENGE:
        {
            request_WSM_Reauth_Server_generateClientChallenge_args_t    *request_arg =
                (request_WSM_Reauth_Server_generateClientChallenge_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_Reauth_Server_generateClientChallenge(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pClientChallenge,
                request_arg->args.isKeyUpdate);
            break;
        }

        case CMD_WSM_REAUTH_CLIENT_CHECKANDGENERATESERVERCHALLENGE:
        {
            request_WSM_Reauth_Client_checkAndGenerateServerChallenge_args_t    *request_arg =
                (request_WSM_Reauth_Client_checkAndGenerateServerChallenge_args_t *)buffer;


            request_arg->args.ret = WSM_SWD_Reauth_Client_checkAndGenerateServerChallenge(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pClientChallenge,
                (uint8_t *)&request_arg->args.pServerChallenge,
                &request_arg->args.isKeyUpdate);
            break;
        }

        case CMD_WSM_REAUTH_SERVER_CHECKANDGENERATECLIENTRESPONSE:
        {
            request_WSM_Reauth_Server_checkAndGenerateClientResponse_args_t *request_arg =
                (request_WSM_Reauth_Server_checkAndGenerateClientResponse_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_Reauth_Server_checkAndGenerateClientResponse(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pServerChallenge,
                (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_REAUTH_CLIENT_CHECKCLIENTRESPONSE:
        {
            request_WSM_Reauth_Client_checkClientResponse_args_t *request_arg =
                (request_WSM_Reauth_Client_checkClientResponse_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_Reauth_Client_checkClientResponse(request_arg->args.id,
                                                                              (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_CREATEAPPKEY:
        {
            request_WSM_createAppKey_args_t *request_arg =
                (request_WSM_createAppKey_args_t *)buffer;

            request_arg->args.ret =  WSM_SWD_createAppKey(request_arg->args.id,
                                                          request_arg->args.nProviderID,
                                                          (unsigned long *)request_arg->args.pConsumerIDs,
                                                          request_arg->args.nNumConsumer);
            break;
        }

        case CMD_WSM_DESTROYAPPKEY:
        {
            request_WSM_destroyAppKey_args_t    *request_arg =
                (request_WSM_destroyAppKey_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_destroyAppKey(request_arg->args.id);
            break;
        }

        case CMD_WSM_ENCRYPT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt(request_arg->args.id,
                                                    request_arg->args.in_text,
                                                    &in_len,
                                                    request_arg->args.out_text,
                                                    &out_len,
                                                    request_arg->args.iv,
                                                    false);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_DECRYPT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt(request_arg->args.id,
                                                    request_arg->args.in_text,
                                                    &in_len,
                                                    request_arg->args.out_text,
                                                    &out_len,
                                                    request_arg->args.iv,
                                                    false);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_ENCRYPT_EX3:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt3(request_arg->args.id,
                                                     request_arg->args.in_text,
                                                     &in_len,
                                                     request_arg->args.out_text,
                                                     &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_DECRYPT_EX3:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt3(request_arg->args.id,
                                                     request_arg->args.in_text,
                                                     &in_len,
                                                     request_arg->args.out_text,
                                                     &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_ENCRYPT_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt(request_arg->args.id,
                                                    request_arg->args.in_text,
                                                    &in_len,
                                                    request_arg->args.out_text,
                                                    &out_len,
                                                    request_arg->args.iv,
                                                    true);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_DECRYPT_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt(request_arg->args.id,
                                                    request_arg->args.in_text,
                                                    &in_len,
                                                    request_arg->args.out_text,
                                                    &out_len,
                                                    request_arg->args.iv,
                                                    true);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }


        ////////////////////////////////////////////////////////////////////
        ///
        /// WSM version 2 (Extended)
        ///
        ////////////////////////////////////////////////////////////////////

        case CMD_WSM_SERVER_INIT_EX:
        {
            request_WSM_Server_init_args_t  *request_arg = (request_WSM_Server_init_args_t *)buffer;
            uint8_t     cmp_temp[sizeof(request_arg->args.pESAPKey)] = { 0 };
            uint8_t     *temp_esap_key = 0;

            if (0 == memcmp(request_arg->args.pESAPKey, cmp_temp, sizeof(cmp_temp)))
            {
                temp_esap_key = NULL;
            }
            else
            {
                temp_esap_key = request_arg->args.pESAPKey;
            }

            request_arg->args.wsm_id = WSM_SWD_Server_init_Ex(request_arg->args.pServerID,
                                                              request_arg->args.pClientID,
                                                              temp_esap_key);
            break;
        }

        case CMD_WSM_CLIENT_INIT_EX:
        {
            request_WSM_Client_init_args_t  *request_arg = (request_WSM_Client_init_args_t *)buffer;
            uint8_t     cmp_temp[sizeof(request_arg->args.pESAPKey)] = { 0 };
            uint8_t     *temp_esap_key = 0;

            if (0 == memcmp(request_arg->args.pESAPKey, cmp_temp, sizeof(cmp_temp)))
            {
                temp_esap_key = NULL;
            }
            else
            {
                temp_esap_key = request_arg->args.pESAPKey;
            }

            request_arg->args.wsm_id = WSM_SWD_Client_init_Ex(request_arg->args.pServerID,
                                                              request_arg->args.pClientID,
                                                              temp_esap_key);

            break;
        }

        case CMD_WSM_DESTROY_EX:
        {
            request_WSM_destroy_arg_t   *request_arg = (request_WSM_destroy_arg_t *)buffer;

            request_arg->args.ret =  WSM_SWD_destroy_Ex(request_arg->args.wsm_id);
            break;
        }

        case CMD_WSM_CLIENT_GENERATE_COMMITMENT_EX:
        {
            request_WSM_Client_generateCommitment_ex_t    *request_arg =
                (request_WSM_Client_generateCommitment_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Client_generateCommitment_Ex(request_arg->args.id,
                                                                         (uint8_t *)&request_arg->args.hash);
            break;
        }

        case CMD_WSM_SERVER_GENERATECLIENTCHALLENGE_EX:
        {
            request_WSM_Server_generateClientChallenge_ex_t    *request_arg =
                (request_WSM_Server_generateClientChallenge_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Server_generateClientChallenge_Ex(request_arg->args.id,
                                                                              (uint8_t *)&request_arg->args.pClientChallenge);
            break;
        }

        case CMD_WSM_CLIENT_CHECKANDGENERATESERVERCHALLENGE_EX:
        {
            request_WSM_Client_checkAndGenerateServerChallenge_ex_t    *request_arg =
                (request_WSM_Client_checkAndGenerateServerChallenge_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Client_checkAndGenerateServerChallenge_Ex(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pClientChallenge,
                (uint8_t *)&request_arg->args.pServerChallenge);
            break;
        }

        case CMD_WSM_SERVER_CHECKANDGENERATECLIENTRESPONSE_EX:
        {
            request_WSM_Server_checkAndGenerateClientResponse_ex_t     *request_arg =
                (request_WSM_Server_checkAndGenerateClientResponse_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Server_checkAndGenerateClientResponse_Ex(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pServerChallenge,
                (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_CLIENT_CHECKCLIENTRESPONSE_EX:
        {
            request_WSM_Client_checkClientResponse_ex_t    *request_arg =
                (request_WSM_Client_checkClientResponse_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Client_checkClientResponse_Ex(request_arg->args.id,
                                                                          (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_GET_CONFIRM_KEY_EX:
        {
            request_WSM_getWSMConfirmKey_t *request_arg =
                (request_WSM_getWSMConfirmKey_t *)buffer;

            unsigned char *confirm_key = WSM_SWD_getWSMConfirmKey_Ex(request_arg->args.id);
            if (NULL == confirm_key)
            {
                request_arg->args.ret = WSM_RET_E_GET_CONFIRM_KEY_V2;
            }
            else
            {
                request_arg->args.ret = WSM_RET_SUC;
                memcpy(request_arg->args.pConfirmKey, confirm_key, WSM_CONFIRM_KEY_SIZE);
            }

            break;
        }

        case CMD_WSM_GENERATECONFIRMMESSAGE_EX:
        {
            request_WSM_generateConfirmMessage_t    *request_arg =
                (request_WSM_generateConfirmMessage_t *)buffer;

            request_arg->args.ret = WSM_SWD_generateConfirmMessage_Ex(request_arg->args.id,
                                                                      request_arg->args.pConfirmMessage);
            break;
        }

        case CMD_WSM_GETESAPKEY_EX:
        {
            request_WSM_getESAPKey_t    *request_arg = (request_WSM_getESAPKey_t *)buffer;

            unsigned char *dst = WSM_SWD_getESAPKey_Ex(request_arg->args.id);

            if (dst != NULL)
            {
                memcpy(request_arg->args.pESAPKey,
                       (void *)dst,
                       sizeof(request_arg->args.pESAPKey));
            }
            else
            {
                WSM_LOG_E(LOG_TAG, WSM_RET_E_NULL_POINTER,
                          "[%s] null pointer dereference in CMD_WSM_GETESAPKEY_EX \n", __func__);
                ret = WSM_RET_E_NULL_POINTER;
            }

            break;
        }

        case CMD_WSM_REAUTH_SERVER_GENERATECLIENTCHALLENGE_EX:
        {
            request_WSM_Reauth_Server_generateClientChallenge_args_ex_t    *request_arg =
                (request_WSM_Reauth_Server_generateClientChallenge_args_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Reauth_Server_generateClientChallenge_Ex(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pClientChallenge,
                request_arg->args.isKeyUpdate);
            break;
        }

        case CMD_WSM_REAUTH_CLIENT_CHECKANDGENERATESERVERCHALLENGE_EX:
        {
            request_WSM_Reauth_Client_checkAndGenerateServerChallenge_args_ex_t    *request_arg =
                (request_WSM_Reauth_Client_checkAndGenerateServerChallenge_args_ex_t *)buffer;


            request_arg->args.ret = WSM_SWD_Reauth_Client_checkAndGenerateServerChallenge_Ex(
                request_arg->args.id,
                (
                    uint8_t *)&request_arg->args.pClientChallenge,
                (
                    uint8_t *)&request_arg->args.pServerChallenge,
                &request_arg->args.isKeyUpdate);
            break;
        }

        case CMD_WSM_REAUTH_SERVER_CHECKANDGENERATECLIENTRESPONSE_EX:
        {
            request_WSM_Reauth_Server_checkAndGenerateClientResponse_args_ex_t *request_arg =
                (request_WSM_Reauth_Server_checkAndGenerateClientResponse_args_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Reauth_Server_checkAndGenerateClientResponse_Ex(
                request_arg->args.id,
                (uint8_t
                 *)&request_arg->args.pServerChallenge,
                (uint8_t
                 *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_REAUTH_CLIENT_CHECKCLIENTRESPONSE_EX:
        {
            request_WSM_Reauth_Client_checkClientResponse_args_ex_t *request_arg =
                (request_WSM_Reauth_Client_checkClientResponse_args_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_Reauth_Client_checkClientResponse_Ex(
                request_arg->args.id,
                (uint8_t *)&request_arg->args.pClientResponse);
            break;
        }

        case CMD_WSM_CREATEAPPKEY_EX:
        {
            request_WSM_createAppKey_args_t *request_arg =
                (request_WSM_createAppKey_args_t *)buffer;

            request_arg->args.ret =  WSM_SWD_createAppKey_Ex(request_arg->args.id,
                                                             request_arg->args.nProviderID,
                                                             (unsigned long *)request_arg->args.pConsumerIDs,
                                                             request_arg->args.nNumConsumer);
            break;
        }

        case CMD_WSM_DESTROYAPPKEY_EX:
        {
            request_WSM_destroyAppKey_args_t    *request_arg =
                (request_WSM_destroyAppKey_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_destroyAppKey_Ex(request_arg->args.id);
            break;
        }

        case CMD_WSM_ENCRYPT_EX:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt_Ex(request_arg->args.id,
                                                       request_arg->args.in_text,
                                                       &in_len,
                                                       request_arg->args.out_text,
                                                       &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_DECRYPT_EX:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt_Ex(request_arg->args.id,
                                                       request_arg->args.in_text,
                                                       &in_len,
                                                       request_arg->args.out_text,
                                                       &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_ENCRYPT_EX_INIT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_encrypt_init_Ex(request_arg->args.id,
                                                            request_arg->args.out_text);
            break;
        }

        case CMD_WSM_DECRYPT_EX_INIT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_decrypt_init_Ex(request_arg->args.id,
                                                            request_arg->args.in_text);
            break;
        }

        case CMD_WSM_ENCRYPT_EX_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt_update_Ex(request_arg->args.id,
                                                              request_arg->args.in_text,
                                                              &in_len,
                                                              request_arg->args.out_text,
                                                              &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_DECRYPT_EX_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt_update_Ex(request_arg->args.id,
                                                              request_arg->args.in_text,
                                                              &in_len,
                                                              request_arg->args.out_text,
                                                              &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_ENCRYPT_EX_FINAL:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt_final_Ex(request_arg->args.id,
                                                             request_arg->args.in_text,
                                                             &in_len,
                                                             request_arg->args.out_text,
                                                             &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_DECRYPT_EX_FINAL:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt_final_Ex(request_arg->args.id,
                                                             request_arg->args.in_text,
                                                             &in_len,
                                                             request_arg->args.out_text,
                                                             &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            break;
        }

        case CMD_WSM_EX_GENERATE_NONCE:
        {
            request_WSM_generateNonce_ex_t *request_arg = (request_WSM_generateNonce_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_generateNonce_Ex(request_arg->args.id,
                                                             request_arg->args.nonce,
                                                             request_arg->args.nonce_len);
            break;
        }

        case CMD_WSM_EX_SET_NONCE:
        {
            request_WSM_generateNonce_ex_t *request_arg = (request_WSM_generateNonce_ex_t *)buffer;

            request_arg->args.ret = WSM_SWD_setNonce_Ex(request_arg->args.id,
                                                        request_arg->args.nonce,
                                                        request_arg->args.nonce_len);
            break;
        }

        case DELEGATED_WRAP:
        {
            delegated_wrap_cmd(buffer);
            break;
        }

        case CMD_WSM_EX_DELEGATED_WRAP:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            WSM_LOG(err_level_info, LOG_TAG, "[%s] CMD_WSM_EX_DELEGATED_WRAP \n", __func__);
            request_arg->args.out_len = sizeof(request_arg->args.out_text);
            request_arg->args.ret = WSM_SWD_delegatedWrap_Ex(
                request_arg->args.id,
                request_arg->args.in_text,
                request_arg->args.in_len,
                request_arg->args.TA_name,
                request_arg->args.TA_name_len,
                request_arg->args.out_text,
                &request_arg->args.out_len);

            break;
        }

        case DECRYPT_NONCE_WRAP:
            decrypt_nonce_wrap_cmd(buffer);
            break;

        case DECRYPT_TAG_WRAP:
            decrypt_tag_wrap_cmd(buffer);
            break;

        case CMD_WSM_EX_DECRYPT_AND_WRAP:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            WSM_LOG(err_level_info, LOG_TAG, "[%s] CMD_WSM_EX_DECRYPT_AND_WRAP \n", __func__);
            request_arg->args.out_len = sizeof(request_arg->args.out_text);

            // fix of x32/x64 cast
            unsigned long out_len = request_arg->args.out_len;
            request_arg->args.ret = WSM_SWD_decryptAndWrap_Ex(request_arg->args.id,
                                                              request_arg->args.in_text,
                                                              request_arg->args.in_len,
                                                              request_arg->args.TA_name,
                                                              request_arg->args.TA_name_len,
                                                              request_arg->args.out_text,
                                                              &out_len);
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_ENCRYPT_WITH_NONCE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;
            request_arg->args.ret = WSM_SWD_encryptWithNonce_Ex(request_arg->args.id,
                                                                request_arg->args.in_text,
                                                                &in_len,
                                                                request_arg->args.out_text,
                                                                &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_DECRYPT_CHECK_NONCE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decryptAndCheckNonce_Ex(request_arg->args.id,
                                                                    request_arg->args.in_text,
                                                                    &in_len,
                                                                    request_arg->args.out_text,
                                                                    &out_len);

            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;

            // Security Check: if output must be wraped then do not return output (plaintext) in NWd.
            if (WSM_RET_E_MUST_BE_WRAPED == (int)request_arg->args.ret)
                memset((void *)request_arg->args.out_text, 0, (size_t)request_arg->args.out_len);
            break;
        }

        case CMD_WSM_EX_ENCRYPT_WITH_NONCE_INIT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_encrypt_with_nonce_init_Ex(request_arg->args.id,
                                                                       request_arg->args.out_text);
            break;
        }

        case CMD_WSM_EX_DECRYPT_CHECK_NONCE_INIT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            request_arg->args.ret = WSM_SWD_decrypt_and_check_nonce_init_Ex(request_arg->args.id,
                                                                            request_arg->args.in_text);
            break;
        }

        case CMD_WSM_EX_ENCRYPT_WITH_NONCE_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt_with_nonce_update_Ex(request_arg->args.id,
                                                                         request_arg->args.in_text,
                                                                         &in_len,
                                                                         request_arg->args.out_text,
                                                                         &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_DECRYPT_CHECK_NONCE_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt_and_check_nonce_update_Ex(request_arg->args.id,
                                                                              request_arg->args.in_text,
                                                                              &in_len,
                                                                              request_arg->args.out_text,
                                                                              &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_ENCRYPT_WITH_NONCE_FINAL:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt_with_nonce_final_Ex(request_arg->args.id,
                                                                        request_arg->args.in_text,
                                                                        &in_len,
                                                                        request_arg->args.out_text,
                                                                        &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_DECRYPT_CHECK_NONCE_FINAL:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt_and_check_nonce_final_Ex(request_arg->args.id,
                                                                             request_arg->args.in_text,
                                                                             &in_len,
                                                                             request_arg->args.out_text,
                                                                             &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_ENCRYPT3_INIT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;
            request_arg->args.ret = WSM_SWD_encrypt3_init(request_arg->args.id,
                                                          request_arg->args.out_text);
            break;
        }

        case CMD_WSM_EX_ENCRYPT3_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt3_update(request_arg->args.id,
                                                            request_arg->args.in_text,
                                                            &in_len,
                                                            request_arg->args.out_text,
                                                            &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_ENCRYPT3_FINAL:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_encrypt3_final(request_arg->args.id,
                                                           request_arg->args.in_text,
                                                           &in_len,
                                                           request_arg->args.out_text,
                                                           &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_DECRYPT3_INIT:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;
            request_arg->args.ret = WSM_SWD_decrypt3_init(request_arg->args.id,
                                                          request_arg->args.in_text);
            break;
        }

        case CMD_WSM_EX_DECRYPT3_UPDATE:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt3_update(request_arg->args.id,
                                                            request_arg->args.in_text,
                                                            &in_len,
                                                            request_arg->args.out_text,
                                                            &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case CMD_WSM_EX_DECRYPT3_FINAL:
        {
            request_WSM_enc_dec_args_t *request_arg = (request_WSM_enc_dec_args_t *)buffer;

            // fix of x32/x64 cast
            unsigned long in_len = request_arg->args.in_len;
            unsigned long out_len = request_arg->args.out_len;

            request_arg->args.ret = WSM_SWD_decrypt3_final(request_arg->args.id,
                                                           request_arg->args.in_text,
                                                           &in_len,
                                                           request_arg->args.out_text,
                                                           &out_len);
            request_arg->args.in_len = (__typeof__(request_arg->args.in_len))in_len;
            request_arg->args.out_len = (__typeof__(request_arg->args.out_len))out_len;
            break;
        }

        case ENCRYPT_AES_CBC:
            encrypt_aes_cbc(buffer);
            break;

        case DECRYPT_AES_CBC:
            decrypt_aes_cbc(buffer);
            break;

        case ENCRYPT_AES_GCM:
            encrypt_aes_gcm(buffer);
            break;

        case DECRYPT_AES_GCM:
            decrypt_aes_gcm(buffer);
            break;

        case ENCRYPT_AES_GCM_NONCE:
            encrypt_aes_gcm_nonce(buffer);
            break;

        case DECRYPT_AES_GCM_NONCE:
            decrypt_aes_gcm_nonce(buffer);
            break;

        case ENCRYPT_AES_GCM_TAG:
            encrypt_aes_gcm_tag(buffer);
            break;

        case DECRYPT_AES_GCM_TAG:
            decrypt_aes_gcm_tag(buffer);
            break;

        case ENCRYPT_UPD_AES_CBC:
            encrypt_upd_aes_cbc(buffer);
            break;

        case DECRYPT_UPD_AES_CBC:
            decrypt_upd_aes_cbc(buffer);
            break;

        case ENCRYPT_INIT_AES_GCM_TAG:
            encrypt_init_aes_gcm_tag(buffer);
            break;

        case ENCRYPT_UPD_AES_GCM_TAG:
            encrypt_upd_aes_gcm_tag(buffer);
            break;

        case ENCRYPT_FIN_AES_GCM_TAG:
            encrypt_fin_aes_gcm_tag(buffer);
            break;

        case DECRYPT_INIT_AES_GCM_TAG:
            decrypt_init_aes_gcm_tag(buffer);
            break;

        case DECRYPT_UPD_AES_GCM_TAG:
            decrypt_upd_aes_gcm_tag(buffer);
            break;

        case DECRYPT_FIN_AES_GCM_TAG:
            decrypt_fin_aes_gcm_tag(buffer);
            break;

        case ENCRYPT_INIT_AES_GCM_NONCE:
            encrypt_init_aes_gcm_nonce(buffer);
            break;

        case ENCRYPT_UPD_AES_GCM_NONCE:
            encrypt_upd_aes_gcm_nonce(buffer);
            break;

        case ENCRYPT_FIN_AES_GCM_NONCE:
            encrypt_fin_aes_gcm_nonce(buffer);
            break;

        case DECRYPT_INIT_AES_GCM_NONCE:
            decrypt_init_aes_gcm_nonce(buffer);
            break;

        case DECRYPT_UPD_AES_GCM_NONCE:
            decrypt_upd_aes_gcm_nonce(buffer);
            break;

        case DECRYPT_FIN_AES_GCM_NONCE:
            decrypt_fin_aes_gcm_nonce(buffer);
            break;

        case ENCRYPT_INIT_AES_GCM:
            encrypt_init_aes_gcm(buffer);
            break;

        case ENCRYPT_UPD_AES_GCM:
            encrypt_upd_aes_gcm(buffer);
            break;

        case ENCRYPT_FIN_AES_GCM:
            encrypt_fin_aes_gcm(buffer);
            break;

        case DECRYPT_INIT_AES_GCM:
            decrypt_init_aes_gcm(buffer);
            break;

        case DECRYPT_UPD_AES_GCM:
            decrypt_upd_aes_gcm(buffer);
            break;

        case DECRYPT_FIN_AES_GCM:
            decrypt_fin_aes_gcm(buffer);
            break;

        case ESAP_v1_CLIENT_INIT:
            easp_v1_client_init_cmd(buffer);
            break;

        case ESAP_v1_SERVER_INIT:
            easp_v1_server_init_cmd(buffer);
            break;

        case ESAP_v1_DESTROY:
            esap_v1_destroy_cmd(buffer);
            break;

        case ESAP_v1_SERVER_STEP1:
        {
            easp_v1_server_step1_cmd(buffer);
            break;
        }

        case ESAP_v1_SERVER_STEP2:
        {
            easp_v1_server_step2_cmd(buffer);
            break;
        }

        case ESAP_v1_CLIENT_STEP1:
        {
            easp_v1_client_step1_cmd(buffer);
            break;
        }

        case ESAP_v1_CLIENT_STEP2:
        {
            easp_v1_client_step2_cmd(buffer);
            break;
        }

        case ESAP_V1_REAUTH_SERVER_STEP1:
            esap_v1_reauth_server_step1_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_CLIENT_STEP1:
            esap_v1_reauth_client_step1_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_SERVER_STEP2:
            esap_v1_reauth_server_step2_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_CLIENT_STEP2:
            esap_v1_reauth_client_step2_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_KEY_UPDATE_SERVER_STEP1:
            esap_v1_server_reauth_new_key_step1_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_KEY_UPDATE_CLIENT_STEP1:
            esap_v1_client_reauth_new_key_step1_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_KEY_UPDATE_SERVER_STEP2:
            esap_v1_server_reauth_new_key_step2_cmd(buffer);
            break;

        case ESAP_V1_REAUTH_KEY_UPDATE_CLIENT_STEP2:
            esap_v1_client_reauth_new_key_step2_cmd(buffer);
            break;

        case ESAP_v1_GET_ESAP:
            esap_v1_get_esap_key_cmd(buffer);
            break;

        case PROT_v2_CLIENT_INIT:
        {
            protocol_v2_client_init_cmd(buffer);
            break;
        }

        case CMD_TOKEN_CLIENT_INIT:
        {
            protocol_v2_token_client_init_cmd(buffer);
            break;
        }

        case CMD_TOKEN_SERVER_INIT:
        {
            protocol_v2_token_server_init_cmd(buffer);
            break;
        }

        case PROT_v2_SERVER_INIT:
        {
            protocol_v2_server_init_cmd(buffer);
            break;
        }

        case PROT_v2_DESTROY:
        {
            protocol_v2_destroy_cmd(buffer);
            break;
        }

        case PROT_v2_CLIENT_STEP1:
        {
            protocol_v2_client_step1_cmd(buffer);
            break;
        }

        case PROT_v2_CLIENT_STEP2:
        {
            protocol_v2_client_step2_cmd(buffer);
            break;
        }

        case PROT_v2_CLIENT_STEP3:
        {
            protocol_v2_client_step3_cmd(buffer);
            break;
        }

        case PROT_v2_SERVER_STEP1:
        {
            protocol_v2_server_step1_cmd(buffer);
            break;
        }

        case PROT_v2_SERVER_STEP2:
        {
            protocol_v2_server_step2_cmd(buffer);
            break;
        }

        case PROT_v2_SERVER_NEW_KEY_STEP1:
        {
            protv2_server_new_key_step1_cmd(buffer);
            break;
        }

        case PROT_v2_CLIENT_NEW_KEY_STEP1:
        {
            protv2_client_new_key_step1_cmd(buffer);
            break;
        }

        case PROT_v2_SERVER_NEW_KEY_STEP2:
        {
            protv2_server_new_key_step2_cmd(buffer);
            break;
        }

        case PROT_v2_CLIENT_NEW_KEY_STEP2:
        {
            protv2_client_new_key_step2_cmd(buffer);
            break;
        }

        case PROT_v2_GET_ESAP:
        {
            protv2_get_esap_key_cmd(buffer);
            break;
        }

        case PROT_v2_GET_CONF_MSG:
        {
            protv2_get_confirm_message_cmd(buffer);
            break;
        }

        case PROT_v2_GET_CONF_KEY:
        {
            protv2_get_confirm_key_cmd(buffer);
            break;
        }

        case PROT_v2_REAUTH_SERVER_STEP1:
        {
            reauth_protv2_server_step1_cmd(buffer);
            break;
        }

        case PROT_v2_REAUTH_CLIENT_STEP1:
        {
            reauth_protv2_client_step1_cmd(buffer);
            break;
        }

        case PROT_v2_REAUTH_SERVER_STEP2:
        {
            reauth_protv2_server_step2_cmd(buffer);
            break;
        }

        case PROT_v2_REAUTH_CLIENT_STEP2:
        {
            reauth_protv2_client_step2_cmd(buffer);
            break;
        }

        case CMD_CREATE_APPSKEY_AESv1:
        {
            create_appskey_aesv1_cmd(buffer);
            break;
        }

        case CMD_CREATE_APPSKEY_AESv2:
        {
            create_appskey_aesv2_cmd(buffer);
            break;
        }

        case CMD_CREATE_APPSKEY_STEP1:
        {
            appskey_v3_step1_cmd(buffer);
            break;
        }

        case CMD_CREATE_APPSKEY_STEP2:
        {
            appskey_v3_step2_cmd(buffer);
            break;
        }

        case CMD_CREATE_APPSKEY_STEP3:
        {
            appskey_v3_step3_cmd(buffer);
            break;
        }

        case CMD_DESTROY_APPSKEY:
        {
            destroy_appskey_cmd(buffer);
            break;
        }

        case CMD_WSMv2_GET_AND_SET_NONCE:
        {
            get_nonce_cmd(buffer);
            break;
        }

        case CMD_WSMv2_SET_AAD:
        {
            set_nonce_cmd(buffer);
            break;
        }

        case CMD_SET_TA_NAME:
        {
            set_ta_name_cmd(buffer);
            break;
        }

        case CMD_TOKEN_SERIALIZE:
            protocol_v2_token_serialize_cmd(buffer);
            break;

        default:
        {
            ret = WSM_RET_E_GENERAL_ERROR;
            WSM_LOG(err_level_warning, LOG_TAG, "Unsupported command: 0x%x\n",
                    ((request_WSM_Server_init_args_t *)buffer)->wsm_command);
            break;
        }
    }
    PERFORM_STOP(__func__);
    return ret;
}
