SE050E AEAD Decryption in S32K314

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SE050E AEAD Decryption in S32K314

841 Views
Changhawn
Contributor IV

Dear

In S32K314 Platform, developing TLS1.3 with SE050E. 

During the TLS1.3 handshake,

the AEAD(AES GCM) key is imported as the traffic key.

The AEADOneShot command (AES GCM calculation) Se05x_API_AeadOneShot() is executed.

However, SE050 is not able to access I2C with a NACK.  I don't know the reason.

I2C was working fine before this issue occurred. S32K314 I2C Problem? or SE050 problem?

Thank you.

Chang

 

< LOG >

mbedtls_cipher_aead_decrypt Cipher ctx(20427388) Mode 6
[INF][devtask] Cipher Aead OneGo Start:0x204273a8 Cipher Mode:0xb0, OP Type:0x38
[INF][devtask] Key ID: 0xef0003b7

[INF][devtask] aadLen: 5 (17 3 3 0...)
[INF][devtask] nonceLen: 12 (67 bf 6f e0...)
[INF][devtask] tagLen: 16 (49 5b 34 3d...)
APDU TX len=75:
80 03 11 38 00 00
42 41 04 EF 00 03 B7
42 01 B0 43 10 E0 5E 33 33 D5 52 0D C4 86 51 E8 E7 6E 0C 86 30
44 05 17 03 03 00 20
45 0C CC C3 95 FF 3A 88 9A A0 64 44 F2 52
46 10 97 C5 DA 87 CE F6 98 C9 DB E3 8D 81 F4 C0 A8 3E
00 00

_i2c_write() failed. Max retry !!!

 

 

< SW Code >

i2c_error_t axI2CWrite(void *conn_ctx, unsigned char bus, unsigned char addr, unsigned char *pTx, unsigned short txLen)
{
    Lpi2c_Ip_StatusType status;
    int i;

    curr_check_ticks = SYS_TMR_TickCountGet();
    {
        status = Lpi2c_Ip_MasterSendDataBlocking(
            I2C_INSTANCE_1,
            pTx,
            txLen,
            true,   /* send STOP */
            100000
        );

        if (status == LPI2C_IP_SUCCESS_STATUS)
        {
            return I2C_OK;
        }
        else
        {
            if (status == LPI2C_IP_RECEIVED_NACK_STATUS)
                return I2C_NACK_ON_ADDRESS;
            else
            {
                __printf("%s Failed(0x%x)\\r\\n", __func__, status);
                return I2C_FAILED;
            }
        }
    }
}

int phPalEse_i2c_write(void *pDevHandle, uint8_t *pBuffer, int nNbBytesToWrite)
{
    unsigned int ret = I2C_OK, retryCount = 0;
    int numWrote = 0;
    pBuffer[0]   = 0x5A; //Recovery if stack forgot to add NAD byte.
    do {
        /* 1ms delay to give ESE polling delay */
        sm_sleep(ESE_POLL_DELAY_MS);
        ret = axI2CWrite(pDevHandle, I2C_BUS_0, SMCOM_I2C_ADDRESS, pBuffer, nNbBytesToWrite);
        if (ret != I2C_OK) {
            T_SMLOG_D("_i2c_write() error : %d ", ret);
            if ((ret == I2C_NACK_ON_ADDRESS) && (retryCount < MAX_RETRY_COUNT)) {
                retryCount++;
                /* 1ms delay to give ESE polling delay */
                /*i2c driver back off delay is providing 1ms wait time so ignoring waiting time at this level*/
                //sm_sleep(ESE_POLL_DELAY_MS);
                T_SMLOG_D("_i2c_write() failed. Going to retry, counter:%d  !", retryCount);
                continue;
            }
            if (retryCount == MAX_RETRY_COUNT)
                __printf("_i2c_write() failed(0x%x). Max retry !!!(size:%d)\\r\\n", ret, nNbBytesToWrite);
            return -1;
        }
        else {
            numWrote = nNbBytesToWrite;
            //sm_sleep(ESE_POLL_DELAY_MS);
            break;
        }
    } while (ret != I2C_OK);
    return numWrote;
}

smStatus_t DoAPDUTxRx(pSe05xSession_t session_ctx,
    const tlvHeader_t *hdr,
    uint8_t *cmdBuf,
    size_t cmdBufLen,
    uint8_t *rspBuf,
    size_t *pRspBufLen,
    uint8_t length_extended)
{
    smStatus_t apduStatus = SM_NOT_OK;

    ENSURE_OR_GO_EXIT(hdr != NULL);
    if (cmdBufLen > 0) {
        ENSURE_OR_GO_EXIT(cmdBuf != NULL);
    }
    ENSURE_OR_GO_EXIT(pRspBufLen != NULL);
    ENSURE_OR_GO_EXIT(rspBuf != NULL);

#ifdef ENABLE_SM_APDU_MUTEX
    SM_MUTEX_LOCK(g_sm_apdu_mutex);
#endif
        {
            if (cmdBufLen > 0) {
                if ((cmdBufLen < 0xFF) && !length_extended) {
                    ENSURE_OR_GO_EXIT((MAX_APDU_BUFFER - 5) >= cmdBufLen);
                    memmove((cmdBuf + 5), cmdBuf, cmdBufLen);
                    memcpy(cmdBuf, hdr, 4);
                    cmdBuf[4] = cmdBufLen;
                    ENSURE_OR_GO_EXIT((UINT_MAX - 5) >= cmdBufLen);
                    cmdBufLen += 5;
                }
                else {
                    ENSURE_OR_GO_EXIT((MAX_APDU_BUFFER - 7) >= cmdBufLen);
                    memmove((cmdBuf + 7), cmdBuf, cmdBufLen);
                    memcpy(cmdBuf, hdr, 4);

                    cmdBuf[4] = 0x00;
                    cmdBuf[5] = 0xFFu & (cmdBufLen >> 8);
                    cmdBuf[6] = 0xFFu & (cmdBufLen);

                    ENSURE_OR_GO_EXIT((UINT_MAX - 7) >= cmdBufLen);
                    cmdBufLen += 7;
                }
            }
            else {
                memcpy(cmdBuf, hdr, 4);
                cmdBufLen = 4;
            }
            if (length_extended) {
                ENSURE_OR_GO_EXIT((MAX_APDU_BUFFER - 2) >= cmdBufLen);
                ENSURE_OR_GO_EXIT((UINT_MAX - 2) >= cmdBufLen);
                cmdBuf[cmdBufLen++] = 0x00;
                cmdBuf[cmdBufLen++] = 0x00;
            }
            apduStatus = smComT1oI2C_TransceiveRaw(session_ctx->conn_context, cmdBuf, cmdBufLen, rspBuf, pRspBufLen);
            if (*pRspBufLen >= 2) {
                apduStatus = rspBuf[(*pRspBufLen) - 2] << 8 | rspBuf[(*pRspBufLen) - 1];
            }
        }

exit:
#ifdef ENABLE_SM_APDU_MUTEX
    SM_MUTEX_UNLOCK(g_sm_apdu_mutex);
#endif
    return apduStatus;
}

