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 #define KS_OP_LOCK      (7 << KS_CTL_OPMODE_Pos)
47 
48 #define KS_OWNER_AES        (0ul)
49 #define KS_OWNER_HMAC       (1ul)
50 #define KS_OWNER_RSA_EXP    (2ul)
51 #define KS_OWNER_RSA_MID    (3ul)
52 #define KS_OWNER_ECC        (4ul)
53 #define KS_OWNER_CPU        (5ul)
54 
55 #define KS_META_AES     (0ul << KS_METADATA_OWNER_Pos)   /*!< AES Access Only                                */
56 #define KS_META_HMAC    (1ul << KS_METADATA_OWNER_Pos)   /*!< HMAC Access Only                               */
57 #define KS_META_RSA_EXP (2ul << KS_METADATA_OWNER_Pos)   /*!< RSA_EXP Access Only                            */
58 #define KS_META_RSA_MID (3ul << KS_METADATA_OWNER_Pos)   /*!< RSA_MID Access Only                            */
59 #define KS_META_ECC     (4ul << KS_METADATA_OWNER_Pos)   /*!< ECC Access Only                                */
60 #define KS_META_CPU     (5ul << KS_METADATA_OWNER_Pos)   /*!< CPU Access Only                                */
61 
62 #define KS_META_128     ( 0ul << KS_METADATA_SIZE_Pos)  /*!< Key size 128 bits                              */
63 #define KS_META_163     ( 1ul << KS_METADATA_SIZE_Pos)  /*!< Key size 163 bits                              */
64 #define KS_META_192     ( 2ul << KS_METADATA_SIZE_Pos)  /*!< Key size 192 bits                              */
65 #define KS_META_224     ( 3ul << KS_METADATA_SIZE_Pos)  /*!< Key size 224 bits                              */
66 #define KS_META_233     ( 4ul << KS_METADATA_SIZE_Pos)  /*!< Key size 233 bits                              */
67 #define KS_META_255     ( 5ul << KS_METADATA_SIZE_Pos)  /*!< Key size 255 bits                              */
68 #define KS_META_256     ( 6ul << KS_METADATA_SIZE_Pos)  /*!< Key size 256 bits                              */
69 #define KS_META_283     ( 7ul << KS_METADATA_SIZE_Pos)  /*!< Key size 283 bits                              */
70 #define KS_META_384     ( 8ul << KS_METADATA_SIZE_Pos)  /*!< Key size 384 bits                              */
71 #define KS_META_409     ( 9ul << KS_METADATA_SIZE_Pos)  /*!< Key size 409 bits                              */
72 #define KS_META_512     (10ul << KS_METADATA_SIZE_Pos)  /*!< Key size 512 bits                              */
73 #define KS_META_521     (11ul << KS_METADATA_SIZE_Pos)  /*!< Key size 521 bits                              */
74 #define KS_META_571     (12ul << KS_METADATA_SIZE_Pos)  /*!< Key size 571 bits                              */
75 #define KS_META_1024    (16ul << KS_METADATA_SIZE_Pos)  /*!< Key size 1024 bits                             */
76 #define KS_META_1536    (17ul << KS_METADATA_SIZE_Pos)  /*!< Key size 1024 bits                             */
77 #define KS_META_2048    (18ul << KS_METADATA_SIZE_Pos)  /*!< Key size 2048 bits                             */
78 #define KS_META_3072    (19ul << KS_METADATA_SIZE_Pos)  /*!< Key size 1024 bits                             */
79 #define KS_META_4096    (20ul << KS_METADATA_SIZE_Pos)  /*!< Key size 4096 bits                             */
80 
81 #define KS_META_BOOT    ( 1ul << KS_METADATA_BS_Pos)    /*!< Key only used for boot ROM only                */
82 
83 #define KS_META_READABLE (1ul << KS_METADATA_READABLE_Pos)  /*!< Allow the key to be read by software       */
84 
85 #define KS_META_PRIV     (1ul << KS_METADATA_PRIV_Pos)  /*!< Privilege key                                  */
86 #define KS_META_NONPRIV  (0ul << KS_METADATA_PRIV_Pos)  /*!< Non-privilege key                              */
87 
88 #define KS_META_SECURE    (1ul << KS_METADATA_SEC_Pos)    /*!< Secure key                                     */
89 #define KS_META_NONSECURE (0ul << KS_METADATA_SEC_Pos)    /*!< Non-secure key                                 */
90 
91 #define KS_TIMEOUT      SystemCoreClock /*!< 1 second time-out \hideinitializer */
92 
93 #define KS_OK            ( 0L)
94 #define KS_ERR_FAIL      (-1L)   /*!< KS failed */
95 #define KS_ERR_TIMEOUT   (-2L)   /*!< KS operation abort due to timeout error */
96 #define KS_ERR_INIT      (-3L)   /*!< KS intital fail */
97 #define KS_ERR_BUSY      (-4L)   /*!< KS is in busy state */
98 #define KS_ERR_PARAMETER (-5L)   /*!< Wrong input parameters */
99 
100 /**
101   * @brief      Enable scramble function
102   * @details    This function is used to enable scramle function of Key Store.
103   */
104 
105 #define KS_SCRAMBLING()     KS->CTL |= KS_CTL_SCMB_Msk
106 
107 
108 
109 
110 /**@}*/ /* end of group KS_EXPORTED_CONSTANTS */
111 
112 extern int32_t g_KS_i32ErrCode;
113 
114 /** @addtogroup KS_EXPORTED_FUNCTIONS Key Store Exported Functions
115   @{
116 */
117 
118 int32_t KS_Open(void);
119 int32_t KS_Read(KS_MEM_Type type, int32_t i32KeyIdx, uint32_t au32Key[], uint32_t u32WordCnt);
120 int32_t KS_Write(KS_MEM_Type eType, uint32_t u32Meta, uint32_t au32Key[]);
121 int32_t KS_WriteOTP(int32_t i32KeyIdx, uint32_t u32Meta, uint32_t au32Key[]);
122 int32_t KS_EraseKey(int32_t i32KeyIdx);
123 int32_t KS_EraseOTPKey(int32_t i32KeyIdx);
124 int32_t KS_LockOTPKey(int32_t i32KeyIdx);
125 int32_t KS_EraseAll(KS_MEM_Type eType);
126 int32_t KS_RevokeKey(KS_MEM_Type eType, int32_t i32KeyIdx);
127 uint32_t KS_GetRemainSize(KS_MEM_Type eType);
128 int32_t KS_ToggleSRAM(void);
129 uint32_t KS_GetKeyWordCnt(uint32_t u32Meta);
130 uint32_t KS_GetRemainKeyCount(KS_MEM_Type mem);
131 
132 /**@}*/ /* end of group KS_EXPORTED_FUNCTIONS */
133 
134 /**@}*/ /* end of group KS_Driver */
135 
136 /**@}*/ /* end of group Standard_Driver */
137 
138 #ifdef __cplusplus
139 }
140 #endif
141 
142 #endif /* __KEYSTORE_H__ */
143 
144 
145