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

xiaoxiang781216 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 6bba29a2bad arch/arm/src/stm32h7: Add support for CRYP peripheral
6bba29a2bad is described below

commit 6bba29a2bad61acbdd8927f3743c025641378994
Author: Peter Barada <[email protected]>
AuthorDate: Mon May 25 19:11:14 2026 -0400

    arch/arm/src/stm32h7: Add support for CRYP peripheral
    
    Add STM32H7 support for AES-CBC/CTR HW encryption accelerator.
    Add nucleo-h753zi:crypt defconfig.
    
    Signed-off-by: Peter Barada <[email protected]>
---
 arch/arm/src/stm32h7/Kconfig                       |  30 +-
 arch/arm/src/stm32h7/Make.defs                     |  12 +
 arch/arm/src/stm32h7/hardware/stm32h7xxxx_cryp.h   | 186 ++++++
 arch/arm/src/stm32h7/stm32_aes.c                   | 705 +++++++++++++++++++++
 arch/arm/src/stm32h7/stm32_aes.h                   |  58 ++
 arch/arm/src/stm32h7/stm32_crypto.c                | 163 +++++
 arch/arm/src/stm32h7/stm32h7x3xx_rcc.c             |   6 +
 .../stm32h7/nucleo-h753zi/configs/crypto/defconfig |  56 ++
 8 files changed, 1212 insertions(+), 4 deletions(-)

diff --git a/arch/arm/src/stm32h7/Kconfig b/arch/arm/src/stm32h7/Kconfig
index 2a1cad61ab3..4f1c6eaaa17 100644
--- a/arch/arm/src/stm32h7/Kconfig
+++ b/arch/arm/src/stm32h7/Kconfig
@@ -233,42 +233,47 @@ config ARCH_CHIP_STM32H750VB
        select STM32H7_STM32H7X0XX
        select STM32H7_FLASH_CONFIG_B
        select STM32H7_IO_CONFIG_V
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7+M4, 128 Kb FLASH, 1024K Kb SRAM,
-               LQFP100
+               with cryptographic accelerator, LQFP100
 
 config ARCH_CHIP_STM32H750ZB
        bool "STM32H750ZB"
        select STM32H7_STM32H7X0XX
        select STM32H7_FLASH_CONFIG_B
        select STM32H7_IO_CONFIG_Z
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7+M4, 128 Kb FLASH, 1024K Kb SRAM,
-               LQFP144
+               with cryptographic accelerator, LQFP144
 
 config ARCH_CHIP_STM32H750IB
        bool "STM32H750IB"
        select STM32H7_STM32H7X0XX
        select STM32H7_FLASH_CONFIG_B
        select STM32H7_IO_CONFIG_I
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7+M4, 128 Kb FLASH, 1024K Kb SRAM,
-               LQFP176 or UFBGA176+25
+               with cryptographic accelerator, LQFP176 or UFBGA176+25
 
 config ARCH_CHIP_STM32H750XB
        bool "STM32H750XB"
        select STM32H7_STM32H7X0XX
        select STM32H7_FLASH_CONFIG_B
        select STM32H7_IO_CONFIG_X
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7+M4, 128 Kb FLASH, 1024K Kb SRAM,
-               TFBGA240+25
+               with cryptographic accelerator, TFBGA240+25
 
 config ARCH_CHIP_STM32H753AI
        bool "STM32H753AI"
        select STM32H7_STM32H7X3XX
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_A
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, UFBGA169
@@ -278,6 +283,7 @@ config ARCH_CHIP_STM32H753BI
        select STM32H7_STM32H7X3XX
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_B
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, LQFP208
@@ -287,6 +293,7 @@ config ARCH_CHIP_STM32H753II
        select STM32H7_STM32H7X3XX
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_I
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, LQFP176/UFBGA176
@@ -296,6 +303,7 @@ config ARCH_CHIP_STM32H753VI
        select STM32H7_STM32H7X3XX
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_V
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, LQFP100/TFBGA100
@@ -305,6 +313,7 @@ config ARCH_CHIP_STM32H753XI
        select STM32H7_STM32H7X3XX
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_X
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, TFBGA240
@@ -314,6 +323,7 @@ config ARCH_CHIP_STM32H753ZI
        select STM32H7_STM32H7X3XX
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_Z
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, LQFP144
@@ -324,6 +334,7 @@ config ARCH_CHIP_STM32H7B3LI
        select STM32H7_FLASH_CONFIG_I
        select STM32H7_IO_CONFIG_L
        select STM32H7_HAVE_SMPS
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1376 Kb SRAM,
                with cryptographic accelerator, TFBGA225
@@ -335,6 +346,7 @@ config ARCH_CHIP_STM32H755II
        select STM32H7_IO_CONFIG_I
        select STM32H7_HAVE_FDCAN1
        select STM32H7_HAVE_FDCAN2
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, LQFP176/UFBGA176
@@ -346,6 +358,7 @@ config ARCH_CHIP_STM32H755XI
        select STM32H7_IO_CONFIG_X
        select STM32H7_HAVE_FDCAN1
        select STM32H7_HAVE_FDCAN2
+       select STM32H7_HAVE_CRYP
        ---help---
                STM32 H7 Cortex M7, 2048 Kb FLASH, 1024K Kb SRAM,
                with cryptographic accelerator, TFBGA240
@@ -759,6 +772,10 @@ config STM32H7_HAVE_RNG
        bool
        default n
 
+config STM32H7_HAVE_CRYP
+       bool
+       default n
+
 # These "hidden" settings are the OR of individual peripheral selections
 # indicating that the general capability is required.
 
@@ -865,6 +882,11 @@ config STM32H7_CRC
        bool "CRC"
        default n
 
+config STM32H7_CRYP
+       bool "CRYP"
+       default n
+       depends on STM32H7_HAVE_CRYP
+
 config STM32H7_BKPSRAM
        bool "Enable BKP RAM Domain"
        select STM32H7_PWR
