@@ -106,8 +106,8 @@ AdafruitBluefruit::AdafruitBluefruit(void)
106
106
_chars_count = 0 ;
107
107
for (uint8_t i=0 ; i<BLE_MAX_CHARS; i++) _chars_list[i] = NULL ;
108
108
109
- varclr (&_enc_key );
110
- varclr (&_peer_id);
109
+ varclr (&_bond );
110
+
111
111
_sys_attr = NULL ;
112
112
_sys_attr_len = 0 ;
113
113
@@ -582,10 +582,8 @@ void AdafruitBluefruit::_poll(void)
582
582
default : break ;
583
583
}
584
584
}
585
- else
586
- {
587
- // Error, do nothing nowx
588
- }
585
+ // Error, do nothing now
586
+ else { }
589
587
590
588
/* ------------- BLE Event -------------*/
591
589
uint32_t ev_buf[BLE_STACK_EVT_MSG_BUF_SIZE/4 + 4 ];
@@ -611,7 +609,6 @@ void AdafruitBluefruit::_poll(void)
611
609
{
612
610
case BLE_GAP_EVT_CONNECTED:
613
611
{
614
- // PRINT_MESS("Connected");
615
612
ble_gap_evt_connected_t * para = &evt->evt .gap_evt .params .connected ;
616
613
617
614
if (para->role == BLE_GAP_ROLE_PERIPH)
@@ -632,14 +629,13 @@ void AdafruitBluefruit::_poll(void)
632
629
break ;
633
630
634
631
case BLE_GAP_EVT_DISCONNECTED:
635
- // PRINT_MESS("Disconnected");
636
-
637
632
// Check if it is peripheral connection
638
633
if (_conn_hdl == evt->evt .gap_evt .conn_handle )
639
634
{
640
635
if (_led_conn) ledOff (LED_CONN);
641
636
642
637
_conn_hdl = BLE_GATT_HANDLE_INVALID;
638
+ _bonded = false ;
643
639
varclr (&_peer_addr);
644
640
645
641
vSemaphoreDelete (_txbuf_sem);
@@ -667,33 +663,19 @@ void AdafruitBluefruit::_poll(void)
667
663
668
664
case BLE_GAP_EVT_CONN_PARAM_UPDATE:
669
665
{
666
+ // Central set the connection parameter
670
667
// ble_gap_conn_params_t* param = &evt->evt.gap_evt.params.conn_param_update.conn_params;
671
668
// PRINT_INT(param->min_conn_interval);
672
669
// PRINT_INT(param->max_conn_interval);
673
670
}
674
671
break ;
675
672
676
- case BLE_GAP_EVT_SEC_INFO_REQUEST:
677
- {
678
- // PRINT_MESS("BLE_GAP_EVT_SEC_INFO_REQUEST");
679
- // If bonded previously, return information. Otherwise NULL
680
- ble_gap_evt_sec_info_request_t * sec_request = (ble_gap_evt_sec_info_request_t *) &evt->evt .gap_evt .params .sec_info_request ;
681
-
682
- if (_enc_key.master_id .ediv == sec_request->master_id .ediv )
683
- {
684
- PRINT_LOCATION ();
685
- sd_ble_gap_sec_info_reply (evt->evt .gap_evt .conn_handle , &_enc_key.enc_info , &_peer_id.id_info , NULL );
686
- } else
687
- {
688
- PRINT_LOCATION ();
689
- sd_ble_gap_sec_info_reply (evt->evt .gap_evt .conn_handle , NULL , NULL , NULL );
690
- }
691
- }
692
- break ;
693
-
694
673
case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
695
674
{
696
- // PRINT_MESS("BLE_GAP_EVT_SEC_PARAMS_REQUEST");
675
+ /* Step 1: Pairing/Bonding
676
+ * - Central supplies its parameters
677
+ * - We replies with our security parameters
678
+ */
697
679
// ble_gap_sec_params_t* peer = &evt->evt.gap_evt.params.sec_params_request.peer_params;
698
680
699
681
ble_gap_sec_params_t sec_para =
@@ -705,21 +687,23 @@ void AdafruitBluefruit::_poll(void)
705
687
.io_caps = BLE_GAP_IO_CAPS_NONE, // (CFG_PIN_ENABLED && nvm_data.core.passkey_enable) ? BLE_GAP_IO_CAPS_DISPLAY_ONLY : BLE_GAP_IO_CAPS_NONE ,
706
688
.oob = 0 ,
707
689
.min_key_size = 7 ,
708
- .max_key_size = 16
690
+ .max_key_size = 16 ,
691
+ .kdist_own = { .enc = 1 , .id = 1 },
692
+ .kdist_peer = { .enc = 1 , .id = 1 },
709
693
};
710
694
711
695
ble_gap_sec_keyset_t keyset =
712
696
{
713
697
.keys_own = {
714
- .p_enc_key = &_enc_key ,
698
+ .p_enc_key = &_bond. own_enc ,
715
699
.p_id_key = NULL ,
716
700
.p_sign_key = NULL ,
717
701
.p_pk = NULL
718
702
},
719
703
720
704
.keys_peer = {
721
- .p_enc_key = NULL ,
722
- .p_id_key = &_peer_id ,
705
+ .p_enc_key = &_bond. peer_enc ,
706
+ .p_id_key = &_bond. peer_id ,
723
707
.p_sign_key = NULL ,
724
708
.p_pk = NULL
725
709
}
@@ -729,14 +713,37 @@ void AdafruitBluefruit::_poll(void)
729
713
}
730
714
break ;
731
715
716
+ case BLE_GAP_EVT_SEC_INFO_REQUEST:
717
+ {
718
+ // If bonded previously, Central will ask for stored keys.
719
+ // return security information. Otherwise NULL
720
+ ble_gap_evt_sec_info_request_t * sec_request = (ble_gap_evt_sec_info_request_t *) &evt->evt .gap_evt .params .sec_info_request ;
721
+
722
+ PRINT_HEX (sec_request->master_id .ediv );
723
+ if (_bond.own_enc .master_id .ediv == sec_request->master_id .ediv )
724
+ {
725
+ PRINT_LOCATION ();
726
+ sd_ble_gap_sec_info_reply (evt->evt .gap_evt .conn_handle , &_bond.own_enc .enc_info , &_bond.peer_id .id_info , NULL );
727
+ } else
728
+ {
729
+ PRINT_LOCATION ();
730
+ sd_ble_gap_sec_info_reply (evt->evt .gap_evt .conn_handle , NULL , NULL , NULL );
731
+ }
732
+ }
733
+ break ;
734
+
735
+
732
736
case BLE_GAP_EVT_PASSKEY_DISPLAY: break ;
733
737
734
738
case BLE_GAP_EVT_CONN_SEC_UPDATE:
735
739
{
736
- // PRINT_MESS("BLE_GAP_EVT_CONN_SEC_UPDATE");
740
+ // Connection is secured
737
741
ble_gap_conn_sec_t * conn_sec = (ble_gap_conn_sec_t *) &evt->evt .gap_evt .params .conn_sec_update .conn_sec ;
738
742
(void ) conn_sec;
739
743
744
+ // TODO check if this connection is bonded
745
+ _bonded = true ;
746
+
740
747
// Connection is secured, Apply Service Context
741
748
sd_ble_gatts_sys_attr_set (_conn_hdl, _sys_attr, _sys_attr_len, SVC_CONTEXT_FLAG);
742
749
}
@@ -746,7 +753,7 @@ void AdafruitBluefruit::_poll(void)
746
753
{
747
754
ble_gap_evt_auth_status_t * status = &evt->evt .gap_evt .params .auth_status ;
748
755
// Bonding succeeded --> save encryption keys
749
- // PRINT_HEX(status->auth_status);
756
+ PRINT_HEX (status->auth_status );
750
757
if (BLE_GAP_SEC_STATUS_SUCCESS == status->auth_status )
751
758
{
752
759
_bonded = true ;
@@ -755,7 +762,6 @@ void AdafruitBluefruit::_poll(void)
755
762
break ;
756
763
757
764
case BLE_GATTS_EVT_SYS_ATTR_MISSING:
758
- // PRINT_MESS("BLE_GATTS_EVT_SYS_ATTR_MISSING");
759
765
sd_ble_gatts_sys_attr_set (_conn_hdl, NULL , 0 , 0 );
760
766
break ;
761
767
0 commit comments