blob: 069f8ade02eb2e8659e81b9d0be8e34c6c36f876 [file] [log] [blame]
/*
*
* Copyright 2019-2020 NXP
* SPDX-License-Identifier: Apache-2.0
*/
#if defined(NONSECURE_WORLD)
#include "veneer_printf_table.h"
#endif
#if defined(NONSECURE_WORLD)
#define NEWLINE() DbgConsole_Printf_NSE("\r\n")
#else
#define NEWLINE() printf("\r\n")
#endif
smStatus_t Se05x_API_CreateSession(
pSe05xSession_t session_ctx, uint32_t authObjectID, uint8_t *sessionId, size_t *psessionIdLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_SESSION_CREATE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CreateSession []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("auth", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, authObjectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, sessionId, psessionIdLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ExchangeSessionData(pSe05xSession_t session_ctx, pSe05xPolicy_t policy)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_SESSION_POLICY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
// uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ExchangeSessionData []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("Policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, policy);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_RefreshSession(pSe05xSession_t session_ctx, pSe05xPolicy_t policy)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_SESSION_REFRESH}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "RefreshSession []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CloseSession(pSe05xSession_t session_ctx)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_SESSION_CLOSE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t iCnt = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CloseSession []");
#endif /* VERBOSE_APDU_LOGS */
if( ((session_ctx->value[0] || session_ctx->value[1] || session_ctx->value[2] || session_ctx->value[3] ||
session_ctx->value[4] || session_ctx->value[5] || session_ctx->value[6] || session_ctx->value[7])) &&
(session_ctx->hasSession == 1))
{
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
if (retStatus == SM_OK)
{
for (iCnt = 0;iCnt < 8; iCnt++)
{
session_ctx->value[iCnt] = 0;
}
session_ctx->hasSession = 0;
}
}
else
{
LOG_D("CloseSession command is sent only if valid Session exists!!!");
}
return retStatus;
}
smStatus_t Se05x_API_VerifySessionUserID(pSe05xSession_t session_ctx, const uint8_t *userId, size_t userIdLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_SESSION_UserID}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "VerifySessionUserID []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8bufOptional("userId", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, userId, userIdLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_SetLockState(pSe05xSession_t session_ctx, uint8_t lockIndicator, uint8_t lockState)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_TRANSPORT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "SetLockState []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U8("lock indicator", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, lockIndicator);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("lock state", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, lockState);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_SetPlatformSCPRequest(pSe05xSession_t session_ctx, SE05x_PlatformSCPRequest_t platformSCPRequest)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_SCP}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "SetPlatformSCPRequest []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_PlatformSCPRequest("platf scp req", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, platformSCPRequest);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_SetAppletFeatures(pSe05xSession_t session_ctx, pSe05xAppletFeatures_t appletVariant)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_VARIANT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "SetAppletFeatures []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Variant(&pCmdbuf, &cmdbufLen, kSE05x_TAG_1, appletVariant);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_WriteECKey(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
SE05x_MaxAttemps_t maxAttempt,
uint32_t objectID,
SE05x_ECCurve_t curveID,
const uint8_t *privKey,
size_t privKeyLen,
const uint8_t *pubKey,
size_t pubKeyLen,
const SE05x_INS_t ins_type,
const SE05x_KeyPart_t key_part)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE | ins_type, kSE05x_P1_EC | key_part, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "WriteECKey []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_MaxAttemps("maxAttempt", &pCmdbuf, &cmdbufLen, kSE05x_TAG_MAX_ATTEMPTS, maxAttempt);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_ECCurve("curveID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, curveID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("privKey", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, privKey, privKeyLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("pubKey", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, pubKey, pubKeyLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_WriteRSAKey(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
uint32_t objectID,
uint16_t size,
const uint8_t *p,
size_t pLen,
const uint8_t *q,
size_t qLen,
const uint8_t *dp,
size_t dpLen,
const uint8_t *dq,
size_t dqLen,
const uint8_t *qInv,
size_t qInvLen,
const uint8_t *pubExp,
size_t pubExpLen,
const uint8_t *priv,
size_t privLen,
const uint8_t *pubMod,
size_t pubModLen,
const SE05x_INS_t ins_type,
const SE05x_KeyPart_t key_part,
const SE05x_RSAKeyFormat_t rsa_format)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE | ins_type, kSE05x_P1_RSA | key_part, rsa_format}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "WriteRSAKey []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("To be Checked(last 3 not pdf)", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("size in bits", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, size);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("p", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, p, pLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("q", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, q, qLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("dp", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, dp, dpLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("dq", &pCmdbuf, &cmdbufLen, kSE05x_TAG_6, dq, dqLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("qnv", &pCmdbuf, &cmdbufLen, kSE05x_TAG_7, qInv, qInvLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("public exp", &pCmdbuf, &cmdbufLen, kSE05x_TAG_8, pubExp, pubExpLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("priv", &pCmdbuf, &cmdbufLen, kSE05x_TAG_9, priv, privLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional_ByteShift("public mod", &pCmdbuf, &cmdbufLen, kSE05x_TAG_10, pubMod, pubModLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_WriteSymmKey(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
SE05x_MaxAttemps_t maxAttempt,
uint32_t objectID,
SE05x_KeyID_t kekID,
const uint8_t *keyValue,
size_t keyValueLen,
const SE05x_INS_t ins_type,
const SE05x_SymmKeyType_t type)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE | ins_type, type, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "WriteSymmKey []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_MaxAttemps("maxAttempt", &pCmdbuf, &cmdbufLen, kSE05x_TAG_MAX_ATTEMPTS, maxAttempt);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_KeyID("KEK id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, kekID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("key value", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, keyValue, keyValueLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_WriteBinary(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
uint32_t objectID,
uint16_t offset,
uint16_t length,
const uint8_t *inputData,
size_t inputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_BINARY, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "WriteBinary []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("offset", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, offset);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("length", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, length);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("input data", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_WriteUserID(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
SE05x_MaxAttemps_t maxAttempt,
uint32_t objectID,
const uint8_t *userId,
size_t userIdLen,
const SE05x_AttestationType_t attestation_type)
{
smStatus_t retStatus = SM_NOT_OK;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE | attestation_type, kSE05x_P1_UserID, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "WriteUserID []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_MaxAttemps("maxAttempt", &pCmdbuf, &cmdbufLen, kSE05x_TAG_MAX_ATTEMPTS, maxAttempt);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("userId", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, userId, userIdLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CreateCounter(pSe05xSession_t session_ctx, pSe05xPolicy_t policy, uint32_t objectID, uint16_t size)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_COUNTER, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "Se05x_API_CreateCounter []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
if (size != 0) {
tlvRet = TLVSET_U16("size", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, size);
if (0 != tlvRet) {
goto cleanup;
}
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_SetCounterValue(pSe05xSession_t session_ctx, uint32_t objectID, uint16_t size, uint64_t value)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_COUNTER, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "SetCounterValue []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
if ((size > 0) && (size <= 8)) {
if (value != 0) {
tlvRet = TLVSET_U64_SIZE("value", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, value, size);
if (0 != tlvRet) {
goto cleanup;
}
}
}
else {
LOG_E("Wrong size provided");
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_IncCounter(pSe05xSession_t session_ctx, uint32_t objectID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_COUNTER, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(objectID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "IncCounter []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_WritePCR(pSe05xSession_t session_ctx,
pSe05xPolicy_t policy,
uint32_t pcrID,
const uint8_t *initialValue,
size_t initialValueLen,
const uint8_t *inputData,
size_t inputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_PCR, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
if (Se05x_IsInValidRangeOfUID(pcrID))
return SM_NOT_OK;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "WritePCR []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_Se05xPolicy("policy", &pCmdbuf, &cmdbufLen, kSE05x_TAG_POLICY, policy);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, pcrID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("initialValue", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, initialValue, initialValueLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ImportObject(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAKeyComponent_t rsaKeyComp,
const uint8_t *serializedObject,
size_t serializedObjectLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_DEFAULT, kSE05x_P2_IMPORT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ImportObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
if (rsaKeyComp != kSE05x_RSAKeyComponent_NA) {
tlvRet = TLVSET_RSAKeyComponent("rsaKeyComp", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, rsaKeyComp);
if (0 != tlvRet) {
goto cleanup;
}
}
tlvRet = TLVSET_u8bufOptional(
"serializedObject", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, serializedObject, serializedObjectLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ImportExternalObject(pSe05xSession_t session_ctx,
const uint8_t *ECKeydata,
size_t ECKeydataLen,
const uint8_t *ECAuthKeyID,
size_t ECAuthKeyIDLen,
const uint8_t *serializedObject,
size_t serializedObjectLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, 0x06, kSE05x_P1_DEFAULT, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ImportExternalObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8buf("AuthData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_IMPORT_AUTH_DATA, ECKeydata, ECKeydataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8buf("AuthID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_IMPORT_AUTH_KEY_ID, ECAuthKeyID, ECAuthKeyIDLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional(
"serializedObject", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, serializedObject, serializedObjectLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadObject(
pSe05xSession_t session_ctx, uint32_t objectID, uint16_t offset, uint16_t length, uint8_t *data, size_t *pdataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_DEFAULT, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("offset", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, offset);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("length", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, length);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, data, pdataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadObject_W_Attst(pSe05xSession_t session_ctx,
uint32_t objectID,
uint16_t offset,
uint16_t length,
uint32_t attestID,
SE05x_AttestationAlgo_t attestAlgo,
const uint8_t *random,
size_t randomLen,
uint8_t *data,
size_t *pdataLen,
uint8_t *attribute,
size_t *pattributeLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *outrandom,
size_t *poutrandomLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ_With_Attestation, kSE05x_P1_DEFAULT, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadObject_W_Attst []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("offset", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, offset);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("length", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, length);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("attestID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, attestID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_AttestationAlgo("attestAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_6, attestAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("random", &pCmdbuf, &cmdbufLen, kSE05x_TAG_7, random, randomLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, data, pdataLen); /* */
if (0 != tlvRet) {
/* Keys with no read policy will not return TAG1 */
//goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_2, attribute, pattributeLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_TimeStamp(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_3, ptimeStamp); /* - */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_4, outrandom, poutrandomLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_5, chipId, pchipIdLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_6, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadRSA(pSe05xSession_t session_ctx,
uint32_t objectID,
uint16_t offset,
uint16_t length,
SE05x_RSAPubKeyComp_t rsa_key_comp,
uint8_t *data,
size_t *pdataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_DEFAULT, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadRSA []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("offset", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, offset);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("length", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, length);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSAPubKeyComp("rsa_key_comp", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, rsa_key_comp);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, data, pdataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadRSA_W_Attst(pSe05xSession_t session_ctx,
uint32_t objectID,
uint16_t offset,
uint16_t length,
SE05x_RSAPubKeyComp_t rsa_key_comp,
uint32_t attestID,
SE05x_AttestationAlgo_t attestAlgo,
const uint8_t *random,
size_t randomLen,
uint8_t *data,
size_t *pdataLen,
uint8_t *attribute,
size_t *pattributeLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *outrandom,
size_t *poutrandomLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ_With_Attestation, kSE05x_P1_DEFAULT, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadRSA_W_Attst []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("offset", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, offset);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16Optional("length", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, length);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSAPubKeyComp("rsa_key_comp", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, rsa_key_comp);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("attestID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, attestID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_AttestationAlgo("attestAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_6, attestAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("random", &pCmdbuf, &cmdbufLen, kSE05x_TAG_7, random, randomLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, data, pdataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_2, attribute, pattributeLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_TimeStamp(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_3, ptimeStamp); /* - */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_4, outrandom, poutrandomLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_5, chipId, pchipIdLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_6, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ExportObject(
pSe05xSession_t session_ctx, uint32_t objectID, SE05x_RSAKeyComponent_t rsaKeyComp, uint8_t *data, size_t *pdataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_DEFAULT, kSE05x_P2_EXPORT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ExportObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSAKeyComponent("rsaKeyComp", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, rsaKeyComp);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, data, pdataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadType(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_SecureObjectType_t *ptype,
uint8_t *pisTransient,
const SE05x_AttestationType_t attestation_type)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ | attestation_type, kSE05x_P1_DEFAULT, kSE05x_P2_TYPE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadType []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_SecureObjectType(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, ptype); /* - */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_U8(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_2, pisTransient); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadSize(pSe05xSession_t session_ctx, uint32_t objectID, uint16_t *psize)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_DEFAULT, kSE05x_P2_SIZE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadSize []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_U16(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, psize); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadIDList(pSe05xSession_t session_ctx,
uint16_t outputOffset,
uint8_t filter,
uint8_t *pmore,
uint8_t *idlist,
size_t *pidlistLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_DEFAULT, kSE05x_P2_LIST}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadIDList []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U16("output offset", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, outputOffset);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("filter", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, filter);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_U8(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, pmore); /* - */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf,
&rspIndex,
rspbufLen,
kSE05x_TAG_2,
idlist,
pidlistLen); /* Byte array containing 4-byte identifiers */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CheckObjectExists(pSe05xSession_t session_ctx, uint32_t objectID, SE05x_Result_t *presult)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_EXIST}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CheckObjectExists []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_Result(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, presult); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DeleteSecureObject(pSe05xSession_t session_ctx, uint32_t objectID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_DELETE_OBJECT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DeleteSecureObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CreateECCurve(pSe05xSession_t session_ctx, SE05x_ECCurve_t curveID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_CURVE, kSE05x_P2_CREATE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CreateECCurve []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_ECCurve("curve id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, curveID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_SetECCurveParam(pSe05xSession_t session_ctx,
SE05x_ECCurve_t curveID,
SE05x_ECCurveParam_t ecCurveParam,
const uint8_t *inputData,
size_t inputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_CURVE, kSE05x_P2_PARAM}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "SetECCurveParam []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_ECCurve("curve id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, curveID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_ECCurveParam("ecCurveParam", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, ecCurveParam);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_GetECCurveId(pSe05xSession_t session_ctx, uint32_t objectID, uint8_t *pcurveId)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_CURVE, kSE05x_P2_ID}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "GetECCurveId []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_U8(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, pcurveId); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadECCurveList(pSe05xSession_t session_ctx, uint8_t *curveList, size_t *pcurveListLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_CURVE, kSE05x_P2_LIST}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadECCurveList []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, curveList, pcurveListLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DeleteECCurve(pSe05xSession_t session_ctx, SE05x_ECCurve_t curveID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_CURVE, kSE05x_P2_DELETE_OBJECT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DeleteECCurve []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_ECCurve("curve id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, curveID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CreateCryptoObject(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
SE05x_CryptoContext_t cryptoContext,
SE05x_CryptoModeSubType_t subtype)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_WRITE, kSE05x_P1_CRYPTO_OBJ, kSE05x_P2_DEFAULT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CreateCryptoObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_CryptoContext("cryptoContext", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoContext);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_CryptoModeSubType(
"1-byte Crypto Object subtype, either from DigestMode, CipherMode or MACAlgo (depending on TAG_2).",
&pCmdbuf,
&cmdbufLen,
kSE05x_TAG_3,
subtype);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ReadCryptoObjectList(pSe05xSession_t session_ctx, uint8_t *idlist, size_t *pidlistLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_READ, kSE05x_P1_CRYPTO_OBJ, kSE05x_P2_LIST}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ReadCryptoObjectList []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTxRx_s_Case2(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet =
tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, idlist, pidlistLen); /* If more ids are present */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DeleteCryptoObject(pSe05xSession_t session_ctx, SE05x_CryptoObjectID_t cryptoObjectID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_CRYPTO_OBJ, kSE05x_P2_DELETE_OBJECT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DeleteCryptoObject []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ECDSASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_ECSignatureAlgo_t ecSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *signature,
size_t *psignatureLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_SIGN}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ECDSASign []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_ECSignatureAlgo("ecSignAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, ecSignAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_EdDSASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_EDSignatureAlgo_t edSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *signature,
size_t *psignatureLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_SIGN}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "EdDSASign []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_EDSignatureAlgo("edSignAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, edSignAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ECDAASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_ECDAASignatureAlgo_t ecdaaSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *randomData,
size_t randomDataLen,
uint8_t *signature,
size_t *psignatureLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_SIGN}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ECDAASign []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_ECDAASignatureAlgo("ecdaaSignAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, ecdaaSignAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("randomData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, randomData, randomDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ECDSAVerify(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_ECSignatureAlgo_t ecSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *signature,
size_t signatureLen,
SE05x_Result_t *presult)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_VERIFY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ECDSAVerify []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_ECSignatureAlgo("ecSignAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, ecSignAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("signature", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, signature, signatureLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_Result(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, presult); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_EdDSAVerify(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_EDSignatureAlgo_t edSignAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *signature,
size_t signatureLen,
SE05x_Result_t *presult)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_VERIFY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "EdDSAVerify []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_EDSignatureAlgo("edSignAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, edSignAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("signature", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, signature, signatureLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_Result(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, presult); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_ECDHGenerateSharedSecret(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *pubKey,
size_t pubKeyLen,
uint8_t *sharedSecret,
size_t *psharedSecretLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_EC, kSE05x_P2_DH}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "ECDHGenerateSharedSecret []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("pubKey", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, pubKey, pubKeyLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, sharedSecret, psharedSecretLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_RSASign(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSASignatureAlgo_t rsaSigningAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *signature,
size_t *psignatureLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_SIGN}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "RSASign []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSASignatureAlgo("rsaSigningAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, rsaSigningAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_RSAVerify(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSASignatureAlgo_t rsaSigningAlgo,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *signature,
size_t signatureLen,
SE05x_Result_t *presult)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_SIGNATURE, kSE05x_P2_VERIFY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "RSAVerify []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSASignatureAlgo("rsaSigningAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, rsaSigningAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("signature", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, signature, signatureLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_Result(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, presult); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_RSAEncrypt(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAEncryptionAlgo_t rsaEncryptionAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *encryptedData,
size_t *pencryptedDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_RSA, kSE05x_P2_ENCRYPT_ONESHOT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "RSAEncrypt []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSAEncryptionAlgo("rsaEncryptionAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, rsaEncryptionAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, encryptedData, pencryptedDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_RSADecrypt(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_RSAEncryptionAlgo_t rsaEncryptionAlgo,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *decryptedData,
size_t *pdecryptedDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_RSA, kSE05x_P2_DECRYPT_ONESHOT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "RSADecrypt []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_RSAEncryptionAlgo("rsaEncryptionAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, rsaEncryptionAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, decryptedData, pdecryptedDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CipherInit(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *IV,
size_t IVLen,
const SE05x_Cipher_Oper_t operation)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_CIPHER, operation}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CipherInit []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("IV", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, IV, IVLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CipherUpdate(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_CIPHER, kSE05x_P2_UPDATE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CipherUpdate []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CipherFinal(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_CIPHER, kSE05x_P2_FINAL}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CipherFinal []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8buf("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_CipherOneShot(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_CipherMode_t cipherMode,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *IV,
size_t IVLen,
uint8_t *outputData,
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_CIPHER, operation}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "CipherOneShot []");
#endif /* VERBOSE_APDU_LOGS */
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);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("IV", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, IV, IVLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_MACInit(pSe05xSession_t session_ctx,
uint32_t objectID,
SE05x_CryptoObjectID_t cryptoObjectID,
const SE05x_Mac_Oper_t mac_oper)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_MAC, mac_oper}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "MACInit []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_MACUpdate(
pSe05xSession_t session_ctx, const uint8_t *inputData, size_t inputDataLen, SE05x_CryptoObjectID_t cryptoObjectID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_MAC, kSE05x_P2_UPDATE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "MACUpdate []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_MACFinal(pSe05xSession_t session_ctx,
const uint8_t *inputData,
size_t inputDataLen,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *macValidateData,
size_t macValidateDataLen,
uint8_t *macValue,
size_t *pmacValueLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_MAC, kSE05x_P2_FINAL}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "MACFinal []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8buf("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional(
"macValidateData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, macValidateData, macValidateDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, macValue, pmacValueLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_MACOneShot_G(pSe05xSession_t session_ctx,
uint32_t objectID,
uint8_t macOperation,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *macValue,
size_t *pmacValueLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_MAC, kSE05x_P2_GENERATE_ONESHOT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "MACOneShot_G []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("macOperation", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, macOperation);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, macValue, pmacValueLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_MACOneShot_V(pSe05xSession_t session_ctx,
uint32_t objectID,
uint8_t macOperation,
const uint8_t *inputData,
size_t inputDataLen,
const uint8_t *MAC,
size_t MACLen,
uint8_t *macValue,
size_t *pmacValueLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_MAC, kSE05x_P2_VALIDATE_ONESHOT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "MACOneShot_V []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("macOperation", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, macOperation);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional(
"MAC to verify (when P2=P2_VALIDATE_ONESHOT)", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, MAC, MACLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, macValue, pmacValueLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_HKDF(pSe05xSession_t session_ctx,
uint32_t hmacID,
SE05x_DigestMode_t digestMode,
const uint8_t *salt,
size_t saltLen,
const uint8_t *info,
size_t infoLen,
uint16_t deriveDataLen,
uint8_t *hkdfOuput,
size_t *phkdfOuputLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_HKDF}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "HKDF []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("hmacID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, hmacID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_DigestMode("digestMode", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, digestMode);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("salt", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, salt, saltLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("info", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, info, infoLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16("2-byte requested length (L)", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, deriveDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, hkdfOuput, phkdfOuputLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_HKDF_Extended(pSe05xSession_t session_ctx,
uint32_t hmacID,
SE05x_DigestMode_t digestMode,
SE05x_HkdfMode_t hkdfMode,
const uint8_t *salt,
size_t saltLen,
uint32_t saltID,
const uint8_t *info,
size_t infoLen,
uint32_t derivedKeyID,
uint16_t deriveDataLen,
uint8_t *hkdfOuput,
size_t *phkdfOuputLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_HKDF}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
hdr.hdr[3] = (hkdfMode == kSE05x_HkdfMode_ExpandOnly ? kSE05x_P2_HKDF_EXPAND_ONLY : kSE05x_P2_HKDF);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "HKDF []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("hmacID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, hmacID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_DigestMode("digestMode", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, digestMode);
if (0 != tlvRet) {
goto cleanup;
}
if ((salt != NULL) && (hkdfMode != kSE05x_HkdfMode_ExpandOnly)) {
tlvRet = TLVSET_u8bufOptional("salt", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, salt, saltLen);
if (0 != tlvRet) {
goto cleanup;
}
}
tlvRet = TLVSET_u8bufOptional("info", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, info, infoLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16("2-byte requested length (L)", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, deriveDataLen);
if (0 != tlvRet) {
goto cleanup;
}
// Warning: TAGS must be in numerical order, so this cannot be the else statement of (salt != null)
if ((salt == NULL) && (hkdfMode != kSE05x_HkdfMode_ExpandOnly)) {
tlvRet = TLVSET_U32("saltID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_6, saltID);
if (0 != tlvRet) {
goto cleanup;
}
}
if (hkdfOuput == NULL) {
tlvRet = TLVSET_U32("derivedKeyID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_7, derivedKeyID);
if (0 != tlvRet) {
goto cleanup;
}
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
if (hkdfOuput == NULL) {
retStatus = SM_NOT_OK;
if (2 == rspbufLen) {
retStatus = (rspbuf[0] << 8) | (rspbuf[1]);
}
}
else {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, hkdfOuput, phkdfOuputLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_PBKDF2(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *salt,
size_t saltLen,
uint16_t count,
uint16_t requestedLen,
uint8_t *derivedSessionKey,
size_t *pderivedSessionKeyLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_PBKDF}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "PBKDF2 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32(
"4-byte password identifier (object type must be HMACKey)", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("salt", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, salt, saltLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16("count", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, count);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16("requestedLen", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, requestedLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet =
tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, derivedSessionKey, pderivedSessionKeyLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFDiversifyKey(pSe05xSession_t session_ctx,
uint32_t masterKeyID,
uint32_t diversifiedKeyID,
const uint8_t *divInputData,
size_t divInputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_DIVERSIFY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFDiversifyKey []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("masterKeyID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, masterKeyID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("diversifiedKeyID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, diversifiedKeyID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("divInputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, divInputData, divInputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFAuthenticateFirstPart1(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_AUTH_FIRST_PART1}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFAuthenticateFirstPart1 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFAuthenticateNonFirstPart1(pSe05xSession_t session_ctx,
uint32_t objectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_AUTH_NONFIRST_PART1}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFAuthenticateFirstPart1 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFAuthenticateFirstPart2(pSe05xSession_t session_ctx,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *outputData,
size_t *poutputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_AUTH_FIRST_PART2}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFAuthenticateFirstPart2 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFAuthenticateNonFirstPart2(
pSe05xSession_t session_ctx, const uint8_t *inputData, size_t inputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_AUTH_NONFIRST_PART2}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFAuthenticateNonFirstPart2 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFDumpSessionKeys(pSe05xSession_t session_ctx, uint8_t *sessionData, size_t *psessionDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_DUMP_KEY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFDumpSessionKeys []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTxRx_s_Case2(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf,
&rspIndex,
rspbufLen,
kSE05x_TAG_1,
sessionData,
psessionDataLen); /* 38 bytes: KeyID.SesAuthENCKey || KeyID.SesAuthMACKey || TI || Cmd-Ctr */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFChangeKeyPart1(pSe05xSession_t session_ctx,
uint32_t oldObjectID,
uint32_t newObjectID,
uint8_t keySetNr,
uint8_t keyNoDESFire,
uint8_t keyVer,
uint8_t *KeyData,
size_t *pKeyDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_CHANGE_KEY_PART1}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFChangeKeyPart1 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_KeyID("oldObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, oldObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("newObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, newObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("keySetNr", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, keySetNr);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("keyNoDESFire", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, keyNoDESFire);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("keyVer", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, keyVer);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, KeyData, pKeyDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFChangeKeyPart2(pSe05xSession_t session_ctx, const uint8_t *MAC, size_t MACLen, uint8_t *presult)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_CHANGE_KEY_PART2}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFChangeKeyPart2 []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8bufOptional("MAC", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, MAC, MACLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_U8(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, presult); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DFKillAuthentication(pSe05xSession_t session_ctx)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_KILL_AUTH}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DFKillAuthentication []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
return retStatus;
}
smStatus_t Se05x_API_TLSGenerateRandom(pSe05xSession_t session_ctx, uint8_t *randomValue, size_t *prandomValueLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_TLS, kSE05x_P2_RANDOM}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "TLSGenerateRandom []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTxRx_s_Case2(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, randomValue, prandomValueLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_TLSCalculatePreMasterSecret(pSe05xSession_t session_ctx,
uint32_t keyPairId,
uint32_t pskId,
uint32_t hmacKeyId,
const uint8_t *inputData,
size_t inputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_TLS, kSE05x_P2_TLS_PMS}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "TLSCalculatePreMasterSecret []");
#endif /* VERBOSE_APDU_LOGS */
if (pskId != 0) {
tlvRet = TLVSET_U32("pskId", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, pskId);
if (0 != tlvRet) {
goto cleanup;
}
}
tlvRet = TLVSET_U32("keyPairId", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, keyPairId);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("hmacKeyId", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, hmacKeyId);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_TLSPerformPRF(pSe05xSession_t session_ctx,
uint32_t objectID,
uint8_t digestAlgo,
const uint8_t *label,
size_t labelLen,
const uint8_t *random,
size_t randomLen,
uint16_t reqLen,
uint8_t *outputData,
size_t *poutputDataLen,
const SE05x_TLSPerformPRFType_t tlsprf)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_TLS, tlsprf}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "TLSPerformPRF []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U32("objectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("digestAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, digestAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("Label (1 to 64 bytes)", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, label, labelLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("32-byte random", &pCmdbuf, &cmdbufLen, kSE05x_TAG_4, random, randomLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U16("2-byte requested length", &pCmdbuf, &cmdbufLen, kSE05x_TAG_5, reqLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, outputData, poutputDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_I2CM_ExecuteCommandSet(pSe05xSession_t session_ctx,
const uint8_t *inputData,
size_t inputDataLen,
uint32_t attestationID,
uint8_t attestationAlgo,
uint8_t *response,
size_t *presponseLen,
SE05x_TimeStamp_t *ptimeStamp,
uint8_t *freshness,
size_t *pfreshnessLen,
uint8_t *chipId,
size_t *pchipIdLen,
uint8_t *signature,
size_t *psignatureLen,
uint8_t *randomAttst,
size_t randomAttstLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_I2CM_Attestation, kSE05x_P1_DEFAULT, kSE05x_P2_I2CM}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "I2CM_ExecuteCommandSet []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_u8bufOptional("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U32("attestationID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, attestationID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_U8("attestationAlgo", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, attestationAlgo);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8bufOptional("freshness random", &pCmdbuf, &cmdbufLen, kSE05x_TAG_7, randomAttst, randomAttstLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, response, presponseLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_TimeStamp(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_3, ptimeStamp); /* - */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_4, freshness, pfreshnessLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_5, chipId, pchipIdLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_6, signature, psignatureLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DigestInit(pSe05xSession_t session_ctx, SE05x_CryptoObjectID_t cryptoObjectID)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_INIT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DigestInit []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DigestUpdate(
pSe05xSession_t session_ctx, SE05x_CryptoObjectID_t cryptoObjectID, const uint8_t *inputData, size_t inputDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_UPDATE}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DigestUpdate []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8buf("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DigestFinal(pSe05xSession_t session_ctx,
SE05x_CryptoObjectID_t cryptoObjectID,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *cmacValue,
size_t *pcmacValueLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_FINAL}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DigestFinal []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_CryptoObjectID("cryptoObjectID", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, cryptoObjectID);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8buf("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_3, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, cmacValue, pcmacValueLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DigestOneShot(pSe05xSession_t session_ctx,
uint8_t digestMode,
const uint8_t *inputData,
size_t inputDataLen,
uint8_t *hashValue,
size_t *phashValueLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_CRYPTO, kSE05x_P1_DEFAULT, kSE05x_P2_ONESHOT}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DigestOneShot []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U8("digestMode", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, digestMode);
if (0 != tlvRet) {
goto cleanup;
}
tlvRet = TLVSET_u8buf("inputData", &pCmdbuf, &cmdbufLen, kSE05x_TAG_2, inputData, inputDataLen);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, hashValue, phashValueLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_GetVersion(pSe05xSession_t session_ctx, uint8_t *pappletVersion, size_t *appletVersionLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_VERSION}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "GetVersion []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTxRx_s_Case2(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, pappletVersion, appletVersionLen); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_GetTimestamp(pSe05xSession_t session_ctx, SE05x_TimeStamp_t *ptimeStamp)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_TIME}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "GetTimestamp []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTxRx_s_Case2(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_TimeStamp(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, ptimeStamp); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_GetFreeMemory(pSe05xSession_t session_ctx, SE05x_MemoryType_t memoryType, uint16_t *pfreeMem)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_MEMORY}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "GetFreeMemory []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_MemoryType("memoryType", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, memoryType);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_U16(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, pfreeMem); /* - */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_GetRandom(pSe05xSession_t session_ctx, uint16_t size, uint8_t *randomData, size_t *prandomDataLen)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_RANDOM}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
uint8_t *pCmdbuf = &cmdbuf[0];
int tlvRet = 0;
uint8_t rspbuf[SE05X_MAX_BUF_SIZE_RSP];
uint8_t *pRspbuf = &rspbuf[0];
size_t rspbufLen = ARRAY_SIZE(rspbuf);
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "GetRandom []");
#endif /* VERBOSE_APDU_LOGS */
tlvRet = TLVSET_U16("size", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, size);
if (0 != tlvRet) {
goto cleanup;
}
retStatus = DoAPDUTxRx_s_Case4_ext(session_ctx, &hdr, cmdbuf, cmdbufLen, rspbuf, &rspbufLen);
if (retStatus == SM_OK) {
retStatus = SM_NOT_OK;
size_t rspIndex = 0;
tlvRet = tlvGet_u8buf(pRspbuf, &rspIndex, rspbufLen, kSE05x_TAG_1, randomData, prandomDataLen); /* */
if (0 != tlvRet) {
goto cleanup;
}
if ((rspIndex + 2) == rspbufLen) {
retStatus = (pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]);
}
}
cleanup:
return retStatus;
}
smStatus_t Se05x_API_DeleteAll(pSe05xSession_t session_ctx)
{
smStatus_t retStatus = SM_NOT_OK;
tlvHeader_t hdr = {{kSE05x_CLA, kSE05x_INS_MGMT, kSE05x_P1_DEFAULT, kSE05x_P2_DELETE_ALL}};
uint8_t cmdbuf[SE05X_MAX_BUF_SIZE_CMD];
size_t cmdbufLen = 0;
#if VERBOSE_APDU_LOGS
NEWLINE();
nLog("APDU", NX_LEVEL_DEBUG, "DeleteAll []");
#endif /* VERBOSE_APDU_LOGS */
retStatus = DoAPDUTx_s_Case3(session_ctx, &hdr, cmdbuf, cmdbufLen);
return retStatus;
}