This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 329e050c30 Added NXP SE05x support (secure element)
329e050c30 is described below

commit 329e050c3098bfba7652d0e3a985430c94a1130d
Author: Andre Heinemans <[email protected]>
AuthorDate: Fri May 12 10:43:26 2023 +0200

    Added NXP SE05x support (secure element)
---
 .../components/drivers/character/index.rst         |   1 +
 .../components/drivers/character/se05x.rst         |  46 +++
 .../s32k1xx/ucans32k146/configs/se05x/defconfig    |  55 ++++
 boards/arm/s32k1xx/ucans32k146/src/Makefile        |   4 +
 .../arm/s32k1xx/ucans32k146/src/s32k1xx_bringup.c  |  11 +
 boards/arm/s32k1xx/ucans32k146/src/s32k1xx_se05x.c |  79 +++++
 boards/arm/s32k1xx/ucans32k146/src/ucans32k146.h   |  10 +
 drivers/crypto/Kconfig                             |  57 ++++
 drivers/crypto/Make.defs                           |   5 +
 drivers/crypto/pnt/.gitignore                      |   2 +
 .../crypto/pnt/0001-fixed-i2c-port-selection.patch |  48 +++
 ...y-management-in-lib-t1oi2c-phNxpEse_Api.c.patch | 335 ++++++++++++++++++++
 .../pnt/0003-Added-Se05x_API_ReadSize-to-API.patch | 196 ++++++++++++
 ...tored-delay-at-i2c-read-and-write-retries.patch |  36 +++
 drivers/crypto/pnt/Make.defs                       |  77 +++++
 drivers/crypto/pnt/pnt_se05x_api.c                 | 344 +++++++++++++++++++++
 drivers/crypto/pnt/pnt_se05x_api.h                 | 299 ++++++++++++++++++
 drivers/crypto/pnt/pnt_util.c                      |  98 ++++++
 drivers/crypto/pnt/pnt_util.h                      |  84 +++++
 drivers/crypto/pnt/scp03_keys.h                    |  40 +++
 drivers/crypto/pnt/sm_i2c.c                        | 116 +++++++
 drivers/crypto/pnt/sm_i2c.h                        |  76 +++++
 drivers/crypto/pnt/sm_port.h                       | 103 ++++++
 drivers/crypto/pnt/sm_timer.c                      |  36 +++
 drivers/crypto/pnt/sm_timer.h                      |  38 +++
 drivers/crypto/se05x.c                             | 266 ++++++++++++++++
 drivers/crypto/se05x_internal.h                    |  49 +++
 include/nuttx/crypto/se05x.h                       | 164 ++++++++++
 include/nuttx/fs/ioctl.h                           |   8 +
 29 files changed, 2683 insertions(+)

diff --git a/Documentation/components/drivers/character/index.rst 
b/Documentation/components/drivers/character/index.rst
index 8cdcaa5521..f9551389b4 100644
--- a/Documentation/components/drivers/character/index.rst
+++ b/Documentation/components/drivers/character/index.rst
@@ -66,4 +66,5 @@ Character device drivers have these properties:
   note.rst
   foc.rst
   ws2812.rst
+  se05x.rst
 
diff --git a/Documentation/components/drivers/character/se05x.rst 
b/Documentation/components/drivers/character/se05x.rst
new file mode 100644
index 0000000000..e064d25aa4
--- /dev/null
+++ b/Documentation/components/drivers/character/se05x.rst
@@ -0,0 +1,46 @@
+============
+SE05X Driver
+============
+
+This driver enables access to the NXP SE05X secure element by
+using the `NXP plug and trust nano 
<https://github.com/NXPPlugNTrust/nano-package>`_.
+
+.. note::
+   Currently this driver has only been tested on SE050.
+
+API
+===
+
+The driver supports reading/writing to the SE05X's keystore and additional
+features like diffie-hellman key derivation and signing CSR's and verifying
+certificates using keys from the keystore.
+Refer to ``drivers/crypto/pnt/pnt_se05x_api.h`` for the API functions available
+and to ``include/nuttx/crypto/se05x.h`` for the ioctl commands
+
+These tools make use of the SE05X driver (which can function as a reference 
project):
+
+- The ``controlse`` app can be used to control the SE05X from NSH.
+
+- The ``setest`` app tests all the SE05X ioctl functionality from NSH
+
+Datasheets are available on the `NXP website 
<https://www.nxp.com/products/security-and-authentication/authentication/edgelock-se050-plug-trust-secure-element-family-enhanced-iot-security-with-high-flexibility:SE050>`_.
+
+Configuration
+=============
+
+- ``DEV_SE05X`` Enable support for /dev/se05x secure element provided by NXP 
SE050
+  or SE051
+
+  - Channel communication interface
+
+    - ``DEV_SE05X_SCP03`` SCP03 secure channel (Not implemented)
+
+      - ``DEV_SE05X_SCP03_KEY_FILE`` Specify file containing the keys needed 
with
+        SCP03 channel authentication.
+        Location may be relative to the NuttX root folder. File should contain
+        the definitions for SCP03_ENC_KEY, SCP03_MAC_KEY and SCP03_DEK_KEY as
+        byte array initializers.
+
+    - ``DEV_SE05X_PLAIN`` plain communication
+
+  - ``SE05X_LOG_LEVEL`` The SE05x log is divided into the following levels: 
ERROR,WARNING,INFO,DEBUG.
diff --git a/boards/arm/s32k1xx/ucans32k146/configs/se05x/defconfig 
b/boards/arm/s32k1xx/ucans32k146/configs/se05x/defconfig
new file mode 100644
index 0000000000..a7bafc199c
--- /dev/null
+++ b/boards/arm/s32k1xx/ucans32k146/configs/se05x/defconfig
@@ -0,0 +1,55 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed 
.config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that 
includes your
+# modifications.
+#
+# CONFIG_ARCH_FPU is not set
+# CONFIG_NSH_ARGCAT is not set
+# CONFIG_NSH_CMDOPT_HEXDUMP is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="ucans32k146"
+CONFIG_ARCH_BOARD_UCANS32K146=y
+CONFIG_ARCH_CHIP="s32k1xx"
+CONFIG_ARCH_CHIP_S32K146=y
+CONFIG_ARCH_CHIP_S32K14X=y
+CONFIG_ARCH_CHIP_S32K1XX=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_BOARD_LOOPSPERMSEC=6667
+CONFIG_BUILTIN=y
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_CONTROLSE=y
+CONFIG_CRYPTO_CONTROLSE_STACKSIZE=5120
+CONFIG_CRYPTO_MBEDTLS=y
+CONFIG_DEBUG_FULLOPT=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DEV_SE05X=y
+CONFIG_EXAMPLES_HELLO=y
+CONFIG_FS_PROCFS=y
+CONFIG_HAVE_CXX=y
+CONFIG_HAVE_CXXINITIALIZE=y
+CONFIG_I2C=y
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_LPUART1_SERIAL_CONSOLE=y
+CONFIG_MBEDTLS_SSL_DTLS_CONNECTION_ID=y
+CONFIG_MBEDTLS_SSL_PROTO_DTLS=y
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_READLINE=y
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=126976
+CONFIG_RAM_START=0x1fff0000
+CONFIG_RAW_BINARY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_S32K1XX_LPI2C0=y
+CONFIG_S32K1XX_LPUART1=y
+CONFIG_SCHED_WAITPID=y
+CONFIG_START_DAY=6
+CONFIG_START_MONTH=9
+CONFIG_START_YEAR=2021
+CONFIG_SYMTAB_ORDEREDBYNAME=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_TESTING_SETEST=y
+CONFIG_TESTING_SETEST_STACKSIZE=4096
diff --git a/boards/arm/s32k1xx/ucans32k146/src/Makefile 
b/boards/arm/s32k1xx/ucans32k146/src/Makefile
index 211ea89471..edbb015b4d 100644
--- a/boards/arm/s32k1xx/ucans32k146/src/Makefile
+++ b/boards/arm/s32k1xx/ucans32k146/src/Makefile
@@ -45,4 +45,8 @@ ifeq ($(CONFIG_S32K1XX_LPSPI),y)
 CSRCS += s32k1xx_spi.c
 endif
 
+ifeq ($(CONFIG_DEV_SE05X),y)
+CSRCS += s32k1xx_se05x.c
+endif
+
 include $(TOPDIR)/boards/Board.mk
diff --git a/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_bringup.c 
b/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_bringup.c
index ab8d102f6d..3efcab34a9 100644
--- a/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_bringup.c
+++ b/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_bringup.c
@@ -139,6 +139,17 @@ int s32k1xx_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_DEV_SE05X
+  /* Initialize SE05x driver */
+
+  ret = s32k1xx_se05x_initialize();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: s32k1xx_se05x_initialize() failed: %d\n",
+             ret);
+    }
+#endif
+
 #ifdef CONFIG_S32K1XX_LPSPI
   /* Initialize SPI driver */
 