smStatus_t Se05x_API_AeadOneShot(pSe05xSession_t session_ctx,
    uint32_t objectID,
    SE05x_CipherMode_t cipherMode,
    const uint8_t *pInputData,
    size_t inputDataLen,
    const uint8_t *pAad,
    size_t aadLen,
    uint8_t *pIV,
    size_t IVLen,
    uint8_t *pTagData,
    size_t *pTagDataLen,
    uint8_t *pOutputData,
    size_t *pOutputDataLen,
    const SE05x_Cipher_Oper_OneShot_t operation)
{
    smStatus_t retStatus = SM_NOT_OK;
    tlvHeader_t hdr      = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_AEAD, operation}};
    //uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
    size_t cmdbufLen                       = 0;
    uint8_t *pCmdbuf;
    int tlvRet                             = 0;
    //uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP] = {0};
    uint8_t *pRspbuf;
    size_t rspbufLen                       = MAX_APDU_BUFFER;
    SE05x_Result_t result;
    uint16_t ivlen16 = 0;
    size_t ivlen32   = IVLen;
    size_t rspIndex  = 0;

    pCmdbuf   = &session_ctx->apdu_buffer[0];
    pRspbuf   = &session_ctx->apdu_buffer[0];

    if (IVLen > UINT16_MAX) {
        goto cleanup;
    }
    ivlen16 = (uint16_t)IVLen;
    tlvRet  = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
    if (0 != tlvRet) {
        goto cleanup;
    }
#if SSS_HAVE_SE05X_VER_GTE_07_02
    tlvRet = TLVSET_CipherMode("cipherMode",
        &pCmdbuf,
        &cmdbufLen,
        kSE05x_TAG_2,
        ((cipherMode == kSE05x_CipherMode_AES_GCM_INT_IV) ? kSE05x_CipherMode_AES_GCM : cipherMode));
#else
    tlvRet = TLVSET_CipherMode("cipherMode", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cipherMode);
#endif
    if (0 != tlvRet) {
        goto cleanup;
    }
    tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, pInputData, inputDataLen);
    if (0 != tlvRet) {
        goto cleanup;
    }
    tlvRet = TLVSET_u8bufOptional("AdditionalData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, pAad, aadLen);
    if (0 != tlvRet) {
        goto cleanup;
    }

    if ((cipherMode == kSE05x_CipherMode_AES_GCM) ||
        ((cipherMode == kSE05x_CipherMode_AES_GCM_INT_IV) && (operation == kSE05x_Cipher_Oper_OneShot_Decrypt))) {
        tlvRet = TLVSET_u8bufOptional("IV", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, pIV, IVLen);
        if (0 != tlvRet) {
            goto cleanup;
        }
    }
    else {
        tlvRet = TLVSET_U16("IVLen", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, ivlen16);
        if (0 != tlvRet) {
            goto cleanup;
        }
    }
    if (operation == kSE05x_Cipher_Oper_OneShot_Decrypt) {
        if (pTagDataLen != NULL) {
            //__printf("%s tgaDataLen is selected\\r\\n", __func__);
        //if (pTagDataLen > 0 ) {
            tlvRet = TLVSET_u8bufOptional("tag", &pCmdbuf, &cmdbufLen, kSE05x_TAG_6, pTagData, *pTagDataLen);
            if (0 != tlvRet) {
                goto cleanup;
            }
        }
    }

    //retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, session_ctx->apdu_buffer, cmdbufLen, pRspbuf, &rspbufLen);
    retStatus = DoAPDUTxRx(session_ctx, &hdr, session_ctx->apdu_buffer, cmdbufLen, pRspbuf, &rspbufLen, 1);
    if (retStatus == SM_OK) {
        retStatus = SM_NOT_OK;
        if (inputDataLen != 0) {
            tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, pOutputData, pOutputDataLen);
            if (0 != tlvRet) {
                goto cleanup;
            }
        }
        if (operation == kSE05x_Cipher_Oper_OneShot_Encrypt) {
            tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_2, pTagData, pTagDataLen);
            if (0 != tlvRet) {
                goto cleanup;
            }
        }
        if (operation == kSE05x_Cipher_Oper_OneShot_Decrypt) {
            tlvRet = tlvGet_Result(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_2, &result);
            if (0 != tlvRet) {
                goto cleanup;
            }
            if (result != kSE05x_Result_SUCCESS) {
                goto cleanup;
            }
        }
        if ((operation == kSE05x_Cipher_Oper_OneShot_Encrypt) && (cipherMode == kSE05x_CipherMode_AES_GCM_INT_IV)) {
            tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_3, pIV, &ivlen32);
            if (0 != tlvRet) {
                goto cleanup;
            }
        }
        if ((rspIndex + 2) == rspbufLen) {
            retStatus = (smStatus_t)((pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]));
        }
    }
cleanup:
    return retStatus;
}

