security_manager.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
  2. *
  3. * The information contained herein is property of Nordic Semiconductor ASA.
  4. * Terms and conditions of usage are described in detail in NORDIC
  5. * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
  6. *
  7. * Licensees are granted free, non-transferable use of the information. NO
  8. * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
  9. * the file.
  10. *
  11. */
  12. #include "security_manager.h"
  13. #include <string.h>
  14. #include "security_dispatcher.h"
  15. #include "peer_database.h"
  16. #include "ble_conn_state.h"
  17. #include "sdk_common.h"
  18. #include "id_manager.h"
  19. #define MAX_REGISTRANTS 3 /**< The number of user that can register with the module. */
  20. typedef struct
  21. {
  22. sm_evt_handler_t evt_handlers[MAX_REGISTRANTS];
  23. uint8_t n_registrants;
  24. ble_conn_state_user_flag_id_t flag_id_link_secure_pending_busy;
  25. ble_conn_state_user_flag_id_t flag_id_link_secure_pending_flash_full;
  26. ble_conn_state_user_flag_id_t flag_id_link_secure_force_repairing;
  27. ble_conn_state_user_flag_id_t flag_id_link_secure_null_params;
  28. ble_conn_state_user_flag_id_t flag_id_params_reply_pending_busy;
  29. ble_conn_state_user_flag_id_t flag_id_params_reply_pending_flash_full;
  30. ble_conn_state_user_flag_id_t flag_id_reject_pairing;
  31. bool pdb_evt_handler_registered;
  32. bool sec_params_valid;
  33. ble_gap_sec_params_t sec_params;
  34. ble_gap_lesc_p256_pk_t * p_public_key;
  35. } sm_t;
  36. static sm_t m_sm = {.flag_id_link_secure_pending_busy = BLE_CONN_STATE_USER_FLAG_INVALID,
  37. .flag_id_link_secure_pending_flash_full = BLE_CONN_STATE_USER_FLAG_INVALID,
  38. .flag_id_link_secure_force_repairing = BLE_CONN_STATE_USER_FLAG_INVALID,
  39. .flag_id_link_secure_null_params = BLE_CONN_STATE_USER_FLAG_INVALID,
  40. .flag_id_params_reply_pending_busy = BLE_CONN_STATE_USER_FLAG_INVALID,
  41. .flag_id_params_reply_pending_flash_full = BLE_CONN_STATE_USER_FLAG_INVALID,
  42. .flag_id_reject_pairing = BLE_CONN_STATE_USER_FLAG_INVALID};
  43. #define MODULE_INITIALIZED (m_sm.n_registrants > 0) /**< Expression which is true when the module is initialized. */
  44. #include "sdk_macros.h"
  45. static void evt_send(sm_evt_t * p_event)
  46. {
  47. for (uint32_t i = 0; i < m_sm.n_registrants; i++)
  48. {
  49. m_sm.evt_handlers[i](p_event);
  50. }
  51. }
  52. static void flags_set_from_err_code(uint16_t conn_handle, ret_code_t err_code, bool params_reply)
  53. {
  54. bool flag_value_flash_full = false;
  55. bool flag_value_busy = false;
  56. if ( (err_code == NRF_ERROR_NO_MEM)
  57. || (err_code == NRF_ERROR_BUSY)
  58. || (err_code == NRF_SUCCESS))
  59. {
  60. if ((err_code == NRF_ERROR_NO_MEM))
  61. {
  62. flag_value_busy = false;
  63. flag_value_flash_full = true;
  64. }
  65. else if (err_code == NRF_ERROR_BUSY)
  66. {
  67. flag_value_busy = true;
  68. flag_value_flash_full = false;
  69. }
  70. else if (err_code == NRF_SUCCESS)
  71. {
  72. flag_value_busy = false;
  73. flag_value_flash_full = false;
  74. }
  75. if (params_reply)
  76. {
  77. ble_conn_state_user_flag_set(conn_handle,
  78. m_sm.flag_id_params_reply_pending_flash_full,
  79. flag_value_flash_full);
  80. ble_conn_state_user_flag_set(conn_handle,
  81. m_sm.flag_id_params_reply_pending_busy,
  82. flag_value_busy);
  83. ble_conn_state_user_flag_set(conn_handle,
  84. m_sm.flag_id_link_secure_pending_flash_full,
  85. false);
  86. ble_conn_state_user_flag_set(conn_handle,
  87. m_sm.flag_id_link_secure_pending_busy,
  88. false);
  89. }
  90. else
  91. {
  92. ble_conn_state_user_flag_set(conn_handle,
  93. m_sm.flag_id_link_secure_pending_flash_full,
  94. flag_value_flash_full);
  95. ble_conn_state_user_flag_set(conn_handle,
  96. m_sm.flag_id_link_secure_pending_busy,
  97. flag_value_busy);
  98. }
  99. }
  100. }
  101. static void events_send_from_err_code(uint16_t conn_handle, ret_code_t err_code)
  102. {
  103. if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY))
  104. {
  105. sm_evt_t evt =
  106. {
  107. .conn_handle = conn_handle,
  108. .params = {.error_unexpected = {
  109. .error = err_code
  110. }}
  111. };
  112. if (err_code == NRF_ERROR_TIMEOUT)
  113. {
  114. evt.evt_id = SM_EVT_ERROR_SMP_TIMEOUT;
  115. }
  116. else if (err_code == NRF_ERROR_NO_MEM)
  117. {
  118. evt.evt_id = SM_EVT_ERROR_NO_MEM;
  119. }
  120. else
  121. {
  122. evt.evt_id = SM_EVT_ERROR_UNEXPECTED;
  123. }
  124. evt_send(&evt);
  125. }
  126. }
  127. static ret_code_t link_secure(uint16_t conn_handle, bool null_params, bool force_repairing, bool send_events)
  128. {
  129. ret_code_t err_code;
  130. if (!null_params && !m_sm.sec_params_valid)
  131. {
  132. return NRF_ERROR_NOT_FOUND;
  133. }
  134. if(null_params)
  135. {
  136. err_code = smd_link_secure(conn_handle, NULL, force_repairing);
  137. }
  138. else
  139. {
  140. err_code = smd_link_secure(conn_handle, &m_sm.sec_params, force_repairing);
  141. }
  142. flags_set_from_err_code(conn_handle, err_code, false);
  143. if (send_events)
  144. {
  145. events_send_from_err_code(conn_handle, err_code);
  146. }
  147. switch (err_code)
  148. {
  149. case NRF_ERROR_BUSY:
  150. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_link_secure_null_params, null_params);
  151. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_link_secure_force_repairing, force_repairing);
  152. err_code = NRF_SUCCESS;
  153. break;
  154. case NRF_ERROR_NO_MEM:
  155. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_link_secure_null_params, null_params);
  156. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_link_secure_force_repairing, force_repairing);
  157. break;
  158. case NRF_SUCCESS:
  159. case NRF_ERROR_TIMEOUT:
  160. case BLE_ERROR_INVALID_CONN_HANDLE:
  161. case NRF_ERROR_INVALID_STATE:
  162. /* No action */
  163. break;
  164. default:
  165. err_code = NRF_ERROR_INTERNAL;
  166. break;
  167. }
  168. return err_code;
  169. }
  170. static void send_config_req(uint16_t conn_handle)
  171. {
  172. sm_evt_t sm_evt;
  173. memset(&sm_evt, 0, sizeof(sm_evt));
  174. sm_evt.evt_id = SM_EVT_CONN_SEC_CONFIG_REQ;
  175. sm_evt.conn_handle = conn_handle;
  176. evt_send(&sm_evt);
  177. }
  178. static void smd_params_reply_perform(uint16_t conn_handle)
  179. {
  180. ret_code_t err_code;
  181. if ( (ble_conn_state_role(conn_handle) == BLE_GAP_ROLE_PERIPH)
  182. && im_peer_id_get_by_conn_handle(conn_handle) != PM_PEER_ID_INVALID)
  183. {
  184. // Bond already exists. Reject the pairing request if the user doesn't intervene.
  185. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_reject_pairing, true);
  186. send_config_req(conn_handle);
  187. }
  188. else
  189. {
  190. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_reject_pairing, false);
  191. }
  192. if ( m_sm.sec_params_valid
  193. && !ble_conn_state_user_flag_get(conn_handle, m_sm.flag_id_reject_pairing))
  194. {
  195. err_code = smd_params_reply(conn_handle, &m_sm.sec_params, m_sm.p_public_key);
  196. }
  197. else
  198. {
  199. err_code = smd_params_reply(conn_handle, NULL, NULL);
  200. }
  201. flags_set_from_err_code(conn_handle, err_code, true);
  202. events_send_from_err_code(conn_handle, err_code);
  203. }
  204. static void smd_evt_handler(smd_evt_t const * p_event)
  205. {
  206. switch(p_event->evt_id)
  207. {
  208. case SMD_EVT_PARAMS_REQ:
  209. smd_params_reply_perform(p_event->conn_handle);
  210. break;
  211. case SMD_EVT_SLAVE_SECURITY_REQ:
  212. {
  213. bool null_params = false;
  214. if (!m_sm.sec_params_valid)
  215. {
  216. null_params = true;
  217. }
  218. else if ((bool)m_sm.sec_params.bond < (bool)p_event->params.slave_security_req.bond)
  219. {
  220. null_params = true;
  221. }
  222. else if ((bool)m_sm.sec_params.mitm < (bool)p_event->params.slave_security_req.mitm)
  223. {
  224. null_params = true;
  225. }
  226. ret_code_t err_code = link_secure(p_event->conn_handle, null_params, false, true);
  227. UNUSED_VARIABLE(err_code); // It is acceptable to ignore the return code because it is
  228. // acceptable to ignore a security request.
  229. }
  230. /* fallthrough */
  231. case SMD_EVT_PAIRING_SUCCESS:
  232. case SMD_EVT_PAIRING_FAIL:
  233. case SMD_EVT_LINK_ENCRYPTION_UPDATE:
  234. case SMD_EVT_LINK_ENCRYPTION_FAILED:
  235. case SMD_EVT_BONDING_INFO_STORED:
  236. case SMD_EVT_ERROR_BONDING_INFO:
  237. case SMD_EVT_ERROR_UNEXPECTED:
  238. case SMD_EVT_SEC_PROCEDURE_START:
  239. {
  240. sm_evt_t evt;
  241. evt.evt_id = (sm_evt_id_t)p_event->evt_id;
  242. evt.conn_handle = p_event->conn_handle;
  243. evt.params = p_event->params;
  244. evt_send(&evt);
  245. }
  246. break;
  247. }
  248. }
  249. static void link_secure_pending_process(ble_conn_state_user_flag_id_t flag_id)
  250. {
  251. sdk_mapped_flags_t flag_collection = ble_conn_state_user_flag_collection(flag_id);
  252. if (sdk_mapped_flags_any_set(flag_collection))
  253. {
  254. sdk_mapped_flags_key_list_t conn_handle_list = ble_conn_state_conn_handles();
  255. for (uint32_t i = 0; i < conn_handle_list.len; i++)
  256. {
  257. bool pending = ble_conn_state_user_flag_get(conn_handle_list.flag_keys[i], flag_id);
  258. if (pending)
  259. {
  260. bool force_repairing = ble_conn_state_user_flag_get(conn_handle_list.flag_keys[i], m_sm.flag_id_link_secure_force_repairing);
  261. bool null_params = ble_conn_state_user_flag_get(conn_handle_list.flag_keys[i], m_sm.flag_id_link_secure_null_params);
  262. ret_code_t err_code = link_secure(conn_handle_list.flag_keys[i], null_params, force_repairing, true); // If this fails, it will be automatically retried.
  263. UNUSED_VARIABLE(err_code);
  264. }
  265. }
  266. }
  267. }
  268. static void params_reply_pending_process(ble_conn_state_user_flag_id_t flag_id)
  269. {
  270. sdk_mapped_flags_t flag_collection = ble_conn_state_user_flag_collection(flag_id);
  271. if (sdk_mapped_flags_any_set(flag_collection))
  272. {
  273. sdk_mapped_flags_key_list_t conn_handle_list = ble_conn_state_conn_handles();
  274. for (uint32_t i = 0; i < conn_handle_list.len; i++)
  275. {
  276. bool pending = ble_conn_state_user_flag_get(conn_handle_list.flag_keys[i], flag_id);
  277. if (pending)
  278. {
  279. smd_params_reply_perform(conn_handle_list.flag_keys[i]);
  280. }
  281. }
  282. }
  283. }
  284. static void pdb_evt_handler(pdb_evt_t const * p_event)
  285. {
  286. switch (p_event->evt_id)
  287. {
  288. case PDB_EVT_COMPRESSED:
  289. params_reply_pending_process(m_sm.flag_id_params_reply_pending_flash_full);
  290. link_secure_pending_process(m_sm.flag_id_link_secure_pending_flash_full);
  291. /* fallthrough */
  292. case PDB_EVT_WRITE_BUF_STORED:
  293. case PDB_EVT_RAW_STORED:
  294. case PDB_EVT_RAW_STORE_FAILED:
  295. case PDB_EVT_CLEARED:
  296. case PDB_EVT_CLEAR_FAILED:
  297. case PDB_EVT_PEER_FREED:
  298. case PDB_EVT_PEER_FREE_FAILED:
  299. params_reply_pending_process(m_sm.flag_id_params_reply_pending_busy);
  300. link_secure_pending_process(m_sm.flag_id_link_secure_pending_busy);
  301. break;
  302. case PDB_EVT_ERROR_NO_MEM:
  303. case PDB_EVT_ERROR_UNEXPECTED:
  304. break;
  305. }
  306. }
  307. /**@brief Funtion for initializing a BLE Connection State user flag.
  308. *
  309. * @param[out] flag_id The flag to initialize.
  310. */
  311. static void flag_id_init(ble_conn_state_user_flag_id_t * p_flag_id)
  312. {
  313. if (*p_flag_id == BLE_CONN_STATE_USER_FLAG_INVALID)
  314. {
  315. *p_flag_id = ble_conn_state_user_flag_acquire();
  316. }
  317. }
  318. ret_code_t sm_register(sm_evt_handler_t evt_handler)
  319. {
  320. VERIFY_PARAM_NOT_NULL(evt_handler);
  321. ret_code_t err_code = NRF_SUCCESS;
  322. if (!MODULE_INITIALIZED)
  323. {
  324. flag_id_init(&m_sm.flag_id_link_secure_pending_busy);
  325. flag_id_init(&m_sm.flag_id_link_secure_pending_flash_full);
  326. flag_id_init(&m_sm.flag_id_link_secure_force_repairing);
  327. flag_id_init(&m_sm.flag_id_link_secure_null_params);
  328. flag_id_init(&m_sm.flag_id_params_reply_pending_busy);
  329. flag_id_init(&m_sm.flag_id_params_reply_pending_flash_full);
  330. flag_id_init(&m_sm.flag_id_reject_pairing);
  331. if (m_sm.flag_id_reject_pairing == BLE_CONN_STATE_USER_FLAG_INVALID)
  332. {
  333. return NRF_ERROR_INTERNAL;
  334. }
  335. if (!m_sm.pdb_evt_handler_registered)
  336. {
  337. err_code = pdb_register(pdb_evt_handler);
  338. if (err_code != NRF_SUCCESS)
  339. {
  340. return NRF_ERROR_INTERNAL;
  341. }
  342. m_sm.pdb_evt_handler_registered = true;
  343. }
  344. err_code = smd_register(smd_evt_handler);
  345. if (err_code != NRF_SUCCESS)
  346. {
  347. return NRF_ERROR_INTERNAL;
  348. }
  349. }
  350. if (err_code == NRF_SUCCESS)
  351. {
  352. if ((m_sm.n_registrants < MAX_REGISTRANTS))
  353. {
  354. m_sm.evt_handlers[m_sm.n_registrants++] = evt_handler;
  355. }
  356. else
  357. {
  358. err_code = NRF_ERROR_NO_MEM;
  359. }
  360. }
  361. return err_code;
  362. }
  363. void sm_ble_evt_handler(ble_evt_t * p_ble_evt)
  364. {
  365. VERIFY_MODULE_INITIALIZED_VOID();
  366. smd_ble_evt_handler(p_ble_evt);
  367. link_secure_pending_process(m_sm.flag_id_link_secure_pending_busy);
  368. }
  369. static bool sec_params_verify(ble_gap_sec_params_t * p_sec_params)
  370. {
  371. // NULL check.
  372. if (p_sec_params == NULL)
  373. {
  374. return false;
  375. }
  376. // OOB not allowed unless MITM.
  377. if (!p_sec_params->mitm && p_sec_params->oob)
  378. {
  379. return false;
  380. }
  381. // IO Capabilities must be one of the valid values from @ref BLE_GAP_IO_CAPS.
  382. if (p_sec_params->io_caps > BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY)
  383. {
  384. return false;
  385. }
  386. // Must have either IO capabilities or OOB if MITM.
  387. if (p_sec_params->mitm && (p_sec_params->io_caps == BLE_GAP_IO_CAPS_NONE) && !p_sec_params->oob)
  388. {
  389. return false;
  390. }
  391. // Minimum key size cannot be larger than maximum key size.
  392. if (p_sec_params->min_key_size > p_sec_params->max_key_size)
  393. {
  394. return false;
  395. }
  396. // Key size cannot be below 7 bytes.
  397. if (p_sec_params->min_key_size < 7)
  398. {
  399. return false;
  400. }
  401. // Key size cannot be above 16 bytes.
  402. if (p_sec_params->max_key_size > 16)
  403. {
  404. return false;
  405. }
  406. // Signing is not supported.
  407. if (p_sec_params->kdist_own.sign || p_sec_params->kdist_peer.sign)
  408. {
  409. return false;
  410. }
  411. // link bit must be 0.
  412. if (p_sec_params->kdist_own.link || p_sec_params->kdist_peer.link)
  413. {
  414. return false;
  415. }
  416. // If bonding is not enabled, no keys can be distributed.
  417. if (!p_sec_params->bond && ( p_sec_params->kdist_own.enc
  418. || p_sec_params->kdist_own.id
  419. || p_sec_params->kdist_peer.enc
  420. || p_sec_params->kdist_peer.id))
  421. {
  422. return false;
  423. }
  424. // If bonding is enabled, one or more keys must be distributed.
  425. if ( p_sec_params->bond
  426. && !p_sec_params->kdist_own.enc
  427. && !p_sec_params->kdist_own.id
  428. && !p_sec_params->kdist_peer.enc
  429. && !p_sec_params->kdist_peer.id)
  430. {
  431. return false;
  432. }
  433. return true;
  434. }
  435. ret_code_t sm_sec_params_set(ble_gap_sec_params_t * p_sec_params)
  436. {
  437. VERIFY_MODULE_INITIALIZED();
  438. if (p_sec_params == NULL)
  439. {
  440. m_sm.sec_params_valid = false;
  441. return NRF_SUCCESS;
  442. }
  443. else if (sec_params_verify(p_sec_params))
  444. {
  445. m_sm.sec_params = *p_sec_params;
  446. m_sm.sec_params_valid = true;
  447. return NRF_SUCCESS;
  448. }
  449. else
  450. {
  451. return NRF_ERROR_INVALID_PARAM;
  452. }
  453. }
  454. void sm_conn_sec_config_reply(uint16_t conn_handle, pm_conn_sec_config_t * p_conn_sec_config)
  455. {
  456. ble_conn_state_user_flag_set(conn_handle, m_sm.flag_id_reject_pairing, !p_conn_sec_config->allow_repairing);
  457. }
  458. ret_code_t sm_lesc_public_key_set(ble_gap_lesc_p256_pk_t * p_public_key)
  459. {
  460. VERIFY_MODULE_INITIALIZED();
  461. m_sm.p_public_key = p_public_key;
  462. return NRF_SUCCESS;
  463. }
  464. ret_code_t sm_sec_params_reply(uint16_t conn_handle, ble_gap_sec_params_t * p_sec_params)
  465. {
  466. VERIFY_MODULE_INITIALIZED();
  467. return NRF_SUCCESS;
  468. }
  469. ret_code_t sm_link_secure(uint16_t conn_handle, bool force_repairing)
  470. {
  471. VERIFY_MODULE_INITIALIZED();
  472. ret_code_t err_code = link_secure(conn_handle, false, force_repairing, false);
  473. return err_code;
  474. }