diff --git a/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_se05x.c 
b/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_se05x.c
new file mode 100644
index 0000000000..a60b64d8ff
--- /dev/null
+++ b/boards/arm/s32k1xx/ucans32k146/src/s32k1xx_se05x.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * boards/arm/s32k1xx/ucans32k146/src/s32k1xx_se05x.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+#include <nuttx/compiler.h>
+#include <nuttx/config.h>
+
+#include "ucans32k146.h"
+#include <errno.h>
+#include <nuttx/crypto/se05x.h>
+#include <s32k1xx_lpi2c.h>
+#include <s32k1xx_pin.h>
+
+/****************************************************************************
+ * Private Functions Prototypes
+ ****************************************************************************/
+
+static bool board_se05x_enable(bool state);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct se05x_config_s se05x_config =
+{
+    .address = 0x48,
+    .frequency = 400000,
+    .set_enable_pin = board_se05x_enable,
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static bool board_se05x_enable(bool state)
+{
+  s32k1xx_gpiowrite(GPIO_SE050_EN, state);
+  return true;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int weak_function s32k1xx_se05x_initialize()
+{
+  int ret;
+
+  struct i2c_master_s *lpi2c0 = s32k1xx_i2cbus_initialize(0);
+  ret = lpi2c0 == NULL ? -EPERM : 0;
+
+  if (ret == 0)
+    {
+      ret = se05x_register("/dev/se05x", lpi2c0, &se05x_config);
+    }
+
+  return ret;
+}
diff --git a/boards/arm/s32k1xx/ucans32k146/src/ucans32k146.h 
b/boards/arm/s32k1xx/ucans32k146/src/ucans32k146.h
index f33a1af748..968a34586f 100644
--- a/boards/arm/s32k1xx/ucans32k146/src/ucans32k146.h
+++ b/boards/arm/s32k1xx/ucans32k146/src/ucans32k146.h
@@ -117,5 +117,15 @@ int s32k1xx_i2cdev_initialize(void);
 
 int s32k1xx_spidev_initialize(void);
 
+/****************************************************************************
+ * Name: s32k1xx_se05x_initialize
+ *
+ * Description:
+ *   Initialize SE05x chip and register /dev/se05x
+ *
+ ****************************************************************************/
+
+int s32k1xx_se05x_initialize(void);
+
 #endif /* __ASSEMBLY__ */
 #endif /* __BOARDS_ARM_S32K1XX_UCANS32K146_SRC_UCANS32K146_H */
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig
index 27aa49ea59..668803e250 100644
--- a/drivers/crypto/Kconfig
+++ b/drivers/crypto/Kconfig
@@ -74,3 +74,60 @@ config DEV_URANDOM_ARCH
 
 endchoice # /dev/urandom algorithm
 endif # DEV_URANDOM
+
+menuconfig DEV_SE05X
+       bool "Enable secure element (SE05X)"
+       depends on I2C
+       depends on CRYPTO
+       default n
+       ---help---
+               Enable support for /dev/se05x secure element provided by NXP 
SE050
+               or SE051
+
+if DEV_SE05X
+
+choice
+       prompt "Channel communication interface"
+       default DEV_SE05X_PLAIN
+       ---help---
+               Select authentication method
+
+config DEV_SE05X_SCP03
+       bool "SCP03 secure channel (TBI)"
+       select CRYPTO_RANDOM_POOL
+       select CRYPTO_AES
+
+config DEV_SE05X_PLAIN
+       bool "plain communication"
+
+endchoice
+
+config DEV_SE05X_SCP03_KEY_FILE
+       string "SCP03 keys"
+       depends on DEV_SE05X_SCP03
+       default "/host/path/to/key_file"
+       ---help---
+               Specify file containing the keys needed with SCP03 channel 
authentication.
+               Location may be relative to the NuttX root folder. File should 
contain
+               the definitions for SCP03_ENC_KEY, SCP03_MAC_KEY and 
SCP03_DEK_KEY as
+               byte array initializers.
+
+choice SE05X_LOG_LEVEL
+       prompt "SE05x debug log level"
+       default SE05X_LOG_NONE
+       ---help---
+               The SE05x log is divided into the following levels: 
ERROR,WARNING,INFO,DEBUG.
+
+       config SE05X_LOG_NONE
+               bool "No output"
+       config SE05X_LOG_ERROR
+               bool "Error"
+       config SE05X_LOG_WARNING
+               bool "Warning"
+       config SE05X_LOG_INFO
+               bool "Info"
+       config SE05X_LOG_DEBUG
+               bool "Debug"
+endchoice
+
+endif #DEV_SE05X
diff --git a/drivers/crypto/Make.defs b/drivers/crypto/Make.defs
index 9f5a90f77e..dc2039bcda 100644
--- a/drivers/crypto/Make.defs
+++ b/drivers/crypto/Make.defs
@@ -24,6 +24,11 @@ ifneq ($(CONFIG_DEV_URANDOM_ARCH),y)
 endif
 endif
 
+ifeq ($(CONFIG_DEV_SE05X),y)
+  CSRCS += se05x.c
+  include crypto/pnt/Make.defs
+endif
+
 # Include crypto device driver build support
 
 DEPPATH += --dep-path crypto
diff --git a/drivers/crypto/pnt/.gitignore b/drivers/crypto/pnt/.gitignore
new file mode 100644
index 0000000000..2582672285
--- /dev/null
+++ b/drivers/crypto/pnt/.gitignore
@@ -0,0 +1,2 @@
+*.zip
+nano-package/
diff --git a/drivers/crypto/pnt/0001-fixed-i2c-port-selection.patch 
b/drivers/crypto/pnt/0001-fixed-i2c-port-selection.patch
new file mode 100644
index 0000000000..3d0b3d26ee
--- /dev/null
+++ b/drivers/crypto/pnt/0001-fixed-i2c-port-selection.patch
@@ -0,0 +1,48 @@
+From 9e5764fa78849d7125aa327838cbb8aab9f72a95 Mon Sep 17 00:00:00 2001
+From: Andre Heinemans <[email protected]>
+Date: Tue, 18 Oct 2022 12:59:38 +0200
+Subject: [PATCH 1/4] fixed i2c port selection
+
+---
+ lib/apdu/se05x_APDU_apis.h | 2 +-
+ lib/apdu/se05x_APDU_impl.c | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/lib/apdu/se05x_APDU_apis.h b/lib/apdu/se05x_APDU_apis.h
+index 544f065..38cf017 100644
+--- a/lib/apdu/se05x_APDU_apis.h
++++ b/lib/apdu/se05x_APDU_apis.h
+@@ -21,7 +21,7 @@
+  *
+  * @return     The sm status.
+  */
+-smStatus_t Se05x_API_SessionOpen(pSe05xSession_t session_ctx);
++smStatus_t Se05x_API_SessionOpen(pSe05xSession_t session_ctx, void 
*conn_context);
+ 
+ /** Se05x_API_SessionClose
+  *
+diff --git a/lib/apdu/se05x_APDU_impl.c b/lib/apdu/se05x_APDU_impl.c
+index 966aca0..4acfad7 100644
+--- a/lib/apdu/se05x_APDU_impl.c
++++ b/lib/apdu/se05x_APDU_impl.c
+@@ -35,7 +35,7 @@ bool Se05x_IsInValidRangeOfUID(uint32_t uid)
+     return FALSE;
+ }
+ 
+-smStatus_t Se05x_API_SessionOpen(pSe05xSession_t session_ctx)
++smStatus_t Se05x_API_SessionOpen(pSe05xSession_t session_ctx, void 
*conn_context)
+ {
+     size_t buff_len            = 0;
+     size_t tx_len              = 0;
+@@ -53,7 +53,7 @@ smStatus_t Se05x_API_SessionOpen(pSe05xSession_t session_ctx)
+ 
+     buff_len = sizeof(session_ctx->apdu_buffer);
+ 
+-    ret = smComT1oI2C_Init(&session_ctx->conn_context, NULL);
++    ret = smComT1oI2C_Init(&session_ctx->conn_context, conn_context);
+     ENSURE_OR_GO_CLEANUP(SM_OK == ret);
+ 
+     if (session_ctx->session_resume == 1) {
+-- 
+2.25.1
+
diff --git 
a/drivers/crypto/pnt/0002-Fixed-memory-management-in-lib-t1oi2c-phNxpEse_Api.c.patch
 
b/drivers/crypto/pnt/0002-Fixed-memory-management-in-lib-t1oi2c-phNxpEse_Api.c.patch
new file mode 100644
index 0000000000..32c735cf54
--- /dev/null
+++ 
b/drivers/crypto/pnt/0002-Fixed-memory-management-in-lib-t1oi2c-phNxpEse_Api.c.patch
@@ -0,0 +1,335 @@
+From 48fefd7d0b92b852de6250a37b615eb654dffaf7 Mon Sep 17 00:00:00 2001
+From: Andre Heinemans <[email protected]>
+Date: Wed, 22 Feb 2023 09:52:15 +0100
+Subject: [PATCH 2/4] Fixed memory management in lib/t1oi2c/phNxpEse_Api.c by
+ not using global memory anymore but take the buffer being allocated as a
+ precondition
+
+---
+ lib/apdu/smCom.c               | 12 ++++-
+ lib/t1oi2c/phNxpEse_Api.c      | 96 +++++++++++-----------------------
+ lib/t1oi2c/phNxpEse_Api.h      |  2 +-
+ lib/t1oi2c/phNxpEse_Internal.h |  1 +
+ 4 files changed, 43 insertions(+), 68 deletions(-)
+
+diff --git a/lib/apdu/smCom.c b/lib/apdu/smCom.c
+index 16eca5e..0fea95a 100644
+--- a/lib/apdu/smCom.c
++++ b/lib/apdu/smCom.c
+@@ -36,6 +36,10 @@ smStatus_t smComT1oI2C_Close(void *conn_ctx, uint8_t mode)
+     status = phNxpEse_close(conn_ctx);
+     ENSURE_OR_RETURN_ON_ERROR((status == ESESTATUS_SUCCESS), SM_NOT_OK);
+ 
++    if (conn_ctx != NULL) {
++        sm_free(conn_ctx);
++    }
++
+     SM_MUTEX_DEINIT(g_sm_mutex);
+ 
+     return SM_OK;
+@@ -47,7 +51,13 @@ smStatus_t smComT1oI2C_Init(void **conn_ctx, const char 
*pConnString)
+     phNxpEse_initParams initParams;
+     initParams.initMode = ESE_MODE_NORMAL;
+ 
+-    status = phNxpEse_open(conn_ctx, initParams, pConnString);
++    if (*conn_ctx != NULL) {
++        // conn_ctx not being NULL could indicate this function is
++        // called 2 times. Return error to prevent leaks
++        return SM_NOT_OK;
++    }
++    *conn_ctx = sm_malloc(sizeof(phNxpEse_Context_t));
++    status = phNxpEse_open(*conn_ctx, initParams, pConnString);
+     ENSURE_OR_RETURN_ON_ERROR((status == ESESTATUS_SUCCESS), SM_NOT_OK);
+ 
+     SM_MUTEX_INIT(g_sm_mutex);
+diff --git a/lib/t1oi2c/phNxpEse_Api.c b/lib/t1oi2c/phNxpEse_Api.c
+index a4565f3..01a757e 100644
+--- a/lib/t1oi2c/phNxpEse_Api.c
++++ b/lib/t1oi2c/phNxpEse_Api.c
+@@ -29,15 +29,6 @@ static int poll_sof_chained_delay = 0;
+ 
+ /*********************** Global Variables 
*************************************/
+ 
+-/* ESE Context structure */
+-phNxpEse_Context_t gnxpese_ctxt;
+-static uint8_t t10i2c_tempBuf[48] = {
+-    0,
+-};
+-phNxpEse_data gRsp = {
+-    0,
+-};
+-
+ 
/******************************************************************************
+  * Function         phNxpEse_init
+  *
+@@ -55,15 +46,15 @@ phNxpEse_data gRsp = {
+ ESESTATUS phNxpEse_init(void *conn_ctx, phNxpEse_initParams initParams, 
phNxpEse_data *AtrRsp)
+ {
+     ESESTATUS wConfigStatus         = ESESTATUS_SUCCESS;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+     bool_t status                   = FALSE;
+     phNxpEseProto7816InitParam_t protoInitParam;
+     phNxpEse_memset(&protoInitParam, 0x00, 
sizeof(phNxpEseProto7816InitParam_t));
+     protoInitParam.rnack_retry_limit = MAX_RNACK_RETRY_LIMIT;
+     protoInitParam.wtx_counter_limit = PH_PROTO_WTX_DEFAULT_COUNT;
+ 
+-    gRsp.p_data = AtrRsp->p_data;
+-    gRsp.len    = AtrRsp->len;
++    nxpese_ctxt->p_read_buff = AtrRsp->p_data;
++    nxpese_ctxt->read_buff_len = AtrRsp->len;
+ 
+     if (ESE_MODE_NORMAL == initParams.initMode) /* TZ/Normal wired mode 
should come here*/
+     {
+@@ -101,25 +92,21 @@ ESESTATUS phNxpEse_init(void *conn_ctx, 
phNxpEse_initParams initParams, phNxpEse
+  *                  In case of failure returns other failure value.
+  *
+  
******************************************************************************/
+-ESESTATUS phNxpEse_open(void **conn_ctx, phNxpEse_initParams initParams, 
const char *pConnString)
++ESESTATUS phNxpEse_open(void *conn_ctx, phNxpEse_initParams initParams, const 
char *pConnString)
+ {
+     phPalEse_Config_t tPalConfig;
+-    phNxpEse_Context_t *pnxpese_ctxt = NULL;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+     ESESTATUS wConfigStatus          = ESESTATUS_SUCCESS;
+ 
+-    pnxpese_ctxt = &gnxpese_ctxt;
+-    phNxpEse_memset(pnxpese_ctxt, 0, sizeof(phNxpEse_Context_t));
+-    if (conn_ctx != NULL) {
+-        *conn_ctx = pnxpese_ctxt;
+-    }
++    phNxpEse_memset(nxpese_ctxt, 0, sizeof(phNxpEse_Context_t));
+ 
+     /*When I2C channel is already opened return status as FAILED*/
+-    if (pnxpese_ctxt->EseLibStatus != ESE_STATUS_CLOSE) {
++    if (nxpese_ctxt->EseLibStatus != ESE_STATUS_CLOSE) {
+         T_SMLOG_E(" Session already opened");
+         return ESESTATUS_BUSY;
+     }
+ 
+-    phNxpEse_memset(pnxpese_ctxt, 0x00, sizeof(phNxpEse_Context_t));
++    phNxpEse_memset(nxpese_ctxt, 0x00, sizeof(phNxpEse_Context_t));
+     phNxpEse_memset(&tPalConfig, 0x00, sizeof(tPalConfig));
+ 
+     tPalConfig.pDevName = (int8_t *)pConnString; //"/dev/p73"; /*RFU*/
+@@ -130,18 +117,18 @@ ESESTATUS phNxpEse_open(void **conn_ctx, 
phNxpEse_initParams initParams, const c
+         goto clean_and_return;
+     }
+     /* Copying device handle to ESE Lib context*/
+-    pnxpese_ctxt->pDevHandle = tPalConfig.pDevHandle;
++    nxpese_ctxt->pDevHandle = tPalConfig.pDevHandle;
+     /* STATUS_OPEN */
+-    pnxpese_ctxt->EseLibStatus = ESE_STATUS_OPEN;
+-    phNxpEse_memcpy(&pnxpese_ctxt->initParams, &initParams, 
sizeof(phNxpEse_initParams));
++    nxpese_ctxt->EseLibStatus = ESE_STATUS_OPEN;
++    phNxpEse_memcpy(&nxpese_ctxt->initParams, &initParams, 
sizeof(phNxpEse_initParams));
+     return wConfigStatus;
+ 
+ clean_and_return:
+-    if (NULL != pnxpese_ctxt->pDevHandle) {
+-        phPalEse_i2c_close(pnxpese_ctxt->pDevHandle);
+-        phNxpEse_memset(pnxpese_ctxt, 0x00, sizeof(phNxpEse_Context_t));
++    if (NULL != nxpese_ctxt->pDevHandle) {
++        phPalEse_i2c_close(nxpese_ctxt->pDevHandle);
++        phNxpEse_memset(nxpese_ctxt, 0x00, sizeof(phNxpEse_Context_t));
+     }
+-    pnxpese_ctxt->EseLibStatus = ESE_STATUS_CLOSE;
++    nxpese_ctxt->EseLibStatus = ESE_STATUS_CLOSE;
+     return ESESTATUS_FAILED;
+ }
+ 
+@@ -162,15 +149,12 @@ ESESTATUS phNxpEse_Transceive(void *conn_ctx, 
phNxpEse_data *pCmd, phNxpEse_data
+ {
+     ESESTATUS status                = ESESTATUS_FAILED;
+     bool_t bStatus                  = FALSE;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+ 
+     if ((NULL == pCmd) || (NULL == pRsp)) {
+         return ESESTATUS_INVALID_PARAMETER;
+     }
+ 
+-    gRsp.p_data = pRsp->p_data;
+-    gRsp.len    = pRsp->len;
+-
+     if ((pCmd->len == 0) || pCmd->p_data == NULL) {
+         T_SMLOG_E(" phNxpEse_Transceive - Invalid Parameter no data");
+         return ESESTATUS_INVALID_PARAMETER;
+@@ -218,7 +202,7 @@ ESESTATUS phNxpEse_Transceive(void *conn_ctx, 
phNxpEse_data *pCmd, phNxpEse_data
+ ESESTATUS phNxpEse_reset(void *conn_ctx)
+ {
+     ESESTATUS status                = ESESTATUS_FAILED;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+     //bool_t bStatus = phNxpEseProto7816_IntfReset(&AtrRsp);
+     status = phNxpEse_chipReset((void *)nxpese_ctxt);
+     if (status != ESESTATUS_SUCCESS) {
+@@ -241,7 +225,7 @@ ESESTATUS phNxpEse_reset(void *conn_ctx)
+ ESESTATUS phNxpEse_EndOfApdu(void *conn_ctx)
+ {
+     ESESTATUS status                = ESESTATUS_SUCCESS;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+     bool_t bStatus                  = phNxpEseProto7816_Close((void 
*)nxpese_ctxt);
+     if (!bStatus) {
+         status = ESESTATUS_FAILED;
+@@ -263,7 +247,7 @@ ESESTATUS phNxpEse_chipReset(void *conn_ctx)
+ {
+     ESESTATUS status                = ESESTATUS_SUCCESS;
+     bool_t bStatus                  = FALSE;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+     bStatus                         = phNxpEseProto7816_Reset();
+     if (!bStatus) {
+         status = ESESTATUS_FAILED;
+@@ -294,15 +278,11 @@ ESESTATUS phNxpEse_deInit(void *conn_ctx)
+ {
+     ESESTATUS status = ESESTATUS_SUCCESS;
+     //bool_t bStatus = FALSE;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
+-    /*bStatus = phNxpEseProto7816_ResetProtoParams();
+-    if(!bStatus)
+-    {
+-        status = ESESTATUS_FAILED;
+-    }*/
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
++
+     phPalEse_i2c_close(nxpese_ctxt->pDevHandle);
+     phNxpEse_memset(nxpese_ctxt, 0x00, sizeof(*nxpese_ctxt));
+-    //status= phNxpEse_close();
++
+     return status;
+ }
+ 
+@@ -320,7 +300,7 @@ ESESTATUS phNxpEse_deInit(void *conn_ctx)
+ ESESTATUS phNxpEse_close(void *conn_ctx)
+ {
+     ESESTATUS status                = ESESTATUS_SUCCESS;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+ 
+     if ((ESE_STATUS_CLOSE == nxpese_ctxt->EseLibStatus)) {
+         T_SMLOG_E(" %s ESE Not Initialized previously ", __FUNCTION__);
+@@ -328,7 +308,6 @@ ESESTATUS phNxpEse_close(void *conn_ctx)
+     }
+ 
+     phPalEse_i2c_close(nxpese_ctxt->pDevHandle);
+-    phNxpEse_memset(nxpese_ctxt, 0x00, sizeof(*nxpese_ctxt));
+     T_SMLOG_D("phNxpEse_close - ESE Context deinit completed");
+     /* Return success always */
+     return status;
+@@ -350,12 +329,11 @@ ESESTATUS phNxpEse_close(void *conn_ctx)
+ void phNxpEse_clearReadBuffer(void *conn_ctx)
+ {
+     int ret                         = -1;
+-    uint8_t *readBuf                = &t10i2c_tempBuf[0]; //[MAX_APDU_BUFFER];
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+ 
+     T_SMLOG_D("%s Enter ..", __FUNCTION__);
+ 
+-    ret = phPalEse_i2c_read(nxpese_ctxt->pDevHandle, readBuf, 
sizeof(t10i2c_tempBuf));
++    ret = phPalEse_i2c_read(nxpese_ctxt->pDevHandle, 
nxpese_ctxt->p_read_buff, nxpese_ctxt->read_buff_len);
+     if (ret < 0) {
+         /* Do nothing as nothing to read*/
+     }
+@@ -385,21 +363,15 @@ ESESTATUS phNxpEse_read(void *conn_ctx, uint32_t 
*data_len, uint8_t **pp_data)
+     ESESTATUS status                = ESESTATUS_FAILED;
+     int ret                         = -1;
+     uint8_t rspBufLen               = 0;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+ 
+     T_SMLOG_D("%s Enter ..", __FUNCTION__);
+ 
+     ENSURE_OR_GO_EXIT(data_len != NULL);
+     ENSURE_OR_GO_EXIT(pp_data != NULL);
+ 
+-    if (gRsp.p_data == NULL || gRsp.len == 0) {
+-        *pp_data  = &t10i2c_tempBuf[0];
+-        rspBufLen = sizeof(t10i2c_tempBuf);
+-    }
+-    else {
+-        *pp_data  = gRsp.p_data;
+-        rspBufLen = gRsp.len;
+-    }
++      *pp_data  = nxpese_ctxt->p_read_buff;
++      rspBufLen = nxpese_ctxt->read_buff_len;
+ 
+     ret = phNxpEse_readPacket((void *)nxpese_ctxt, nxpese_ctxt->pDevHandle, 
*pp_data, rspBufLen);
+     if (ret < 0) {
+@@ -417,8 +389,6 @@ ESESTATUS phNxpEse_read(void *conn_ctx, uint32_t 
*data_len, uint8_t **pp_data)
+         status = ESESTATUS_SUCCESS;
+     }
+ exit:
+-    gRsp.p_data = NULL;
+-    gRsp.len    = 0;
+     return status;
+ }
+ 
+@@ -442,7 +412,7 @@ static int phNxpEse_readPacket(void *conn_ctx, void 
*pDevHandle, uint8_t *pBuffe
+     int ret         = -1;
+     int sof_counter = 0; /* one read may take 1 ms*/
+     int total_count = 0, numBytesToRead = 0, headerIndex = 0;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+ 
+     ENSURE_OR_GO_EXIT(pBuffer != NULL);
+     memset(pBuffer, 0, nNbBytesToRead);
+@@ -578,7 +548,7 @@ ESESTATUS phNxpEse_WriteFrame(void *conn_ctx, uint32_t 
data_len, const uint8_t *
+ {
+     ESESTATUS status                = ESESTATUS_INVALID_PARAMETER;
+     int32_t dwNoBytesWrRd           = 0;
+-    phNxpEse_Context_t *nxpese_ctxt = (conn_ctx == NULL) ? &gnxpese_ctxt : 
(phNxpEse_Context_t *)conn_ctx;
++    phNxpEse_Context_t *nxpese_ctxt = (phNxpEse_Context_t *)conn_ctx;
+ 
+     /* Create local copy of cmd_data */
+     T_SMLOG_D("%s Enter ..", __FUNCTION__);
+@@ -709,9 +679,6 @@ ESESTATUS phNxpEse_getAtr(void *conn_ctx, phNxpEse_data 
*pRsp)
+ {
+     bool_t status = FALSE;
+ 
+-    gRsp.p_data = pRsp->p_data;
+-    gRsp.len    = pRsp->len;
+-
+     status = phNxpEseProto7816_GetAtr(conn_ctx, pRsp);
+     if (status == FALSE) {
+         T_SMLOG_E("%s Get ATR Failed ", __FUNCTION__);
+@@ -736,9 +703,6 @@ ESESTATUS phNxpEse_getCip(void *conn_ctx, phNxpEse_data 
*pRsp)
+ {
+     bool_t status = FALSE;
+ 
+-    gRsp.p_data = pRsp->p_data;
+-    gRsp.len    = pRsp->len;
+-
+     status = phNxpEseProto7816_GetCip(conn_ctx, pRsp);
+     if (status == FALSE) {
+         T_SMLOG_E("%s Get CIP Failed ", __FUNCTION__);
+diff --git a/lib/t1oi2c/phNxpEse_Api.h b/lib/t1oi2c/phNxpEse_Api.h
+index 3d5224d..688c84b 100644
+--- a/lib/t1oi2c/phNxpEse_Api.h
++++ b/lib/t1oi2c/phNxpEse_Api.h
+@@ -52,7 +52,7 @@ typedef struct phNxpEse_initParams
+ } phNxpEse_initParams;
+ 
+ ESESTATUS phNxpEse_init(void *conn_ctx, phNxpEse_initParams initParams, 
phNxpEse_data *AtrRsp);
+-ESESTATUS phNxpEse_open(void **conn_ctx, phNxpEse_initParams initParams, 
const char *pConnString);
++ESESTATUS phNxpEse_open(void *conn_ctx, phNxpEse_initParams initParams, const 
char *pConnString);
+ ESESTATUS phNxpEse_Transceive(void *conn_ctx, phNxpEse_data *pCmd, 
phNxpEse_data *pRsp);
+ ESESTATUS phNxpEse_deInit(void *conn_ctx);
+ ESESTATUS phNxpEse_close(void *conn_ctx);
+diff --git a/lib/t1oi2c/phNxpEse_Internal.h b/lib/t1oi2c/phNxpEse_Internal.h
+index f20d86a..a5e8a36 100644
+--- a/lib/t1oi2c/phNxpEse_Internal.h
++++ b/lib/t1oi2c/phNxpEse_Internal.h
+@@ -38,6 +38,7 @@ typedef enum
+ typedef struct phNxpEse_Context
+ {
+     uint8_t *p_read_buff;
++    uint8_t read_buff_len;
+     uint8_t cmd_len;
+     uint8_t *p_cmd_data;
+     phNxpEse_LibStatus EseLibStatus; /* Indicate if Ese Lib is open or closed 
*/
+-- 
+2.25.1
+
diff --git a/drivers/crypto/pnt/0003-Added-Se05x_API_ReadSize-to-API.patch 
b/drivers/crypto/pnt/0003-Added-Se05x_API_ReadSize-to-API.patch
new file mode 100644
index 0000000000..9e4923316f
--- /dev/null
+++ b/drivers/crypto/pnt/0003-Added-Se05x_API_ReadSize-to-API.patch
@@ -0,0 +1,196 @@
+From b88625c69a26cfc178cad2e1430d53c8f01be6b0 Mon Sep 17 00:00:00 2001
+From: Andre Heinemans <[email protected]>
+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
+
diff --git 
a/drivers/crypto/pnt/0004-Restored-delay-at-i2c-read-and-write-retries.patch 
b/drivers/crypto/pnt/0004-Restored-delay-at-i2c-read-and-write-retries.patch
new file mode 100644
index 0000000000..0a86a764fb
--- /dev/null
+++ b/drivers/crypto/pnt/0004-Restored-delay-at-i2c-read-and-write-retries.patch
@@ -0,0 +1,36 @@
+From 592b71399937c8a4b30e15c1a3ec15c8b6bb883a Mon Sep 17 00:00:00 2001
+From: Andre Heinemans <[email protected]>
+Date: Wed, 22 Feb 2023 09:34:38 +0100
+Subject: [PATCH 4/4] Restored delay at i2c read and write retries
+
+---
+ lib/t1oi2c/phNxpEsePal_i2c.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/lib/t1oi2c/phNxpEsePal_i2c.c b/lib/t1oi2c/phNxpEsePal_i2c.c
+index 8e4c6bc..4bb4301 100644
+--- a/lib/t1oi2c/phNxpEsePal_i2c.c
++++ b/lib/t1oi2c/phNxpEsePal_i2c.c
+@@ -124,8 +124,7 @@ int phPalEse_i2c_read(void *pDevHandle, uint8_t *pBuffer, 
int nNbBytesToRead)
+             if ((ret == I2C_NACK_ON_ADDRESS) && (retryCount < 
MAX_RETRY_COUNT)) {
+                 retryCount++;
+                 /* 1ms delay to give ESE polling delay */
+-                /*i2c driver back off delay is providing 1ms wait time so 
ignoring waiting time at this level*/
+-                //sm_sleep(ESE_POLL_DELAY_MS);
++                sm_sleep(ESE_POLL_DELAY_MS);
+                 T_SMLOG_D("_i2c_read() failed. Going to retry, counter:%d  
!", retryCount);
+                 continue;
+             }
+@@ -167,8 +166,7 @@ int phPalEse_i2c_write(void *pDevHandle, uint8_t *pBuffer, 
int nNbBytesToWrite)
+             if ((ret == I2C_NACK_ON_ADDRESS) && (retryCount < 
MAX_RETRY_COUNT)) {
+                 retryCount++;
+                 /* 1ms delay to give ESE polling delay */
+-                /*i2c driver back off delay is providing 1ms wait time so 
ignoring waiting time at this level*/
+-                //sm_sleep(ESE_POLL_DELAY_MS);
++                sm_sleep(ESE_POLL_DELAY_MS);
+                 T_SMLOG_D("_i2c_write() failed. Going to retry, counter:%d  
!", retryCount);
+                 continue;
+             }
+-- 
+2.25.1
+
diff --git a/drivers/crypto/pnt/Make.defs b/drivers/crypto/pnt/Make.defs
new file mode 100644
index 0000000000..8798b65e3c
--- /dev/null
+++ b/drivers/crypto/pnt/Make.defs
@@ -0,0 +1,77 @@
+############################################################################
+# drivers/crypto/pnt/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+PNT_GIT_COMMIT_HASH = d7323c25d967edb0ff1957459586850f447eb8c5
+PNT_DOWNLOAD_URL = 
https://github.com/NXPPlugNTrust/nano-package/archive/$(PNT_GIT_COMMIT_HASH).zip
+PNT_WRAPPER_DIR = crypto/pnt
+PNT_NANO_ZIP = $(PNT_WRAPPER_DIR)/pnt_$(PNT_GIT_COMMIT_HASH).zip
+PNT_NANO_DIR = $(PNT_WRAPPER_DIR)/nano-package
+
+PNT_INCDIRS = \
+       -I. \
+       -I$(PNT_WRAPPER_DIR) \
+       -I$(PNT_NANO_DIR)/lib/apdu \
+       -I$(PNT_NANO_DIR)/lib/t1oi2c \
+
+CSRCS += \
+       $(PNT_WRAPPER_DIR)/pnt_se05x_api.c \
+       $(PNT_WRAPPER_DIR)/pnt_util.c \
+       $(PNT_WRAPPER_DIR)/sm_i2c.c \
+       $(PNT_WRAPPER_DIR)/sm_timer.c \
+       $(PNT_NANO_DIR)/lib/apdu/smCom.c \
+       $(PNT_NANO_DIR)/lib/apdu/se05x_tlv.c \
+       $(PNT_NANO_DIR)/lib/apdu/se05x_APDU_impl.c \
+       $(PNT_NANO_DIR)/lib/t1oi2c/phNxpEse_Api.c \
+       $(PNT_NANO_DIR)/lib/t1oi2c/phNxpEseProto7816_3.c \
+       $(PNT_NANO_DIR)/lib/t1oi2c/phNxpEsePal_i2c.c \
+
+ifeq ($(CONFIG_DEV_SE05X_SCP03),y)
+       PNT_INCDIRS += -I$(PNT_NANO_DIR)/lib/apdu/scp03
+       CFLAGS += DWITH_PLATFORM_SCP03
+       CSRCS += hcrypto.c $(PNT_NANO_DIR)/lib/apdu/scp03/se05x_scp03.c
+endif
+
+CFLAGS += $(PNT_INCDIRS) -DT1oI2C -DT1oI2C_UM11225 -DAX_EMBEDDED=0
+
+UNPACK ?= unzip -q -o
+
+PATCH ?= patch -p1
+
+$(PNT_NANO_ZIP):
+       @echo "Downloading: $(PNT_DOWNLOAD_URL)"
+       $(Q) curl -o $(PNT_NANO_ZIP) -L $(PNT_DOWNLOAD_URL)
+
+$(PNT_NANO_DIR): $(PNT_NANO_ZIP)
+       @echo "Unpacking: $(PNT_NANO_ZIP) -> $(PNT_NANO_DIR)"
+       $(Q) $(UNPACK) $(PNT_NANO_ZIP) -d $(PNT_WRAPPER_DIR)
+       $(call DELDIR, $(PNT_NANO_DIR))
+       $(Q) mv -T $(PNT_NANO_DIR)-$(PNT_GIT_COMMIT_HASH) $(PNT_NANO_DIR)
+       $(Q) $(foreach PATCH_FILE, $(sort $(wildcard 
$(PNT_WRAPPER_DIR)/*.patch)), $(PATCH) -d $(PNT_NANO_DIR) < $(PATCH_FILE);)
+
+context:: $(PNT_NANO_DIR)
+
+distclean::
+       $(call DELFILE, $(PNT_NANO_ZIP))
+       $(call DELDIR, $(PNT_NANO_DIR))
+
+# Include crypto device driver build support
+
+DEPPATH += --dep-path crypto
+CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)drivers$(DELIM)crypto$(DELIM)pnt}
diff --git a/drivers/crypto/pnt/pnt_se05x_api.c 
b/drivers/crypto/pnt/pnt_se05x_api.c
new file mode 100644
index 0000000000..01823e9150
--- /dev/null
+++ b/drivers/crypto/pnt/pnt_se05x_api.c
@@ -0,0 +1,344 @@
+/****************************************************************************
+ * drivers/crypto/pnt/pnt_se05x_api.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "pnt_se05x_api.h"
+
+#include "../se05x_internal.h"
+#include "pnt_util.h"
+#include "scp03_keys.h"
+#include <nuttx/kmalloc.h>
+#include <phNxpEse_Internal.h>
+#include <se05x_APDU_apis.h>
+#include <smCom.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SCP03_KEY_SIZE 16
+#define DATA_CHUNK_SIZE 100
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct pnt_handle
+{
+  Se05xSession_t session;
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const SE05x_ECSignatureAlgo_t
+    signature_algorithm_mapping[SE05X_ALGORITHM_SIZE] =
+{
+        kSE05x_ECSignatureAlgo_NA,      kSE05x_ECSignatureAlgo_PLAIN,
+        kSE05x_ECSignatureAlgo_SHA,     kSE05x_ECSignatureAlgo_SHA_224,
+        kSE05x_ECSignatureAlgo_SHA_256, kSE05x_ECSignatureAlgo_SHA_384,
+        kSE05x_ECSignatureAlgo_SHA_512
+};
+
+static const uint8_t scp03_enc_key[SCP03_KEY_SIZE] = SCP03_ENC_KEY;
+static const uint8_t scp03_mac_key[SCP03_KEY_SIZE] = SCP03_MAC_KEY;
+static const uint8_t scp03_dek_key[SCP03_KEY_SIZE] = SCP03_DEK_KEY;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static bool set_enable_pin(FAR struct se05x_dev_s *se05x, bool state)
+{
+  if (se05x->config->set_enable_pin == NULL)
+    {
+      return FALSE;
+    }
+
+  return se05x->config->set_enable_pin(state);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int pnt_se05x_open(FAR struct se05x_dev_s *se05x)
+{
+  se05x->pnt = kmm_malloc(sizeof(struct pnt_handle));
+  int ret = se05x->pnt != NULL ? 0 : -EIO;
+
+  if (ret == 0)
+    {
+      memset(&(se05x->pnt->session), 0, sizeof(Se05xSession_t));
+
+      se05x->pnt->session.pScp03_enc_key = (FAR uint8_t *)scp03_enc_key;
+      se05x->pnt->session.pScp03_mac_key = (FAR uint8_t *)scp03_mac_key;
+      se05x->pnt->session.pScp03_dek_key = (FAR uint8_t *)scp03_dek_key;
+      se05x->pnt->session.scp03_enc_key_len = SCP03_KEY_SIZE;
+      se05x->pnt->session.scp03_mac_key_len = SCP03_KEY_SIZE;
+      se05x->pnt->session.scp03_dek_key_len = SCP03_KEY_SIZE;
+      ret = set_enable_pin(se05x, true) ? 0 : -EIO;
+    }
+
+  if (ret == 0)
+    {
+      se05x->pnt->session.skip_applet_select = 0;
+      se05x->pnt->session.session_resume = 0;
+      smStatus_t status =
+          Se05x_API_SessionOpen(&(se05x->pnt->session), se05x);
+      ret = status == SM_OK ? 0 : -EIO;
+    }
+
+  /* if error */
+
+  if (ret < 0)
+    {
+      if (se05x->pnt->session.conn_context != NULL)
+        {
+          kmm_free(se05x->pnt->session.conn_context);
+        }
+
+      if (se05x->pnt != NULL)
+        {
+          kmm_free(se05x->pnt);
+        }
+    }
+
+  return ret;
+}
+
+void pnt_se05x_close(FAR struct se05x_dev_s *se05x)
+{
+  Se05x_API_SessionClose(&(se05x->pnt->session));
+  (void)set_enable_pin(se05x, FALSE);
+  kmm_free(se05x->pnt);
+}
+
+int pnt_se05x_get_info(FAR struct se05x_dev_s *se05x,
+                       FAR struct se05x_info_s *se05x_info)
+{
+  bool result = select_card_manager(&(se05x->pnt->session));
+  identify_rsp_t identify_response;
+  if (result)
+    {
+      result = se05x_identify(&(se05x->pnt->session), &identify_response);
+    }
+
+  if (result)
+    {
+      se05x_info->oef_id = (identify_response.configuration_id[2] << 8) +
+                           identify_response.configuration_id[3];
+    }
+
+  return result ? 0 : -EIO;
+}
+
+int pnt_se05x_get_uid(FAR struct se05x_dev_s *se05x,
+                      FAR struct se05x_uid_s *uid)
+{
+  SE05x_Result_t dummy = kSE05x_Result_NA;
+  size_t uid_size = SE050_MODULE_UNIQUE_ID_LEN;
+
+  smStatus_t status = Se05x_API_CheckObjectExists(
+      &(se05x->pnt->session), KSE05X_APPLETRESID_UNIQUE_ID, &dummy);
+  int result = status == SM_OK ? 0 : -ENODATA;
+  if (result == 0)
+    {
+      status = Se05x_API_ReadObject(&(se05x->pnt->session),
+                                    KSE05X_APPLETRESID_UNIQUE_ID, 0,
+                                    (uint16_t)uid_size, uid->uid, &uid_size);
+      result = status == SM_OK ? 0 : -EIO;
+    }
+
+  return result;
+}
+
+int pnt_se05x_generate_keypair(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_generate_keypair_s *generate_keypair_args)
+{
+  smStatus_t status = Se05x_API_WriteECKey(
+      &(se05x->pnt->session), NULL, 0, generate_keypair_args->id,
+      kSE05x_ECCurve_NIST_P256, NULL, 0, NULL, 0, kSE05x_INS_NA,
+      kSE05x_KeyPart_Pair);
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_set_public_key(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_key_transmission_s *set_publickey_args)
+{
+  smStatus_t status = Se05x_API_WriteECKey(
+      &(se05x->pnt->session), NULL, 0, set_publickey_args->entry.id,
+      kSE05x_ECCurve_NIST_P256, NULL, 0, set_publickey_args->content.buffer,
+      set_publickey_args->content.buffer_size, kSE05x_INS_NA,
+      kSE05x_KeyPart_Public);
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_set_data(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_key_transmission_s *set_publickey_args)
+{
+  size_t remainder = set_publickey_args->content.buffer_size;
+  smStatus_t status = SM_OK;
+  uint16_t offset = 0;
+  bool first_cycle = TRUE;
+
+  while ((remainder > 0) && (status == SM_OK))
+    {
+      size_t chunk_size =
+          remainder > DATA_CHUNK_SIZE ? DATA_CHUNK_SIZE : remainder;
+      status = Se05x_API_WriteBinary(
+          &(se05x->pnt->session), NULL, set_publickey_args->entry.id, offset,
+          first_cycle ? set_publickey_args->content.buffer_size : 0,
+          set_publickey_args->content.buffer + offset, chunk_size);
+      remainder -= chunk_size;
+      offset += chunk_size;
+      first_cycle = FALSE;
+    }
+
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_get_key(FAR struct se05x_dev_s *se05x,
+                      FAR struct se05x_key_transmission_s *get_key_args)
+{
+  get_key_args->content.buffer_content_size =
+      get_key_args->content.buffer_size;
+  smStatus_t status =
+      Se05x_API_ReadObject(&(se05x->pnt->session), get_key_args->entry.id, 0,
+                           0, get_key_args->content.buffer,
+                           &get_key_args->content.buffer_content_size);
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_get_data(FAR struct se05x_dev_s *se05x,
+                       FAR struct se05x_key_transmission_s *get_key_args)
+{
+  uint16_t remainder;
+  smStatus_t status = Se05x_API_ReadSize(&(se05x->pnt->session),
+                                         get_key_args->entry.id, &remainder);
+
+  if (remainder > get_key_args->content.buffer_size)
+    {
+      status = SM_NOT_OK;
+    }
+
+  uint16_t offset = 0;
+
+  while ((remainder > 0) && (status == SM_OK))
+    {
+      size_t chunk_size =
+          remainder > DATA_CHUNK_SIZE ? DATA_CHUNK_SIZE : remainder;
+      status = Se05x_API_ReadObject(
+          &(se05x->pnt->session), get_key_args->entry.id, offset, chunk_size,
+          get_key_args->content.buffer + offset, &chunk_size);
+      remainder -= chunk_size;
+      offset += chunk_size;
+    }
+
+  get_key_args->content.buffer_content_size = offset;
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_delete_key(FAR struct se05x_dev_s *se05x, uint32_t key_id)
+{
+  smStatus_t status =
+      Se05x_API_DeleteSecureObject(&(se05x->pnt->session), key_id);
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_derive_key(FAR struct se05x_dev_s *se05x,
+                         FAR struct se05x_derive_key_s *derive_key_args)
+{
+  uint8_t public_key[65];
+  size_t public_key_size = sizeof(public_key);
+  smStatus_t status = Se05x_API_ReadObject(&(se05x->pnt->session),
+                                           derive_key_args->public_key_id, 0,
+                                           0, public_key, &public_key_size);
+
+  if (status == SM_OK)
+    {
+      derive_key_args->content.buffer_content_size =
+          derive_key_args->content.buffer_size;
+      status = Se05x_API_ECDHGenerateSharedSecret(
+          &(se05x->pnt->session), derive_key_args->private_key_id,
+          public_key, public_key_size, derive_key_args->content.buffer,
+          &derive_key_args->content.buffer_content_size);
+    }
+
+  return status == SM_OK ? 0 : -EIO;
+}
+
+int pnt_se05x_create_signature(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_signature_s *create_signature_args)
+{
+  create_signature_args->signature.buffer_content_size =
+      create_signature_args->signature.buffer_size;
+  int result =
+      Se05x_API_ECDSASign(
+          &(se05x->pnt->session), create_signature_args->key_id,
+          signature_algorithm_mapping[create_signature_args->algorithm],
+          create_signature_args->tbs.buffer,
+          create_signature_args->tbs.buffer_content_size,
+          create_signature_args->signature.buffer,
+          &create_signature_args->signature.buffer_content_size) == SM_OK
+          ? 0
+          : -EIO;
+
+  return result;
+}
+
+int pnt_se05x_verify_signature(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_signature_s *verify_signature_args)
+{
+  SE05x_Result_t se05x_result;
+  int result =
+      Se05x_API_ECDSAVerify(
+          &(se05x->pnt->session), verify_signature_args->key_id,
+          signature_algorithm_mapping[verify_signature_args->algorithm],
+          verify_signature_args->tbs.buffer,
+          verify_signature_args->tbs.buffer_content_size,
+          verify_signature_args->signature.buffer,
+          verify_signature_args->signature.buffer_content_size,
+          &se05x_result) == SM_OK
+          ? 0
+          : -EACCES;
+
+  if ((result == 0) && (se05x_result != kSE05x_Result_SUCCESS))
+    {
+      result = -EIO;
+    }
+
+  return result;
+}
diff --git a/drivers/crypto/pnt/pnt_se05x_api.h 
b/drivers/crypto/pnt/pnt_se05x_api.h
new file mode 100644
index 0000000000..b3e8d40450
--- /dev/null
+++ b/drivers/crypto/pnt/pnt_se05x_api.h
@@ -0,0 +1,299 @@
+/****************************************************************************
+ * drivers/crypto/pnt/pnt_se05x_api.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_PNT_PNT_API_H_
+#define __INCLUDE_NUTTX_CRYPTO_PNT_PNT_API_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/crypto/se05x.h>
+#include <stdbool.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+struct se05x_dev_s;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+int pnt_se05x_open(FAR struct se05x_dev_s *se05x);
+void pnt_se05x_close(FAR struct se05x_dev_s *se05x);
+
+/****************************************************************************
+ * Name: pnt_se05x_get_info
+ *
+ * Description:
+ *   Get information on the variant of the SE05x
+ *
+ * Input Parameters:
+ *   se05x        - Ptr to se05x device struct
+ *   se05x_info   - Ptr to storage of retrieved SE050 info.
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_get_info(FAR struct se05x_dev_s *se05x,
+                       FAR struct se05x_info_s *se05x_info);
+
+/****************************************************************************
+ * Name: pnt_se05x_get_uid
+ *
+ * Description:
+ *   Get the unique id of the SE05x
+ *
+ * Input Parameters:
+ *   se05x        - Ptr to se05x device struct
+ *   se05x_uid    - Ptr to storage for the unique id
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_get_uid(FAR struct se05x_dev_s *se05x,
+                      FAR struct se05x_uid_s *uid);
+
+/****************************************************************************
+ * Name: pnt_se05x_generate_keypair
+ *
+ * Description:
+ *   Generate a private/public keypair.
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   generate_keypair_args - Ptr to arguments needed to generate keypair
+ *   (input)
+ *     ->id               id where to store key
+ *     ->cipher           cipher type
+ *                        (defaults to se05x_asym_cipher_EC_NIST_P_256)
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_generate_keypair(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_generate_keypair_s *generate_keypair_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_set_public_key
+ *
+ * Description:
+ *   Store key into keystore. Key must be in raw format
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   set_publickey_args    - Ptr to arguments needed to set public key
+ *   (input)
+ *     ->entry.id         id where to store key
+ *     ->entry.cipher     cipher type
+ *                        (defaults to se05x_asym_cipher_EC_NIST_P_256)
+ *     ->content          assign with public key
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_set_public_key(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_key_transmission_s *set_publickey_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_set_data
+ *
+ * Description:
+ *   Store data into keystore.
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   set_publickey_args    - Ptr to arguments needed to set data
+ *   (input)
+ *     ->entry.id         id where to store key
+ *     ->entry.cipher     (not used)
+ *     ->content          assign with data
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_set_data(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_key_transmission_s *set_publickey_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_get_key
+ *
+ * Description:
+ *   Get the key from keystore. Key is returned in raw format
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   get_publickey_args    - Ptr to arguments needed to get public key
+ *   (input)
+ *     ->entry.id        id where to get key
+ *   (output)
+ *     ->entry.type      key type
+ *     ->content         public key will be copied into
+ *                       buffer. Must be allocated!
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_get_key(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_key_transmission_s *get_publickey_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_get_data
+ *
+ * Description:
+ *   Get data from keystore. The returned data is raw data
+ *
+ * Input Parameters:
+ *   se05x               - Ptr to se05x device struct
+ *   get_data_args       - Ptr to arguments needed to get public key
+ *   (input)
+ *     ->entry.id        id where to get key
+ *   (output)
+ *     ->entry.type      key type
+ *     ->content         data will be copied into
+ *                       buffer. Must be allocated!
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_get_data(FAR struct se05x_dev_s *se05x,
+                       FAR struct se05x_key_transmission_s *get_data_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_delete_key
+ *
+ * Description:
+ *   Delete key from keystore
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   key_id                - key ID
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_delete_key(FAR struct se05x_dev_s *se05x, uint32_t key_id);
+
+/****************************************************************************
+ * Name: pnt_se05x_derive_key
+ *
+ * Description:
+ *   Derive a symmetric key using a private key of an owned keypair and
+ *   a public key that is received from the peer.
+ *   Currently only keys derived from ecdsa keys are supported
+ *
+ * Input Parameters:
+ *   se05x              - Ptr to se05x device struct
+ *   derive_key_args    - Ptr to arguments needed to derive symmetric key
+ *   (input)
+ *     ->private_key_id  id of entry in keystore to get private key
+ *                       This entry may be a keypair
+ *     ->public_key_id   id of entry in keystore to get public key
+ *   (output)
+ *     ->content         symmetric key will be copied into
+ *                       buffer. Must be allocated! (>= 32 bytes)
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_derive_key(FAR struct se05x_dev_s *se05x,
+                         FAR struct se05x_derive_key_s *derive_key_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_create_signature
+ *
+ * Description:
+ *   Create a signature, using a hash value and a private key.
+ *   To create the signature the hash value is encrypted using the private
+ *key.
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   create_signature_args - Ptr to arguments needed to create signature
+ *   (input)
+ *     ->key_id          id where to get private key
+ *     ->algorithm       hash algorithm
+ *     ->tbs             digest
+ *   (output)
+ *     ->signature       the generated signature. Must be allocated!
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_create_signature(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_signature_s *create_signature_args);
+
+/****************************************************************************
+ * Name: pnt_se05x_verify_signature
+ *
+ * Description:
+ *   Verify a signature, using a hash value, a signature and a public key.
+ *   To verify the signature, the provided signature is decrypted using the
+ *   public key. The results in the original hash value which should be the
+ *   same as the provided hash value.
+ *
+ * Input Parameters:
+ *   se05x                 - Ptr to se05x device struct
+ *   verify_signature_args - Ptr to arguments needed to create signature
+ *   (input)
+ *     ->key_id          id where to get public key
+ *     ->algorithm       hash algorithm
+ *     ->tbs             digest
+ *     ->signature       the signature
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int pnt_se05x_verify_signature(
+    FAR struct se05x_dev_s *se05x,
+    FAR struct se05x_signature_s *verify_signature_args);
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_PNT_PNT_API_H_ */
diff --git a/drivers/crypto/pnt/pnt_util.c b/drivers/crypto/pnt/pnt_util.c
new file mode 100644
index 0000000000..4468497e81
--- /dev/null
+++ b/drivers/crypto/pnt/pnt_util.c
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * drivers/crypto/pnt/pnt_util.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "pnt_util.h"
+#include "smCom.h"
+#include <stddef.h>
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static smStatus_t t1oi2c_transceive(pSe05xSession_t session_ctx,
+                                    FAR uint8_t *tx, size_t tx_len,
+                                    FAR uint8_t *rx, size_t *rx_len)
+{
+  memcpy(session_ctx->apdu_buffer, tx, tx_len);
+  smStatus_t status = smComT1oI2C_TransceiveRaw(
+      session_ctx->conn_context, session_ctx->apdu_buffer, tx_len,
+      session_ctx->apdu_buffer, rx_len);
+
+  memcpy(rx, session_ctx->apdu_buffer, *rx_len);
+  return status;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+bool select_card_manager(pSe05xSession_t session_ctx)
+{
+  uint8_t tx_buf[5];
+
+  tx_buf[0] = CLA_ISO7816;
+  tx_buf[1] = INS_GP_SELECT;
+  tx_buf[2] = 4;
+  tx_buf[3] = 0;
+  tx_buf[4] = 0;
+
+  uint8_t response_data[50];
+  size_t response_data_size = sizeof(response_data);
+  smStatus_t status = t1oi2c_transceive(session_ctx, tx_buf, sizeof(tx_buf),
+                                        response_data, &response_data_size);
+  if (status == SM_OK && response_data_size >= 2)
+    {
+      uint16_t rv = response_data[response_data_size - 2];
+      rv <<= 8;
+      rv |= response_data[response_data_size - 1];
+      status = rv;
+    }
+
+  return status == SM_OK;
+}
+
+bool se05x_identify(pSe05xSession_t session_ctx,
+                    FAR identify_rsp_t *identify_response)
+{
+  const uint8_t cmd[] = {
+      CLA_GP_7816,     /* CLA '80' / '00' GlobalPlatform / ISO / IEC */
+      INS_GP_GET_DATA, /* INS 'CA' GET DATA(IDENTIFY) */
+      0x00,            /* P1 '00' High order tag value */
+      0xfe,            /* P2 'FE' Low order tag value - proprietary data */
+      0x02,            /* Lc '02' Length of data field */
+      0xdf,
+      0x28, /* Data 'DF28' Card identification data */
+      0x00  /* Le '00' Length of response data */
+  };
+
+  size_t identify_response_size = sizeof(identify_rsp_t);
+  smStatus_t status = t1oi2c_transceive(
+      session_ctx, (FAR uint8_t *)cmd, sizeof(cmd),
+      (FAR uint8_t *)identify_response, &identify_response_size);
+
+  return (status == SM_OK) &&
+         (identify_response_size == sizeof(identify_rsp_t));
+}
diff --git a/drivers/crypto/pnt/pnt_util.h b/drivers/crypto/pnt/pnt_util.h
new file mode 100644
index 0000000000..6ea74ca72e
--- /dev/null
+++ b/drivers/crypto/pnt/pnt_util.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * drivers/crypto/pnt/pnt_util.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_PNT_PNT_UTIL_H_
+#define __INCLUDE_NUTTX_CRYPTO_PNT_PNT_UTIL_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "se05x_types.h"
+#include <stdbool.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SE050_MODULE_UNIQUE_ID_LEN 18
+#define KSE05X_APPLETRESID_UNIQUE_ID 0x7fff0206
+#define CLA_ISO7816 (0x00)     /* ISO7816-4 defined CLA byte */
+#define CLA_GP_7816 (0x80)     /* GP 7816-4 defined CLA byte */
+#define INS_GP_SELECT (0xa4)   /* Global platform defined instruction */
+#define INS_GP_GET_DATA (0xcA) /* Global platform defined instruction */
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef struct
+{
+  uint8_t tag_value_proprietary_data;
+  uint8_t length_of_following_data;
+  uint8_t tag_card_identification_data[0x02];
+  uint8_t length_of_card_identification_data;
+  uint8_t tag_configuration_id;
+  uint8_t length_configuration_id;
+  uint8_t configuration_id[0x0c];
+  uint8_t tag_patch_id;
+  uint8_t length_patch_id;
+  uint8_t patch_id[0x08];
+  uint8_t tag_platform_build_id1;
+  uint8_t length_platform_build_id;
+  uint8_t platform_build_id[0x18];
+  uint8_t tag_fips_mode;
+  uint8_t length_fips_mode;
+  uint8_t fips_mode;
+  uint8_t tag_pre_perso_state;
+  uint8_t length_pre_perso_state;
+  uint8_t bitmask_of_pre_perso_state;
+  uint8_t tag_rom_id;
+  uint8_t length_rom_id;
+  uint8_t rom_id[0x08];
+  uint8_t status_word_sw_[0x02];
+} identify_rsp_t;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+bool select_card_manager(pSe05xSession_t session_ctx);
+bool se05x_identify(pSe05xSession_t session_ctx,
+        FAR identify_rsp_t *response);
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_PNT_PNT_UTIL_H_ */
diff --git a/drivers/crypto/pnt/scp03_keys.h b/drivers/crypto/pnt/scp03_keys.h
new file mode 100644
index 0000000000..0466a5eb06
--- /dev/null
+++ b/drivers/crypto/pnt/scp03_keys.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+ * drivers/crypto/pnt/scp03_keys.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_PNT_SCP03_KEYS_H_
+#define __INCLUDE_NUTTX_CRYPTO_PNT_SCP03_KEYS_H_
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SCP03_ENC_KEY                                                        \
+  {0xbd, 0x1d, 0xe2, 0x0a, 0x81, 0xea, 0xb2, 0xbf,                           \
+   0x3b, 0x70, 0x9a, 0x9d, 0x69, 0xa3, 0x12, 0x54};
+#define SCP03_MAC_KEY                                                        \
+  {0x9a, 0x76, 0x1b, 0x8d, 0xba, 0x6b, 0xed, 0xf2,                           \
+   0x27, 0x41, 0xe4, 0x5d, 0x8d, 0x42, 0x36, 0xf5};
+#define SCP03_DEK_KEY                                                        \
+  {0x9b, 0x99, 0x3b, 0x60, 0x0f, 0x1c, 0x64, 0xf5,                           \
+   0xad, 0xc0, 0x63, 0x19, 0x2a, 0x96, 0xc9, 0x47};
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_PNT_SCP03_KEYS_H_ */
diff --git a/drivers/crypto/pnt/sm_i2c.c b/drivers/crypto/pnt/sm_i2c.c
new file mode 100644
index 0000000000..775ae6c890
--- /dev/null
+++ b/drivers/crypto/pnt/sm_i2c.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * drivers/crypto/pnt/sm_i2c.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "sm_i2c.h"
+#include "../se05x_internal.h"
+#include <nuttx/crypto/se05x.h>
+#include <nuttx/i2c/i2c_master.h>
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static int se05x_i2c_write(FAR struct se05x_dev_s *priv,
+                           FAR const uint8_t *buffer, ssize_t buflen)
+{
+  struct i2c_msg_s msg;
+  int ret;
+
+  /* Setup for the transfer */
+
+  msg.frequency = priv->config->frequency;
+  msg.addr = priv->config->address;
+  msg.flags = 0;
+  msg.buffer = (FAR uint8_t *)buffer; /* Override const */
+  msg.length = buflen;
+
+  /* Then perform the transfer. */
+
+  ret = I2C_TRANSFER(priv->i2c, &msg, 1);
+  return (ret >= 0) ? OK : ret;
+}
+
+static int se05x_i2c_read(FAR struct se05x_dev_s *priv, FAR uint8_t *buffer,
+                          ssize_t buflen)
+{
+  struct i2c_msg_s msg;
+  int ret;
+
+  /* Setup for the transfer */
+
+  msg.frequency = priv->config->frequency;
+  msg.addr = priv->config->address;
+  msg.flags = I2C_M_READ;
+  msg.buffer = buffer;
+  msg.length = buflen;
+
+  /* Then perform the transfer. */
+
+  ret = I2C_TRANSFER(priv->i2c, &msg, 1);
+  return (ret >= 0) ? OK : ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: axI2CInit
+ *
+ * Description:
+ *   Initialize i2c (plug and trust mw hook)
+ *   pDevName should contain the private device struct
+ *
+ ****************************************************************************/
+
+unsigned int sm_i2c_init(FAR void **conn_ctx, FAR const char *dev_name)
+{
+  *conn_ctx = (FAR void *)dev_name;
+  return I2C_OK;
+}
+
+void sm_i2c_term(FAR void *conn_ctx, int mode)
+{
+  (void)conn_ctx;
+  (void)mode;
+}
+
+unsigned int sm_i2c_write(FAR void *conn_ctx, unsigned char bus,
+                          unsigned char addr, FAR unsigned char *tx,
+                          unsigned short tx_len)
+{
+  (void)bus;
+  int result = se05x_i2c_write(conn_ctx, tx, (ssize_t)tx_len);
+  return result == OK ? I2C_OK : I2C_FAILED;
+}
+
+unsigned int sm_i2c_read(FAR void *conn_ctx, uint8_t bus, uint8_t addr,
+                         FAR uint8_t *rx, unsigned short rx_len)
+{
+  (void)bus;
+  int result = se05x_i2c_read(conn_ctx, rx, (ssize_t)rx_len);
+  return result == OK ? I2C_OK : I2C_FAILED;
+}
diff --git a/drivers/crypto/pnt/sm_i2c.h b/drivers/crypto/pnt/sm_i2c.h
new file mode 100644
index 0000000000..3566f0f32a
--- /dev/null
+++ b/drivers/crypto/pnt/sm_i2c.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * drivers/crypto/pnt/sm_i2c.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_PNT_SM_I2C_H_
+#define __INCLUDE_NUTTX_CRYPTO_PNT_SM_I2C_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "se05x_types.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define axI2CInit sm_i2c_init
+#define axI2CTerm sm_i2c_term
+#define axI2CWrite sm_i2c_write
+#define axI2CRead sm_i2c_read
+
+#define I2C_IDLE 0
+#define I2C_STARTED 1
+#define I2C_RESTARTED 2
+#define I2C_REPEATED_START 3
+#define DATA_ACK 4
+#define DATA_NACK 5
+#define I2C_BUSY 6
+#define I2C_NO_DATA 7
+#define I2C_NACK_ON_ADDRESS 8
+#define I2C_NACK_ON_DATA 9
+#define I2C_ARBITRATION_LOST 10
+#define I2C_TIME_OUT 11
+#define I2C_OK 12
+#define I2C_FAILED 13
+#define I2C_BUS_0 (0)
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef unsigned int i2c_error_t;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+i2c_error_t sm_i2c_init(FAR void **conn_ctx, FAR const char *dev_name);
+void sm_i2c_term(FAR void *conn_ctx, int mode);
+i2c_error_t sm_i2c_write(FAR void *conn_ctx, unsigned char bus,
+                         unsigned char addr, FAR unsigned char *tx,
+                         unsigned short tx_len);
+i2c_error_t sm_i2c_read(FAR void *conn_ctx, unsigned char bus,
+                        unsigned char addr, FAR unsigned char *rx,
+                        unsigned short rx_len);
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_PNT_SM_I2C_H_ */
diff --git a/drivers/crypto/pnt/sm_port.h b/drivers/crypto/pnt/sm_port.h
new file mode 100644
index 0000000000..54970ff911
--- /dev/null
+++ b/drivers/crypto/pnt/sm_port.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+ * drivers/crypto/pnt/sm_port.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_PNT_SM_PORT_H_
+#define __INCLUDE_NUTTX_CRYPTO_PNT_SM_PORT_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <errno.h>
+#include <nuttx/config.h>
+#include <nuttx/kmalloc.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <syslog.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_SE05X_LOG_ERROR
+#define SE05X_LOG_LEVEL LOG_ERR
+#elif defined(CONFIG_SE05X_LOG_WARNING)
+#define SE05X_LOG_LEVEL LOG_WARNING
+#elif defined(CONFIG_SE05X_LOG_INFO)
+#define SE05X_LOG_LEVEL LOG_INFO
+#elif defined(CONFIG_SE05X_LOG_DEBUG)
+#define SE05X_LOG_LEVEL LOG_DEBUG
+#else
+#define SE05X_LOG_LEVEL LOG_EMERG
+#endif
+
+#if SE05X_LOG_LEVEL >= LOG_ERR
+#define SMLOG_E(...) syslog(LOG_ERR, __VA_ARGS__);
+#else
+#define SMLOG_E(...)
+#endif
+
+#if SE05X_LOG_LEVEL >= LOG_WARNING
+#define SMLOG_W(...) syslog(LOG_WARNING, __VA_ARGS__);
+#else
+#define SMLOG_W(...)
+#endif
+
+#if SE05X_LOG_LEVEL >= LOG_INFO
+#define SMLOG_I(...) syslog(LOG_INFO, __VA_ARGS__);
+#else
+#define SMLOG_I(...)
+#endif
+
+#if SE05X_LOG_LEVEL >= LOG_DEBUG
+#define SMLOG_D(...) syslog(LOG_DEBUG, __VA_ARGS__);
+#define SMLOG_AU8_D(BUF, LEN)                                                \
+  syslog(LOG_DEBUG, " :");                                                   \
+  for (size_t bufIndex = 0; bufIndex < LEN; bufIndex++)                      \
+    {                                                                        \
+      syslog(LOG_DEBUG, "%02x", BUF[bufIndex]);                              \
+    }                                                                        \
+  syslog(LOG_DEBUG, "\n")
+#define SMLOG_MAU8_D(MSG, BUF, LEN)                                          \
+  syslog(LOG_DEBUG, MSG);                                                    \
+  syslog(LOG_DEBUG, " :");                                                   \
+  for (size_t bufIndex = 0; bufIndex < LEN; bufIndex++)                      \
+    {                                                                        \
+      syslog(LOG_DEBUG, "%02x", BUF[bufIndex]);                              \
+    }                                                                        \
+  syslog(LOG_DEBUG, "\n")
+#else
+#define SMLOG_D(...)
+#define SMLOG_AU8_D(BUF, LEN)
+#define SMLOG_MAU8_D(MSG, BUF, LEN)
+#endif
+
+#define sm_malloc kmm_malloc
+#define sm_free kmm_free
+
+#define SM_MUTEX_DEFINE(x)
+#define SM_MUTEX_INIT(x)
+#define SM_MUTEX_DEINIT(x)
+#define SM_MUTEX_LOCK(x)
+#define SM_MUTEX_UNLOCK(x)
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_PNT_SM_PORT_H_ */
diff --git a/drivers/crypto/pnt/sm_timer.c b/drivers/crypto/pnt/sm_timer.c
new file mode 100644
index 0000000000..9d64497c05
--- /dev/null
+++ b/drivers/crypto/pnt/sm_timer.c
@@ -0,0 +1,36 @@
+/****************************************************************************
+ * drivers/crypto/pnt/sm_timer.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <unistd.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void sm_sleep(uint32_t msec)
+{
+  usleep(1000 * msec);
+}
diff --git a/drivers/crypto/pnt/sm_timer.h b/drivers/crypto/pnt/sm_timer.h
new file mode 100644
index 0000000000..e30d8bf1ea
--- /dev/null
+++ b/drivers/crypto/pnt/sm_timer.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+ * drivers/crypto/pnt/sm_timer.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_PNT_SM_TIMER_H_
+#define __INCLUDE_NUTTX_CRYPTO_PNT_SM_TIMER_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+void sm_sleep(uint32_t msec);
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_PNT_SM_TIMER_H_ */
diff --git a/drivers/crypto/se05x.c b/drivers/crypto/se05x.c
new file mode 100644
index 0000000000..f41b0a5fb6
--- /dev/null
+++ b/drivers/crypto/se05x.c
@@ -0,0 +1,266 @@
+/****************************************************************************
+ * drivers/crypto/se05x.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "pnt/pnt_se05x_api.h"
+#include "se05x_internal.h"
+#include <debug.h>
+#include <nuttx/config.h>
+#include <nuttx/crypto/se05x.h>
+#include <nuttx/fs/fs.h>
+#include <nuttx/i2c/i2c_master.h>
+#include <nuttx/kmalloc.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_CRYPTO_CONTROLSE
+#warning Controlse is not available; This is probably not what you want.
+#endif
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/* Character driver methods */
+
+static int se05x_open(FAR struct file *filep);
+static int se05x_close(FAR struct file *filep);
+static ssize_t se05x_read(FAR struct file *filep, FAR char *buffer,
+                          size_t buflen);
+static ssize_t se05x_write(FAR struct file *filep, FAR const char *buffer,
+                           size_t buflen);
+static int se05x_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const FAR struct file_operations g_fops =
+{
+    se05x_open, se05x_close, se05x_read, se05x_write,
+    NULL,       se05x_ioctl, NULL
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static int se05x_open(FAR struct file *filep)
+{
+  /* create se05x session */
+
+  FAR struct inode *inode = filep->f_inode;
+  FAR struct se05x_dev_s *priv = inode->i_private;
+  nxmutex_lock(&priv->mutex);
+  int res = pnt_se05x_open(priv) == 0 ? OK : ERROR;
+  if (res == ERROR)
+    {
+      nxmutex_unlock(&priv->mutex);
+    }
+
+  return res;
+}
+
+static int se05x_close(FAR struct file *filep)
+{
+  /* stop se05x session */
+
+  FAR struct inode *inode = filep->f_inode;
+  FAR struct se05x_dev_s *priv = inode->i_private;
+  pnt_se05x_close(priv);
+  nxmutex_unlock(&priv->mutex);
+  return OK;
+}
+
+static ssize_t se05x_read(FAR struct file *filep, char *buffer,
+                           size_t buflen)
+{
+  return -ENOSYS;
+}
+
+static ssize_t se05x_write(FAR struct file *filep, const char *buffer,
+                           size_t buflen)
+{
+  return -ENOSYS;
+}
+
+static int se05x_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
+{
+  FAR struct inode *inode = filep->f_inode;
+  FAR struct se05x_dev_s *priv = inode->i_private;
+  int ret = -ENOTTY;
+
+  switch (cmd)
+    {
+    case SEIOC_GET_INFO:
+      {
+        FAR struct se05x_info_s *info = (FAR struct se05x_info_s *)arg;
+        ret = pnt_se05x_get_info(priv, info);
+      }
+      break;
+
+    case SEIOC_GET_UID:
+      {
+        FAR struct se05x_uid_s *uid = (FAR struct se05x_uid_s *)arg;
+        ret = pnt_se05x_get_uid(priv, uid);
+      }
+      break;
+
+    case SEIOC_GENERATE_KEYPAIR:
+      {
+        FAR struct se05x_generate_keypair_s *generate_keypair_args =
+            (FAR struct se05x_generate_keypair_s *)arg;
+        ret = pnt_se05x_generate_keypair(priv, generate_keypair_args);
+      }
+      break;
+
+    case SEIOC_SET_KEY:
+      {
+        FAR struct se05x_key_transmission_s *set_key_args =
+            (FAR struct se05x_key_transmission_s *)arg;
+        ret = pnt_se05x_set_public_key(priv, set_key_args);
+      }
+      break;
+
+    case SEIOC_SET_DATA:
+      {
+        FAR struct se05x_key_transmission_s *set_key_args =
+            (FAR struct se05x_key_transmission_s *)arg;
+        ret = pnt_se05x_set_data(priv, set_key_args);
+      }
+      break;
+
+    case SEIOC_GET_KEY:
+      {
+        FAR struct se05x_key_transmission_s *get_key_args =
+            (FAR struct se05x_key_transmission_s *)arg;
+        ret = pnt_se05x_get_key(priv, get_key_args);
+      }
+      break;
+
+    case SEIOC_GET_DATA:
+      {
+        FAR struct se05x_key_transmission_s *get_data_args =
+            (FAR struct se05x_key_transmission_s *)arg;
+        ret = pnt_se05x_get_data(priv, get_data_args);
+      }
+      break;
+
+    case SEIOC_DELETE_KEY:
+      {
+        ret = pnt_se05x_delete_key(priv, arg);
+      }
+      break;
+
+    case SEIOC_DERIVE_SYMM_KEY:
+      {
+        FAR struct se05x_derive_key_s *derive_key_args =
+            (FAR struct se05x_derive_key_s *)arg;
+        ret = pnt_se05x_derive_key(priv, derive_key_args);
+      }
+      break;
+
+    case SEIOC_CREATE_SIGNATURE:
+      {
+        FAR struct se05x_signature_s *create_signature_args =
+            (FAR struct se05x_signature_s *)arg;
+        ret = pnt_se05x_create_signature(priv, create_signature_args);
+      }
+      break;
+
+    case SEIOC_VERIFY_SIGNATURE:
+      {
+        FAR struct se05x_signature_s *verify_signature_args =
+            (FAR struct se05x_signature_s *)arg;
+        ret = pnt_se05x_verify_signature(priv, verify_signature_args);
+      }
+      break;
+
+    default:
+      crypterr("ERROR: Unrecognized cmd: %d\n", cmd);
+      ret = -ENOTTY;
+      break;
+    }
+
+  return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int se05x_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
+                   FAR struct se05x_config_s *config)
+{
+  int ret;
+
+  FAR struct se05x_dev_s *priv;
+
+  /* Sanity check */
+
+  DEBUGASSERT(devpath != NULL);
+  DEBUGASSERT(i2c != NULL);
+
+  /* Initialize the device's structure */
+
+  priv = (FAR struct se05x_dev_s *)kmm_malloc(sizeof(*priv));
+  if (priv == NULL)
+    {
+      crypterr("ERROR: Failed to allocate instance\n");
+      return -ENOMEM;
+    }
+
+  priv->config = config;
+  priv->i2c = i2c;
+
+  /* Check se05x availability */
+
+  pnt_se05x_open(priv);
+  struct se05x_uid_s uid;
+  ret = pnt_se05x_get_uid(priv, &uid);
+  if (ret < 0)
+    {
+      crypterr("ERROR: Failed to register driver: %d\n", ret);
+      kmm_free(priv);
+      return -ENODEV;
+    }
+
+  pnt_se05x_close(priv);
+
+  /* Register driver */
+
+  ret = register_driver(devpath, &g_fops, 0666, priv);
+  if (ret < 0)
+    {
+      crypterr("ERROR: Failed to register driver: %d\n", ret);
+      kmm_free(priv);
+    }
+
+  nxmutex_init(&priv->mutex);
+
+  return ret;
+}
diff --git a/drivers/crypto/se05x_internal.h b/drivers/crypto/se05x_internal.h
new file mode 100644
index 0000000000..7b3ac184de
--- /dev/null
+++ b/drivers/crypto/se05x_internal.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+ * drivers/crypto/se05x_internal.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_DRIVERS_CRYPTO_SE05X_INTERNAL_H_
+#define __INCLUDE_NUTTX_DRIVERS_CRYPTO_SE05X_INTERNAL_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/mutex.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+struct i2c_master_s;
+struct pnt_handle;
+struct se05x_config_s;
+
+struct se05x_dev_s
+{
+  FAR struct se05x_config_s *config;
+  FAR struct i2c_master_s *i2c; /* I2C interface */
+  FAR struct pnt_handle *pnt;
+  mutex_t mutex;
+};
+
+#endif /* __INCLUDE_NUTTX_DRIVERS_CRYPTO_SE05X_INTERNAL_H_ */
diff --git a/include/nuttx/crypto/se05x.h b/include/nuttx/crypto/se05x.h
new file mode 100644
index 0000000000..9b82a38341
--- /dev/null
+++ b/include/nuttx/crypto/se05x.h
@@ -0,0 +1,164 @@
+/****************************************************************************
+ * include/nuttx/crypto/se05x.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/* Copyright 2023 NXP */
+
+#ifndef __INCLUDE_NUTTX_CRYPTO_SE05X_H_
+#define __INCLUDE_NUTTX_CRYPTO_SE05X_H_
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+#include <nuttx/config.h>
+
+#ifdef CONFIG_DEV_SE05X
+
+#include <nuttx/fs/ioctl.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SE05X_MODULE_UNIQUE_ID_LEN 18
+
+#define SEIOC_GET_INFO _SEIOC(0x0000)         /* Arg: se05x_info_s */
+#define SEIOC_GET_UID _SEIOC(0x0001)          /* Arg: se05x_uid_s */
+#define SEIOC_GENERATE_KEYPAIR _SEIOC(0x0002)
+/* Arg: se05x_key_store_entry_t */
+#define SEIOC_SET_KEY _SEIOC(0x0003)          /* Arg: se05x_key_transmission_s 
*/
+#define SEIOC_SET_DATA _SEIOC(0x0004)         /* Arg: se05x_key_transmission_s 
*/
+#define SEIOC_GET_KEY _SEIOC(0x0005)          /* Arg: se05x_key_transmission_s 
*/
+#define SEIOC_GET_DATA _SEIOC(0x0006)         /* Arg: se05x_key_transmission_s 
*/
+#define SEIOC_DELETE_KEY _SEIOC(0x0007)       /* Arg: uint32_t key_id */
+#define SEIOC_CREATE_SIGNATURE _SEIOC(0x0008) /* Arg: se05x_signature_s */
+#define SEIOC_VERIFY_SIGNATURE _SEIOC(0x0009) /* Arg: se05x_signature_s */
+#define SEIOC_DERIVE_SYMM_KEY _SEIOC(0x000A)  /* Arg: se05x_derive_key_s */
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef enum
+{
+  SE05X_ASYM_CIPHER_EC_NIST_P_256 = 0,
+} se05x_asym_cipher_type_e;
+
+typedef enum
+{
+  SE05X_ALGORITHM_NA = 0,
+  SE05X_ALGORITHM_PLAIN,
+  SE05X_ALGORITHM_SHA,
+  SE05X_ALGORITHM_SHA224,
+  SE05X_ALGORITHM_SHA256,
+  SE05X_ALGORITHM_SHA384,
+  SE05X_ALGORITHM_SHA512,
+  SE05X_ALGORITHM_SIZE,
+} se05x_algorithm_e;
+
+struct se05x_info_s
+{
+  uint16_t oef_id;
+};
+
+struct se05x_uid_s
+{
+  uint8_t uid[SE05X_MODULE_UNIQUE_ID_LEN];
+};
+
+struct se05x_generate_keypair_s
+{
+  uint32_t id;
+  se05x_asym_cipher_type_e cipher;
+};
+
+struct se05x_key_store_entry_s
+{
+  uint32_t id;
+  se05x_asym_cipher_type_e cipher;
+};
+
+struct se05x_buffer_s
+{
+  FAR uint8_t *buffer;
+  size_t buffer_size;
+  size_t buffer_content_size;
+};
+
+struct se05x_key_transmission_s
+{
+  struct se05x_key_store_entry_s entry;
+  struct se05x_buffer_s content;
+};
+
+struct se05x_derive_key_s
+{
+  uint32_t private_key_id;
+  uint32_t public_key_id;
+  struct se05x_buffer_s content;
+};
+
+struct se05x_signature_s
+{
+  uint32_t key_id;
+  se05x_algorithm_e algorithm;
+  struct se05x_buffer_s tbs;
+  struct se05x_buffer_s signature;
+};
+
+struct se05x_config_s
+{
+  uint8_t address;
+  uint32_t frequency;
+
+  CODE bool (*set_enable_pin)(bool state);
+};
+
+struct i2c_master_s;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: se05x_register
+ *
+ * Description:
+ *   Register the se05x character device as 'devpath'.
+ *
+ * Input Parameters:
+ *   devpath - The full path to the driver to register, e.g., "/dev/se05x".
+ *   i2c     - An I2C driver instance.
+ *   config  - Pointer to the se05x configuration
+ *
+ * Returned Value:
+ *   se050_status_success (0) on success,
+ *       a negative value on failure
+ *
+ ****************************************************************************/
+
+int se05x_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
+                   FAR struct se05x_config_s *config);
+
+#endif /* CONFIG_DEV_SE05X */
+
+#endif /* __INCLUDE_NUTTX_CRYPTO_SE05X_H_ */
diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h
index dd70cc634b..3fd1fac623 100644
--- a/include/nuttx/fs/ioctl.h
+++ b/include/nuttx/fs/ioctl.h
@@ -96,6 +96,7 @@
 #define _VIDIOCBASE     (0x3700) /* Video device ioctl commands */
 #define _CELLIOCBASE    (0x3800) /* Cellular device ioctl commands */
 #define _MIPIDSIBASE    (0x3900) /* Mipidsi device ioctl commands */
+#define _SEIOCBASE      (0x3a00) /* Secure element ioctl commands */
 #define _SYSLOGBASE     (0x3c00) /* Syslog device ioctl commands */
 #define _WLIOCBASE      (0x8b00) /* Wireless modules ioctl network commands */
 
@@ -651,6 +652,13 @@
 #define _MIPIDSIIOCVALID(c)    (_IOC_TYPE(c)==_MIPIDSIBASE)
 #define _MIPIDSIIOC(nr)        _IOC(_MIPIDSIBASE,nr)
 
+/* Secure element ioctl definitions *****************************************/
+
+/* (see nuttx/include/crypto/se05x.h */
+
+#define _SEIOCVALID(c)         (_IOC_TYPE(c)==_SEIOCBASE)
+#define _SEIOC(nr)             _IOC(_SEIOCBASE,nr)
+
 /* syslog driver ioctl definitions ******************************************/
 
 #define _SYSLOGVALID(c) (_IOC_TYPE(c)==_SYSLOGBASE)

Reply via email to