Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: nRF51_Vdd TextLCD BME280
PalSecurityManager.h
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2017-2018 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #ifndef MBED_OS_FEATURES_FEATURE_BLE_BLE_PAL_PALSM_H_ 00018 #define MBED_OS_FEATURES_FEATURE_BLE_BLE_PAL_PALSM_H_ 00019 00020 #include "platform/Callback.h" 00021 #include "platform/NonCopyable.h" 00022 #include "ble/BLETypes.h" 00023 #include "ble/BLEProtocol.h" 00024 #include "ble/SecurityManager.h" 00025 #include "ble/pal/GapTypes.h" 00026 00027 namespace ble { 00028 namespace pal { 00029 00030 typedef ::SecurityManager::SecurityCompletionStatus_t SecurityCompletionStatus_t; 00031 typedef ::SecurityManager::SecurityMode_t SecurityMode_t; 00032 typedef ::SecurityManager::LinkSecurityStatus_t LinkSecurityStatus_t; 00033 typedef ::SecurityManager::Keypress_t Keypress_t; 00034 00035 /** 00036 * Key distribution as required by the SMP with convenient setters and getters, 00037 * use value() to get the octet you can use directly in the PDU. 00038 */ 00039 class KeyDistribution { 00040 public: 00041 enum KeyDistributionFlags_t { 00042 KEY_DISTRIBUTION_NONE = 0x00, 00043 KEY_DISTRIBUTION_ENCRYPTION = 0x01, 00044 KEY_DISTRIBUTION_IDENTITY = 0x02, 00045 KEY_DISTRIBUTION_SIGNING = 0x04, 00046 KEY_DISTRIBUTION_LINK = 0x08, 00047 KEY_DISTRIBUTION_ALL = 0x0F 00048 }; 00049 00050 KeyDistribution() : _value(0) { } 00051 KeyDistribution(uint8_t value) : _value(value) { } 00052 KeyDistribution(bool encryption, 00053 bool identity, 00054 bool signing, 00055 bool link) : _value(0) { 00056 set_encryption(encryption); 00057 set_identity(identity); 00058 set_signing(signing); 00059 set_link(link); 00060 } 00061 00062 bool get_encryption() const { 00063 return _value & KEY_DISTRIBUTION_ENCRYPTION; 00064 } 00065 bool get_identity() const { 00066 return _value & KEY_DISTRIBUTION_IDENTITY; 00067 } 00068 bool get_signing() const { 00069 return _value & KEY_DISTRIBUTION_SIGNING; 00070 } 00071 bool get_link() const { 00072 return _value & KEY_DISTRIBUTION_LINK; 00073 } 00074 00075 void set_encryption(bool enabled = true) { 00076 if (enabled) { 00077 _value |= KEY_DISTRIBUTION_ENCRYPTION; 00078 } else { 00079 _value &= ~KEY_DISTRIBUTION_ENCRYPTION; 00080 } 00081 } 00082 void set_identity(bool enabled = true) { 00083 if (enabled) { 00084 _value |= KEY_DISTRIBUTION_IDENTITY; 00085 } else { 00086 _value &= ~KEY_DISTRIBUTION_IDENTITY; 00087 } 00088 } 00089 void set_signing(bool enabled = true) { 00090 if (enabled) { 00091 _value |= KEY_DISTRIBUTION_SIGNING; 00092 } else { 00093 _value &= ~KEY_DISTRIBUTION_SIGNING; 00094 } 00095 } 00096 void set_link(bool enabled = true) { 00097 if (enabled) { 00098 _value |= KEY_DISTRIBUTION_LINK; 00099 } else { 00100 _value &= ~KEY_DISTRIBUTION_LINK; 00101 } 00102 } 00103 00104 operator uint8_t() { 00105 return _value; 00106 } 00107 00108 KeyDistribution operator&(const KeyDistribution& other) const { 00109 KeyDistribution result(this->value() & other.value()); 00110 return result; 00111 } 00112 00113 KeyDistribution& operator&=(const KeyDistribution& other) { 00114 this->_value = this->_value & other.value(); 00115 return *this; 00116 } 00117 00118 uint8_t value() const { 00119 return _value; 00120 } 00121 00122 private: 00123 uint8_t _value; 00124 }; 00125 00126 /** 00127 * Authentication mask as required by the SMP with convenient setters and getters, 00128 * use value() to get the octet you can use directly in the PDU. 00129 */ 00130 class AuthenticationMask { 00131 public: 00132 enum AuthenticationFlags_t { 00133 AUTHENTICATION_BONDABLE = 0x01, 00134 AUTHENTICATION_MITM = 0x04, /* 0x02 missing because bonding uses two bits */ 00135 AUTHENTICATION_SECURE_CONNECTIONS = 0x08, 00136 AUTHENTICATION_KEYPRESS_NOTIFICATION = 0x10 00137 }; 00138 00139 AuthenticationMask() : _value(0) { } 00140 AuthenticationMask(uint8_t value) : _value(value) { } 00141 AuthenticationMask(bool bondable, 00142 bool mitm, 00143 bool secure_connections, 00144 bool keypress) : _value(0) { 00145 set_bondable(bondable); 00146 set_mitm(mitm); 00147 set_secure_connections(secure_connections); 00148 set_keypress_notification(keypress); 00149 } 00150 00151 bool get_bondable() const { 00152 return _value & AUTHENTICATION_BONDABLE; 00153 } 00154 bool get_mitm() const { 00155 return _value & AUTHENTICATION_MITM; 00156 } 00157 bool get_secure_connections() const { 00158 return _value & AUTHENTICATION_SECURE_CONNECTIONS; 00159 } 00160 bool get_keypress_notification() const { 00161 return _value & AUTHENTICATION_KEYPRESS_NOTIFICATION; 00162 } 00163 00164 void set_bondable(bool enabled = true) { 00165 if (enabled) { 00166 _value |= AUTHENTICATION_BONDABLE; 00167 } else { 00168 _value &= ~AUTHENTICATION_BONDABLE; 00169 } 00170 } 00171 void set_mitm(bool enabled = true) { 00172 if (enabled) { 00173 _value |= AUTHENTICATION_MITM; 00174 } else { 00175 _value &= ~AUTHENTICATION_MITM; 00176 } 00177 } 00178 void set_secure_connections(bool enabled = true) { 00179 if (enabled) { 00180 _value |= AUTHENTICATION_SECURE_CONNECTIONS; 00181 } else { 00182 _value &= ~AUTHENTICATION_SECURE_CONNECTIONS; 00183 } 00184 } 00185 void set_keypress_notification(bool enabled = true) { 00186 if (enabled) { 00187 _value |= AUTHENTICATION_KEYPRESS_NOTIFICATION; 00188 } else { 00189 _value &= ~AUTHENTICATION_KEYPRESS_NOTIFICATION; 00190 } 00191 } 00192 00193 operator uint8_t() { 00194 return _value; 00195 } 00196 uint8_t value() const { 00197 return _value; 00198 } 00199 00200 private: 00201 uint8_t _value; 00202 }; 00203 00204 /** 00205 * Adaptation layer of the Security Manager. 00206 */ 00207 class SecurityManager : private mbed::NonCopyable<SecurityManager> { 00208 public: 00209 /** 00210 * Handle events generated by ble::pal::SecurityManager 00211 */ 00212 class EventHandler { 00213 public: 00214 //////////////////////////////////////////////////////////////////////////// 00215 // Pairing 00216 // 00217 00218 /** 00219 * Request pairing. This is called on the slave in response to a request from the master. 00220 * Upper layer shall either send a pairing response (send_pairing_response) 00221 * or cancel the pairing procedure (cancel_pairing). 00222 * 00223 * @param[in] connection connection handle 00224 * @param[in] oob_data_flag is out of band data present 00225 * @param[in] authentication_requirements authentication requirements 00226 * @param[in] initiator_dist key distribution 00227 * @param[in] responder_dist key distribution 00228 */ 00229 virtual void on_pairing_request( 00230 connection_handle_t connection, 00231 bool oob_data_flag, 00232 AuthenticationMask authentication_requirements, 00233 KeyDistribution initiator_dist, 00234 KeyDistribution responder_dist 00235 ) = 0; 00236 00237 /** 00238 * Indicate that the pairing has failed. 00239 * 00240 * @note Any subsequent pairing procedure shall restart from the Pairing 00241 * Feature Exchange phase. 00242 * @param[in] connection connection handle 00243 * @param[in] error reason for the failed pairing 00244 */ 00245 virtual void on_pairing_error( 00246 connection_handle_t connection, 00247 pairing_failure_t error 00248 ) = 0; 00249 00250 /** 00251 * Indicate that the pairing has timed out. 00252 * 00253 * @param[in] connection connection handle 00254 */ 00255 virtual void on_pairing_timed_out( 00256 connection_handle_t connection 00257 ) = 0; 00258 00259 /** 00260 * Indicate that the pairing for the link has completed. 00261 * 00262 * @param[in] connection connection handle 00263 */ 00264 virtual void on_pairing_completed( 00265 connection_handle_t connection 00266 ) = 0; 00267 00268 //////////////////////////////////////////////////////////////////////////// 00269 // Security 00270 // 00271 00272 /** 00273 * Indicate that the authentication timeout time has elapsed 00274 * and we received no packets with a valid MIC in that time. 00275 * 00276 * @param[in] connection connection handle 00277 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 6, Part B, 5.4 00278 */ 00279 virtual void on_valid_mic_timeout( 00280 connection_handle_t connection 00281 ) = 0; 00282 00283 /** 00284 * Ask the stack to evaluate the security request received from the slave. 00285 * This might result in the stack enabling encryption, or pairing/re-pairing. 00286 * 00287 * @param[in] connection connection handle 00288 * @param[in] authentication authentication requirements from the slave 00289 */ 00290 virtual void on_slave_security_request( 00291 connection_handle_t connection, 00292 AuthenticationMask authentication 00293 ) = 0; 00294 00295 //////////////////////////////////////////////////////////////////////////// 00296 // Encryption 00297 // 00298 00299 /** 00300 * Inform the application of the result of an encryption request. 00301 * @note Do no call if request timed out, call on_link_encryption_request_timed_out 00302 * instead. 00303 * 00304 * @param[in] connection connection handle 00305 * @param[in] result encryption state of the link 00306 */ 00307 virtual void on_link_encryption_result( 00308 connection_handle_t connection, 00309 link_encryption_t result 00310 ) = 0; 00311 00312 /** 00313 * Indicate that the encryption request failed due to timeout. 00314 * 00315 * @param[in] connection connection handle 00316 */ 00317 virtual void on_link_encryption_request_timed_out( 00318 connection_handle_t connection 00319 ) = 0; 00320 00321 //////////////////////////////////////////////////////////////////////////// 00322 // MITM 00323 // 00324 00325 /** 00326 * Inform the application that should display a passkey. 00327 * 00328 * @param[in] connection connection handle 00329 * @param[in] passkey passkey to be displayed 00330 */ 00331 virtual void on_passkey_display( 00332 connection_handle_t connection, 00333 passkey_num_t passkey 00334 ) = 0; 00335 00336 /** 00337 * Indicate that user confirmation is required to confirm matching 00338 * passkeys displayed on devices. 00339 * 00340 * @param[in] connection connection handle 00341 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E, 7.7.42 00342 */ 00343 virtual void on_confirmation_request( 00344 connection_handle_t connection 00345 ) = 0; 00346 00347 /** 00348 * Request the passkey entered during pairing. 00349 * 00350 * @note shall be followed by: pal::SecurityManager::passkey_request_reply 00351 * @param[in] connection connection handle 00352 * or a cancellation of the procedure. 00353 */ 00354 virtual void on_passkey_request( 00355 connection_handle_t connection 00356 ) = 0; 00357 00358 /** 00359 * Indicate that a key has been pressed by the peer. 00360 * 00361 * @param[in] connection connection handle 00362 * @param[in] keypress type of keypress event 00363 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part H, 3.5.8 00364 */ 00365 virtual void on_keypress_notification( 00366 connection_handle_t connection, 00367 Keypress_t keypress 00368 ) = 0; 00369 00370 /** 00371 * Request OOB data from the user application. 00372 * 00373 * @param[in] connection connection handle 00374 * @note shall be followed by: pal::SecurityManager::secure_connections_oob_request_reply 00375 * or a cancellation of the procedure. 00376 */ 00377 virtual void on_secure_connections_oob_request( 00378 connection_handle_t connection 00379 ) = 0; 00380 00381 /** 00382 * Request OOB data from the user application. 00383 * 00384 * @param[in] connection connection handle 00385 * @note shall be followed by: pal::SecurityManager::legacy_pairing_oob_request_reply 00386 * or a cancellation of the procedure. 00387 */ 00388 virtual void on_legacy_pairing_oob_request( 00389 connection_handle_t connection 00390 ) = 0; 00391 00392 /** 00393 * Send OOB data to the application for transport to the peer. 00394 * 00395 * @param[in] connection connection handle 00396 * @param[in] random random number used to generate the confirmation 00397 * @param[in] confirm confirmation value to be use for authentication 00398 * in secure connections pairing 00399 * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason. 00400 */ 00401 virtual void on_secure_connections_oob_generated( 00402 const oob_lesc_value_t &random, 00403 const oob_confirm_t &confirm 00404 ) = 0; 00405 00406 //////////////////////////////////////////////////////////////////////////// 00407 // Keys 00408 // 00409 00410 /** 00411 * Store the results of key generation of the stage 2 of secure connections pairing 00412 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part H - 2.3.5.6.5 00413 * 00414 * @param[in] connection connection handle 00415 * @param[in] ltk long term key from the peer 00416 */ 00417 virtual void on_secure_connections_ltk_generated( 00418 connection_handle_t connection, 00419 const ltk_t <k 00420 ) = 0; 00421 00422 /** 00423 * Store the results of key distribution after LTK has been received. 00424 * 00425 * @param[in] connection connection handle 00426 * @param[in] ltk long term key from the peer 00427 */ 00428 virtual void on_keys_distributed_ltk( 00429 connection_handle_t connection, 00430 const ltk_t <k 00431 ) = 0; 00432 00433 /** 00434 * Store the results of key distribution after EDIV and RAND has been received. 00435 * 00436 * @param[in] connection connection handle 00437 * @param[in] ltk long term key from the peer 00438 */ 00439 virtual void on_keys_distributed_ediv_rand( 00440 connection_handle_t connection, 00441 const ediv_t &ediv, 00442 const rand_t &rand 00443 ) = 0; 00444 00445 /** 00446 * Store the local key, if we are slave now or in the future 00447 * this will be used to encrypt. 00448 * 00449 * @param[in] connection connection handle 00450 * @param[in] ltk key sent to the peer 00451 */ 00452 virtual void on_keys_distributed_local_ltk( 00453 connection_handle_t connection, 00454 const ltk_t <k 00455 ) = 0; 00456 00457 /** 00458 * Store the EDIV and RAND that will be used to identify 00459 * the stored local LTK. if we are slave that LTK will be 00460 * used to encrypt, otherwise this will be stored to 00461 * be used in case of role reversal. 00462 * 00463 * @param[in] connection connection handle 00464 * @param[in] ediv identifies LTK 00465 * @param[in] rand identifies LTK 00466 */ 00467 virtual void on_keys_distributed_local_ediv_rand( 00468 connection_handle_t connection, 00469 const ediv_t &ediv, 00470 const rand_t &rand 00471 ) = 0; 00472 00473 /** 00474 * Store the results of key distribution after IRK has been received. 00475 * 00476 * @param[in] connection connection handle 00477 * @param[in] irk identity resolution key 00478 */ 00479 virtual void on_keys_distributed_irk( 00480 connection_handle_t connection, 00481 const irk_t &irk 00482 ) = 0; 00483 00484 /** 00485 * Store the identity address of the peer after it has been distributed. 00486 * 00487 * @param[in] connection connection handle 00488 * @param[in] peer_identity_address_type public or private address indication 00489 * @param[in] peer_identity_address peer address 00490 */ 00491 virtual void on_keys_distributed_bdaddr( 00492 connection_handle_t connection, 00493 advertising_peer_address_type_t peer_identity_address_type, 00494 const address_t &peer_identity_address 00495 ) = 0; 00496 00497 /** 00498 * Store the peer's CSRK after it has been distributed. 00499 * 00500 * @param[in] connection connection handle 00501 * @param[in] csrk signing key 00502 */ 00503 virtual void on_keys_distributed_csrk( 00504 connection_handle_t connection, 00505 const csrk_t &csrk 00506 ) = 0; 00507 00508 /** 00509 * Request the LTK since the peer is asking us to encrypt the link. We need to 00510 * provide the LTK based on the EDIV and RAND provided by the other side. This 00511 * is called on the slave. 00512 * 00513 * @param[in] connection connection handle 00514 * @param[in] ediv identifies LTK 00515 * @param[in] rand identifies LTK 00516 */ 00517 virtual void on_ltk_request( 00518 connection_handle_t connection, 00519 const ediv_t &ediv, 00520 const rand_t &rand 00521 ) = 0; 00522 00523 /** 00524 * Request the LTK since the peer is asking us to encrypt the link. 00525 * @note No EDIV or RAND is provided as this requests a secure 00526 * connections LTK where their values are all zeroes 00527 * 00528 * @param[in] connection connection handle 00529 */ 00530 virtual void on_ltk_request( 00531 connection_handle_t connection 00532 ) = 0; 00533 }; 00534 00535 public: 00536 SecurityManager() : _pal_event_handler(NULL) { }; 00537 00538 virtual ~SecurityManager() { }; 00539 00540 //////////////////////////////////////////////////////////////////////////// 00541 // SM lifecycle management 00542 // 00543 00544 /** 00545 * Initialise stack. Called before first use. 00546 * 00547 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00548 */ 00549 virtual ble_error_t initialize() = 0; 00550 00551 /** 00552 * Finalise all actions. Called before shutdown. 00553 * 00554 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00555 */ 00556 virtual ble_error_t terminate() = 0; 00557 00558 /** 00559 * Reset to same state as after initialize. 00560 * 00561 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00562 */ 00563 virtual ble_error_t reset() = 0; 00564 00565 //////////////////////////////////////////////////////////////////////////// 00566 // Resolving list management 00567 // 00568 00569 /** 00570 * Return the number of address translation entries that can be stored by the 00571 * subsystem. 00572 * 00573 * @warning: The number of entries is considered fixed. 00574 * 00575 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E: 7.8.41 00576 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00577 */ 00578 virtual uint8_t read_resolving_list_capacity() = 0; 00579 00580 /** 00581 * Add a device definition into the resolving list of the LE subsystem. 00582 * 00583 * @param[in] peer_identity_address_type public/private indicator 00584 * @param[in] peer_identity_address address of the device whose entry is to be added 00585 * @param[in] peer_irk peer identity resolving key 00586 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E: 7.8.38 00587 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00588 */ 00589 virtual ble_error_t add_device_to_resolving_list( 00590 advertising_peer_address_type_t peer_identity_address_type, 00591 const address_t &peer_identity_address, 00592 const irk_t &peer_irk 00593 ) = 0; 00594 00595 /** 00596 * Add a device definition from the resolving list of the LE subsystem. 00597 * 00598 * @param[in] peer_identity_address_type public/private indicator 00599 * @param[in] peer_identity_address address of the device whose entry is to be removed 00600 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E: 7.8.39 00601 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00602 */ 00603 virtual ble_error_t remove_device_from_resolving_list( 00604 advertising_peer_address_type_t peer_identity_address_type, 00605 const address_t &peer_identity_address 00606 ) = 0; 00607 00608 /** 00609 * Remove all devices from the resolving list. 00610 * 00611 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part E: 7.8.40 00612 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00613 */ 00614 virtual ble_error_t clear_resolving_list() = 0; 00615 00616 //////////////////////////////////////////////////////////////////////////// 00617 // Pairing 00618 // 00619 00620 /** 00621 * Send a pairing request to a slave. 00622 * 00623 * @param[in] connection connection handle 00624 * @param[in] oob_data_flag is oob data present 00625 * @param[in] authentication_requirements authentication requirements 00626 * @param[in] initiator_dist key distribution 00627 * @param[in] responder_dist key distribution 00628 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part H - 3.5.1 00629 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00630 */ 00631 virtual ble_error_t send_pairing_request( 00632 connection_handle_t connection, 00633 bool oob_data_flag, 00634 AuthenticationMask authentication_requirements, 00635 KeyDistribution initiator_dist, 00636 KeyDistribution responder_dist 00637 ) = 0; 00638 00639 /** 00640 * Send a pairing response to a master. 00641 * 00642 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part H - 3.5.2* 00643 * @param[in] connection connection handle 00644 * @param[in] oob_data_flag is oob data present 00645 * @param[in] authentication_requirements authentication requirements 00646 * @param[in] initiator_dist key distribution 00647 * @param[in] responder_dist key distribution 00648 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00649 */ 00650 virtual ble_error_t send_pairing_response( 00651 connection_handle_t connection, 00652 bool oob_data_flag, 00653 AuthenticationMask authentication_requirements, 00654 KeyDistribution initiator_dist, 00655 KeyDistribution responder_dist 00656 ) = 0; 00657 00658 /** 00659 * Cancel an ongoing pairing. 00660 * 00661 * @param[in] connection connection handle 00662 * @param[in] reason pairing failure error 00663 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 3, Part H - 3.5.5 00664 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00665 */ 00666 virtual ble_error_t cancel_pairing( 00667 connection_handle_t connection, 00668 pairing_failure_t reason 00669 ) = 0; 00670 00671 //////////////////////////////////////////////////////////////////////////// 00672 // Feature support 00673 // 00674 00675 /** 00676 * Check if the Secure Connections feature is supported by the stack and controller. 00677 * 00678 * @param[out] enabled true if SC are supported 00679 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00680 */ 00681 virtual ble_error_t get_secure_connections_support( 00682 bool &enabled 00683 ) = 0; 00684 00685 /** 00686 * Set the IO capability that will be used during pairing feature exchange. 00687 * 00688 * @param[in] io_capability type of IO capabilities available on the local device 00689 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00690 */ 00691 virtual ble_error_t set_io_capability( 00692 io_capability_t io_capability 00693 ) = 0; 00694 00695 //////////////////////////////////////////////////////////////////////////// 00696 // Security settings 00697 // 00698 00699 /** 00700 * Set the time after which an event will be generated unless we received a packet with 00701 * a valid MIC. 00702 * 00703 * @param[in] connection connection handle 00704 * @param[in] timeout_in_10ms time measured in units of 10 milliseconds 00705 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00706 */ 00707 virtual ble_error_t set_authentication_timeout( 00708 connection_handle_t connection, 00709 uint16_t timeout_in_10ms 00710 ) = 0; 00711 00712 /** 00713 * Get the time after which an event will be generated unless we received a packet with 00714 * a valid MIC. 00715 * 00716 * @param[in] connection connection handle 00717 * @param[out] timeout_in_10ms time measured in units of 10 milliseconds 00718 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00719 */ 00720 virtual ble_error_t get_authentication_timeout( 00721 connection_handle_t connection, 00722 uint16_t &timeout_in_10ms 00723 ) = 0; 00724 00725 /** 00726 * Set the key size boundaries that will be used during pairing feature 00727 * exchange. 00728 * 00729 * @param[in] min_encryption_key_size The minimum encryption key size in bytes 00730 * required for pairing. This value shall be in the range [7 : 16]. 00731 * 00732 * @param[in] max_encryption_key_size The maximum encryption key size in bytes 00733 * required for pairing. This value shall be in the range 00734 * [min_encryption_key_size : 16]. 00735 * 00736 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00737 */ 00738 virtual ble_error_t set_encryption_key_requirements( 00739 uint8_t min_encryption_key_size, 00740 uint8_t max_encryption_key_size 00741 ) = 0; 00742 00743 /** 00744 * Request change of security level from the master. This is called by the slave when 00745 * it needs to elevate the security level as it can't change it itself. This will be 00746 * received by the master who will take the decision about what action to take 00747 * (encryption, pairing, re-paring). 00748 * 00749 * @param[in] connection connection handle 00750 * @param[in] authentication authentication requirements 00751 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00752 */ 00753 virtual ble_error_t slave_security_request( 00754 connection_handle_t connection, 00755 AuthenticationMask authentication 00756 ) = 0; 00757 00758 //////////////////////////////////////////////////////////////////////////// 00759 // Encryption 00760 // 00761 00762 /** 00763 * Enabled encryption using the LTK given. The EDIV and RAND will be sent to the peer and 00764 * used to identify the LTK. This is called by the master. This will refresh the key if 00765 * enabled on an already encrypted link. 00766 * 00767 * @param[in] connection connection handle 00768 * @param[in] ltk long term key from the peer 00769 * @param[in] ediv encryption diversifier from the peer 00770 * @param[in] rand random value from the peer 00771 * @param[in] mitm does the LTK have man in the middle protection 00772 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00773 */ 00774 virtual ble_error_t enable_encryption( 00775 connection_handle_t connection, 00776 const ltk_t <k, 00777 const rand_t &rand, 00778 const ediv_t &ediv, 00779 bool mitm 00780 ) = 0; 00781 00782 /** 00783 * Enabled encryption using the LTK given on a connection established with secure 00784 * connections pairing. 00785 * 00786 * @param[in] connection connection handle 00787 * @param[in] ltk long term key from the peer 00788 * @param[in] mitm does the LTK have man in the middle protection 00789 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00790 */ 00791 virtual ble_error_t enable_encryption( 00792 connection_handle_t connection, 00793 const ltk_t <k, 00794 bool mitm 00795 ) = 0; 00796 00797 /** 00798 * Encrypt data with a given key. This uses the facility on the controller to 00799 * perform the encryption. 00800 * 00801 * @param[in] key encryption key 00802 * @param[in,out] data data to be encrypted, if successful contains the result 00803 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00804 */ 00805 virtual ble_error_t encrypt_data( 00806 const byte_array_t<16> &key, 00807 encryption_block_t &data 00808 ) = 0; 00809 00810 //////////////////////////////////////////////////////////////////////////// 00811 // Privacy 00812 // 00813 00814 virtual ble_error_t set_private_address_timeout( 00815 uint16_t timeout_in_seconds 00816 ) = 0; 00817 00818 //////////////////////////////////////////////////////////////////////////// 00819 // Keys 00820 // 00821 00822 /** 00823 * Set the LTK that is to be used for encryption. 00824 * 00825 * @param[in] connection connection handle 00826 * @param[in] ltk long term key 00827 * @param[in] mitm does the LTK have man in the middle protection 00828 * @param[in] secure_connections is this a secure_connections pairing 00829 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00830 */ 00831 virtual ble_error_t set_ltk( 00832 connection_handle_t connection, 00833 const ltk_t <k, 00834 bool mitm, 00835 bool secure_connections 00836 ) = 0; 00837 00838 /** 00839 * Inform the stack we don't have the LTK. 00840 * 00841 * @param[in] connection connection handle 00842 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00843 */ 00844 virtual ble_error_t set_ltk_not_found( 00845 connection_handle_t connection 00846 ) = 0; 00847 00848 /** 00849 * Set the local IRK. 00850 * 00851 * @param[in] irk identity resolution key 00852 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00853 */ 00854 virtual ble_error_t set_irk( 00855 const irk_t &irk 00856 ) = 0; 00857 00858 /** 00859 * Set the local CSRK. 00860 * 00861 * @param[in] csrk local signing key 00862 * @param[in] sign_counter local signing counter 00863 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00864 */ 00865 virtual ble_error_t set_csrk( 00866 const csrk_t &csrk, 00867 sign_count_t sign_counter 00868 ) = 0; 00869 00870 /** 00871 * Set the peer CSRK for particular connection. 00872 * 00873 * @param[in] connection connection handle 00874 * @param[in] csrk signing key 00875 * @param[in] authenticated is the CSRK authenticated 00876 * @param[in] sign_counter signing counter 00877 * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure 00878 */ 00879 virtual ble_error_t set_peer_csrk( 00880 connection_handle_t connection, 00881 const csrk_t &csrk, 00882 bool authenticated, 00883 sign_count_t sign_counter 00884 ) = 0; 00885 00886 virtual ble_error_t remove_peer_csrk(connection_handle_t connection) = 0; 00887 00888 //////////////////////////////////////////////////////////////////////////// 00889 // Authentication 00890 // 00891 00892 /** 00893 * Generate and return 8 octets of random data compliant with [FIPS PUB 140-2] 00894 * 00895 * @param[out] random_data returns 8 octets of random data 00896 * @see BLUETOOTH SPECIFICATION Version 5.0 | Vol 2, Part H 2 00897 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00898 */ 00899 virtual ble_error_t get_random_data( 00900 byte_array_t<8> &random_data 00901 ) = 0; 00902 00903 //////////////////////////////////////////////////////////////////////////// 00904 // MITM 00905 // 00906 00907 /** 00908 * Set the default passkey that will be used when the SM needs a passkey to 00909 * be displayed. 00910 * 00911 * By default, the pal security manager generates a random passkey when a 00912 * passkey has to be displayed by the application. A call to this function 00913 * with a valid passkey alter this behaviour and the SecurityManager shall 00914 * pass the passkey set into SecurityManagerEvent::on_passkey_display . 00915 * 00916 * A call to this function with a zero value will reset the behaviour and 00917 * indicates to the security manager that passkeys passed to 00918 * SecurityManagerEvent::on_passkey_display shall be randomly generated. 00919 * 00920 * @param[in] passkey Set the passkey that shall be used by the security 00921 * manager when SecurityManagerEvent::on_passkey_display is called. If 00922 * passkey is set to 0 then the security manager generates a random 00923 * passkey every time it calls SecurityManagerEvent::on_passkey_display. 00924 * 00925 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00926 */ 00927 virtual ble_error_t set_display_passkey( 00928 passkey_num_t passkey 00929 ) = 0; 00930 00931 /** 00932 * Reply to a passkey request received from the SecurityManagerEventHandler. 00933 * 00934 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00935 */ 00936 virtual ble_error_t passkey_request_reply( 00937 connection_handle_t connection, 00938 passkey_num_t passkey 00939 ) = 0; 00940 00941 /** 00942 * Reply to a Secure Connections oob data request received from the SecurityManagerEventHandler. 00943 * 00944 * @param[in] connection connection handle 00945 * @param[in] local_random local random number used for the last oob exchange 00946 * @param[in] peer_random random number used to generate the confirmation on peer 00947 * @param[in] peer_confirm confirmation value to be use for authentication 00948 * in secure connections pairing 00949 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00950 */ 00951 virtual ble_error_t secure_connections_oob_request_reply( 00952 connection_handle_t connection, 00953 const oob_lesc_value_t &local_random, 00954 const oob_lesc_value_t &peer_random, 00955 const oob_confirm_t &peer_confirm 00956 ) = 0; 00957 00958 /** 00959 * Reply to a legacy pairing oob data request received from the SecurityManagerEventHandler. 00960 * 00961 * @param[in] connection connection handle 00962 * @param[in] oob_data pointer to out of band data 00963 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00964 */ 00965 virtual ble_error_t legacy_pairing_oob_request_reply( 00966 connection_handle_t connection, 00967 const oob_tk_t &oob_data 00968 ) = 0; 00969 00970 /** 00971 * Notify the stack that the user has confirmed the values during numerical 00972 * comparison stage of pairing. 00973 * 00974 * @param[in] connection connection handle 00975 * @param[in] confirmation true if the user indicated the numbers match 00976 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00977 */ 00978 virtual ble_error_t confirmation_entered( 00979 connection_handle_t connection, 00980 bool confirmation 00981 ) = 0; 00982 00983 /** 00984 * Notify the stack that the user pressed a key. This will be sent to the peer and create 00985 * an appropriate event there if the keypress protocol is enabled. 00986 * 00987 * @param[in] connection connection handle 00988 * @param[in] keypress type of keypress event 00989 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00990 */ 00991 virtual ble_error_t send_keypress_notification( 00992 connection_handle_t connection, 00993 Keypress_t keypress 00994 ) = 0; 00995 00996 /** 00997 * Generate local OOB data to be sent to the application which sends it to the peer. 00998 * @return BLE_ERROR_NONE On success, else an error code indicating reason for failure 00999 */ 01000 virtual ble_error_t generate_secure_connections_oob() = 0; 01001 01002 /* Entry points for the underlying stack to report events back to the user. */ 01003 public: 01004 /** 01005 * Sets the event handler that us called by the PAL porters to notify the stack of events 01006 * which will in turn be passed onto the user application when appropriate. 01007 * 01008 * @param[in] event_handler the new event handler interface implementation. Memory 01009 * owned by caller who is responsible for updating this pointer if interface changes. 01010 */ 01011 void set_event_handler( 01012 EventHandler *event_handler 01013 ) { 01014 _pal_event_handler = event_handler; 01015 } 01016 01017 EventHandler* get_event_handler() { 01018 return _pal_event_handler; 01019 } 01020 01021 private: 01022 EventHandler *_pal_event_handler; 01023 01024 }; 01025 01026 } /* namespace pal */ 01027 } /* namespace ble */ 01028 01029 #endif /* MBED_OS_FEATURES_FEATURE_BLE_BLE_PAL_PALSM_H_ */
Generated on Tue Jul 12 2022 15:15:55 by