int sss_se05x_aead_one_go(mbedtls_cipher_context_t *ctx,
    const uint8_t *srcData,
    uint8_t *destData,
    size_t size,
    uint8_t *nonce,
    size_t nonceLen,
    const uint8_t *aad,
    size_t aadLen,
    uint8_t *tag,
    size_t *tagLen)
{
    int retval = -1;
    smStatus_t status  = SM_NOT_OK;
    /* Already saved aead cipher ctx */
    sss_se05x_aead_t *context = (sss_se05x_aead_t *)ctx->cipher_ctx;
    size_t destDataLen = size;
    SE05x_CipherMode_t cipherMode =
        (context->algorithm == kAlgorithm_SSS_AES_GCM) ? kSE05x_CipherMode_AES_GCM : kSE05x_CipherMode_AES_GCM_INT_IV;
    SE05x_Cipher_Oper_OneShot_t OperType = 
        (context->mode == kMode_SSS_Encrypt) ? kSE05x_Cipher_Oper_OneShot_Encrypt : kSE05x_Cipher_Oper_OneShot_Decrypt;

    // Not support decrypt with internal IV.
    SMLOG_I("Cipher Aead OneGo Start:0x%x Cipher Mode:0x%x, OP Type:0x%x", context->keyObject, cipherMode, OperType);
    SMLOG_I("  Key ID: 0x%x\\r\\n", context->keyObject->keyId);
    SMLOG_I("  aadLen: %d (%x %x %x %x...)", (size_t)aadLen , aad[0], aad[1], aad[2], aad[3]);
    SMLOG_I("  nonceLen: %d (%x %x %x %x...)", nonceLen, nonce[0], nonce[1], nonce[2], nonce[3]);
    SMLOG_I("  tagLen: %d (%x %x %x %x...)", *tagLen, tag[0], tag[1], tag[2], tag[3]);
    
    ENSURE_OR_GO_EXIT(context->keyObject != NULL);
    status = Se05x_API_AeadOneShot(context->keyObject->session,
        context->keyObject->keyId,
        cipherMode,
        srcData,
        size,
        aad,
        aadLen,
        nonce,
        nonceLen,
        tag,
        tagLen,
        destData,
        &destDataLen,
        OperType);
    if (status == SM_ERR_APDU_THROUGHPUT) {
        retval = kStatus_SSS_ApduThroughputError;
        goto exit;
    }
    SMLOG_I("Cipher Aead One Go Status: 0x%x\\r\\n", status);
    ENSURE_OR_GO_EXIT(status == SM_OK);

    retval = 0;
exit:
    return retval;
}

int psa_mbedtls_gcm_auth_decrypt( mbedtls_cipher_context_t *ctx,
							  size_t length,
							  const unsigned char *iv,
							  size_t iv_len,
							  const unsigned char *add,
							  size_t add_len,
							  const unsigned char *tag,
							  size_t tag_len,
							  const unsigned char *input,
							  unsigned char *output )
{
	int ret = 0;

    size_t TAG_SIZE = tag_len; /* should be */

    ret = sss_se05x_aead_one_go(
        ctx,   // AEAD context
        input,                  // srcData (ciphertext)
        output,                 // destData (plaintext)
        length,                   // size
        (uint8_t *)iv,          // nonce
        iv_len,                 // nonceLen
        add,                     // aad
        add_len,                 // aadLen
        (uint8_t *)tag,         // tag
        &TAG_SIZE            // tagLen
        );
    if (ret != 0) {
        ret = MBEDTLS_ERR_GCM_AUTH_FAILED; 
    }

    return( ret );
}

int mbedtls_cipher_auth_decrypt_ext(mbedtls_cipher_context_t *ctx,
                                    const unsigned char *iv, size_t iv_len,
                                    const unsigned char *ad, size_t ad_len,
                                    const unsigned char *input, size_t ilen,
                                    unsigned char *output, size_t output_len,
                                    size_t *olen, size_t tag_len)
{

#if defined(MBEDTLS_CIPHER_MODE_AEAD)
    /* AEAD case: check length before passing on to shared function */
    if (ilen < tag_len || output_len < ilen - tag_len) {
        return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
    }
    return mbedtls_cipher_aead_decrypt(ctx, iv, iv_len, ad, ad_len,
                                       input, ilen - tag_len, output, olen,
                                       input + ilen - tag_len, tag_len);
#else
    return MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;
#endif /* MBEDTLS_CIPHER_MODE_AEAD */
}

0 Kudos
Reply
1 Reply

803 Views
VaneB
NXP TechSupport
NXP TechSupport

Hi @Changhawn 

The current MbedTLS middleware stack for S32K3 devices supports Transport Layer Security (TLS) Protocol Version 1.2, along with security features provided by the HSE. At this time, TLS 1.3 is not supported on S32K3 devices, and its implementation falls outside the scope of our support.

For any issues related to SE050, please post your questions in the Secure Authentication community, where the dedicated support team for these devices can assist you further.

 

