nuttx/drivers/crypto/pnt/0003-Added-Se05x_API_ReadSize-to-API.patch
2023-09-09 15:54:08 +08:00

197 lines
6.6 KiB
Diff

From b88625c69a26cfc178cad2e1430d53c8f01be6b0 Mon Sep 17 00:00:00 2001
From: Andre Heinemans <andre.heinemans@nxp.com>
Date: Fri, 11 Nov 2022 13:20:53 +0100
Subject: [PATCH 3/4] Added Se05x_API_ReadSize to API
---
lib/apdu/se05x_APDU_apis.h | 71 ++++++++++++++++++++++++++++++++++++++
lib/apdu/se05x_APDU_impl.c | 39 +++++++++++++++++++++
lib/apdu/se05x_tlv.c | 26 ++++++++++++++
lib/apdu/se05x_tlv.h | 1 +
4 files changed, 137 insertions(+)
diff --git a/lib/apdu/se05x_APDU_apis.h b/lib/apdu/se05x_APDU_apis.h
index 38cf017..7865c93 100644
--- a/lib/apdu/se05x_APDU_apis.h
+++ b/lib/apdu/se05x_APDU_apis.h
@@ -113,6 +113,77 @@ smStatus_t Se05x_API_WriteECKey(pSe05xSession_t session_ctx,
const SE05x_INS_t ins_type,
const SE05x_KeyPart_t key_part);
+/** Se05x_API_ReadSize
+ *
+ * ReadSize
+ *
+ * Get the size of a Secure Object (in bytes):
+ *
+ * * For EC keys: the size of the curve is returned.
+ *
+ * * For RSA keys: the key size is returned.
+ *
+ * * For AES/DES/HMAC keys, the key size is returned.
+ *
+ * * For binary files: the file size is returned
+ *
+ * * For userIDs: nothing is returned (SW_CONDITIONS_NOT_SATISFIED).
+ *
+ * * For counters: the counter length is returned.
+ *
+ * * For PCR: the PCR length is returned.
+ *
+ * # Command to Applet
+ *
+ * @rst
+ * +-------+------------+-----------------------------+
+ * | Field | Value | Description |
+ * +=======+============+=============================+
+ * | CLA | 0x80 | |
+ * +-------+------------+-----------------------------+
+ * | INS | INS_READ | See :cpp:type:`SE05x_INS_t` |
+ * +-------+------------+-----------------------------+
+ * | P1 | P1_DEFAULT | See :cpp:type:`SE05x_P1_t` |
+ * +-------+------------+-----------------------------+
+ * | P2 | P2_SIZE | See :cpp:type:`SE05x_P2_t` |
+ * +-------+------------+-----------------------------+
+ * | Lc | #(Payload) | |
+ * +-------+------------+-----------------------------+
+ * | | TLV[TAG_1] | 4-byte object identifier. |
+ * +-------+------------+-----------------------------+
+ * | Le | 0x00 | |
+ * +-------+------------+-----------------------------+
+ * @endrst
+ *
+ * # R-APDU Body
+ *
+ * @rst
+ * +------------+-----------------------------+
+ * | Value | Description |
+ * +============+=============================+
+ * | TLV[TAG_1] | Byte array containing size. |
+ * +------------+-----------------------------+
+ * @endrst
+ *
+ * # R-APDU Trailer
+ *
+ * @rst
+ * +-------------+--------------------------------+
+ * | SW | Description |
+ * +=============+================================+
+ * | SW_NO_ERROR | Data is returned successfully. |
+ * +-------------+--------------------------------+
+ * @endrst
+ *
+ *
+ * @param[in] session_ctx The session context
+ * @param[in] objectID The object id
+ * @param psize The psize
+ *
+ * @return The sm status.
+ */
+smStatus_t Se05x_API_ReadSize(pSe05xSession_t session_ctx, uint32_t objectID, uint16_t *psize);
+
/** Se05x_API_ReadObject
*
* Reads the content of a Secure Object.
diff --git a/lib/apdu/se05x_APDU_impl.c b/lib/apdu/se05x_APDU_impl.c
index 4acfad7..86b0d8f 100644
--- a/lib/apdu/se05x_APDU_impl.c
+++ b/lib/apdu/se05x_APDU_impl.c
@@ -186,6 +186,45 @@ 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}};
+ size_t cmdbufLen = 0;
+ uint8_t *pCmdbuf = NULL;
+ int tlvRet = 0;
+ uint8_t *pRspbuf = NULL;
+ size_t rspbufLen = 0;
+
+ ENSURE_OR_GO_CLEANUP(session_ctx != NULL);
+
+ pCmdbuf = &session_ctx->apdu_buffer[0];
+ pRspbuf = &session_ctx->apdu_buffer[0];
+ rspbufLen = sizeof(session_ctx->apdu_buffer);
+
+ SMLOG_D("APDU - ReadSize [] \n");
+
+ tlvRet = TLVSET_U32("object id", &pCmdbuf, &cmdbufLen, kSE05x_TAG_1, objectID);
+ if (0 != tlvRet) {
+ goto cleanup;
+ }
+ retStatus = DoAPDUTxRx(session_ctx, &hdr, session_ctx->apdu_buffer, cmdbufLen, pRspbuf, &rspbufLen, 1);
+ 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 = (smStatus_t)((pRspbuf[rspIndex] << 8) | (pRspbuf[rspIndex + 1]));
+ }
+ }
+
+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)
{
diff --git a/lib/apdu/se05x_tlv.c b/lib/apdu/se05x_tlv.c
index 4ed996e..71d253a 100644
--- a/lib/apdu/se05x_tlv.c
+++ b/lib/apdu/se05x_tlv.c
@@ -252,6 +252,32 @@ cleanup:
return retVal;
}
+int tlvGet_U16(uint8_t *buf, size_t *pBufIndex, const size_t bufLen, SE05x_TAG_t tag, uint16_t *pRsp)
+{
+ int retVal = 1;
+ uint8_t *pBuf = buf + (*pBufIndex);
+ uint8_t got_tag = *pBuf++;
+ size_t rspLen;
+
+ if ((*pBufIndex) > bufLen) {
+ goto cleanup;
+ }
+
+ if (got_tag != tag) {
+ goto cleanup;
+ }
+ rspLen = *pBuf++;
+ if (rspLen > 2) {
+ goto cleanup;
+ }
+ *pRsp = (*pBuf++) << 8;
+ *pRsp |= *pBuf++;
+ *pBufIndex += (1 + 1 + (rspLen));
+ retVal = 0;
+cleanup:
+ return retVal;
+}
+
int tlvGet_u8buf(uint8_t *buf, size_t *pBufIndex, const size_t bufLen, SE05x_TAG_t tag, uint8_t *rsp, size_t *pRspLen)
{
int retVal = 1;
diff --git a/lib/apdu/se05x_tlv.h b/lib/apdu/se05x_tlv.h
index 2fda3e7..ea7bfdf 100644
--- a/lib/apdu/se05x_tlv.h
+++ b/lib/apdu/se05x_tlv.h
@@ -34,6 +34,7 @@ int tlvSet_ECCurve(uint8_t **buf, size_t *bufLen, SE05x_TAG_t tag, SE05x_ECCurve
int tlvSet_KeyID(uint8_t **buf, size_t *bufLen, SE05x_TAG_t tag, uint32_t keyID);
int tlvSet_header(uint8_t **buf, size_t *bufLen, tlvHeader_t *hdr);
int tlvGet_U8(uint8_t *buf, size_t *pBufIndex, const size_t bufLen, SE05x_TAG_t tag, uint8_t *pRsp);
+int tlvGet_U16(uint8_t *buf, size_t *pBufIndex, const size_t bufLen, SE05x_TAG_t tag, uint16_t *pRsp);
int tlvGet_u8buf(uint8_t *buf, size_t *pBufIndex, const size_t bufLen, SE05x_TAG_t tag, uint8_t *rsp, size_t *pRspLen);
int tlvGet_Result(uint8_t *buf, size_t *pBufIndex, size_t bufLen, SE05x_TAG_t tag, SE05x_Result_t *presult);
smStatus_t DoAPDUTx(
--
2.25.1