Dear Kan_Li
The i2c issue was somewhat resolved by fixing the i2c access issue. However, the AEAD Decryption still has issues. Please check the code and logs to determine what the issue is.
#define KEY_BIT_LEN 256
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}};
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = NULL;
int tlvRet = 0;
uint8_t *pRspbuf = NULL;
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;
}
tlvRet = TLVSET_CipherMode("cipherMode",
&pCmdbuf,
&cmdbufLen,
kSE05x_TAG_2,
((cipherMode == kSE05x_CipherMode_AES_GCM_INT_IV) ? kSE05x_CipherMode_AES_GCM : cipherMode));
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;
}
}
}
#if 0
{
uint8_t *temp = session_ctx->apdu_buffer;
__printf("APDU TX len=%zu:\n", cmdbufLen);
for (size_t i=0;i<cmdbufLen;i++) __printf("%02X ", temp[i]);
__printf("\n");
}
#endif
//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, session_ctx->apdu_buffer, &rspbufLen, 1);
if (retStatus == SM_OK) {
__printf("%s SE050 AEAD Decrypt Ok...\r\n", __func__);
{
__printf("APDU RSP len=%d:\n", rspbufLen);
for (size_t i=0 ; i < rspbufLen ; i++) __printf("%02X ", pRspbuf[i]);
__printf("\n");
}
retStatus = SM_NOT_OK;
if (inputDataLen != 0) {
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, pOutputData, pOutputDataLen);
__printf("AEAD Decrypt RSP tag1=%d:\n", tlvRet);
if (0 != tlvRet) {
goto cleanup;
}
}
if (operation == kSE05x_Cipher_Oper_OneShot_Encrypt) {
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_2, pTagData, pTagDataLen);
__printf("AEAD Decrypt RSP tag2=%d:\n", tlvRet);
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) {
__printf("AEAD Decrypt RSP tlvRet=%d:\n", tlvRet);
goto cleanup;
}
if (result != kSE05x_Result_SUCCESS) {
__printf("APDU Decrypt RSP result=%d:\n", result);
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] << | (pRspbuf[rspIndex + 1]));
}
}
cleanup:
return retStatus;
}
void ex_sss_aead_decrypt(void)
{
sss_status_t status = kStatus_SSS_Success;
sss_algorithm_t algorithm;
sss_mode_t mode;
/* clang-format off */
#ifdef ADED_DECRYPT_TEST
uint8_t aead_srcData[16] = { 0x8f, 0xd9, 0x64, 0xc, 0xa9, 0x95, 0xf1, 0x98, 0x86, 0xcf, 0xd6, 0xe9, 0xde, 0xd0, 0x37, 0x1f };
uint8_t aead_keystring[KEY_BIT_LEN / 8] = { 0xad, 0x4f , 0x6f , 0xaa , 0x5c , 0x67 , 0xf8 , 0x94 , 0xdc , 0x50 , 0xdd , 0x3e ,
0xf2 , 0x82 , 0xe3 , 0xf9 , 0x65 , 0x34 , 0xf8 , 0x0f , 0xdc , 0x46 , 0x65 , 0x1b , 0xb5 , 0x9a , 0x01 , 0x69 , 0xce , 0xfb , 0xa8 , 0xec};
#else
uint8_t aead_srcData[16] = { 0x48 ,0x45 ,0x4c ,0x4c ,0x4f ,0x48 ,0x45 ,0x4c ,0x4c ,0x4f ,0x48 ,0x45 ,0x4c ,0x4c ,0x4f ,0x31 }; /*HELLOHELLOHELLO1*/
uint8_t aead_keystring[KEY_BIT_LEN / 8] = { 0x48 ,0x45 ,0x4c ,0x4c ,0x4f ,0x48 ,0x45 ,0x4c ,0x4c ,0x4f ,0x48 ,0x45 ,0x4c ,0x4c ,0x4f ,0x31 }; /*HELLOHELLOHELLO1*/
#endif
uint8_t destData[16] = {0,};
size_t destDataLen = sizeof(destData);
#ifdef ADED_DECRYPT_TEST
uint8_t aead_iv[12] = {0x55, 0x6a , 0xe5 , 0xa9 , 0x17 , 0xce , 0xa , 0xd , 0x27 , 0x3f , 0x9f , 0xaa};
size_t ivlen = 12;
#else
uint8_t aead_iv[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x15, 0x71, 0x99, 0x32, 0xd3, 0x56, 0x90};
size_t ivlen = 16;
#endif
uint32_t keyId = MAKE_TEST_ID(__LINE__);
sss_key_part_t keyPart;
sss_cipher_type_t cipherType;
size_t keyByteLenMax = KEY_BIT_LEN/8;
sss_object_t key = { 0 };
sss_se05x_aead_t ctx_aead_encrypt = { 0 };
#ifdef ADED_DECRYPT_TEST
size_t TAG_SIZE = 16;
uint8_t tag[16] = {0x99 , 0xc5 , 0x3 , 0xaa , 0x7c , 0x6d ,
0x37 , 0x52 , 0x64 , 0x6e , 0x62 , 0x47 , 0xe0 , 0x3a , 0x80 , 0xc8};
uint8_t aad[5] = {0x17, 0x3, 0x3, 0x0, 0x20};
//uint8_t *aad =(uint8_t*)"Extra authentication data";
#else
size_t TAG_SIZE = 16;
uint8_t tag[TAG_SIZE];
uint8_t *aad =(uint8_t*)"Extra authentication data";
#endif
size_t aadSize = strlen((char*)aad);
//uint8_t *aad = NULL;
//size_t aadSize = 0;
pSe05xSession_t p_session_ctx = &se05x_session;
SE05x_CipherMode_t cipherMode = kSE05x_CipherMode_AES_GCM;
#ifdef ADED_DECRYPT_TEST
SE05x_Cipher_Oper_OneShot_t OperType = kSE05x_Cipher_Oper_OneShot_Decrypt;
#else
SE05x_Cipher_Oper_OneShot_t OperType = kSE05x_Cipher_Oper_OneShot_Encrypt; // : kSE05x_Cipher_Oper_OneShot_Decrypt;
#endif
algorithm = kAlgorithm_SSS_AES_GCM;
keyPart = kSSS_KeyPart_Default;
cipherType = kSSS_CipherType_AES;
#ifdef ADED_DECRYPT_TEST
mode = kMode_SSS_Decrypt;
#else
mode = kMode_SSS_Encrypt;
#endif
/* doc:start ex_sss_symmetric-allocate-key */
/* Pre-requisite for encryption Part*/
//status = Se05x_API_SessionOpen(p_session_ctx);
p_session_ctx = se05x_get_session();
key.session = p_session_ctx;
if (key.session == NULL)
{
__printf("SESSION open failed\r\n");
return;
}
//status = sss_key_object_allocate_handle(&key, keyId, keyPart, cipherType, keyByteLenMax, kKeyObject_Mode_Persistent);
status = sss_key_object_allocate_handle(&key, keyId, keyPart, cipherType, keyByteLenMax, kKeyObject_Mode_Persistent);
if (status != true)
{
__printf("sss_key_object_allocate_handle failed %x\r\n", status);
return;
}
//status = sss_key_store_set_key(&pCtx->ks, &key, keystring, sizeof(keystring), sizeof(keystring) * 8, NULL, 0);
status = sss_se05x_key_store_set_key(&key, aead_keystring, sizeof(aead_keystring), sizeof(aead_keystring) * 8);
if (status != kStatus_SSS_Success)
{
__printf("sss_se05x_key_store_set_key failed 0x%x\r\n", status);
return;
}
/*Do Encryption*/
#if 1
status = Se05x_API_AeadOneShot(p_session_ctx, keyId, cipherMode, aead_srcData,
destDataLen, aad, aadSize, aead_iv, ivlen, tag, &TAG_SIZE, destData, &destDataLen, OperType);
//aeadoneshotlog = false;
if (status != SM_OK)
{
sm_dbg_printf("Se05x_API_AeadOneShot failed %x\r\n", status);
return;
}
/* doc:end ex_sss_aead-encrypt */
__printf("AEAD En/Decryption successful !!!");
#else /* AEAD Multistep */
status = se05x_gcm_encrypt_multistep(p_session_ctx,
keyId, aead_srcData, destDataLen,
aad, aadSize, aead_iv, ivlen, destData, &destDataLen,
tag, &TAG_SIZE, OperType);
aeadoneshotlog = false;
if (status != SM_OK)
{
sm_dbg_printf("se05x_gcm_encrypt_multistep failed %x\r\n", status);
return;
}
/* doc:end ex_sss_aead-encrypt */
__printf("Encryption successful !!!");
#endif
cleanup:
return;
}
< LOG >
[INF][cli] Open Session to SE05x
[INF][cli] Plug and Trust nano package - version: 1.5.4
[SE_APDU] Update SymmKey keyid(0xef0003d1)
Se05x_API_AeadOneShot SE050 AEAD Decrypt Ok...
APDU RSP len=7:
42 82 00 01 02 90 00
AEAD Decrypt RSP tag1=1:
[409452 ms] Se05x_API_AeadOneShot failed ffff