BR, VaneB

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2217379%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ESE050E%20AEAD%20Decryption%20in%20S32K314%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2217379%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EDear%3C%2FP%3E%3CP%3EIn%20S32K314%20Platform%2C%20developing%20TLS1.3%20with%20SE050E.%26nbsp%3B%3C%2FP%3E%3CP%3EDuring%20the%20TLS1.3%20handshake%2C%3C%2FP%3E%3CP%3Ethe%20AEAD(AES%20GCM)%20key%20is%20imported%20as%20the%20traffic%20key.%3C%2FP%3E%3CP%3EThe%20AEADOneShot%20command%20(AES%20GCM%20calculation)%20Se05x_API_AeadOneShot()%20is%20executed.%3C%2FP%3E%3CP%3EHowever%2C%20SE050%20is%20not%20able%20to%20access%20I2C%20with%20a%20NACK.%26nbsp%3B%20I%20don't%20know%20the%20reason.%3C%2FP%3E%3CP%3EI2C%20was%20working%20fine%20before%20this%20issue%20occurred.%20S32K314%20I2C%20Problem%3F%20or%20SE050%20problem%3F%3C%2FP%3E%3CP%3EThank%20you.%3C%2FP%3E%3CP%3EChang%3C%2FP%3E%3CBR%20%2F%3E%3CP%3E%26lt%3B%20LOG%20%26gt%3B%3C%2FP%3E%3CP%3Embedtls_cipher_aead_decrypt%20Cipher%20ctx(20427388)%20Mode%206%3CBR%20%2F%3E%5BINF%5D%5Bdevtask%5D%20Cipher%20Aead%20OneGo%20Start%3A0x204273a8%20Cipher%20Mode%3A0xb0%2C%20OP%20Type%3A0x38%3CBR%20%2F%3E%5BINF%5D%5Bdevtask%5D%20Key%20ID%3A%200xef0003b7%3C%2FP%3E%3CP%3E%5BINF%5D%5Bdevtask%5D%20aadLen%3A%205%20(17%203%203%200...)%3CBR%20%2F%3E%5BINF%5D%5Bdevtask%5D%20nonceLen%3A%2012%20(67%20bf%206f%20e0...)%3CBR%20%2F%3E%5BINF%5D%5Bdevtask%5D%20tagLen%3A%2016%20(49%205b%2034%203d...)%3CBR%20%2F%3EAPDU%20TX%20len%3D75%3A%3CBR%20%2F%3E80%2003%2011%2038%2000%2000%3CBR%20%2F%3E42%2041%2004%20EF%2000%2003%20B7%3CBR%20%2F%3E42%2001%20B0%2043%2010%20E0%205E%2033%2033%20D5%2052%200D%20C4%2086%2051%20E8%20E7%206E%200C%2086%2030%3CBR%20%2F%3E44%2005%2017%2003%2003%2000%2020%3CBR%20%2F%3E45%200C%20CC%20C3%2095%20FF%203A%2088%209A%20A0%2064%2044%20F2%2052%3CBR%20%2F%3E46%2010%2097%20C5%20DA%2087%20CE%20F6%2098%20C9%20DB%20E3%208D%2081%20F4%20C0%20A8%203E%3CBR%20%2F%3E00%2000%3C%2FP%3E%3CP%3E_i2c_write()%20failed.%20Max%20retry%20!!!%3C%2FP%3E%3CBR%20%2F%3E%3CBR%20%2F%3E%3CP%3E%26lt%3B%20SW%20Code%20%26gt%3B%3C%2FP%3E%3CPRE%3Ei2c_error_t%20axI2CWrite(void%20*conn_ctx%2C%20unsigned%20char%20bus%2C%20unsigned%20char%20addr%2C%20unsigned%20char%20*pTx%2C%20unsigned%20short%20txLen)%0A%7B%0A%20%20%20%20Lpi2c_Ip_StatusType%20status%3B%0A%20%20%20%20int%20i%3B%0A%0A%20%20%20%20curr_check_ticks%20%3D%20SYS_TMR_TickCountGet()%3B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20status%20%3D%20Lpi2c_Ip_MasterSendDataBlocking(%0A%20%20%20%20%20%20%20%20%20%20%20%20I2C_INSTANCE_1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20pTx%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20txLen%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20true%2C%20%20%20%2F*%20send%20STOP%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20100000%0A%20%20%20%20%20%20%20%20)%3B%0A%0A%20%20%20%20%20%20%20%20if%20(status%20%3D%3D%20LPI2C_IP_SUCCESS_STATUS)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20I2C_OK%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(status%20%3D%3D%20LPI2C_IP_RECEIVED_NACK_STATUS)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20I2C_NACK_ON_ADDRESS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20__printf(%22%25s%20Failed(0x%25x)%5C%5Cr%5C%5Cn%22%2C%20__func__%2C%20status)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20I2C_FAILED%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0Aint%20phPalEse_i2c_write(void%20*pDevHandle%2C%20uint8_t%20*pBuffer%2C%20int%20nNbBytesToWrite)%0A%7B%0A%20%20%20%20unsigned%20int%20ret%20%3D%20I2C_OK%2C%20retryCount%20%3D%200%3B%0A%20%20%20%20int%20numWrote%20%3D%200%3B%0A%20%20%20%20pBuffer%5B0%5D%20%20%20%3D%200x5A%3B%20%2F%2FRecovery%20if%20stack%20forgot%20to%20add%20NAD%20byte.%0A%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20%2F*%201ms%20delay%20to%20give%20ESE%20polling%20delay%20*%2F%0A%20%20%20%20%20%20%20%20sm_sleep(ESE_POLL_DELAY_MS)%3B%0A%20%20%20%20%20%20%20%20ret%20%3D%20axI2CWrite(pDevHandle%2C%20I2C_BUS_0%2C%20SMCOM_I2C_ADDRESS%2C%20pBuffer%2C%20nNbBytesToWrite)%3B%0A%20%20%20%20%20%20%20%20if%20(ret%20!%3D%20I2C_OK)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20T_SMLOG_D(%22_i2c_write()%20error%20%3A%20%25d%20%22%2C%20ret)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20((ret%20%3D%3D%20I2C_NACK_ON_ADDRESS)%20%26amp%3B%26amp%3B%20(retryCount%20%26lt%3B%20MAX_RETRY_COUNT))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20retryCount%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F*%201ms%20delay%20to%20give%20ESE%20polling%20delay%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F*i2c%20driver%20back%20off%20delay%20is%20providing%201ms%20wait%20time%20so%20ignoring%20waiting%20time%20at%20this%20level*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fsm_sleep(ESE_POLL_DELAY_MS)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20T_SMLOG_D(%22_i2c_write()%20failed.%20Going%20to%20retry%2C%20counter%3A%25d%20%20!%22%2C%20retryCount)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(retryCount%20%3D%3D%20MAX_RETRY_COUNT)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20__printf(%22_i2c_write()%20failed(0x%25x).%20Max%20retry%20!!!(size%3A%25d)%5C%5Cr%5C%5Cn%22%2C%20ret%2C%20nNbBytesToWrite)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20-1%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20numWrote%20%3D%20nNbBytesToWrite%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fsm_sleep(ESE_POLL_DELAY_MS)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20while%20(ret%20!%3D%20I2C_OK)%3B%0A%20%20%20%20return%20numWrote%3B%0A%7D%0A%0AsmStatus_t%20DoAPDUTxRx(pSe05xSession_t%20session_ctx%2C%0A%20%20%20%20const%20tlvHeader_t%20*hdr%2C%0A%20%20%20%20uint8_t%20*cmdBuf%2C%0A%20%20%20%20size_t%20cmdBufLen%2C%0A%20%20%20%20uint8_t%20*rspBuf%2C%0A%20%20%20%20size_t%20*pRspBufLen%2C%0A%20%20%20%20uint8_t%20length_extended)%0A%7B%0A%20%20%20%20smStatus_t%20apduStatus%20%3D%20SM_NOT_OK%3B%0A%0A%20%20%20%20ENSURE_OR_GO_EXIT(hdr%20!%3D%20NULL)%3B%0A%20%20%20%20if%20(cmdBufLen%20%26gt%3B%200)%20%7B%0A%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT(cmdBuf%20!%3D%20NULL)%3B%0A%20%20%20%20%7D%0A%20%20%20%20ENSURE_OR_GO_EXIT(pRspBufLen%20!%3D%20NULL)%3B%0A%20%20%20%20ENSURE_OR_GO_EXIT(rspBuf%20!%3D%20NULL)%3B%0A%0A%23ifdef%20ENABLE_SM_APDU_MUTEX%0A%20%20%20%20SM_MUTEX_LOCK(g_sm_apdu_mutex)%3B%0A%23endif%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(cmdBufLen%20%26gt%3B%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20((cmdBufLen%20%26lt%3B%200xFF)%20%26amp%3B%26amp%3B%20!length_extended)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT((MAX_APDU_BUFFER%20-%205)%20%26gt%3B%3D%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20memmove((cmdBuf%20%2B%205)%2C%20cmdBuf%2C%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20memcpy(cmdBuf%2C%20hdr%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBuf%5B4%5D%20%3D%20cmdBufLen%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT((UINT_MAX%20-%205)%20%26gt%3B%3D%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBufLen%20%2B%3D%205%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT((MAX_APDU_BUFFER%20-%207)%20%26gt%3B%3D%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20memmove((cmdBuf%20%2B%207)%2C%20cmdBuf%2C%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20memcpy(cmdBuf%2C%20hdr%2C%204)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBuf%5B4%5D%20%3D%200x00%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBuf%5B5%5D%20%3D%200xFFu%20%26amp%3B%20(cmdBufLen%20%26gt%3B%26gt%3B%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBuf%5B6%5D%20%3D%200xFFu%20%26amp%3B%20(cmdBufLen)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT((UINT_MAX%20-%207)%20%26gt%3B%3D%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBufLen%20%2B%3D%207%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20memcpy(cmdBuf%2C%20hdr%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBufLen%20%3D%204%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(length_extended)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT((MAX_APDU_BUFFER%20-%202)%20%26gt%3B%3D%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENSURE_OR_GO_EXIT((UINT_MAX%20-%202)%20%26gt%3B%3D%20cmdBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBuf%5BcmdBufLen%2B%2B%5D%20%3D%200x00%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmdBuf%5BcmdBufLen%2B%2B%5D%20%3D%200x00%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20apduStatus%20%3D%20smComT1oI2C_TransceiveRaw(session_ctx-%26gt%3Bconn_context%2C%20cmdBuf%2C%20cmdBufLen%2C%20rspBuf%2C%20pRspBufLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(*pRspBufLen%20%26gt%3B%3D%202)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20apduStatus%20%3D%20rspBuf%5B(*pRspBufLen)%20-%202%5D%20%26lt%3B%26lt%3B%208%20%7C%20rspBuf%5B(*pRspBufLen)%20-%201%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0Aexit%3A%0A%23ifdef%20ENABLE_SM_APDU_MUTEX%0A%20%20%20%20SM_MUTEX_UNLOCK(g_sm_apdu_mutex)%3B%0A%23endif%0A%20%20%20%20return%20apduStatus%3B%0A%7D%0A%0AsmStatus_t%20Se05x_API_AeadOneShot(pSe05xSession_t%20session_ctx%2C%0A%20%20%20%20uint32_t%20objectID%2C%0A%20%20%20%20SE05x_CipherMode_t%20cipherMode%2C%0A%20%20%20%20const%20uint8_t%20*pInputData%2C%0A%20%20%20%20size_t%20inputDataLen%2C%0A%20%20%20%20const%20uint8_t%20*pAad%2C%0A%20%20%20%20size_t%20aadLen%2C%0A%20%20%20%20uint8_t%20*pIV%2C%0A%20%20%20%20size_t%20IVLen%2C%0A%20%20%20%20uint8_t%20*pTagData%2C%0A%20%20%20%20size_t%20*pTagDataLen%2C%0A%20%20%20%20uint8_t%20*pOutputData%2C%0A%20%20%20%20size_t%20*pOutputDataLen%2C%0A%20%20%20%20const%20SE05x_Cipher_Oper_OneShot_t%20operation)%0A%7B%0A%20%20%20%20smStatus_t%20retStatus%20%3D%20SM_NOT_OK%3B%0A%20%20%20%20tlvHeader_t%20hdr%20%20%20%20%20%20%3D%20%7B%7BkSE05x_CLA%2C%20kSE05x_INS_CRYPTO%2C%20kSE05x_P1_AEAD%2C%20operation%7D%7D%3B%0A%20%20%20%20%2F%2Fuint8_t%20cmdbuf%5BSE05X_MAX_BUF_SIZE_CMD%5D%3B%0A%20%20%20%20size_t%20cmdbufLen%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%200%3B%0A%20%20%20%20uint8_t%20*pCmdbuf%3B%0A%20%20%20%20int%20tlvRet%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%200%3B%0A%20%20%20%20%2F%2Fuint8_t%20rspbuf%5BSE05X_MAX_BUF_SIZE_RSP%5D%20%3D%20%7B0%7D%3B%0A%20%20%20%20uint8_t%20*pRspbuf%3B%0A%20%20%20%20size_t%20rspbufLen%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20MAX_APDU_BUFFER%3B%0A%20%20%20%20SE05x_Result_t%20result%3B%0A%20%20%20%20uint16_t%20ivlen16%20%3D%200%3B%0A%20%20%20%20size_t%20ivlen32%20%20%20%3D%20IVLen%3B%0A%20%20%20%20size_t%20rspIndex%20%20%3D%200%3B%0A%0A%20%20%20%20pCmdbuf%20%20%20%3D%20%26amp%3Bsession_ctx-%26gt%3Bapdu_buffer%5B0%5D%3B%0A%20%20%20%20pRspbuf%20%20%20%3D%20%26amp%3Bsession_ctx-%26gt%3Bapdu_buffer%5B0%5D%3B%0A%0A%20%20%20%20if%20(IVLen%20%26gt%3B%20UINT16_MAX)%20%7B%0A%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%7D%0A%20%20%20%20ivlen16%20%3D%20(uint16_t)IVLen%3B%0A%20%20%20%20tlvRet%20%20%3D%20TLVSET_U32(%22objectID%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_1%2C%20objectID)%3B%0A%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%7D%0A%23if%20SSS_HAVE_SE05X_VER_GTE_07_02%0A%20%20%20%20tlvRet%20%3D%20TLVSET_CipherMode(%22cipherMode%22%2C%0A%20%20%20%20%20%20%20%20%26amp%3BpCmdbuf%2C%0A%20%20%20%20%20%20%20%20%26amp%3BcmdbufLen%2C%0A%20%20%20%20%20%20%20%20kSE05x_TAG_2%2C%0A%20%20%20%20%20%20%20%20((cipherMode%20%3D%3D%20kSE05x_CipherMode_AES_GCM_INT_IV)%20%3F%20kSE05x_CipherMode_AES_GCM%20%3A%20cipherMode))%3B%0A%23else%0A%20%20%20%20tlvRet%20%3D%20TLVSET_CipherMode(%22cipherMode%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_2%2C%20cipherMode)%3B%0A%23endif%0A%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%7D%0A%20%20%20%20tlvRet%20%3D%20TLVSET_u8bufOptional(%22inputData%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_3%2C%20pInputData%2C%20inputDataLen)%3B%0A%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%7D%0A%20%20%20%20tlvRet%20%3D%20TLVSET_u8bufOptional(%22AdditionalData%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_4%2C%20pAad%2C%20aadLen)%3B%0A%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20((cipherMode%20%3D%3D%20kSE05x_CipherMode_AES_GCM)%20%7C%7C%0A%20%20%20%20%20%20%20%20((cipherMode%20%3D%3D%20kSE05x_CipherMode_AES_GCM_INT_IV)%20%26amp%3B%26amp%3B%20(operation%20%3D%3D%20kSE05x_Cipher_Oper_OneShot_Decrypt)))%20%7B%0A%20%20%20%20%20%20%20%20tlvRet%20%3D%20TLVSET_u8bufOptional(%22IV%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_5%2C%20pIV%2C%20IVLen)%3B%0A%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20tlvRet%20%3D%20TLVSET_U16(%22IVLen%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_5%2C%20ivlen16)%3B%0A%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20(operation%20%3D%3D%20kSE05x_Cipher_Oper_OneShot_Decrypt)%20%7B%0A%20%20%20%20%20%20%20%20if%20(pTagDataLen%20!%3D%20NULL)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F__printf(%22%25s%20tgaDataLen%20is%20selected%5C%5Cr%5C%5Cn%22%2C%20__func__)%3B%0A%20%20%20%20%20%20%20%20%2F%2Fif%20(pTagDataLen%20%26gt%3B%200%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20tlvRet%20%3D%20TLVSET_u8bufOptional(%22tag%22%2C%20%26amp%3BpCmdbuf%2C%20%26amp%3BcmdbufLen%2C%20kSE05x_TAG_6%2C%20pTagData%2C%20*pTagDataLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2FretStatus%20%3D%20DoAPDUTxRx_s_Case4_ext(session_ctx%2C%20%26amp%3Bhdr%2C%20session_ctx-%26gt%3Bapdu_buffer%2C%20cmdbufLen%2C%20pRspbuf%2C%20%26amp%3BrspbufLen)%3B%0A%20%20%20%20retStatus%20%3D%20DoAPDUTxRx(session_ctx%2C%20%26amp%3Bhdr%2C%20session_ctx-%26gt%3Bapdu_buffer%2C%20cmdbufLen%2C%20pRspbuf%2C%20%26amp%3BrspbufLen%2C%201)%3B%0A%20%20%20%20if%20(retStatus%20%3D%3D%20SM_OK)%20%7B%0A%20%20%20%20%20%20%20%20retStatus%20%3D%20SM_NOT_OK%3B%0A%20%20%20%20%20%20%20%20if%20(inputDataLen%20!%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20tlvRet%20%3D%20tlvGet_u8buf(pRspbuf%2C%20%26amp%3BrspIndex%2C%20rspbufLen%2C%20kSE05x_TAG_1%2C%20pOutputData%2C%20pOutputDataLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(operation%20%3D%3D%20kSE05x_Cipher_Oper_OneShot_Encrypt)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20tlvRet%20%3D%20tlvGet_u8buf(pRspbuf%2C%20%26amp%3BrspIndex%2C%20rspbufLen%2C%20kSE05x_TAG_2%2C%20pTagData%2C%20pTagDataLen)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(operation%20%3D%3D%20kSE05x_Cipher_Oper_OneShot_Decrypt)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20tlvRet%20%3D%20tlvGet_Result(pRspbuf%2C%20%26amp%3BrspIndex%2C%20rspbufLen%2C%20kSE05x_TAG_2%2C%20%26amp%3Bresult)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(result%20!%3D%20kSE05x_Result_SUCCESS)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20((operation%20%3D%3D%20kSE05x_Cipher_Oper_OneShot_Encrypt)%20%26amp%3B%26amp%3B%20(cipherMode%20%3D%3D%20kSE05x_CipherMode_AES_GCM_INT_IV))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20tlvRet%20%3D%20tlvGet_u8buf(pRspbuf%2C%20%26amp%3BrspIndex%2C%20rspbufLen%2C%20kSE05x_TAG_3%2C%20pIV%2C%20%26amp%3Bivlen32)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(0%20!%3D%20tlvRet)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goto%20cleanup%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20((rspIndex%20%2B%202)%20%3D%3D%20rspbufLen)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20retStatus%20%3D%20(smStatus_t)((pRspbuf%5BrspIndex%5D%20%26lt%3B%26lt%3B%20%3CLI-EMOJI%20id%3D%22lia_smiling-face-with-sunglasses%22%20title%3D%22%3Asmiling_face_with_sunglasses%3A%22%3E%3C%2FLI-EMOJI%3E%20%7C%20(pRspbuf%5BrspIndex%20%2B%201%5D))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0Acleanup%3A%0A%20%20%20%20return%20retStatus%3B%0A%7D%0A%0Aint%20sss_se05x_aead_one_go(mbedtls_cipher_context_t%20*ctx%2C%0A%20%20%20%20const%20uint8_t%20*srcData%2C%0A%20%20%20%20uint8_t%20*destData%2C%0A%20%20%20%20size_t%20size%2C%0A%20%20%20%20uint8_t%20*nonce%2C%0A%20%20%20%20size_t%20nonceLen%2C%0A%20%20%20%20const%20uint8_t%20*aad%2C%0A%20%20%20%20size_t%20aadLen%2C%0A%20%20%20%20uint8_t%20*tag%2C%0A%20%20%20%20size_t%20*tagLen)%0A%7B%0A%20%20%20%20int%20retval%20%3D%20-1%3B%0A%20%20%20%20smStatus_t%20status%20%20%3D%20SM_NOT_OK%3B%0A%20%20%20%20%2F*%20Already%20saved%20aead%20cipher%20ctx%20*%2F%0A%20%20%20%20sss_se05x_aead_t%20*context%20%3D%20(sss_se05x_aead_t%20*)ctx-%26gt%3Bcipher_ctx%3B%0A%20%20%20%20size_t%20destDataLen%20%3D%20size%3B%0A%20%20%20%20SE05x_CipherMode_t%20cipherMode%20%3D%0A%20%20%20%20%20%20%20%20(context-%26gt%3Balgorithm%20%3D%3D%20kAlgorithm_SSS_AES_GCM)%20%3F%20kSE05x_CipherMode_AES_GCM%20%3A%20kSE05x_CipherMode_AES_GCM_INT_IV%3B%0A%20%20%20%20SE05x_Cipher_Oper_OneShot_t%20OperType%20%3D%20%0A%20%20%20%20%20%20%20%20(context-%26gt%3Bmode%20%3D%3D%20kMode_SSS_Encrypt)%20%3F%20kSE05x_Cipher_Oper_OneShot_Encrypt%20%3A%20kSE05x_Cipher_Oper_OneShot_Decrypt%3B%0A%0A%20%20%20%20%2F%2F%20Not%20support%20decrypt%20with%20internal%20IV.%0A%20%20%20%20SMLOG_I(%22Cipher%20Aead%20OneGo%20Start%3A0x%25x%20Cipher%20Mode%3A0x%25x%2C%20OP%20Type%3A0x%25x%22%2C%20context-%26gt%3BkeyObject%2C%20cipherMode%2C%20OperType)%3B%0A%20%20%20%20SMLOG_I(%22%20%20Key%20ID%3A%200x%25x%5C%5Cr%5C%5Cn%22%2C%20context-%26gt%3BkeyObject-%26gt%3BkeyId)%3B%0A%20%20%20%20SMLOG_I(%22%20%20aadLen%3A%20%25d%20(%25x%20%25x%20%25x%20%25x...)%22%2C%20(size_t)aadLen%20%2C%20aad%5B0%5D%2C%20aad%5B1%5D%2C%20aad%5B2%5D%2C%20aad%5B3%5D)%3B%0A%20%20%20%20SMLOG_I(%22%20%20nonceLen%3A%20%25d%20(%25x%20%25x%20%25x%20%25x...)%22%2C%20nonceLen%2C%20nonce%5B0%5D%2C%20nonce%5B1%5D%2C%20nonce%5B2%5D%2C%20nonce%5B3%5D)%3B%0A%20%20%20%20SMLOG_I(%22%20%20tagLen%3A%20%25d%20(%25x%20%25x%20%25x%20%25x...)%22%2C%20*tagLen%2C%20tag%5B0%5D%2C%20tag%5B1%5D%2C%20tag%5B2%5D%2C%20tag%5B3%5D)%3B%0A%20%20%20%20%0A%20%20%20%20ENSURE_OR_GO_EXIT(context-%26gt%3BkeyObject%20!%3D%20NULL)%3B%0A%20%20%20%20status%20%3D%20Se05x_API_AeadOneShot(context-%26gt%3BkeyObject-%26gt%3Bsession%2C%0A%20%20%20%20%20%20%20%20context-%26gt%3BkeyObject-%26gt%3BkeyId%2C%0A%20%20%20%20%20%20%20%20cipherMode%2C%0A%20%20%20%20%20%20%20%20srcData%2C%0A%20%20%20%20%20%20%20%20size%2C%0A%20%20%20%20%20%20%20%20aad%2C%0A%20%20%20%20%20%20%20%20aadLen%2C%0A%20%20%20%20%20%20%20%20nonce%2C%0A%20%20%20%20%20%20%20%20nonceLen%2C%0A%20%20%20%20%20%20%20%20tag%2C%0A%20%20%20%20%20%20%20%20tagLen%2C%0A%20%20%20%20%20%20%20%20destData%2C%0A%20%20%20%20%20%20%20%20%26amp%3BdestDataLen%2C%0A%20%20%20%20%20%20%20%20OperType)%3B%0A%20%20%20%20if%20(status%20%3D%3D%20SM_ERR_APDU_THROUGHPUT)%20%7B%0A%20%20%20%20%20%20%20%20retval%20%3D%20kStatus_SSS_ApduThroughputError%3B%0A%20%20%20%20%20%20%20%20goto%20exit%3B%0A%20%20%20%20%7D%0A%20%20%20%20SMLOG_I(%22Cipher%20Aead%20One%20Go%20Status%3A%200x%25x%5C%5Cr%5C%5Cn%22%2C%20status)%3B%0A%20%20%20%20ENSURE_OR_GO_EXIT(status%20%3D%3D%20SM_OK)%3B%0A%0A%20%20%20%20retval%20%3D%200%3B%0Aexit%3A%0A%20%20%20%20return%20retval%3B%0A%7D%0A%0Aint%20psa_mbedtls_gcm_auth_decrypt(%20mbedtls_cipher_context_t%20*ctx%2C%0A%09%09%09%09%09%09%09%20%20size_t%20length%2C%0A%09%09%09%09%09%09%09%20%20const%20unsigned%20char%20*iv%2C%0A%09%09%09%09%09%09%09%20%20size_t%20iv_len%2C%0A%09%09%09%09%09%09%09%20%20const%20unsigned%20char%20*add%2C%0A%09%09%09%09%09%09%09%20%20size_t%20add_len%2C%0A%09%09%09%09%09%09%09%20%20const%20unsigned%20char%20*tag%2C%0A%09%09%09%09%09%09%09%20%20size_t%20tag_len%2C%0A%09%09%09%09%09%09%09%20%20const%20unsigned%20char%20*input%2C%0A%09%09%09%09%09%09%09%20%20unsigned%20char%20*output%20)%0A%7B%0A%09int%20ret%20%3D%200%3B%0A%0A%20%20%20%20size_t%20TAG_SIZE%20%3D%20tag_len%3B%20%2F*%20should%20be%20*%2F%0A%0A%20%20%20%20ret%20%3D%20sss_se05x_aead_one_go(%0A%20%20%20%20%20%20%20%20ctx%2C%20%20%20%2F%2F%20AEAD%20context%0A%20%20%20%20%20%20%20%20input%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20srcData%20(ciphertext)%0A%20%20%20%20%20%20%20%20output%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20destData%20(plaintext)%0A%20%20%20%20%20%20%20%20length%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20size%0A%20%20%20%20%20%20%20%20(uint8_t%20*)iv%2C%20%20%20%20%20%20%20%20%20%20%2F%2F%20nonce%0A%20%20%20%20%20%20%20%20iv_len%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20nonceLen%0A%20%20%20%20%20%20%20%20add%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20aad%0A%20%20%20%20%20%20%20%20add_len%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20aadLen%0A%20%20%20%20%20%20%20%20(uint8_t%20*)tag%2C%20%20%20%20%20%20%20%20%20%2F%2F%20tag%0A%20%20%20%20%20%20%20%20%26amp%3BTAG_SIZE%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20tagLen%0A%20%20%20%20%20%20%20%20)%3B%0A%20%20%20%20if%20(ret%20!%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20ret%20%3D%20MBEDTLS_ERR_GCM_AUTH_FAILED%3B%20%0A%20%20%20%20%7D%0A%0A%20%20%20%20return(%20ret%20)%3B%0A%7D%0A%0Aint%20mbedtls_cipher_auth_decrypt_ext(mbedtls_cipher_context_t%20*ctx%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsigned%20char%20*iv%2C%20size_t%20iv_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsigned%20char%20*ad%2C%20size_t%20ad_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20unsigned%20char%20*input%2C%20size_t%20ilen%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20unsigned%20char%20*output%2C%20size_t%20output_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20size_t%20*olen%2C%20size_t%20tag_len)%0A%7B%0A%0A%23if%20defined(MBEDTLS_CIPHER_MODE_AEAD)%0A%20%20%20%20%2F*%20AEAD%20case%3A%20check%20length%20before%20passing%20on%20to%20shared%20function%20*%2F%0A%20%20%20%20if%20(ilen%20%26lt%3B%20tag_len%20%7C%7C%20output_len%20%26lt%3B%20ilen%20-%20tag_len)%20%7B%0A%20%20%20%20%20%20%20%20return%20MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20mbedtls_cipher_aead_decrypt(ctx%2C%20iv%2C%20iv_len%2C%20ad%2C%20ad_len%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20input%2C%20ilen%20-%20tag_len%2C%20output%2C%20olen%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20input%20%2B%20ilen%20-%20tag_len%2C%20tag_len)%3B%0A%23else%0A%20%20%20%20return%20MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE%3B%0A%23endif%20%2F*%20MBEDTLS_CIPHER_MODE_AEAD%20*%2F%0A%7D%0A%0A%3C%2FPRE%3E%3CP%3E%3C!--%20%20%20notionvc%3A%208eb86d55-fa52-470f-8713-ea307840f61f%20%20%20--%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2225090%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20SE050E%20AEAD%20Decryption%20in%20S32K314%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2225090%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHi%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F232520%22%20target%3D%22_blank%22%3E%40Changhawn%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EThe%20current%20MbedTLS%20middleware%20stack%20for%20S32K3%20devices%20supports%20Transport%20Layer%20Security%20(TLS)%20Protocol%20Version%201.2%2C%20along%20with%20security%20features%20provided%20by%20the%20HSE.%20At%20this%20time%2C%20TLS%201.3%20is%20not%20supported%20on%20S32K3%20devices%2C%20and%20its%20implementation%20falls%20outside%20the%20scope%20of%20our%20support.%3C%2FP%3E%0A%3CP%3EFor%20any%20issues%20related%20to%20SE050%2C%20please%20post%20your%20questions%20in%20the%20%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2FSecure-Authentication%2Fbd-p%2Fsecure-authentication%3F_gl%3D1*f54jnn*_ga*MTQwODQzMzcyNC4xNzYzNjUxOTcy*_ga_WM5LE0KMSH*czE3NjM2NjM0NjIkbzQkZzEkdDE3NjM2NjUyMDgkajU1JGwwJGgxOTUxMDc2NTMx%22%20target%3D%22_blank%22%3ESecure%20Authentication%3C%2FA%3E%20community%2C%20where%20the%20dedicated%20support%20team%20for%20these%20devices%20can%20assist%20you%20further.%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3EBR%2C%20VaneB%3C%2FP%3E%3C%2FLINGO-BODY%3E