@@ -32,6 +32,7 @@ L2CAPSignalingClass::L2CAPSignalingClass() :
3232 _minInterval(0 ),
3333 _maxInterval(0 ),
3434 _supervisionTimeout(0 )
35+ ,_pairing_enabled(1 )
3536{
3637}
3738
@@ -131,53 +132,64 @@ void L2CAPSignalingClass::handleSecurityData(uint16_t connectionHandle, uint8_t
131132 btct.printBytes (data,dlen);
132133#endif
133134 if (code == CONNECTION_PAIRING_REQUEST) {
134- // 0x1
135- struct __attribute__ ((packed)) PairingRequest {
136- uint8_t ioCapability;
137- uint8_t oobDataFlag;
138- uint8_t authReq;
139- uint8_t maxEncSize;
140- uint8_t initiatorKeyDistribution;
141- uint8_t responderKeyDistribution;
142- } *pairingRequest = (PairingRequest*)l2capSignalingHdr->data ;
143-
144-
145- ATT.remoteKeyDistribution = KeyDistribution (pairingRequest->initiatorKeyDistribution );
146- ATT.localKeyDistribution = KeyDistribution (pairingRequest->responderKeyDistribution );
147- KeyDistribution rkd (pairingRequest->responderKeyDistribution );
148- AuthReq req (pairingRequest->authReq );
149- KeyDistribution responseKD = KeyDistribution ();
150- responseKD.setIdKey (true );
135+
136+ if (isPairingEnabled ()){
137+ if (_pairing_enabled >= 2 ) _pairing_enabled = 0 ; // 2 = pair once only
138+
139+ // 0x1
140+ struct __attribute__ ((packed)) PairingRequest {
141+ uint8_t ioCapability;
142+ uint8_t oobDataFlag;
143+ uint8_t authReq;
144+ uint8_t maxEncSize;
145+ uint8_t initiatorKeyDistribution;
146+ uint8_t responderKeyDistribution;
147+ } *pairingRequest = (PairingRequest*)l2capSignalingHdr->data ;
148+
149+
150+ ATT.remoteKeyDistribution = KeyDistribution (pairingRequest->initiatorKeyDistribution );
151+ ATT.localKeyDistribution = KeyDistribution (pairingRequest->responderKeyDistribution );
152+ KeyDistribution rkd (pairingRequest->responderKeyDistribution );
153+ AuthReq req (pairingRequest->authReq );
154+ KeyDistribution responseKD = KeyDistribution ();
155+ responseKD.setIdKey (true );
151156#ifdef _BLE_TRACE_
152- Serial.print (" Req has properties: " );
153- Serial.print (req.Bonding ()?" bonding, " :" no bonding, " );
154- Serial.print (req.CT2 ()?" CT2, " :" no CT2, " );
155- Serial.print (req.KeyPress ()?" KeyPress, " :" no KeyPress, " );
156- Serial.print (req.MITM ()?" MITM, " :" no MITM, " );
157- Serial.print (req.SC ()?" SC, " :" no SC, " );
157+ Serial.print (" Req has properties: " );
158+ Serial.print (req.Bonding ()?" bonding, " :" no bonding, " );
159+ Serial.print (req.CT2 ()?" CT2, " :" no CT2, " );
160+ Serial.print (req.KeyPress ()?" KeyPress, " :" no KeyPress, " );
161+ Serial.print (req.MITM ()?" MITM, " :" no MITM, " );
162+ Serial.print (req.SC ()?" SC, " :" no SC, " );
158163#endif
159164
160- uint8_t peerIOCap[3 ];
161- peerIOCap[0 ] = pairingRequest->authReq ;
162- peerIOCap[1 ] = pairingRequest->oobDataFlag ;
163- peerIOCap[2 ] = pairingRequest->ioCapability ;
164- ATT.setPeerIOCap (connectionHandle, peerIOCap);
165- ATT.setPeerEncryption (connectionHandle, ATT.getPeerEncryption (connectionHandle) | PEER_ENCRYPTION::PAIRING_REQUEST);
165+ uint8_t peerIOCap[3 ];
166+ peerIOCap[0 ] = pairingRequest->authReq ;
167+ peerIOCap[1 ] = pairingRequest->oobDataFlag ;
168+ peerIOCap[2 ] = pairingRequest->ioCapability ;
169+ ATT.setPeerIOCap (connectionHandle, peerIOCap);
170+ ATT.setPeerEncryption (connectionHandle, ATT.getPeerEncryption (connectionHandle) | PEER_ENCRYPTION::PAIRING_REQUEST);
166171#ifdef _BLE_TRACE_
167- Serial.print (" Peer encryption : 0b" );
168- Serial.println (ATT.getPeerEncryption (connectionHandle), BIN);
172+ Serial.print (" Peer encryption : 0b" );
173+ Serial.println (ATT.getPeerEncryption (connectionHandle), BIN);
169174#endif
170- struct __attribute__ ((packed)) PairingResponse {
171- uint8_t code;
172- uint8_t ioCapability;
173- uint8_t oobDataFlag;
174- uint8_t authReq;
175- uint8_t maxEncSize;
176- uint8_t initiatorKeyDistribution;
177- uint8_t responderKeyDistribution;
178- } response = { CONNECTION_PAIRING_RESPONSE, LOCAL_IOCAP, 0 , LOCAL_AUTHREQ, 0x10 , responseKD.getOctet (), responseKD.getOctet ()};
179-
180- HCI.sendAclPkt (connectionHandle, SECURITY_CID, sizeof (response), &response);
175+ struct __attribute__ ((packed)) PairingResponse {
176+ uint8_t code;
177+ uint8_t ioCapability;
178+ uint8_t oobDataFlag;
179+ uint8_t authReq;
180+ uint8_t maxEncSize;
181+ uint8_t initiatorKeyDistribution;
182+ uint8_t responderKeyDistribution;
183+ } response = { CONNECTION_PAIRING_RESPONSE, LOCAL_IOCAP, 0 , LOCAL_AUTHREQ, 0x10 , responseKD.getOctet (), responseKD.getOctet ()};
184+
185+ HCI.sendAclPkt (connectionHandle, SECURITY_CID, sizeof (response), &response);
186+
187+ } else {
188+ // Pairing not enabled
189+ uint8_t ret[2 ] = {CONNECTION_PAIRING_FAILED, 0x05 }; // reqect pairing
190+ HCI.sendAclPkt (connectionHandle, SECURITY_CID, sizeof (ret), ret);
191+ ATT.setPeerEncryption (connectionHandle, NO_ENCRYPTION);
192+ }
181193 }
182194 else if (code == CONNECTION_PAIRING_RANDOM)
183195 {
@@ -392,6 +404,15 @@ void L2CAPSignalingClass::setSupervisionTimeout(uint16_t supervisionTimeout)
392404 _supervisionTimeout = supervisionTimeout;
393405}
394406
407+ void L2CAPSignalingClass::setPairingEnabled (uint8_t enabled)
408+ {
409+ _pairing_enabled = enabled;
410+ }
411+ bool L2CAPSignalingClass::isPairingEnabled ()
412+ {
413+ return _pairing_enabled > 0 ;
414+ }
415+
395416void L2CAPSignalingClass::connectionParameterUpdateRequest (uint16_t handle, uint8_t identifier, uint8_t dlen, uint8_t data[])
396417{
397418 struct __attribute__ ((packed)) L2CAPConnectionParameterUpdateRequest {
0 commit comments