ufs_aio_rpmb.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #ifndef __UFS_AIO_RPMB_H
  32. #define __UFS_AIO_RPMB_H
  33. #include "ufs_aio_cfg.h"
  34. #include "ufs_aio_types.h"
  35. #include "ufs_aio.h"
  36. #include "ufs_aio_hcd.h"
  37. #include "ufs_aio_core.h"
  38. #if defined(MTK_UFS_DRV_LK)
  39. #include "partition_wp.h"
  40. #endif
  41. #if defined(MTK_UFS_DRV_DA) || defined(MTK_UFS_DRV_PRELOADER)
  42. typedef enum {
  43. WP_PERMANENT = 0,
  44. WP_POWER_ON,
  45. WP_PERMANENT_AWP,
  46. /* Important: do not change the enum above. They are used as assigned value. */
  47. WP_TEMPORARY,
  48. WP_DISABLE,
  49. } STORAGE_WP_TYPE;
  50. #endif
  51. #define UFS_SECURITY_PROTOCOL (0xEC)
  52. #define RPMB_PROTOCOL_ID (0x1)
  53. #define RPMB_FRM_STUFF_LEN (196)
  54. #define RPMB_FRM_KEY_MAC_LEN (32)
  55. #define RPMB_FRM_DATA_LEN (256)
  56. #define RPMB_FRM_NONCE_LEN (16)
  57. #define RPMB_FRM_WR_CNT_LEN (4)
  58. #define RPMB_FRM_ADDR_LEN (2)
  59. #define RPMB_FRM_BLK_CNT_LEN (2)
  60. #define RPMB_FRM_RESULT_LEN (2)
  61. #define RPMB_FRM_REQ_RESP_LEN (2)
  62. #define RPMB_SWP_CB_VALID_DATA_SIZE (80) /* Maximum valid data length in a single SWP Configuration Block */
  63. #define HMAC_TEXT_LEN (284)
  64. static const unsigned char rpmb_authen_key[RPMB_FRM_KEY_MAC_LEN] =
  65. {"vutsrqponmlkjihgfedcba9876543210"};
  66. // {"0123456789abcdefghijklmnopqrstuv"};
  67. static const char rpmb_oper_result[][64] = {
  68. "Operation OK",
  69. "General failure",
  70. "Authentication failure(MAC not match)",
  71. "Counter failure(Counter not match or Inc fail) ",
  72. "Address failure (out of range or wrong alignment)",
  73. "write failure (data/counter/result wite failure)",
  74. "Read failure (data/counter.result read failure)",
  75. "Authentication Key not yet programmed",
  76. "Secure Write Protect Configration Block access failure",
  77. "Invalid Secure Write Protect Block Configration parameter",
  78. "Secure Write Protection not applicable",
  79. };
  80. struct rpmb_data_frame {
  81. u8 stuff[RPMB_FRM_STUFF_LEN];
  82. u8 key_MAC[RPMB_FRM_KEY_MAC_LEN];
  83. u8 data[RPMB_FRM_DATA_LEN];
  84. u8 nonce[RPMB_FRM_NONCE_LEN];
  85. u32 wr_cnt;
  86. u16 addr;
  87. u16 blk_cnt;
  88. u16 result;
  89. u16 req_resp;
  90. };
  91. enum enum_rpmb_msg {
  92. RPMB_REQ_AUTHEN_KEY_PRG = 0x0001,
  93. RPMB_REQ_READ_WR_CNT = 0x0002,
  94. RPMB_REQ_AUTHEN_WRITE = 0x0003,
  95. RPMB_REQ_AUTHEN_READ = 0x0004,
  96. RPMB_REQ_RESULT_RD = 0x0005,
  97. RPMB_REQ_SEC_WPCB_WRITE = 0x0006,
  98. RPMB_REQ_SEC_WPCB_READ = 0x0007,
  99. RPMB_RSP_AUTHEN_KEY_PRG = 0x0100,
  100. RPMB_RSP_READ_WR_CNT = 0x0200,
  101. RPMB_RSP_AUTHEN_WRITE = 0x0300,
  102. RPMB_RSP_AUTHEN_READ = 0x0400,
  103. RPMB_RSP_SEC_WPCB_WRITE = 0x0600,
  104. RPMB_RSP_SEC_WPCB_READ = 0x0700,
  105. };
  106. #define SWP_ENTRY_RESERVED (3)
  107. #define WPF_BIT (0)
  108. #define WPF_SIZE (1)
  109. #define WPF_MASK (0xFE)
  110. #define WPT_BIT (1)
  111. #define WPT_SIZE (2)
  112. #define WPT_MASK (0xF9)
  113. struct secure_wp_entry {
  114. u8 wpt_wpf;
  115. u8 reserved1[SWP_ENTRY_RESERVED];
  116. u32 upper_addr;
  117. u32 lower_addr;
  118. u32 block_num;
  119. } __attribute__((packed));
  120. #define SWPCB_RESERVED1 (14)
  121. #define SWPWP_ENTRY_NUM (4)
  122. #define SWPCB_RESERVED2 (176)
  123. struct secure_wp_config_block {
  124. u8 lun;
  125. u8 data_length;
  126. u8 reserved1[SWPCB_RESERVED1];
  127. struct secure_wp_entry wp_entry[SWPWP_ENTRY_NUM];
  128. u8 reserved2[SWPCB_RESERVED2];
  129. } __attribute__((packed));
  130. #define WP_WPF_EN (1)
  131. #define WP_WPF_DISABLE (0)
  132. #define WP_ENTRY_SIZE (16)
  133. #define WP_MAX_ENTRY_SIZE (WP_ENTRY_SIZE * SWPWP_ENTRY_NUM)
  134. #define WP_CONF_BLOCK_SIZE (256)
  135. int ufs_rpmb_authen_key_program(const char *authen_key, int *rpmb_result);
  136. int rpmb_authen_read_counter(u32 host_id, u8 *nonce_buf, u32 nonce_len,
  137. u32 *wr_cnt);
  138. #if defined(MTK_UFS_DRV_LK) || defined(MTK_UFS_DRV_DA)
  139. int ufs_clr_write_protect(void);
  140. int ufs_set_write_protect(int dev_num, ufs_logical_unit partition,unsigned long blknr,u32 blkcnt, STORAGE_WP_TYPE type);
  141. #endif
  142. #if defined(MTK_UFS_DRV_LK)
  143. int ufs_rpmb_read_data(u32 addr, u32 *buf, u32 buf_len);
  144. int ufs_rpmb_write_data(u32 addr, u32 *buf, u32 buf_len);
  145. #endif
  146. #endif // __UFS_AIO_RPMB_H