@@ -32,6 +32,7 @@ L2CAPSignalingClass::L2CAPSignalingClass() :
32
32
_minInterval(0 ),
33
33
_maxInterval(0 ),
34
34
_supervisionTimeout(0 )
35
+ ,_pairing_enabled(1 )
35
36
{
36
37
}
37
38
@@ -131,53 +132,64 @@ void L2CAPSignalingClass::handleSecurityData(uint16_t connectionHandle, uint8_t
131
132
btct.printBytes (data,dlen);
132
133
#endif
133
134
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 );
151
156
#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, " );
158
163
#endif
159
164
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);
166
171
#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);
169
174
#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
+ }
181
193
}
182
194
else if (code == CONNECTION_PAIRING_RANDOM)
183
195
{
@@ -392,6 +404,15 @@ void L2CAPSignalingClass::setSupervisionTimeout(uint16_t supervisionTimeout)
392
404
_supervisionTimeout = supervisionTimeout;
393
405
}
394
406
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
+
395
416
void L2CAPSignalingClass::connectionParameterUpdateRequest (uint16_t handle, uint8_t identifier, uint8_t dlen, uint8_t data[])
396
417
{
397
418
struct __attribute__ ((packed)) L2CAPConnectionParameterUpdateRequest {
0 commit comments