diff --git a/arch/arm/src/stm32h7/Make.defs b/arch/arm/src/stm32h7/Make.defs
index ed5fdee000a..73f9b13979a 100644
--- a/arch/arm/src/stm32h7/Make.defs
+++ b/arch/arm/src/stm32h7/Make.defs
@@ -213,3 +213,15 @@ endif
 ifeq ($(CONFIG_STM32H7_WWDG),y)
 CHIP_CSRCS += stm32_wwdg.c
 endif
+
+#ifeq ($(CONFIG_STM32H7_HASH),y)
+#CHIP_CSRCS += stm32_hash.c
+#endif
+
+ifeq ($(CONFIG_STM32H7_CRYP),y)
+CHIP_CSRCS += stm32_aes.c
+endif
+
+ifeq ($(CONFIG_CRYPTO_CRYPTODEV_HARDWARE),y)
+CHIP_CSRCS += stm32_crypto.c
+endif
diff --git a/arch/arm/src/stm32h7/hardware/stm32h7xxxx_cryp.h 
b/arch/arm/src/stm32h7/hardware/stm32h7xxxx_cryp.h
new file mode 100644
index 00000000000..7decd0e0eb2
--- /dev/null
+++ b/arch/arm/src/stm32h7/hardware/stm32h7xxxx_cryp.h
@@ -0,0 +1,186 @@
+/****************************************************************************
+ * arch/arm/src/stm32h7/hardware/stm32h7xxxx_cryp.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32H7X3XX_CRYP_H
+#define __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32H7X3XX_CRYP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+
+#include "chip.h"
+
+/* The following STM32H7 devices have a cryptographic accelerator that
+ * support AES, DES/TDES:
+ *
+ * STM32H735ZO, STM32H750XX, STM32H753XX, STM32H755XX, STM32H757XX,
+ * STM32H7B0XX, STM32H7B3XX, STM32H7S3x8, STM32H7S7X8
+ */
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* CRYP register offsets ****************************************************/
+
+#define STM32_CRYP_CR_OFFSET                0x0000 /* Control Register */
+#define STM32_CRYP_SR_OFFSET                0x0004 /* Status Register */
+#define STM32_CRYP_DIN_OFFSET               0x0008 /* Data Input Register */
+#define STM32_CRYP_DOUT_OFFSET              0x000C /* Data Output Register */
+#define STM32_CRYP_DMACR_OFFSET             0x0010 /* DMA Control Register */
+#define STM32_CRYP_IMSCR_OFFSET             0x0014 /* Interrupt Mask Register 
*/
+#define STM32_CRYP_RISR_OFFSET              0x0018 /* Raw Interrupt Status 
Register */
+#define STM32_CRYP_MISR_OFFSET              0x001C /* Masked Interrupt Status 
Register */
+
+#define STM32_CRYP_K0LR_OFFSET              0x0020 /* CRYP key 0L Register */
+#define STM32_CRYP_K0RR_OFFSET              0x0024 /* CRYP key 0R Register */
+#define STM32_CRYP_K1LR_OFFSET              0x0028 /* CRYP key 1L Register */
+#define STM32_CRYP_K1RR_OFFSET              0x002c /* CRYP key 1R Register */
+#define STM32_CRYP_K2LR_OFFSET              0x0030 /* CRYP key 2L Register */
+#define STM32_CRYP_K2RR_OFFSET              0x0034 /* CRYP key 2R Register */
+#define STM32_CRYP_K3LR_OFFSET              0x0038 /* CRYP key 3L Register */
+#define STM32_CRYP_K3RR_OFFSET              0x003c /* CRYP key 3R Register */
+
+#define STM32_CRYP_IV0LR_OFFSET             0x0040 /* CRYP Init Vector 0L 
Register */
+#define STM32_CRYP_IV0RR_OFFSET             0x0044 /* CRYP Init Vector 0R 
Register */
+#define STM32_CRYP_IV1LR_OFFSET             0x0048 /* CRYP Init Vector 1L 
Register */
+#define STM32_CRYP_IV1RR_OFFSET             0x004C /* CRYP Init Vector 1R 
Register */
+
+#define STM32_CRYP_CSGCMCCM0R_OFFSET        0x0050 /* CRYP Context Swap 
Register 0R */
+
+/* CRYP register addresses **************************************************/
+
+#define STM32_CRYP_CR           (STM32_CRYPTO_BASE + STM32_CRYP_CR_OFFSET)
+#define STM32_CRYP_SR           (STM32_CRYPTO_BASE + STM32_CRYP_SR_OFFSET)
+#define STM32_CRYP_DIN          (STM32_CRYPTO_BASE + STM32_CRYP_DIN_OFFSET)
+#define STM32_CRYP_DOUT         (STM32_CRYPTO_BASE + STM32_CRYP_DOUT_OFFSET)
+#define STM32_CRYP_DMACR        (STM32_CRYPTO_BASE + STM32_CRYP_DMACR_OFFSET)
+#define STM32_CRYP_IMSCR        (STM32_CRYPTO_BASE + STM32_CRYP_IMSCR_OFFSET)
+#define STM32_CRYP_RISR         (STM32_CRYPTO_BASE + STM32_CRYP_RISR_OFFSET)
+#define STM32_CRYP_MISR         (STM32_CRYPTO_BASE + STM32_CRYP_MISR_OFFSET)
+#define STM32_CRYP_K0LR         (STM32_CRYPTO_BASE + STM32_CRYP_K0LR_OFFSET)
+#define STM32_CRYP_K0RR         (STM32_CRYPTO_BASE + STM32_CRYP_K0RR_OFFSET)
+#define STM32_CRYP_K1LR         (STM32_CRYPTO_BASE + STM32_CRYP_K1LR_OFFSET)
+#define STM32_CRYP_K1RR         (STM32_CRYPTO_BASE + STM32_CRYP_K1RR_OFFSET)
+#define STM32_CRYP_K2LR         (STM32_CRYPTO_BASE + STM32_CRYP_K2LR_OFFSET)
+#define STM32_CRYP_K2RR         (STM32_CRYPTO_BASE + STM32_CRYP_K2RR_OFFSET)
+#define STM32_CRYP_K3LR         (STM32_CRYPTO_BASE + STM32_CRYP_K3LR_OFFSET)
+#define STM32_CRYP_K3RR         (STM32_CRYPTO_BASE + STM32_CRYP_K3RR_OFFSET)
+#define STM32_CRYP_IV0LR        (STM32_CRYPTO_BASE + STM32_CRYP_IV0LR_OFFSET)
+#define STM32_CRYP_IV0RR        (STM32_CRYPTO_BASE + STM32_CRYP_IV0RR_OFFSET)
+#define STM32_CRYP_IV1LR        (STM32_CRYPTO_BASE + STM32_CRYP_IV1LR_OFFSET)
+#define STM32_CRYP_IV1RR        (STM32_CRYPTO_BASE + STM32_CRYP_IV1RR_OFFSET)
+#define STM32_CRYP_CSGCMCCM0R   (STM32_CRYPTO_BASE + 
STM32_CRYP_CSGCMCCM0R_OFFSET)
+
+/* CRYP register bit definitions ********************************************/
+
+/* CRYP CR register */
+
+#define CRYP_CR_GCMPH_SHIFT             16
+#define CRYP_CR_GCMPH_MASK              (0x3 << CRYP_CR_GCMPH_SHIFT)
+#  define CRYP_CR_GCMPH_INIT            (0 << CRYP_CR_GCMPH_SHIFT)
+#  define CRYP_CR_GCMPH_HEADER          (1 << CRYP_CR_GCMPH_SHIFT)
+#  define CRYP_CR_GCMPH_PAYLOAD         (2 << CRYP_CR_GCMPH_SHIFT)
+#  define CRYP_CR_GCMPH_FINAL           (3 << CRYP_CR_GCMPH_SHIFT)
+#define CRYP_CR_CRYPEN                  (1 << 15)
+#define CRYP_CR_FFLUSH                  (1 << 14)
+#define CRYP_CR_KEYSIZE_SHIFT           8
+#define CRYP_CR_KEYSIZE_MASK            (0x3 << CRYP_CR_KEYSIZE_SHIFT)
+#  define CRYP_CR_KEYSIZE_128           (0 << CRYP_CR_KEYSIZE_SHIFT)
+#  define CRYP_CR_KEYSIZE_192           (1 << CRYP_CR_KEYSIZE_SHIFT)
+#  define CRYP_CR_KEYSIZE_256           (2 << CRYP_CR_KEYSIZE_SHIFT)
+#define CRYP_CR_DATATYPE_SHIFT          6
+#define CRYP_CR_DATATYPE_MASK           (0x3 << CRYP_CR_DATATYPE_SHIFT)
+#  define CRYP_CR_DATATYPE_LE           (0 << CRYP_CR_DATATYPE_SHIFT)
+#  define CRYP_CR_DATATYPE_BE           (2 << CRYP_CR_DATATYPE_SHIFT)
+/* ALGOMODE straddles bits [19, 5:3] of CRYP_CR */
+#define CRYP_CR_ALGOMODE3_SHIFT         19
+#define CRYP_CR_ALGOMODE3_MASK          (0x1 << CRYP_CR_ALGOMODE3_SHIFT)
+#define CRYP_CR_ALGOMODE_SHIFT          3
+#define CRYP_CR_ALGOMODE_MASK           ((0xf << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | CRYP_CR_ALGOMODE3_MASK)
+#  define CRYP_CR_ALGOMODE_TDES_ECB     ((0 << CRYP_CR_ALGOMODE3_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_TDES_CBC     ((1 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_DES_ECB      ((2 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_DES_CBC      ((3 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_AES_ECB      ((4 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_AES_CBC      ((5 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_AES_CTR      ((6 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_AES_KEY_PREP ((7 << CRYP_CR_ALGOMODE_SHIFT)  \
+                                         | (0 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_AES_GCM      ((8 << CRYP_CR_ALGOMODE_SHIFT) \
+                                         | (1 << CRYP_CR_ALGOMODE_SHIFT))
+#  define CRYP_CR_ALGOMODE_AES_CCM      ((9 << CRYP_CR_ALGOMODE_SHIFT)  \
+                                         | (1 << CRYP_CR_ALGOMODE_SHIFT))
+#define CRYP_CR_ALGODIR_SHIFT           2
+#define CRYP_CR_ALGODIR_MASK            (1 << CRYP_CR_ALGODIR_SHIFT)
+#  define CRYP_CR_ALGODIR_ENCRYPT       (0 << CRYP_CR_ALGODIR_SHIFT)
+#  define CRYP_CR_ALGODIR_DECRYPT       (1 << CRYP_CR_ALGODIR_SHIFT)
+
+/* All non-defined bits in CRYP_CR have to be set
+ * to the reset value (0x00000000). Following is mask for such
+ */
+#define CRYP_CR_RESET_MASK                                          \
+  (CRYP_CR_ALGOMODE3_MASK | CRYP_CR_GCMPH_MASK | CRYP_CR_CRYPEN     \
+   | CRYP_CR_FFLUSH | CRYP_CR_KEYSIZE_MASK | CRYP_CR_DATATYPE_MASK  \
+   | CRYP_CR_ALGOMODE_MASK | CRYP_CR_ALGODIR_MASK)
+
+/* CRYP SR register */
+
+#define CRYP_SR_BUSY                    (1 << 4) /* BUSY */
+#define CRYP_SR_OFFU                    (1 << 3) /* Output Fifo Full */
+#define CRYP_SR_OFNE                    (1 << 2) /* Output Fifo Not Empty */
+#define CRYP_SR_IFNF                    (1 << 1) /* Input Fifo Not Full */
+#define CRYP_SR_IFEM                    (1 << 0) /* Input Fifo Empty */
+
+/* CRYP DMACR register */
+
+#define CRYP_DMACR_DOEN                 (1 << 1) /* DMA Output Enable */
+#define CRYP_DMACR_DIEN                 (1 << 0) /* DMA Input Enable */
+
+/* CRYP IMSCR register */
+
+#define CRYP_IMSCR_OUTIM                (1 << 1) /* Output Fifo Service Mask */
+#define CRYP_IMSCR_INIM                 (1 << 0) /* Input Fifo Service Mask */
+
+/* CRYP RISR register */
+
+#define CRYP_RISR_OUTRIS                (1 << 1)
+#define CRYP_RISR_INRIS                 (1 << 0)
+
+/* CRYP MISR register */
+
+#define CRYP_MISR_OUTMIS                (1 << 1)
+#define CRYP_MISR_INMIS                 (1 << 0)
+
+#endif /* __ARCH_ARM_SRC_STM32H7_HARDWARE_STM32H7X3XX_CRYP_H */
diff --git a/arch/arm/src/stm32h7/stm32_aes.c b/arch/arm/src/stm32h7/stm32_aes.c
new file mode 100644
index 00000000000..51d9c1c2cba
--- /dev/null
+++ b/arch/arm/src/stm32h7/stm32_aes.c
@@ -0,0 +1,705 @@
+/****************************************************************************
+ * arch/arm/src/stm32h7/stm32_aes.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <nuttx/debug.h>
+
+#include <nuttx/crypto/crypto.h>
+#include <nuttx/irq.h>
+#include <nuttx/arch.h>
+#include <nuttx/semaphore.h>
+#include <arch/board/board.h>
+
+#include "arm_internal.h"
+#include "chip.h"
+#include "stm32_rcc.h"
+#include "stm32_aes.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define AES_BLOCK_SIZE 16
+
+/* Any reserved bits in CRYP_CR must be kept at reset value (0x0) */
+#define STM32AES_CLEAR_RESERVED_CR_BITS(regval) \
+  (regval & CRYP_CR_RESET_MASK)
+
+/* #define CONFIG_STM32_CRYP_DEBUG */
+
+#ifdef CONFIG_STM32_CRYP_DEBUG
+#define cryp_getreg32(reg) stm32aes_getreg32(__FUNCTION__, __LINE__, reg)
+#define cryp_putreg32(val, reg) stm32aes_putreg32(__FUNCTION__, __LINE__, val, 
reg)
+#define crypinfo(func, line, format, ...)                             \
+  __arch_syslog(LOG_INFO, "%s:%d" format, func, line, ##__VA_ARGS__)
+#else
+#define crypinfo(func, line, format, ...)
+#define cryp_getreg32(reg) getreg32(reg)
+#define cryp_putreg32(val, reg) putreg32(val, reg)
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static void stm32aes_enable(bool on);
+static int stm32aes_setkey(const void *key, size_t keysize);
+static void stm32aes_setiv(const void *iv);
+static void stm32aes_encryptblock(void *block_out,
+                                  const void *block_in);
+static int  stm32aes_setup_cr(int mode, int encrypt,
+                              const void *key, size_t keysize);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static mutex_t g_stm32aes_lock = NXMUTEX_INITIALIZER;
+static bool    g_stm32aes_initdone = false;
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+#ifdef STM32_CRYP_DEBUG
+
+struct rn
+{
+  FAR const char *name;
+  uint32_t regaddr;
+};
+
+static struct rn stm32aes_regnames [] =
+{
+    {
+      "RCC_AHB2RSTR",
+      STM32_RCC_AHB2RSTR,
+    },
+
+    {
+      "RCC_AHB2ENR",
+      STM32_RCC_AHB2ENR,
+    },
+
+    {
+      "CRYP_CR",
+      STM32_CRYP_CR,
+    },
+
+    {
+      "CRYP_SR",
+      STM32_CRYP_SR,
+    },
+
+    {
+      "CRYP_DIN",
+      STM32_CRYP_DIN,
+    },
+
+    {
+      "CRYP_DOUT",
+      STM32_CRYP_DOUT,
+    },
+
+    {
+      "CRYP_DMACR",
+      STM32_CRYP_DMACR,
+    },
+
+    {
+      "CRYP_IMSCR",
+      STM32_CRYP_IMSCR,
+    },
+
+    {
+      "CRYP_RISR",
+      STM32_CRYP_RISR,
+    },
+
+    {
+      "CRYP_MISR",
+      STM32_CRYP_MISR,
+    },
+
+    {
+      "CRYP_K0LR",
+      STM32_CRYP_K0LR,
+    },
+
+    {
+      "CRYP_K0RR",
+      STM32_CRYP_K0RR,
+    },
+
+    {
+      "CRYP_K1LR",
+      STM32_CRYP_K1LR,
+    },
+
+    {
+      "CRYP_K1RR",
+      STM32_CRYP_K1RR,
+    },
+
+    {
+      "CRYP_K2LR",
+      STM32_CRYP_K2LR,
+    },
+
+    {
+      "CRYP_K2RR",
+      STM32_CRYP_K2RR,
+    },
+
+    {
+      "CRYP_K3LR",
+      STM32_CRYP_K3LR,
+    },
+
+    {
+      "CRYP_K3RR",
+      STM32_CRYP_K3RR,
+    },
+
+    {
+      "CRYP_IV0LR",
+      STM32_CRYP_IV0LR,
+    },
+
+    {
+      "CRYP_IV0RR",
+      STM32_CRYP_IV0RR,
+    },
+
+    {
+      "CRYP_IV1LR",
+      STM32_CRYP_IV1LR,
+    },
+
+    {
+      "CRYP_IV1RR",
+      STM32_CRYP_IV1RR,
+    },
+
+    {
+      "CRYP_CSGCMCCM0R",
+      STM32_CRYP_CSGCMCCM0R,
+    },
+};
+
+const char *stm32aes_regname(uint32_t regaddr)
+{
+  int i;
+
+  for (i = 0; i < nitems(stm32aes_regnames); ++i)
+    {
+      if (stm32aes_regnames[i].regaddr == regaddr)
+        {
+          return stm32aes_regnames[i].name;
+        }
+    }
+
+  return "???";
+}
+
+static uint32_t stm32aes_getreg32(const char *func, int line,
+                                  uint32_t regaddr)
+{
+  const char *regname = stm32aes_regname(regaddr);
+  char buf[128];
+  uint32_t val;
+
+  val = getreg32(regaddr);
+  snprintf(buf, sizeof(buf), "%08" PRIx32 "(%s)<=%08" PRIx32 "",
+           regaddr, regname, val);
+  crypinfo(func, line, " %s", buf);
+  return val;
+}
+
+static void stm32aes_putreg32(const char *func, int line,
+                              uint32_t val, uint32_t regaddr)
+{
+  const char *regname = stm32aes_regname(regaddr);
+  char buf[128];
+
+  snprintf(buf, sizeof(buf), "%08" PRIx32 "(%s)=>%08" PRIx32 "",
+           regaddr, regname, val);
+  putreg32(val, regaddr);
+  crypinfo(func, line, " %s", buf);
+}
+#endif
+
+static void stm32aes_enable(bool on)
+{
+  uint32_t regval;
+
+  regval = cryp_getreg32(STM32_CRYP_CR);
+  if (on)
+    {
+      if (regval & CRYP_CR_CRYPEN)
+        {
+          return;
+        }
+
+      regval |= CRYP_CR_CRYPEN;
+    }
+  else
+    {
+      if (!(regval & CRYP_CR_CRYPEN))
+        {
+          return;
+        }
+
+      regval &= ~CRYP_CR_CRYPEN;
+    }
+
+  regval = STM32AES_CLEAR_RESERVED_CR_BITS(regval);
+  cryp_putreg32(regval, STM32_CRYP_CR);
+}
+
+static void stm32aes_wait_not_busy(void)
+{
+  uint32_t regval;
+
+  do
+    {
+      regval = cryp_getreg32(STM32_CRYP_SR);
+    }
+  while (regval & CRYP_SR_BUSY);
+}
+
+static int stm32aes_setkey(const void *key, size_t keysize)
+{
+  uint32_t *in = (uint32_t *)key;
+
+  stm32aes_wait_not_busy();
+
+  if (keysize == 32)
+    {
+      cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K0LR); /* [255:224] */
+      in++;
+      cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K0RR); /* [223:192] */
+      in++;
+    }
+
+  if (keysize >= 24)
+    {
+      cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K1LR); /* [191:160] */
+      in++;
+      cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K1RR); /* [159:128] */
+      in++;
+    }
+
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K2LR); /* [127:96] */
+  in++;
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K2RR); /* [95:64] */
+  in++;
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K3LR); /* [63:32] */
+  in++;
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_K3RR); /* [31:0] */
+  return 0;
+}
+
+static void stm32aes_setiv(const void *iv)
+{
+  uint32_t *in = (uint32_t *)iv;
+
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_IV0LR); /* [127:96] */
+  in++;
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_IV0RR); /* [95:64] */
+  in++;
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_IV1LR); /* [63:32] */
+  in++;
+  cryp_putreg32(__builtin_bswap32(*in), STM32_CRYP_IV1RR); /* [31:0] */
+}
+
+static void stm32aes_encryptblock(void *block_out,
+                                  const void *block_in)
+{
+  uint32_t *in  = (uint32_t *)block_in;
+  uint32_t *out = (uint32_t *)block_out;
+
+  cryp_putreg32(*in, STM32_CRYP_DIN);
+  in++;
+  cryp_putreg32(*in, STM32_CRYP_DIN);
+  in++;
+  cryp_putreg32(*in, STM32_CRYP_DIN);
+  in++;
+  cryp_putreg32(*in, STM32_CRYP_DIN);
+
+  stm32aes_wait_not_busy();
+
+  *out = cryp_getreg32(STM32_CRYP_DOUT);
+  out++;
+  *out = cryp_getreg32(STM32_CRYP_DOUT);
+  out++;
+  *out = cryp_getreg32(STM32_CRYP_DOUT);
+  out++;
+  *out = cryp_getreg32(STM32_CRYP_DOUT);
+}
+
+static void stm32aes_set_datatype(void)
+{
+  uint32_t regval;
+
+  regval = cryp_getreg32(STM32_CRYP_CR);
+  regval |= CRYP_CR_DATATYPE_BE;
+  regval = STM32AES_CLEAR_RESERVED_CR_BITS(regval);
+  cryp_putreg32(regval, STM32_CRYP_CR);
+}
+
+static int stm32aes_setup_cr(int mode, int encrypt,
+                             const void *key, size_t keysize)
+{
+  int ret;
+  uint32_t regval = 0;
+
+  /** 1) Configure algorithm/chaining mode through ALGOMODE/AOGODIR
+   *    bits; also set KEYSIZE
+   *    - when decrypting and mode is AES-ECB or AES-CBC, an initial
+   *      key derivation must be performed (see section 35.4.7)
+   */
+
+  /* Set KEYSIZE field */
+
+  switch (keysize)
+    {
+      case 16:
+        regval |= CRYP_CR_KEYSIZE_128;
+        break;
+      case 24:
+        regval |= CRYP_CR_KEYSIZE_192;
+        break;
+      case 32:
+        regval |= CRYP_CR_KEYSIZE_256;
+        break;
+      default:
+        return -EINVAL;
+    }
+
+  /* Set symmetric key */
+
+  ret = stm32aes_setkey(key, keysize);
+  if (ret)
+    {
+      return -EINVAL;
+    }
+
+  /* If decrypting and mode is AES-ECB or AES-CBC need to perform
+   * key derivation first
+   */
+
+  if (!encrypt)
+    {
+      /* Set DECRYPT field */
+
+      regval |= CRYP_CR_ALGODIR_DECRYPT;
+      if ((mode == AES_MODE_ECB) || (mode == AES_MODE_CBC))
+        {
+          regval |= CRYP_CR_ALGOMODE_AES_KEY_PREP;
+          cryp_putreg32(regval, STM32_CRYP_CR);
+
+          /* Start key derivation and wait for not BUSY */
+
+          stm32aes_enable(true);
+          stm32aes_wait_not_busy();
+          /* CRYPEN is automatically cleared. Clear
+           * ALGOMODE field to allow following code to set
+           * to the proper mode
+           */
+
+          regval &= ~CRYP_CR_ALGOMODE_MASK;
+        }
+    }
+  else
+    {
+      /* Encrypting, make sure DECRYPT flag is cleared */
+
+      regval &= ~CRYP_CR_ALGODIR_DECRYPT;
+    }
+
+  switch (mode)
+  {
+  case AES_MODE_ECB:
+    regval |= CRYP_CR_ALGOMODE_AES_ECB;
+    break;
+
+  case AES_MODE_CBC:
+    regval |= CRYP_CR_ALGOMODE_AES_CBC;
+    break;
+
+  case AES_MODE_CTR:
+    regval |= CRYP_CR_ALGOMODE_AES_CTR;
+    break;
+
+  default:
+    return -EINVAL;
+  }
+
+  regval = STM32AES_CLEAR_RESERVED_CR_BITS(regval);
+  cryp_putreg32(regval, STM32_CRYP_CR);
+
+  stm32aes_wait_not_busy();
+
+  stm32aes_set_datatype();
+
+  stm32aes_wait_not_busy();
+
+  return OK;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int stm32_aesreset(void)
+{
+  irqstate_t flags;
+  uint32_t regval;
+
+  flags = enter_critical_section();
+
+  /* Clear/set AHB2RSTR to reset CRYP peripheral */
+
+  regval  = cryp_getreg32(STM32_RCC_AHB2RSTR);
+  regval |= RCC_AHB2RSTR_CRYPTRST;
+  cryp_putreg32(regval, STM32_RCC_AHB2RSTR);
+  regval &= ~RCC_AHB2RSTR_CRYPTRST;
+  cryp_putreg32(regval, STM32_RCC_AHB2RSTR);
+
+  leave_critical_section(flags);
+
+  return OK;
+}
+
+int stm32_aesinitialize(void)
+{
+  uint32_t regval;
+
+  regval  = cryp_getreg32(STM32_RCC_AHB2ENR);
+  regval |= RCC_AHB2ENR_CRYPTEN;
+  cryp_putreg32(regval, STM32_RCC_AHB2ENR);
+
+  stm32aes_enable(false);
+
+  return OK;
+}
+
+static void stm32aes_flush_fifos(void)
+{
+  uint32_t regval;
+
+  regval = cryp_getreg32(STM32_CRYP_CR);
+  regval |= CRYP_CR_FFLUSH;
+  regval = STM32AES_CLEAR_RESERVED_CR_BITS(regval);
+  cryp_putreg32(regval, STM32_CRYP_CR);
+}
+
+/* See section 35.4.5 CRYP procedure to perform a cipher operation:
+ * 0) Clear CRYPEN bit
+ * 1) Configure algorithm/chaining mode through ALGOMODE/AOGODIR
+ *    bits; also set KEYSIZE
+ *    - when decrypting and mode is AES-ECB or AES-CBC, an initial
+ *      key derivation must be performed (see section 35.4.7)
+ * 2) When previous step is complete (and when applicable), write
+ *    key into CRYP_KxL/R registers (see section 35.4.17)
+ * 3) Configure DATATYPE
+ * 4) When required(eg for CBC or CTR chaining modes), write the
+ *    initialization vectors into CRYP_IVx(L/R)R.
+ * 5) Flush the IN/OUT FIFOS by setting FFLUSH.
+ *
+ * Warning: If ECB/CBC mode is selected and data is not a multiple
+ *          of 64 bits (for DES) or 128 bits (for AES), the 2nd and last
+ *          block management is more comples; see Section 35.4.8
+ *
+ *  Appending data using the CPU in Polling mode
+ * 1) Enable the cryptographic processor by setting to 1 the CRYPEN
+ *    bit in the CRYP_CR register.
+ * 2) Write data in the IN FIFO (one block or until the FIFO is full).
+ * 3) Repeat the following sequence until the second last block of
+ *    data has been processed:
+ *    a) Wait until the not-empty-flag OFNE is set to 1, then read
+ *       the OUT FIFO (one block or until the FIFO is empty).
+ *    b) Wait until the not-full-flag IFNF is set to 1, then write
+ *       the IN FIFO (one block or until the FIFO is full) except
+ *       if it is the last block.
+ * 4) The BUSY bit is set automatically by the cryptographic processor.
+ *    At the end of the processing, the BUSY bit returns to 0 and both
+ *    FIFOs are empty (IN FIFO empty flag IFEM = 1 and OUT FIFO not
+ *    empty flag OFNE = 0).
+ * 5) If the next processing block is the last block, the CPU must pad
+ *    (when applicable) the data with zeroes to obtain a complete block
+ * 6) When the operation is complete, the cryptographic processor can
+ *    be disabled by clearing the CRYPEN bit in CRYP_CR register.
+ *
+ * 35.4.7 Preparing the CRYP AES key for decryption:
+ *
+ * When performing an AES ECB or CBC decryption, the AES key
+ * has to be prepared. Indeed, in AES encryption the round 0 key
+ * is the one stored in the key registers, and AES decryption must
+ * start using the last round key. Hence, as the encryption key
+ * is stored in memory, a special key scheduling must be performed
+ * to obtain the decryption key. This preparation is not required
+ * in any other AES modes than ECB or CBC decryption.
+ *
+ * When the cryptographic processor is disabled (CRYPEN = 0),
+ * the CRYP key preparation process is performed as follows:
+ * 1) Program ALGOMODE bits to 0x7 and ALGODIR to 0x0 in CRYP_CR.
+ *    In addition, configure the key length with the KEYSIZE bits.
+ * 2) Write the symmetric key to the CRYP_KxL/R registers, as
+ *    described in Section 35.4.17: CRYP key registers.
+ * 3) Enable the cryptographic processor by setting the CRYPEN bit
+ *    in the CRYP_CR register. It immediately starts an AES round
+ *    for key preparation (BUSY = 1).
+ * 4) Wait until the BUSY bit is cleared in the CRYP_SR register.
+ *    Then update ALGOMODE bits in the CRYP_CR register to select
+ *    the correct chaining mode, that is 0x4 for ECB or 0x5 for CBC.
+ * 5) The AES key is available in the CRYP key registers, ready
+ *    to use for decryption.
+ * Note: As the CRYPEN bitfield is reset by hardware at the end of
+ *       the key preparation, the application software must set it
+ *       again for the next operation.
+ *       The latency of the key preparation operation is 14, 16 or 18
+ *       clock cycles depending on the key size (128, 192 or 256 bits).
+ *
+ * 35.4.8 CRYP stealing and data padding
+ *
+ * When using DES or AES algorithm in ECB or CBC modes to manage
+ * messages that are not multiple of the block size (64 bits for DES,
+ * 128 bits for AES), use ciphertext stealing techniques such as those
+ * described in NIST Special Publication 800-38A, Recommendation
+ * for Block Cipher Modes of Operation: Three Variants of Ciphertext
+ * Stealing for CBC Mode. Since the cryptographic processor does not
+ * implement such techniques, the last two blocks must be handled in
+ * a special way by the application.
+ *
+ * Note: Ciphertext stealing techniques are not documented in this
+ *       reference manual.
+ *
+ * Similarly, when the AES algorithm is used in other modes than ECB
+ * or CBC, incomplete input data blocks (i.e. block shorter than 128
+ * bits) have to be padded with zeroes by the application prior to
+ * encryption (i.e. extra bits should be appended to the trailing end
+ * of the data string). After decryption, the extra bits have to be
+ * discarded. The cryptographic processor does not implement automatic
+ * data padding operation to the last block, so the application should
+ * follow the recommendation given in Section 35.4.5: CRYP procedure to
+ * perform a cipher operation to manage messages that are not multiple
+ * of 128 bits.
+ *
+ * Note: Padding data are swapped in a similar way as normal data,
+ *       according to the DATATYPE field in CRYP_CR register (see
+ *       Section 35.4.16: CRYP data registers and data swapping for
+ *       details).
+ */
+
+int aes_cypher(void *out, const void *in, size_t size,
+               const void *iv, const void *key, size_t keysize,
+               int mode, int encrypt)
+{
+  int ret = OK;
+
+  /* CRYP peripheral clock is already enabled;
+   * make sure it gets reset (once)
+   */
+
+  if (!g_stm32aes_initdone)
+    {
+      ret = stm32_aesreset();
+      if (ret < 0)
+        {
+          return ret; /* AES init failed */
+        }
+
+      g_stm32aes_initdone = true;
+    }
+
+  if ((size & (AES_BLOCK_SIZE - 1)) != 0)
+    {
+      return -EINVAL;
+    }
+
+  if (keysize != 16 && keysize != 24 && keysize != 32)
+    {
+      return -EINVAL;
+    }
+
+  ret = nxmutex_lock(&g_stm32aes_lock);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  /* AES must be disabled before changing mode, key or IV. */
+
+  stm32aes_enable(false);
+  ret = stm32aes_setup_cr(mode, encrypt, key, keysize);
+  if (ret < 0)
+    {
+      goto out;
+    }
+
+  if (iv != NULL)
+    {
+      stm32aes_setiv(iv);
+    }
+
+  stm32aes_wait_not_busy();
+  stm32aes_flush_fifos();
+  stm32aes_wait_not_busy();
+
+  stm32aes_enable(true);
+
+  while (size)
+    {
+      stm32aes_encryptblock(out, in);
+      out   = (uint8_t *)out + AES_BLOCK_SIZE;
+      in    = (uint8_t *)in  + AES_BLOCK_SIZE;
+      size -= AES_BLOCK_SIZE;
+    }
+
+  stm32aes_enable(false);
+
+out:
+  nxmutex_unlock(&g_stm32aes_lock);
+
+  return ret;
+}
diff --git a/arch/arm/src/stm32h7/stm32_aes.h b/arch/arm/src/stm32h7/stm32_aes.h
new file mode 100644
index 00000000000..ad9595d946a
--- /dev/null
+++ b/arch/arm/src/stm32h7/stm32_aes.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * arch/arm/src/stm32h7/stm32_aes.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_STM32H7_STM32_AES_H
+#define __ARCH_ARM_SRC_STM32H7_STM32_AES_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+
+#include "chip.h"
+
+/* For simplicity support STM32753ZI, not sure what other STM32H7
+ * variants include CRYP
+ */
+
+#ifdef CONFIG_STM32H7_HAVE_CRYP
+#  include "hardware/stm32h7xxxx_cryp.h"
+#else
+#  error "Unknown chip for AES"
+#endif
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Inline Functions
+ ****************************************************************************/
+
+#endif /* __ARCH_ARM_SRC_STM32H7_STM32_AES_H */
diff --git a/arch/arm/src/stm32h7/stm32_crypto.c 
b/arch/arm/src/stm32h7/stm32_crypto.c
new file mode 100644
index 00000000000..e73205f36c5
--- /dev/null
+++ b/arch/arm/src/stm32h7/stm32_crypto.c
@@ -0,0 +1,163 @@
+/****************************************************************************
+ * arch/arm/src/stm32h7/stm32_crypto.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/debug.h>
+#include <errno.h>
+#include <stdint.h>
+
+#include <crypto/cryptodev.h>
+#include <crypto/xform.h>
+#include <nuttx/crypto/crypto.h>
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static uint32_t g_stm32_sesnum = 0;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: stm32_newsession
+ *
+ * Description:
+ *   create new session for crypto.
+ *
+ ****************************************************************************/
+
+static int stm32_newsession(uint32_t *sid, struct cryptoini *cri)
+{
+  int klen;
+
+  if (sid == NULL || cri == NULL)
+    {
+      return -EINVAL;
+    }
+
+  switch (cri->cri_alg)
+    {
+      case CRYPTO_AES_CBC:
+        *sid = g_stm32_sesnum++;
+        break;
+      case CRYPTO_AES_CTR:
+        klen = cri->cri_klen / 8 - 4;
+        if ((klen != 16) && (klen != 24) && (klen != 32))
+          {
+            /* stm32h7 aes-ctr key bits support 128, 192, or 256 */
+
+            return -EINVAL;
+          }
+
+        *sid = g_stm32_sesnum++;
+        break;
+      default:
+        return -EINVAL;
+    }
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: stm32_freesession
+ *
+ * Description:
+ *   free session.
+ *
+ ****************************************************************************/
+
+static int stm32_freesession(uint64_t tid)
+{
+  return 0;
+}
+
+/****************************************************************************
+ * Name: stm32_process
+ *
+ * Description:
+ *   process session to use hardware algorithm.
+ *
+ ****************************************************************************/
+
+static int stm32_process(struct cryptop *crp)
+{
+  struct cryptodesc *crd;
+  uint8_t iv[AESCTR_BLOCKSIZE];
+
+  for (crd = crp->crp_desc; crd; crd = crd->crd_next)
+    {
+      switch (crd->crd_alg)
+        {
+          case CRYPTO_AES_CBC:
+            return aes_cypher(crp->crp_dst, crp->crp_buf, crd->crd_len,
+                              crp->crp_iv, crd->crd_key, 16,
+                              AES_MODE_CBC, crd->crd_flags & CRD_F_ENCRYPT);
+          case CRYPTO_AES_CTR:
+
+            memcpy(iv, crd->crd_key + crd->crd_klen / 8 - AESCTR_NONCESIZE,
+                   AESCTR_NONCESIZE);
+            memcpy(iv + AESCTR_NONCESIZE, crp->crp_iv, AESCTR_IVSIZE);
+            memcpy(iv + AESCTR_NONCESIZE + AESCTR_IVSIZE,
+                   (uint8_t *)crp->crp_iv + AESCTR_IVSIZE, 4);
+
+            return aes_cypher(crp->crp_dst, crp->crp_buf,
+                              crd->crd_len, iv, crd->crd_key,
+                              crd->crd_klen / 8 - AESCTR_NONCESIZE,
+                              AES_MODE_CTR, crd->crd_flags & CRD_F_ENCRYPT);
+          default:
+            return -EINVAL;
+        }
+    }
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: hwcr_init
+ *
+ * Description:
+ *   register the hardware crypto driver.
+ *
+ ****************************************************************************/
+
+void hwcr_init(void)
+{
+  int hwcr_id;
+  int algs[CRYPTO_ALGORITHM_MAX + 1];
+
+  hwcr_id = crypto_get_driverid(0);
+  DEBUGASSERT(hwcr_id >= 0);
+
+  memset(algs, 0, sizeof(algs));
+
+  algs[CRYPTO_AES_CBC] = CRYPTO_ALG_FLAG_SUPPORTED;
+  algs[CRYPTO_AES_CTR] = CRYPTO_ALG_FLAG_SUPPORTED;
+
+  crypto_register(hwcr_id, algs, stm32_newsession,
+                  stm32_freesession, stm32_process);
+}
diff --git a/arch/arm/src/stm32h7/stm32h7x3xx_rcc.c 
b/arch/arm/src/stm32h7/stm32h7x3xx_rcc.c
index 291c26b8632..a1ce272975b 100644
--- a/arch/arm/src/stm32h7/stm32h7x3xx_rcc.c
+++ b/arch/arm/src/stm32h7/stm32h7x3xx_rcc.c
@@ -326,6 +326,12 @@ static inline void rcc_enableahb2(void)
   regval |= RCC_AHB2ENR_RNGEN;
 #endif
 
+#ifdef CONFIG_STM32H7_CRYP
+  /* Cryptographic clock enable */
+
+  regval |= RCC_AHB2ENR_CRYPTEN;
+#endif
+
   putreg32(regval, STM32_RCC_AHB2ENR);   /* Enable peripherals */
 }
 
diff --git a/boards/arm/stm32h7/nucleo-h753zi/configs/crypto/defconfig 
b/boards/arm/stm32h7/nucleo-h753zi/configs/crypto/defconfig
new file mode 100644
index 00000000000..e36ef998844
--- /dev/null
+++ b/boards/arm/stm32h7/nucleo-h753zi/configs/crypto/defconfig
@@ -0,0 +1,56 @@
+#
+# 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_NSH_DISABLE_IFCONFIG is not set
+# CONFIG_NSH_DISABLE_PS is not set
+# CONFIG_STANDARD_SERIAL is not set
+# CONFIG_TESTING_CRYPTO_3DES_CBC is not set
+# CONFIG_TESTING_CRYPTO_AES_XTS is not set
+# CONFIG_TESTING_CRYPTO_HMAC is not set
+CONFIG_ALLOW_BSD_COMPONENTS=y
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="nucleo-h753zi"
+CONFIG_ARCH_BOARD_NUCLEO_H753ZI=y
+CONFIG_ARCH_CHIP="stm32h7"
+CONFIG_ARCH_CHIP_STM32H753ZI=y
+CONFIG_ARCH_CHIP_STM32H7=y
+CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_DTCM=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_BOARD_LOOPSPERMSEC=43103
+CONFIG_BUILTIN=y
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_CRYPTODEV=y
+CONFIG_CRYPTO_CRYPTODEV_HARDWARE=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LINE_MAX=64
+CONFIG_MM_REGIONS=4
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_READLINE=y
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=245760
+CONFIG_RAM_START=0x20010000
+CONFIG_RAW_BINARY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_WAITPID=y
+CONFIG_START_DAY=6
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2011
+CONFIG_STM32H7_CRYP=y
+CONFIG_STM32H7_USART3=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_TASK_NAME_SIZE=0
+CONFIG_TESTING_CRYPTO=y
+CONFIG_TESTING_CRYPTO_STACKSIZE=4096
+CONFIG_USART3_SERIAL_CONSOLE=y


Reply via email to