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

/**
* @par Description
* This file implements generic APDU response evaluation.
* @par History
* 1.0   20-feb-2012 : Initial version
*
*****************************************************************************/

#include <stddef.h>
#include <assert.h>

#include "scp.h"
#include "sm_apdu.h"
#include "sm_errors.h"
#include "nxLog_hostLib.h"
#include "nxEnsure.h"

/**
* Returns the status word of a response APDU when no response data is expected.
* @param[in] pApdu Pointer to the APDU.
* @retval ::ERR_WRONG_RESPONSE In case the response contains more than only the status word
* @returns status word (in case the response is 2 byte long)
*/
U16 CheckNoResponseData(apdu_t * pApdu)
{
    U16 rv = ERR_GENERAL_ERROR;
    U8 isOk = 0x00;
    ENSURE_OR_GO_EXIT(pApdu != NULL);

    if (pApdu->rxlen != 2)
    {
        // printf("%d: pApdu->rxlen = %d", __LINE__, pApdu->rxlen);
        rv = ERR_WRONG_RESPONSE;
    }
    else
    {
        // printBytestring("CheckNoResponseData", pApdu->pBuf, pApdu->rxlen);
        rv = smGetSw(pApdu, &isOk);
    }

exit:
    return rv;
}

/**
* Returns the status word of a response APDU when no response data is expected.
* @param[in] rawResponse      Pointer to the raw response
* @param[in] rawResponseLen   Length of \p rawResponse
* @retval ::ERR_WRONG_RESPONSE In case the response contains more than only the status word
* @returns status word (in case the response is 2 byte long)
*/
U16 CheckNoResponseDataRaw(U8 *rawResponse, U16 rawResponseLen)
{
    U16 rv = ERR_GENERAL_ERROR;
    ENSURE_OR_GO_EXIT(rawResponse != NULL);

    if (rawResponseLen != 2)
    {
        rv = ERR_WRONG_RESPONSE;
    }
    else
    {
        rv = (rawResponse[0] << 8) + rawResponse[1];
    }

exit:
    return rv;
}
