1 /**************************************************************************//**
2  * @file     keystore.h
3  * @version  V3.00
4  * @brief    Key Store Driver Header
5  *
6  * @copyright SPDX-License-Identifier: Apache-2.0
7  * @copyright Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
8  *****************************************************************************/
9 #ifndef __KEYSTORE_H__
10 #define __KEYSTORE_H__
11 
12 #ifdef __cplusplus
13 extern "C"
14 {
15 #endif
16 
17 
18 /** @addtogroup Standard_Driver Standard Driver
19   @{
20 */
21 
22 /** @addtogroup KS_Driver Key Store Driver
23   @{
24 */
25 
26 /** @addtogroup KS_EXPORTED_CONSTANTS Key Store Exported Constants
27   @{
28 */
29 
30 #define KS_TOMETAKEY(x)     (((uint32_t)(x) << KS_METADATA_NUMBER_Pos) & KS_METADATA_NUMBER_Msk)
31 #define KS_TOKEYIDX(x)      (((uint32_t)(x) & KS_METADATA_NUMBER_Msk) >> KS_METADATA_NUMBER_Pos)
32 
33 typedef enum KSMEM
34 {
35     KS_SRAM  = 0,     /*!< Volatile Memory                                */
36     KS_FLASH = 1,    /*!< Non-volatile Memory                            */
37     KS_OTP   = 2     /*!< One-Time Programming Memory                    */
38 } KS_MEM_Type;
39 
40 #define KS_OP_READ      (0 << KS_CTL_OPMODE_Pos)
41 #define KS_OP_WRITE     (1 << KS_CTL_OPMODE_Pos)
42 #define KS_OP_ERASE     (2 << KS_CTL_OPMODE_Pos)
43 #define KS_OP_ERASE_ALL (3 << KS_CTL_OPMODE_Pos)
44 #define KS_OP_REVOKE    (4 << KS_CTL_OPMODE_Pos)
45 #define KS_OP_REMAN     (5 << KS_CTL_OPMODE_Pos)
46 
47 #define KS_OWNER_AES        (0ul)
48 #define KS_OWNER_HMAC       (1ul)
49 #define KS_OWNER_RSA_EXP    (2ul)
50 #define KS_OWNER_RSA_MID    (3ul)
51 #define KS_OWNER_ECC        (4ul)
52 #define KS_OWNER_CPU        (5ul)
53 
54 #define KS_META_AES     (0ul << KS_METADATA_OWNER_Pos)   /*!< AES Access Only                                */
55 #define KS_META_HMAC    (1ul << KS_METADATA_OWNER_Pos)   /*!< HMAC Access Only                               */
56 #define KS_META_RSA_EXP (2ul << KS_METADATA_OWNER_Pos)   /*!< RSA_EXP Access Only                            */
57 #define KS_META_RSA_MID (3ul << KS_METADATA_OWNER_Pos)   /*!< RSA_MID Access Only                            */
58 #define KS_META_ECC     (4ul << KS_METADATA_OWNER_Pos)   /*!< ECC Access Only                                */
59 #define KS_META_CPU     (5ul << KS_METADATA_OWNER_Pos)   /*!< CPU Access Only                                */
60 
61 #define KS_META_128     ( 0ul << KS_METADATA_SIZE_Pos)  /*!< Key size 128 bits                              */
62 #define KS_META_163     ( 1ul << KS_METADATA_SIZE_Pos)  /*!< Key size 163 bits                              */
63 #define KS_META_192     ( 2ul << KS_METADATA_SIZE_Pos)  /*!< Key size 192 bits                              */
64 #define KS_META_224     ( 3ul << KS_METADATA_SIZE_Pos)  /*!< Key size 224 bits                              */
65 #define KS_META_233     ( 4ul << KS_METADATA_SIZE_Pos)  /*!< Key size 233 bits                              */
66 #define KS_META_255     ( 5ul << KS_METADATA_SIZE_Pos)  /*!< Key size 255 bits                              */
67 #define KS_META_256     ( 6ul << KS_METADATA_SIZE_Pos)  /*!< Key size 256 bits                              */
68 #define KS_META_283     ( 7ul << KS_METADATA_SIZE_Pos)  /*!< Key size 283 bits                              */
69 #define KS_META_384     ( 8ul << KS_METADATA_SIZE_Pos)  /*!< Key size 384 bits                              */
70 #define KS_META_409     ( 9ul << KS_METADATA_SIZE_Pos)  /*!< Key size 409 bits                              */
71 #define KS_META_512     (10ul << KS_METADATA_SIZE_Pos)  /*!< Key size 512 bits                              */
72 #define KS_META_521     (11ul << KS_METADATA_SIZE_Pos)  /*!< Key size 521 bits                              */
73 #define KS_META_571     (12ul << KS_METADATA_SIZE_Pos)  /*!< Key size 571 bits                              */
74 #define KS_META_1024    (16ul << KS_METADATA_SIZE_Pos)  /*!< Key size 1024 bits                             */
75 #define KS_META_1536    (17ul << KS_METADATA_SIZE_Pos)  /*!< Key size 1024 bits                             */
76 #define KS_META_2048    (18ul << KS_METADATA_SIZE_Pos)  /*!< Key size 2048 bits                             */
77 #define KS_META_3072    (19ul << KS_METADATA_SIZE_Pos)  /*!< Key size 1024 bits                             */
78 #define KS_META_4096    (20ul << KS_METADATA_SIZE_Pos)  /*!< Key size 4096 bits                             */
79 
80 #define KS_META_BOOT    ( 1ul << KS_METADATA_BS_Pos)    /*!< Key only used for boot ROM only                */
81 
82 #define KS_META_READABLE (1ul << KS_METADATA_READABLE_Pos)  /*!< Allow the key to be read by software       */
83 
84 #define KS_META_PRIV     (1ul << KS_METADATA_PRIV_Pos)  /*!< Privilege key                                  */
85 #define KS_META_NONPRIV  (0ul << KS_METADATA_PRIV_Pos)  /*!< Non-privilege key                              */
86 
87 #define KS_META_SECURE    (1ul << KS_METADATA_SEC_Pos)    /*!< Secure key                                     */
88 #define KS_META_NONSECURE (0ul << KS_METADATA_SEC_Pos)    /*!< Non-secure key                                 */
89 
90 
91 /**
92   * @brief      Enable scramble function
93   * @details    This function is used to enable scramle function of Key Store.
94   */
95 
96 #define KS_SCRAMBLING()     KS->CTL |= KS_CTL_SCMB_Msk
97 
98 
99 
100 
101 /**@}*/ /* end of group KS_EXPORTED_CONSTANTS */
102 
103 
104 /** @addtogroup KS_EXPORTED_FUNCTIONS Key Store Exported Functions
105   @{
106 */
107 
108 void KS_Open(void);
109 int32_t KS_Read(KS_MEM_Type type, int32_t i32KeyIdx, uint32_t au32Key[], uint32_t u32WordCnt);
110 int32_t KS_Write(KS_MEM_Type eType, uint32_t u32Meta, uint32_t au32Key[]);
111 int32_t KS_WriteOTP(int32_t i32KeyIdx, uint32_t u32Meta, uint32_t au32Key[]);
112 int32_t KS_EraseKey(int32_t i32KeyIdx);
113 int32_t KS_EraseAll(KS_MEM_Type eType);
114 int32_t KS_RevokeKey(KS_MEM_Type eType, int32_t i32KeyIdx);
115 uint32_t KS_GetRemainSize(KS_MEM_Type eType);
116 int32_t KS_ToggleSRAM(void);
117 uint32_t KS_GetKeyWordCnt(uint32_t u32Meta);
118 uint32_t KS_GetRemainKeyCount(KS_MEM_Type mem);
119 
120 /**@}*/ /* end of group KS_EXPORTED_FUNCTIONS */
121 
122 /**@}*/ /* end of group KS_Driver */
123 
124 /**@}*/ /* end of group Standard_Driver */
125 
126 #ifdef __cplusplus
127 }
128 #endif
129 
130 #endif /* __KEYSTORE_H__ */
131