/*
 * Copyright 2020 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#include "test_Crypto.h"

#define MAC_BLOCK_SIZE 16

/* clang-format off */
const uint8_t gSRCData1[MAC_BLOCK_SIZE] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
const uint8_t gSRCData2[] = {
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,0x49,
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,0x49,
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,0x49,
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,0x49,
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,0x49,
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,0x49,
    0x84,0x82,0x33,0x00,0x10,0xB3,0x60,0x8B,0x7A,0x4C,0xC3,0xA1,
};
const uint8_t srcData3[] = {
    0x84, 0x01, 0x03, 0x00, 0x28, 0x82, 0x7B, 0x9B, 0xBD, 0x3F, 0xDC, 0x41, 0x8C, 0x46, 0xBB, 0x42, 0xD4, 0x9A, 0x32, 0xC7, 0x0C, 0x0F,
    0x52, 0xB8, 0x6B, 0x24, 0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10,
    0x52, 0xB8, 0x6B, 0x24, 0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10,
    0x52, 0xB8, 0x6B, 0x24, 0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10, 11, 1,2,3,4,5,
    0x52, 0xB8, 0x6B, 0x24, 0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10,
    0x03, 0x61, 0x5E, 0x97, 0xA6, 0xDD, 0x8C, 0x18 };
const uint8_t srcData4[] = {
    0x28, 0x82, 0x7B, 0x9B, 0xBD, 0x3F, 0xDC, 0x41, 0x8C, 0x46, 0xBB, 0x42, 0xD4, 0x9A, 0x32, 0xC7, 0x0C, 0x0F,
    0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10,
    0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10,
    0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10, 11, 1,2,3,4,5,
    0x13, 0x73, 0xFF, 1,2,3,4,5,6,6,7,8,9,0,1,2,3,4,5,6,7,9, 10,
    0xA6, 0xDD, 0x8C, 0x18 };

const uint8_t keystring[MAC_BLOCK_SIZE] = { 0xB3,0x35,0xFB,0xB5,0x14,0x00,0xB8,0x0B,0xB3,0x9B,0xE1,0xBF,0xD9,0x32,0x78,0x8C };
/* clang-format on */

static sss_status_t test_mac_multiStep_algo(userCtx_t *pUserCtx,
    const uint8_t expectedData[MAC_BLOCK_SIZE],
    const uint16_t srcData1Len,
    const uint16_t srcData2Len,
    const uint16_t srcData3Len,
    const uint16_t srcData4Len
);





