hpm_keyman_regs.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_KEYMAN_H
  8. #define HPM_KEYMAN_H
  9. typedef struct {
  10. __RW uint32_t SOFTMKEY[8]; /* 0x0 - 0x1C: software set symmetric key */
  11. __RW uint32_t SOFTPKEY[8]; /* 0x20 - 0x3C: system asymmetric key */
  12. __RW uint32_t SEC_KEY_CTL; /* 0x40: Random number interface behavior */
  13. __RW uint32_t NSC_KEY_CTL; /* 0x44: Random number interface behavior */
  14. __RW uint32_t RNG; /* 0x48: Random number interface behavior */
  15. __RW uint32_t READ_CONTROL; /* 0x4C: symmetric and asymmetric key read out control */
  16. } KEYMAN_Type;
  17. /* Bitfield definition for register array: SOFTMKEY */
  18. /*
  19. * KEY (RW)
  20. *
  21. * software symmetric key
  22. * key will be scambled to 4 variants for software to use, and replicable on same chip.
  23. * scramble keys are chip different, and not replicable on different chip
  24. * must be write sequencely from 0 - 7, otherwise key value will be treated as all 0
  25. */
  26. #define KEYMAN_SOFTMKEY_KEY_MASK (0xFFFFFFFFUL)
  27. #define KEYMAN_SOFTMKEY_KEY_SHIFT (0U)
  28. #define KEYMAN_SOFTMKEY_KEY_SET(x) (((uint32_t)(x) << KEYMAN_SOFTMKEY_KEY_SHIFT) & KEYMAN_SOFTMKEY_KEY_MASK)
  29. #define KEYMAN_SOFTMKEY_KEY_GET(x) (((uint32_t)(x) & KEYMAN_SOFTMKEY_KEY_MASK) >> KEYMAN_SOFTMKEY_KEY_SHIFT)
  30. /* Bitfield definition for register array: SOFTPKEY */
  31. /*
  32. * KEY (RW)
  33. *
  34. * software asymmetric key
  35. * key is XOR version of scrambles of fuse private key, software input key, SRK, and system security status.
  36. * This key os read once, sencondary read will read out 0
  37. */
  38. #define KEYMAN_SOFTPKEY_KEY_MASK (0xFFFFFFFFUL)
  39. #define KEYMAN_SOFTPKEY_KEY_SHIFT (0U)
  40. #define KEYMAN_SOFTPKEY_KEY_SET(x) (((uint32_t)(x) << KEYMAN_SOFTPKEY_KEY_SHIFT) & KEYMAN_SOFTPKEY_KEY_MASK)
  41. #define KEYMAN_SOFTPKEY_KEY_GET(x) (((uint32_t)(x) & KEYMAN_SOFTPKEY_KEY_MASK) >> KEYMAN_SOFTPKEY_KEY_SHIFT)
  42. /* Bitfield definition for register: SEC_KEY_CTL */
  43. /*
  44. * LOCK_SEC_CTL (RW)
  45. *
  46. * block secure state key setting being changed
  47. */
  48. #define KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_MASK (0x80000000UL)
  49. #define KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_SHIFT (31U)
  50. #define KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_SET(x) (((uint32_t)(x) << KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_SHIFT) & KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_MASK)
  51. #define KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_GET(x) (((uint32_t)(x) & KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_MASK) >> KEYMAN_SEC_KEY_CTL_LOCK_SEC_CTL_SHIFT)
  52. /*
  53. * SK_VAL (RO)
  54. *
  55. * session key valid
  56. * 0: session key is all 0's and not usable
  57. * 1: session key is valid
  58. */
  59. #define KEYMAN_SEC_KEY_CTL_SK_VAL_MASK (0x10000UL)
  60. #define KEYMAN_SEC_KEY_CTL_SK_VAL_SHIFT (16U)
  61. #define KEYMAN_SEC_KEY_CTL_SK_VAL_GET(x) (((uint32_t)(x) & KEYMAN_SEC_KEY_CTL_SK_VAL_MASK) >> KEYMAN_SEC_KEY_CTL_SK_VAL_SHIFT)
  62. /*
  63. * SMK_SEL (RW)
  64. *
  65. * software symmetric key selection
  66. * 0: use scramble version of software symmetric key
  67. * 1: use origin value in software symmetric key
  68. */
  69. #define KEYMAN_SEC_KEY_CTL_SMK_SEL_MASK (0x1000U)
  70. #define KEYMAN_SEC_KEY_CTL_SMK_SEL_SHIFT (12U)
  71. #define KEYMAN_SEC_KEY_CTL_SMK_SEL_SET(x) (((uint32_t)(x) << KEYMAN_SEC_KEY_CTL_SMK_SEL_SHIFT) & KEYMAN_SEC_KEY_CTL_SMK_SEL_MASK)
  72. #define KEYMAN_SEC_KEY_CTL_SMK_SEL_GET(x) (((uint32_t)(x) & KEYMAN_SEC_KEY_CTL_SMK_SEL_MASK) >> KEYMAN_SEC_KEY_CTL_SMK_SEL_SHIFT)
  73. /*
  74. * ZMK_SEL (RW)
  75. *
  76. * software symmetric key selection
  77. * 0: use scramble version of software symmetric key
  78. * 1: use origin value in software symmetric key
  79. */
  80. #define KEYMAN_SEC_KEY_CTL_ZMK_SEL_MASK (0x100U)
  81. #define KEYMAN_SEC_KEY_CTL_ZMK_SEL_SHIFT (8U)
  82. #define KEYMAN_SEC_KEY_CTL_ZMK_SEL_SET(x) (((uint32_t)(x) << KEYMAN_SEC_KEY_CTL_ZMK_SEL_SHIFT) & KEYMAN_SEC_KEY_CTL_ZMK_SEL_MASK)
  83. #define KEYMAN_SEC_KEY_CTL_ZMK_SEL_GET(x) (((uint32_t)(x) & KEYMAN_SEC_KEY_CTL_ZMK_SEL_MASK) >> KEYMAN_SEC_KEY_CTL_ZMK_SEL_SHIFT)
  84. /*
  85. * FMK_SEL (RW)
  86. *
  87. * fuse symmetric key selection
  88. * 0: use scramble version of fuse symmetric key
  89. * 1: use origin value in fuse symmetric key
  90. */
  91. #define KEYMAN_SEC_KEY_CTL_FMK_SEL_MASK (0x10U)
  92. #define KEYMAN_SEC_KEY_CTL_FMK_SEL_SHIFT (4U)
  93. #define KEYMAN_SEC_KEY_CTL_FMK_SEL_SET(x) (((uint32_t)(x) << KEYMAN_SEC_KEY_CTL_FMK_SEL_SHIFT) & KEYMAN_SEC_KEY_CTL_FMK_SEL_MASK)
  94. #define KEYMAN_SEC_KEY_CTL_FMK_SEL_GET(x) (((uint32_t)(x) & KEYMAN_SEC_KEY_CTL_FMK_SEL_MASK) >> KEYMAN_SEC_KEY_CTL_FMK_SEL_SHIFT)
  95. /*
  96. * KEY_SEL (RW)
  97. *
  98. * secure symmtric key synthesize setting, key is a XOR of followings
  99. * bit0: fuse mk, 0: not selected, 1:selected
  100. * bit1: zmk from batt, 0: not selected, 1:selected
  101. * bit2: software key 0: not selected, 1:selected
  102. */
  103. #define KEYMAN_SEC_KEY_CTL_KEY_SEL_MASK (0x7U)
  104. #define KEYMAN_SEC_KEY_CTL_KEY_SEL_SHIFT (0U)
  105. #define KEYMAN_SEC_KEY_CTL_KEY_SEL_SET(x) (((uint32_t)(x) << KEYMAN_SEC_KEY_CTL_KEY_SEL_SHIFT) & KEYMAN_SEC_KEY_CTL_KEY_SEL_MASK)
  106. #define KEYMAN_SEC_KEY_CTL_KEY_SEL_GET(x) (((uint32_t)(x) & KEYMAN_SEC_KEY_CTL_KEY_SEL_MASK) >> KEYMAN_SEC_KEY_CTL_KEY_SEL_SHIFT)
  107. /* Bitfield definition for register: NSC_KEY_CTL */
  108. /*
  109. * LOCK_NSC_CTL (RW)
  110. *
  111. * block non-secure state key setting being changed
  112. */
  113. #define KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_MASK (0x80000000UL)
  114. #define KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_SHIFT (31U)
  115. #define KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_SET(x) (((uint32_t)(x) << KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_SHIFT) & KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_MASK)
  116. #define KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_GET(x) (((uint32_t)(x) & KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_MASK) >> KEYMAN_NSC_KEY_CTL_LOCK_NSC_CTL_SHIFT)
  117. /*
  118. * SK_VAL (RO)
  119. *
  120. * session key valid
  121. * 0: session key is all 0's and not usable
  122. * 1: session key is valid
  123. */
  124. #define KEYMAN_NSC_KEY_CTL_SK_VAL_MASK (0x10000UL)
  125. #define KEYMAN_NSC_KEY_CTL_SK_VAL_SHIFT (16U)
  126. #define KEYMAN_NSC_KEY_CTL_SK_VAL_GET(x) (((uint32_t)(x) & KEYMAN_NSC_KEY_CTL_SK_VAL_MASK) >> KEYMAN_NSC_KEY_CTL_SK_VAL_SHIFT)
  127. /*
  128. * SMK_SEL (RW)
  129. *
  130. * software symmetric key selection
  131. * 0: use scramble version of software symmetric key
  132. * 1: use origin value in software symmetric key
  133. */
  134. #define KEYMAN_NSC_KEY_CTL_SMK_SEL_MASK (0x1000U)
  135. #define KEYMAN_NSC_KEY_CTL_SMK_SEL_SHIFT (12U)
  136. #define KEYMAN_NSC_KEY_CTL_SMK_SEL_SET(x) (((uint32_t)(x) << KEYMAN_NSC_KEY_CTL_SMK_SEL_SHIFT) & KEYMAN_NSC_KEY_CTL_SMK_SEL_MASK)
  137. #define KEYMAN_NSC_KEY_CTL_SMK_SEL_GET(x) (((uint32_t)(x) & KEYMAN_NSC_KEY_CTL_SMK_SEL_MASK) >> KEYMAN_NSC_KEY_CTL_SMK_SEL_SHIFT)
  138. /*
  139. * ZMK_SEL (RW)
  140. *
  141. * software symmetric key selection
  142. * 0: use scramble version of software symmetric key
  143. * 1: use origin value in software symmetric key
  144. */
  145. #define KEYMAN_NSC_KEY_CTL_ZMK_SEL_MASK (0x100U)
  146. #define KEYMAN_NSC_KEY_CTL_ZMK_SEL_SHIFT (8U)
  147. #define KEYMAN_NSC_KEY_CTL_ZMK_SEL_SET(x) (((uint32_t)(x) << KEYMAN_NSC_KEY_CTL_ZMK_SEL_SHIFT) & KEYMAN_NSC_KEY_CTL_ZMK_SEL_MASK)
  148. #define KEYMAN_NSC_KEY_CTL_ZMK_SEL_GET(x) (((uint32_t)(x) & KEYMAN_NSC_KEY_CTL_ZMK_SEL_MASK) >> KEYMAN_NSC_KEY_CTL_ZMK_SEL_SHIFT)
  149. /*
  150. * FMK_SEL (RW)
  151. *
  152. * fuse symmetric key selection
  153. * 0: use scramble version of fuse symmetric key
  154. * 1: use origin value in fuse symmetric key
  155. */
  156. #define KEYMAN_NSC_KEY_CTL_FMK_SEL_MASK (0x10U)
  157. #define KEYMAN_NSC_KEY_CTL_FMK_SEL_SHIFT (4U)
  158. #define KEYMAN_NSC_KEY_CTL_FMK_SEL_SET(x) (((uint32_t)(x) << KEYMAN_NSC_KEY_CTL_FMK_SEL_SHIFT) & KEYMAN_NSC_KEY_CTL_FMK_SEL_MASK)
  159. #define KEYMAN_NSC_KEY_CTL_FMK_SEL_GET(x) (((uint32_t)(x) & KEYMAN_NSC_KEY_CTL_FMK_SEL_MASK) >> KEYMAN_NSC_KEY_CTL_FMK_SEL_SHIFT)
  160. /*
  161. * KEY_SEL (RW)
  162. *
  163. * non-secure symmtric key synthesize setting, key is a XOR of followings
  164. * bit0: fuse mk, 0: not selected, 1:selected
  165. * bit1: zmk from batt, 0: not selected, 1:selected
  166. * bit2: software key 0: not selected, 1:selected
  167. */
  168. #define KEYMAN_NSC_KEY_CTL_KEY_SEL_MASK (0x7U)
  169. #define KEYMAN_NSC_KEY_CTL_KEY_SEL_SHIFT (0U)
  170. #define KEYMAN_NSC_KEY_CTL_KEY_SEL_SET(x) (((uint32_t)(x) << KEYMAN_NSC_KEY_CTL_KEY_SEL_SHIFT) & KEYMAN_NSC_KEY_CTL_KEY_SEL_MASK)
  171. #define KEYMAN_NSC_KEY_CTL_KEY_SEL_GET(x) (((uint32_t)(x) & KEYMAN_NSC_KEY_CTL_KEY_SEL_MASK) >> KEYMAN_NSC_KEY_CTL_KEY_SEL_SHIFT)
  172. /* Bitfield definition for register: RNG */
  173. /*
  174. * BLOCK_RNG_XOR (RW)
  175. *
  176. * block RNG_XOR bit from changing, if this bit is written to 1, it will hold 1 until next reset
  177. * 0: RNG_XOR can be changed by software
  178. * 1: RNG_XOR ignore software change from software
  179. */
  180. #define KEYMAN_RNG_BLOCK_RNG_XOR_MASK (0x10000UL)
  181. #define KEYMAN_RNG_BLOCK_RNG_XOR_SHIFT (16U)
  182. #define KEYMAN_RNG_BLOCK_RNG_XOR_SET(x) (((uint32_t)(x) << KEYMAN_RNG_BLOCK_RNG_XOR_SHIFT) & KEYMAN_RNG_BLOCK_RNG_XOR_MASK)
  183. #define KEYMAN_RNG_BLOCK_RNG_XOR_GET(x) (((uint32_t)(x) & KEYMAN_RNG_BLOCK_RNG_XOR_MASK) >> KEYMAN_RNG_BLOCK_RNG_XOR_SHIFT)
  184. /*
  185. * RNG_XOR (RW)
  186. *
  187. * control how SFK is accepted from random number generator
  188. * 0: SFK value replaced by random number input
  189. * 1: SFK value exclusive or with random number input,this help generate random number using 2 rings inside RNG
  190. */
  191. #define KEYMAN_RNG_RNG_XOR_MASK (0x1U)
  192. #define KEYMAN_RNG_RNG_XOR_SHIFT (0U)
  193. #define KEYMAN_RNG_RNG_XOR_SET(x) (((uint32_t)(x) << KEYMAN_RNG_RNG_XOR_SHIFT) & KEYMAN_RNG_RNG_XOR_MASK)
  194. #define KEYMAN_RNG_RNG_XOR_GET(x) (((uint32_t)(x) & KEYMAN_RNG_RNG_XOR_MASK) >> KEYMAN_RNG_RNG_XOR_SHIFT)
  195. /* Bitfield definition for register: READ_CONTROL */
  196. /*
  197. * BLOCK_PK_READ (RW)
  198. *
  199. * asymmetric key readout control, if this bit is written to 1, it will hold 1 until next reset
  200. * 0: key can be read out
  201. * 1: key cannot be read out
  202. */
  203. #define KEYMAN_READ_CONTROL_BLOCK_PK_READ_MASK (0x10000UL)
  204. #define KEYMAN_READ_CONTROL_BLOCK_PK_READ_SHIFT (16U)
  205. #define KEYMAN_READ_CONTROL_BLOCK_PK_READ_SET(x) (((uint32_t)(x) << KEYMAN_READ_CONTROL_BLOCK_PK_READ_SHIFT) & KEYMAN_READ_CONTROL_BLOCK_PK_READ_MASK)
  206. #define KEYMAN_READ_CONTROL_BLOCK_PK_READ_GET(x) (((uint32_t)(x) & KEYMAN_READ_CONTROL_BLOCK_PK_READ_MASK) >> KEYMAN_READ_CONTROL_BLOCK_PK_READ_SHIFT)
  207. /*
  208. * BLOCK_SMK_READ (RW)
  209. *
  210. * symmetric key readout control, if this bit is written to 1, it will hold 1 until next reset
  211. * 0: key can be read out
  212. * 1: key cannot be read out
  213. */
  214. #define KEYMAN_READ_CONTROL_BLOCK_SMK_READ_MASK (0x1U)
  215. #define KEYMAN_READ_CONTROL_BLOCK_SMK_READ_SHIFT (0U)
  216. #define KEYMAN_READ_CONTROL_BLOCK_SMK_READ_SET(x) (((uint32_t)(x) << KEYMAN_READ_CONTROL_BLOCK_SMK_READ_SHIFT) & KEYMAN_READ_CONTROL_BLOCK_SMK_READ_MASK)
  217. #define KEYMAN_READ_CONTROL_BLOCK_SMK_READ_GET(x) (((uint32_t)(x) & KEYMAN_READ_CONTROL_BLOCK_SMK_READ_MASK) >> KEYMAN_READ_CONTROL_BLOCK_SMK_READ_SHIFT)
  218. /* SOFTMKEY register group index macro definition */
  219. #define KEYMAN_SOFTMKEY_SFK0 (0UL)
  220. #define KEYMAN_SOFTMKEY_SFK1 (1UL)
  221. #define KEYMAN_SOFTMKEY_SFK2 (2UL)
  222. #define KEYMAN_SOFTMKEY_SFK3 (3UL)
  223. #define KEYMAN_SOFTMKEY_SFK4 (4UL)
  224. #define KEYMAN_SOFTMKEY_SFK5 (5UL)
  225. #define KEYMAN_SOFTMKEY_SFK6 (6UL)
  226. #define KEYMAN_SOFTMKEY_SFK7 (7UL)
  227. /* SOFTPKEY register group index macro definition */
  228. #define KEYMAN_SOFTPKEY_SPK0 (0UL)
  229. #define KEYMAN_SOFTPKEY_SPK1 (1UL)
  230. #define KEYMAN_SOFTPKEY_SPK2 (2UL)
  231. #define KEYMAN_SOFTPKEY_SPK3 (3UL)
  232. #define KEYMAN_SOFTPKEY_SPK4 (4UL)
  233. #define KEYMAN_SOFTPKEY_SPK5 (5UL)
  234. #define KEYMAN_SOFTPKEY_SPK6 (6UL)
  235. #define KEYMAN_SOFTPKEY_SPK7 (7UL)
  236. #endif /* HPM_KEYMAN_H */