blufi_security.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "freertos/FreeRTOS.h"
  10. #include "freertos/task.h"
  11. #include "freertos/event_groups.h"
  12. #include "esp_system.h"
  13. #include "esp_wifi.h"
  14. #include "esp_event.h"
  15. #include "esp_log.h"
  16. #include "nvs_flash.h"
  17. #include "esp_bt.h"
  18. #include "esp_blufi_api.h"
  19. #include "blufi_example.h"
  20. #include "mbedtls/aes.h"
  21. #include "mbedtls/dhm.h"
  22. #include "mbedtls/md5.h"
  23. #include "esp_crc.h"
  24. /*
  25. The SEC_TYPE_xxx is for self-defined packet data type in the procedure of "BLUFI negotiate key"
  26. If user use other negotiation procedure to exchange(or generate) key, should redefine the type by yourself.
  27. */
  28. #define SEC_TYPE_DH_PARAM_LEN 0x00
  29. #define SEC_TYPE_DH_PARAM_DATA 0x01
  30. #define SEC_TYPE_DH_P 0x02
  31. #define SEC_TYPE_DH_G 0x03
  32. #define SEC_TYPE_DH_PUBLIC 0x04
  33. struct blufi_security {
  34. #define DH_SELF_PUB_KEY_LEN 128
  35. #define DH_SELF_PUB_KEY_BIT_LEN (DH_SELF_PUB_KEY_LEN * 8)
  36. uint8_t self_public_key[DH_SELF_PUB_KEY_LEN];
  37. #define SHARE_KEY_LEN 128
  38. #define SHARE_KEY_BIT_LEN (SHARE_KEY_LEN * 8)
  39. uint8_t share_key[SHARE_KEY_LEN];
  40. size_t share_len;
  41. #define PSK_LEN 16
  42. uint8_t psk[PSK_LEN];
  43. uint8_t *dh_param;
  44. int dh_param_len;
  45. uint8_t iv[16];
  46. mbedtls_dhm_context dhm;
  47. mbedtls_aes_context aes;
  48. };
  49. static struct blufi_security *blufi_sec;
  50. static int myrand( void *rng_state, unsigned char *output, size_t len )
  51. {
  52. esp_fill_random(output, len);
  53. return( 0 );
  54. }
  55. extern void btc_blufi_report_error(esp_blufi_error_state_t state);
  56. void blufi_dh_negotiate_data_handler(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free)
  57. {
  58. int ret;
  59. uint8_t type = data[0];
  60. if (blufi_sec == NULL) {
  61. BLUFI_ERROR("BLUFI Security is not initialized");
  62. btc_blufi_report_error(ESP_BLUFI_INIT_SECURITY_ERROR);
  63. return;
  64. }
  65. switch (type) {
  66. case SEC_TYPE_DH_PARAM_LEN:
  67. blufi_sec->dh_param_len = ((data[1]<<8)|data[2]);
  68. if (blufi_sec->dh_param) {
  69. free(blufi_sec->dh_param);
  70. blufi_sec->dh_param = NULL;
  71. }
  72. blufi_sec->dh_param = (uint8_t *)malloc(blufi_sec->dh_param_len);
  73. if (blufi_sec->dh_param == NULL) {
  74. btc_blufi_report_error(ESP_BLUFI_DH_MALLOC_ERROR);
  75. BLUFI_ERROR("%s, malloc failed\n", __func__);
  76. return;
  77. }
  78. break;
  79. case SEC_TYPE_DH_PARAM_DATA:{
  80. if (blufi_sec->dh_param == NULL) {
  81. BLUFI_ERROR("%s, blufi_sec->dh_param == NULL\n", __func__);
  82. btc_blufi_report_error(ESP_BLUFI_DH_PARAM_ERROR);
  83. return;
  84. }
  85. uint8_t *param = blufi_sec->dh_param;
  86. memcpy(blufi_sec->dh_param, &data[1], blufi_sec->dh_param_len);
  87. ret = mbedtls_dhm_read_params(&blufi_sec->dhm, &param, &param[blufi_sec->dh_param_len]);
  88. if (ret) {
  89. BLUFI_ERROR("%s read param failed %d\n", __func__, ret);
  90. btc_blufi_report_error(ESP_BLUFI_READ_PARAM_ERROR);
  91. return;
  92. }
  93. free(blufi_sec->dh_param);
  94. blufi_sec->dh_param = NULL;
  95. ret = mbedtls_dhm_make_public(&blufi_sec->dhm, (int) mbedtls_mpi_size( &blufi_sec->dhm.P ), blufi_sec->self_public_key, blufi_sec->dhm.len, myrand, NULL);
  96. if (ret) {
  97. BLUFI_ERROR("%s make public failed %d\n", __func__, ret);
  98. btc_blufi_report_error(ESP_BLUFI_MAKE_PUBLIC_ERROR);
  99. return;
  100. }
  101. mbedtls_dhm_calc_secret( &blufi_sec->dhm,
  102. blufi_sec->share_key,
  103. SHARE_KEY_BIT_LEN,
  104. &blufi_sec->share_len,
  105. NULL, NULL);
  106. mbedtls_md5(blufi_sec->share_key, blufi_sec->share_len, blufi_sec->psk);
  107. mbedtls_aes_setkey_enc(&blufi_sec->aes, blufi_sec->psk, 128);
  108. /* alloc output data */
  109. *output_data = &blufi_sec->self_public_key[0];
  110. *output_len = blufi_sec->dhm.len;
  111. *need_free = false;
  112. }
  113. break;
  114. case SEC_TYPE_DH_P:
  115. break;
  116. case SEC_TYPE_DH_G:
  117. break;
  118. case SEC_TYPE_DH_PUBLIC:
  119. break;
  120. }
  121. }
  122. int blufi_aes_encrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len)
  123. {
  124. int ret;
  125. size_t iv_offset = 0;
  126. uint8_t iv0[16];
  127. memcpy(iv0, blufi_sec->iv, sizeof(blufi_sec->iv));
  128. iv0[0] = iv8; /* set iv8 as the iv0[0] */
  129. ret = mbedtls_aes_crypt_cfb128(&blufi_sec->aes, MBEDTLS_AES_ENCRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data);
  130. if (ret) {
  131. return -1;
  132. }
  133. return crypt_len;
  134. }
  135. int blufi_aes_decrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len)
  136. {
  137. int ret;
  138. size_t iv_offset = 0;
  139. uint8_t iv0[16];
  140. memcpy(iv0, blufi_sec->iv, sizeof(blufi_sec->iv));
  141. iv0[0] = iv8; /* set iv8 as the iv0[0] */
  142. ret = mbedtls_aes_crypt_cfb128(&blufi_sec->aes, MBEDTLS_AES_DECRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data);
  143. if (ret) {
  144. return -1;
  145. }
  146. return crypt_len;
  147. }
  148. uint16_t blufi_crc_checksum(uint8_t iv8, uint8_t *data, int len)
  149. {
  150. /* This iv8 ignore, not used */
  151. return esp_crc16_be(0, data, len);
  152. }
  153. esp_err_t blufi_security_init(void)
  154. {
  155. blufi_sec = (struct blufi_security *)malloc(sizeof(struct blufi_security));
  156. if (blufi_sec == NULL) {
  157. return ESP_FAIL;
  158. }
  159. memset(blufi_sec, 0x0, sizeof(struct blufi_security));
  160. mbedtls_dhm_init(&blufi_sec->dhm);
  161. mbedtls_aes_init(&blufi_sec->aes);
  162. memset(blufi_sec->iv, 0x0, 16);
  163. return 0;
  164. }
  165. void blufi_security_deinit(void)
  166. {
  167. if (blufi_sec == NULL) {
  168. return;
  169. }
  170. if (blufi_sec->dh_param){
  171. free(blufi_sec->dh_param);
  172. blufi_sec->dh_param = NULL;
  173. }
  174. mbedtls_dhm_free(&blufi_sec->dhm);
  175. mbedtls_aes_free(&blufi_sec->aes);
  176. memset(blufi_sec, 0x0, sizeof(struct blufi_security));
  177. free(blufi_sec);
  178. blufi_sec = NULL;
  179. }