sss_status_t test_mac_multiStep_algo_mmm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x90,0xFA,0x63,0x22,0x11,0x9D,0x60,0xDB,0x82,0x9D,0xC7,0xCF,0xC3,0x98,0x35,0x6C,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mmz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
            {0xF5,0x89,0x46,0x96,0x10,0x1B,0x57,0x37,0xD1,0xC5,0x62,0x16,0x9D,0xFF,0x88,0x03,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_mmp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
            {0xD1,0x05,0x5E,0xF8,0x98,0xFF,0x74,0xF0,0xFC,0x44,0x79,0xE5,0xD9,0x52,0x34,0xEE,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mmq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
            {0x6C,0xEB,0x44,0x3F,0xAF,0x8D,0x21,0x78,0x08,0xD0,0x7B,0xC8,0xF0,0x16,0x03,0x4B,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_mzm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
            {0xC0,0x80,0xB8,0x40,0x88,0xC4,0x0E,0x98,0x24,0xA8,0x93,0xD0,0xA1,0xC9,0xD1,0x29,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mzz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x10,0xEF,0xEE,0x75,0xFD,0xE7,0xDF,0xD9,0x45,0xE5,0x98,0xE3,0x31,0x34,0xF8,0x6A,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_mzp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0xD4,0xB0,0xD8,0x39,0x31,0x07,0x78,0xD2,0x9D,0x51,0x2D,0x97,0x6B,0x05,0x07,0xC2,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mzq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x06,0xD2,0xB2,0x05,0x6F,0x6C,0x6C,0x44,0xF6,0xDD,0x51,0x9A,0x0D,0x7B,0x33,0x47,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_mpm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0xB6,0xE3,0x43,0x83,0xC1,0x33,0x4B,0x07,0xD8,0x3C,0xB4,0xDA,0xC2,0x7F,0xB1,0x56,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mpz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
    { 0x2C,0x86,0x75,0x84,0xD7,0x25,0x75,0x56,0x5A,0xE3,0xDA,0x8A,0x76,0xD5,0x20,0x78, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_mpp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x29,0x34,0xF6,0xE5,0xC5,0x1D,0x99,0xC6,0xB7,0x39,0x71,0xC9,0xAC,0x06,0xD1,0x35, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mpq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x71,0x12,0x09,0x62,0x81,0x25,0x54,0xF4,0x7B,0x09,0x1F,0xB9,0xE6,0x23,0x7E,0x3D,};


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_mqm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x8D,0xF2,0x84,0xE5,0x30,0xA0,0x1A,0x01,0xDF,0x84,0x6E,0x88,0xB1,0x6C,0xC2,0x50,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mqz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
    { 0x80,0x5C,0xD9,0xBB,0x9E,0x6F,0xBB,0x98,0x1C,0xF1,0x7C,0x89,0x6B,0x05,0x86,0x73, };
    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_mqp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
            {0x6E,0xCC,0x06,0xED,0xC9,0x55,0xED,0xC6,0xA1,0x41,0x0A,0xE2,0xB7,0xF5,0x9E,0x82,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_mqq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x5E,0xDC,0x15,0x66,0xE0,0x67,0x89,0xF8,0x2C,0x2A,0xC3,0xC4,0x53,0xC1,0x1C,0x01,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_zmm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
            {0xD7,0xE2,0x26,0x83,0xC6,0xC5,0x35,0xD0,0xEE,0x7D,0xB0,0x12,0x49,0xF0,0x54,0x10,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zmz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
    { 0xC8,0xDC,0xC5,0xBC,0x31,0x3D,0x7F,0x8F,0xA1,0x76,0x47,0xF1,0xBD,0xED,0xFF,0xCE, };
    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_zmp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xCA,0x15,0xFF,0x1B,0xE1,0x2A,0xAC,0x2C,0xF5,0x8E,0x57,0x3B,0x7B,0x18,0x27,0x63, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zmq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x51,0x71,0x68,0xAE,0x0D,0x71,0x00,0x38,0x25,0x90,0xD4,0x20,0x6C,0xDA,0x4C,0xBE, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_zzm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x15,0x5D,0xF8,0x66,0x68,0xD8,0x48,0xB9,0x6C,0x32,0x41,0x34,0x1B,0x59,0x2A,0x62, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zzz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x59,0x3D,0x3F,0x51,0x75,0xED,0x59,0x17,0xF4,0x2D,0x1F,0xEF,0x9F,0x52,0xBF,0x53, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_zzp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x9A,0xB9,0xCB,0xE5,0x79,0x50,0xF3,0x78,0x66,0xCF,0x6E,0x4A,0xA5,0x77,0x50,0x1F, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zzq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xAB,0xA8,0x71,0x31,0xAC,0x2A,0x1A,0x1A,0xA6,0x5A,0x32,0xEB,0x51,0x64,0x1F,0x29, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_zpm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x72,0xCF,0xEB,0xC5,0x5E,0xA0,0xD9,0x36,0x53,0xB6,0x8F,0xF7,0x7E,0xD8,0x75,0xE0, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zpz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xB0,0x50,0x69,0x02,0x73,0x9D,0x0A,0x73,0x46,0x15,0xC7,0x76,0xC7,0x25,0x25,0xEF, };


    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_zpp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xF0,0x26,0xF3,0xEF,0xAE,0x80,0x65,0xE5,0x45,0x23,0xF0,0xF6,0xBC,0xD0,0x7D,0x54, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zpq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x78,0x31,0x80,0x6A,0xEE,0xC4,0xE5,0x22,0x08,0x03,0xE6,0x1C,0x80,0x96,0xBB,0x8F, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_zqm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x52,0xD2,0x2B,0x58,0xC9,0x90,0xDA,0xA0,0x85,0x9B,0x98,0xE2,0x23,0xB8,0xF6,0x0B, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zqz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xC5,0x75,0xC5,0x03,0x9F,0x31,0xDF,0x67,0xCF,0x05,0xCB,0xE3,0xD4,0x9D,0x5E,0x08, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_zqp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x33,0x94,0xBA,0x46,0xFF,0x8E,0x5E,0x82,0xB2,0xFF,0x7A,0xCB,0xBA,0x27,0x85,0x57, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_zqq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x3A,0x98,0x00,0xFF,0x90,0x63,0x90,0x16,0x41,0xB8,0xFF,0x2B,0xF9,0x30,0xB5,0xE1, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_pmm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x42,0xF5,0x9A,0x2B,0x3A,0xC6,0x85,0x87,0x8F,0xE4,0x46,0x03,0x94,0x3D,0x5D,0xF7, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_pmz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x2F,0xB3,0x72,0xAE,0x9E,0xC3,0x41,0xE9,0x6F,0x35,0x67,0xB8,0xB3,0x0A,0x4C,0x4B, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_pmp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xDE,0x6B,0x4C,0xC8,0x39,0xDB,0xDB,0xE4,0x65,0x9B,0x5A,0x2A,0x9F,0x7D,0xA5,0xA2, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_pmq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xE6,0x0B,0x48,0x5A,0x7E,0xB6,0xC0,0x48,0xA9,0xA6,0xCE,0xE5,0x1D,0x16,0x8B,0xD3, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_pzm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xBB,0xA4,0x76,0x83,0x2B,0xEA,0xEA,0x7D,0x4D,0x77,0x0D,0x07,0x19,0xC5,0x87,0x3D, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_pzz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0x38,0x11,0x1B,0xD9,0xF1,0x4D,0x07,0x33,0x28,0xCB,0xB3,0x93,0x95,0xBC,0x69,0x98, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_pzp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xD7,0xE0,0x43,0x16,0x1E,0x42,0x6B,0x81,0x97,0x4E,0xFC,0x0E,0x39,0xD5,0xAC,0xB8, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_pzq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xE5,0xC8,0xF3,0x69,0xBB,0x35,0x95,0xE1,0x8B,0xCD,0x8F,0x93,0x26,0xD2,0x27,0x10, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_ppm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xE9,0xCC,0x28,0x02,0x30,0x54,0xA0,0x0C,0x08,0x21,0x2E,0xB7,0x9F,0x71,0x94,0xEF, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_ppz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xD0,0x8C,0x24,0x0E,0x7F,0x70,0x34,0x77,0x63,0xE7,0x76,0xF8,0xB2,0xAD,0xF4,0x87, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_ppp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0xE4,0xDF,0x2B,0x4B,0xB7,0x24,0xA5,0x7D,0xA5,0x31,0xB2,0x2D,0x82,0x71,0x66,0xFE,};
;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_ppq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =         {0x17,0xC6,0x24,0xD0,0x4C,0x3C,0x08,0x1C,0x26,0xEB,0x18,0x79,0xFC,0x8E,0x17,0x53,};
;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_pqm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =        
    { 0x9E,0xC2,0x0A,0xE5,0x5C,0xC1,0x90,0xA2,0xE6,0x23,0xD4,0x1E,0xFB,0x5D,0x98,0x32, };

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_pqz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] = { 0xE7,0x6A,0xA2,0xC1,0xDE,0x97,0xDE,0x0F,0x09,0x61,0xD0,0xA2,0x40,0xBC,0x8E,0x6D, };;

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_pqp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x0F,0x45,0x6C,0x7F,0x52,0xFE,0xDB,0xF7,0xE8,0x45,0x0C,0x9D,0xA7,0x35,0x24,0x7A,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_pqq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x7F,0x49,0xE2,0x54,0xE5,0xA1,0x82,0xDD,0x5E,0xC3,0xC1,0x1B,0x48,0xD3,0x16,0x27,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_qmm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x5D,0x5C,0x78,0x11,0x8F,0x14,0x65,0xC3,0xC7,0x61,0xE7,0x3B,0x84,0xF6,0xCE,0xCE,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qmz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x4A,0x71,0xA4,0xE5,0x8D,0xD0,0xA0,0x66,0xDE,0x31,0xB2,0xE7,0xAD,0xB8,0xD9,0xF6,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_qmp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
       {0x51,0x6A,0xBE,0xEB,0x00,0x86,0xDE,0xB6,0xAC,0x89,0x9A,0x9F,0x87,0xE9,0x62,0x86,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qmq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x78,0x14,0x6B,0xA9,0x06,0xFC,0x66,0x36,0xDC,0x43,0xD0,0x97,0x2B,0xDF,0x1D,0xEF,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_qzm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x37,0xCA,0xAD,0xE1,0xE4,0x2A,0x93,0xC6,0xB6,0x84,0xE6,0xA4,0xF3,0x4D,0x56,0x9D,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qzz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0xB6,0x4F,0x1A,0x86,0xF8,0xFA,0x78,0x19,0xE0,0x7B,0xB3,0x22,0x27,0x9F,0xF5,0xED,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_qzp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0xC0,0x33,0xDA,0xA7,0x1B,0xD6,0xA1,0x9B,0x2F,0x9E,0x42,0x2C,0x55,0x45,0xE3,0xE4,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qzq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x33,0x18,0xE9,0x1D,0xDD,0x67,0xDF,0x78,0xAB,0xB2,0xE0,0x81,0xA0,0xAF,0xC2,0x78,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4),
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_qpm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x20,0x2C,0x59,0x8B,0x5F,0xFD,0xBB,0x3D,0x8B,0xC7,0x21,0x2F,0x2A,0x74,0xF3,0xC2,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qpz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x84,0x2C,0xBC,0xD2,0x1A,0xEB,0xD3,0xF4,0xA6,0xCF,0x3D,0xD7,0xAF,0xDF,0xF7,0xB9,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_qpp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x1B,0x08,0xEE,0x62,0x89,0xDA,0x5E,0x57,0x87,0x20,0xE2,0x5D,0x85,0x8C,0x7E,0xB4,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qpq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0xCB,0xE6,0xF2,0x93,0x55,0x14,0xFA,0x5C,0x44,0x49,0xDB,0x55,0x82,0x43,0xFE,0x7E,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}


sss_status_t test_mac_multiStep_algo_qqm(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x6E,0xD0,0x7C,0x27,0x21,0x48,0x25,0x41,0xC4,0xCD,0xEE,0x53,0x9B,0x3F,0xC9,0x95,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) - 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qqz(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x4D,0x4C,0x25,0x1E,0x6D,0x0D,0xC3,0x81,0x98,0x5B,0xEC,0xC7,0x10,0x5F,0xE7,0xD4,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4));
    return status;
}


sss_status_t test_mac_multiStep_algo_qqp(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0x6D,0x5D,0xF5,0x9F,0x0B,0xC1,0x67,0xBC,0xF3,0x70,0x95,0x9B,0x91,0x08,0x2B,0x64,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) + 1);
    return status;
}


sss_status_t test_mac_multiStep_algo_qqq(userCtx_t *pUserCtx) {
    sss_status_t status;
    const uint8_t expectedData[MAC_BLOCK_SIZE] =
        {0xB8,0xE0,0x0B,0x59,0xAC,0x33,0xAE,0x74,0xAF,0x09,0x30,0xC0,0x2A,0xFC,0xF3,0x11,};

    status = test_mac_multiStep_algo(pUserCtx, expectedData,
        MAC_BLOCK_SIZE,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0,
        (MAC_BLOCK_SIZE * 4) * 0);
    return status;
}



static sss_status_t test_mac_multiStep_algo(userCtx_t *pUserCtx,
    const uint8_t expectedData[MAC_BLOCK_SIZE],
    const uint16_t srcData1Len,
    const uint16_t srcData2Len,
    const uint16_t srcData3Len,
    const uint16_t srcData4Len
    )
{
    sss_status_t status;
    uint8_t outdata[256] = { 0 };
    size_t outdatLen = sizeof(outdata);
    uint8_t count = 0;

    sss_algorithm_t algorithm = kAlgorithm_SSS_CMAC_AES;
    sss_mode_t mode = kMode_SSS_Mac;

    status = sss_host_key_object_allocate_handle(&pUserCtx->key,
        __LINE__,
        kSSS_KeyPart_Default,
        kSSS_CipherType_CMAC,
        16,
        kKeyObject_Mode_Transient);
    if (status != kStatus_SSS_Success)
    {
        LOG_E("Userkey_key_object_alloc_mac_multiStep Failed!!!");
        goto exit;
    }

    status = sss_host_key_store_set_key(&pUserCtx->ks,
        &pUserCtx->key,
        keystring,
        sizeof(keystring),
        sizeof(keystring) * 8,
        NULL,
        0);
    if (status != kStatus_SSS_Success)
    {
        LOG_E("Userkey_set_key_mac_multiStep Failed!!!");
        goto exit;
    }

    status = sss_host_mac_context_init(
        &pUserCtx->mac, &pUserCtx->session, &pUserCtx->key, algorithm, mode);
    if (status != kStatus_SSS_Success)
    {
        LOG_E("Userkey_mac_context_init_multiStep Failed!!!");
        goto exit;
    }

    status = sss_host_mac_init(&pUserCtx->mac);
    if (status != kStatus_SSS_Success)
    {
        LOG_E("Userkey_mac_init_multiStep Failed!!!");
        goto exit;
    }

    if (srcData1Len > 0) {
        status = sss_host_mac_update(&pUserCtx->mac, gSRCData1, srcData1Len);
        if (status != kStatus_SSS_Success)
        {
            LOG_E("Userkey_mac_update_multiStep step1 Failed!!!");
            goto exit;
        }
    }


    if (srcData2Len > 0) {
        status = sss_host_mac_update(&pUserCtx->mac, gSRCData2, srcData2Len);
        if (status != kStatus_SSS_Success)
        {
            LOG_E("Userkey_mac_update_multiStep step2 Failed!!!");
            goto exit;
        }
    }

    if (srcData3Len > 0) {
        status = sss_host_mac_update(&pUserCtx->mac, srcData3, srcData3Len);
        if (status != kStatus_SSS_Success)
        {
            LOG_E("Userkey_mac_update_multiStep step2 Failed!!!");
            goto exit;
        }
    }
    if (srcData4Len > 0) {
        status = sss_host_mac_update(&pUserCtx->mac, srcData4, srcData4Len);
        if (status != kStatus_SSS_Success)
        {
            LOG_E("Userkey_mac_update_multiStep step2 Failed!!!");
            goto exit;
        }
    }
    status = sss_host_mac_finish(&pUserCtx->mac, outdata, &outdatLen);
    if (status != kStatus_SSS_Success)
    {
        LOG_E("Userkey_mac_finish_multiStep Failed!!!");
        goto exit;
    }
    LOG_AU8_I(outdata, outdatLen);
    for (count = 0;count < outdatLen;count++)
    {
        if (outdata[count] != expectedData[count])
        {
            LOG_E("Crypto results are wrong mac_multiStep !!!");
            LOG_MAU8_E("Expected", expectedData, MAC_BLOCK_SIZE);
            printf("\n        {");
            for (size_t i = 0; i < outdatLen; i++) {
                printf("0x%02X,", outdata[i]);
            }
            printf("};\n\n");
            //LOG_MAU8_E("Got", outdata, outdatLen);
            status = kStatus_SSS_Fail;
            break;
        }
    }

#if 0
   // sss_host_key_object_free(&pUserCtx->key);
    sss_host_mac_context_free(&pUserCtx->mac);
    status = sss_host_mac_context_init(
        &pUserCtx->mac, &pUserCtx->session, &pUserCtx->key, algorithm, mode);
    status = sss_host_mac_init(&pUserCtx->mac);
    status = sss_host_mac_update(&pUserCtx->mac, expectedData, 16);
    status = sss_host_mac_update(&pUserCtx->mac, srcData3, srcData3Len);
    sss_host_mac_finish(&pUserCtx->mac, outdata, &outdatLen);
#endif

exit:
    sss_host_key_object_free(&pUserCtx->key);
    sss_host_mac_context_free(&pUserCtx->mac);
    sss_host_key_store_context_free(&pUserCtx->ks);
    return status;
}
