• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "gap.h"
17 #include "gap_internal.h"
18 #include "gap_task_internal.h"
19 
20 #include <securec.h>
21 
22 #include "allocator.h"
23 #include "log.h"
24 #include "thread.h"
25 
26 #include "btm.h"
27 #include "btm/btm_interop.h"
28 #include "btm/btm_thread.h"
29 
30 typedef struct {
31     GapSecurityCallback callback;
32     void *context;
33 } SecurityCallback;
34 
35 typedef struct {
36     GapAuthenticationCallback callback;
37     void *context;
38 } AuthenticationCallback;
39 
40 static SecurityCallback g_securityCallback;
41 static AuthenticationCallback g_authenticationCallback;
42 
43 static int GapAuthenticationRequested(uint16_t handle);
44 static int GapSetConnectionEncryption(uint16_t handle, uint8_t encryptionEnable);
45 
GapCompareServiceSecurityInfo(const GapServiceSecurityInfo * info1,const GapServiceSecurityInfo * info2)46 static bool GapCompareServiceSecurityInfo(const GapServiceSecurityInfo *info1, const GapServiceSecurityInfo *info2)
47 {
48     return ((info1->direction == info2->direction) && (info1->protocolId == info2->protocolId) &&
49             (GapCompareChannelID(info2->protocolId, info1->channelId, info2->channelId)) &&
50             ((info1->serviceId == info2->serviceId) || (info1->serviceId == UNKNOWN_SERVICE) ||
51                 (info2->serviceId == UNKNOWN_SERVICE)));
52 }
53 
GapAllocReqSecInfo(const BtAddr * addr,GapSecurityResultCallback callback,void * context,const ProfileSecurityInfo * info)54 static RequestSecInfo *GapAllocReqSecInfo(
55     const BtAddr *addr, GapSecurityResultCallback callback, void *context, const ProfileSecurityInfo *info)
56 {
57     RequestSecInfo *reqInfo = NULL;
58 
59     reqInfo = MEM_MALLOC.alloc(sizeof(RequestSecInfo));
60     if (reqInfo == NULL) {
61         LOG_ERROR("%{public}s:malloc error.", __FUNCTION__);
62     } else {
63         (void)memset_s(reqInfo, sizeof(RequestSecInfo), 0x00, sizeof(RequestSecInfo));
64         reqInfo->addr = *addr;
65         reqInfo->callback = callback;
66         reqInfo->info = info->info;
67         reqInfo->context = context;
68         reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
69         if (info->info.direction == OUTGOING) {
70             reqInfo->needAuthentication = !!(info->securityMode & GAP_SEC_OUT_AUTHENTICATION);
71             reqInfo->needEncryption = !!(info->securityMode & GAP_SEC_OUT_ENCRYPTION);
72             reqInfo->needAuthorization = false;
73             if (*GapGetSecurityMode() != SEC_MODE_2) {
74                 reqInfo->needEncryption = true;
75             }
76         } else if (info->info.direction == INCOMING) {
77             reqInfo->needAuthentication = !!(info->securityMode & GAP_SEC_IN_AUTHENTICATION);
78             reqInfo->needEncryption = !!(info->securityMode & GAP_SEC_IN_ENCRYPTION);
79             reqInfo->needAuthorization = !!(info->securityMode & GAP_SEC_IN_AUTHORIZATION);
80         }
81         reqInfo->needUnauthentication = reqInfo->needEncryption && !reqInfo->needAuthentication;
82         reqInfo->needMITM = !!(info->securityMode & GAP_SEC_MITM);
83     }
84 
85     return reqInfo;
86 }
87 
GapDoAuthenticationCallback(const void * req)88 void GapDoAuthenticationCallback(const void *req)
89 {
90     const RequestSecInfo *reqInfo = req;
91     BtAddr addr = BT_ADDR_NULL;
92     uint8_t result = GAP_STATUS_FAILED;
93     if (reqInfo != NULL && reqInfo->status == GAP_SEC_REQ_STATUS_SUCCESS) {
94         result = GAP_STATUS_SUCCESS;
95     }
96     if (reqInfo != NULL) {
97         addr = reqInfo->addr;
98     }
99 
100     if (g_authenticationCallback.callback.authenticationComplete) {
101         g_authenticationCallback.callback.authenticationComplete(&addr, result, g_authenticationCallback.context);
102     }
103 }
104 
GapTrySecurityCallback(RequestSecInfo * reqInfo)105 static void GapTrySecurityCallback(RequestSecInfo *reqInfo)
106 {
107     if (!reqInfo->doCallback) {
108         reqInfo->doCallback = true;
109         GapDoSecurityCallback(reqInfo);
110     }
111 }
112 
GapDoSecurityCallback(void * req)113 void GapDoSecurityCallback(void *req)
114 {
115     RequestSecInfo *reqInfo = (RequestSecInfo *)req;
116     uint16_t result = GAP_STATUS_FAILED;
117 
118     if (GapIsBredrEnable() == false) {
119         return;
120     }
121 
122     if (reqInfo->status == GAP_SEC_REQ_STATUS_SUCCESS) {
123         result = GAP_STATUS_SUCCESS;
124     } else if (reqInfo->hciStatus != HCI_SUCCESS) {
125         result = reqInfo->hciStatus;
126     }
127 
128     LOG_INFO("%{public}s:%{public}s-%02d-%{public}s result:%02x:",
129         __FUNCTION__,
130         reqInfo->info.direction ? "IN" : "OUT",
131         reqInfo->info.serviceId,
132         reqInfo->info.protocolId ? "RFCOMM" : "L2CAP",
133         result);
134 
135     if (reqInfo->callback) {
136         reqInfo->callback(result, reqInfo->info, reqInfo->context);
137     }
138 
139     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
140     ListRemoveNode(profileSecurityBlock->requestlist, req);
141 }
142 
GapDoAuthorizationCallback(const void * req)143 static void GapDoAuthorizationCallback(const void *req)
144 {
145     const RequestSecInfo *reqInfo = req;
146     bool reject = false;
147 
148     if (g_securityCallback.callback.authorizeInd) {
149         g_securityCallback.callback.authorizeInd(&reqInfo->addr, reqInfo->info.serviceId, reqInfo->context);
150     } else {
151         reject = true;
152     }
153 
154     if (reject) {
155         GAP_AuthorizeRes(&reqInfo->addr, reqInfo->info.serviceId, GAP_NOT_ACCEPT);
156     }
157 }
158 
GapDoSecurityAction(RequestSecInfo * reqInfo,DeviceInfo * devInfo)159 static void GapDoSecurityAction(RequestSecInfo *reqInfo, DeviceInfo *devInfo)
160 {
161     int ret;
162 
163     if (devInfo->status != GAP_DEV_SEC_STATUS_ACTION) {
164         if (devInfo->status == GAP_DEV_SEC_STATUS_IDLE) {
165             BTM_AclAddRef(devInfo->handle);
166         } else {
167             AlarmCancel(devInfo->alarm);
168         }
169         devInfo->status = GAP_DEV_SEC_STATUS_ACTION;
170     }
171     if (reqInfo->needAuthorization) {
172         GapDoAuthorizationCallback(reqInfo);
173     } else if (reqInfo->needAuthentication || reqInfo->needUnauthentication) {
174         if (devInfo->authenticationStatus == GAP_AUTH_STATUS_IDLE) {
175             devInfo->authenticationStatus = GAP_AUTH_STATUS_ACTION;
176         }
177         ret = GapAuthenticationRequested(devInfo->handle);
178         if (ret != BT_NO_ERROR) {
179             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
180             devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
181             devInfo->authenticationStatus = GAP_AUTH_STATUS_IDLE;
182             GapDoAuthenticationCallback(reqInfo);
183             GapTrySecurityCallback(reqInfo);
184         }
185     } else if (reqInfo->needEncryption) {
186         if (devInfo->encryptionStatus == GAP_ENC_STATUS_IDLE) {
187             devInfo->encryptionStatus = GAP_ENC_STATUS_ACTION;
188         }
189         ret = GapSetConnectionEncryption(devInfo->handle, LINK_LEVEL_ENCRYPTION_ON);
190         if (ret != BT_NO_ERROR) {
191             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
192             devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
193             devInfo->encryptionStatus = GAP_ENC_STATUS_IDLE;
194             GapTrySecurityCallback(reqInfo);
195         }
196     } else {
197         devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
198     }
199 }
200 
GapDoReleaseACLConnection(const void * dev)201 static void GapDoReleaseACLConnection(const void *dev)
202 {
203     const DeviceInfo *devInfo = dev;
204 
205     ListNode *node = ListGetFirstNode(GapGetConnectionInfoBlock()->devicelist);
206     while (node != NULL) {
207         if (dev == ListGetNodeData(node)) {
208             break;
209         }
210         node = ListGetNextNode(node);
211     }
212 
213     if (node != NULL) {
214         BTM_AclRelease(devInfo->handle);
215     }
216 }
217 
GapDiscACLTimerTimeoutTask(void * ctx)218 static void GapDiscACLTimerTimeoutTask(void *ctx)
219 {
220     const DeviceInfo *dev = ((const GapGeneralPointerInfo *)ctx)->pointer;
221 
222     if (GapIsBredrEnable()) {
223         GapDoReleaseACLConnection(dev);
224     }
225 }
226 
GapDiscACLTimerTimeout(void * dev)227 static void GapDiscACLTimerTimeout(void *dev)
228 {
229     LOG_INFO("%{public}s: ", __FUNCTION__);
230     GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo));
231     if (ctx == NULL) {
232         LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
233         return;
234     }
235 
236     ctx->pointer = dev;
237 
238     int ret = GapRunTaskUnBlockProcess(GapDiscACLTimerTimeoutTask, ctx, NULL);
239     if (ret != BT_NO_ERROR) {
240         LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret);
241     }
242 }
243 
GapCheckConnection(void)244 static void GapCheckConnection(void)
245 {
246     ListNode *node = NULL;
247     ConnectionInfoBlock *connectionInfoBlock = NULL;
248     DeviceInfo *devInfo = NULL;
249     connectionInfoBlock = GapGetConnectionInfoBlock();
250     node = ListGetFirstNode(connectionInfoBlock->devicelist);
251     while (node != 0) {
252         devInfo = ListGetNodeData(node);
253         if (devInfo->status == GAP_DEV_SEC_STATUS_WAIT_DISC) {
254             LOG_DEBUG("%{public}s: " BT_ADDR_FMT " 4s disconnect ACL", __FUNCTION__, BT_ADDR_FMT_OUTPUT(devInfo->addr.addr));
255             AlarmCancel(devInfo->alarm);
256             AlarmSet(devInfo->alarm, GAP_DISC_ACL_WAIT_TIME, GapDiscACLTimerTimeout, devInfo);
257             devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
258         }
259         node = ListGetNextNode(node);
260     }
261 }
262 
GapRequestSecurityProcess(void)263 void GapRequestSecurityProcess(void)
264 {
265     ListNode *requestNode = ListGetFirstNode(GapGetProfileSecurityBlock()->requestlist);
266     while (requestNode != 0) {
267         RequestSecInfo *reqInfo = ListGetNodeData(requestNode);
268         requestNode = ListGetNextNode(requestNode);
269 
270         if (reqInfo->status == GAP_SEC_REQ_STATUS_FAILED) {
271             GapTrySecurityCallback(reqInfo);
272             continue;
273         }
274 
275         if (reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_CONNECT || reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_FEATURE ||
276             reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
277             continue;
278         }
279 
280         DeviceInfo *devInfo =
281             ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, &reqInfo->addr);
282         if (devInfo == NULL) {
283             continue;
284         }
285 
286         if (reqInfo->info.serviceId == GAP) {
287             devInfo->inDedicatedBonding = true;
288         } else {
289             if (devInfo->isAuthentication) {
290                 reqInfo->needAuthentication = false;
291                 reqInfo->needUnauthentication = false;
292             }
293             if (devInfo->isEncryption) {
294                 reqInfo->needEncryption = false;
295             }
296         }
297 
298         if (reqInfo->needAuthorization) {
299             reqInfo->status = GAP_SEC_REQ_STATUS_ACTION;
300             GapDoSecurityAction(reqInfo, devInfo);
301         } else if (reqInfo->needAuthentication || reqInfo->needUnauthentication || reqInfo->needEncryption) {
302             if (devInfo->actionReq != NULL) {
303                 continue;
304             } else {
305                 reqInfo->status = GAP_SEC_REQ_STATUS_ACTION;
306                 devInfo->actionReq = reqInfo;
307                 GapDoSecurityAction(reqInfo, devInfo);
308             }
309         } else {
310             reqInfo->status = GAP_SEC_REQ_STATUS_SUCCESS;
311             GapTrySecurityCallback(reqInfo);
312         }
313     }
314 
315     GapCheckConnection();
316 }
317 
GapDoDiscACLConnection(void * dev)318 static void GapDoDiscACLConnection(void *dev)
319 {
320     DeviceInfo *deviceInfo = dev;
321 
322     ListNode *node = ListGetFirstNode(GapGetConnectionInfoBlock()->devicelist);
323     while (node != NULL) {
324         if (deviceInfo == ListGetNodeData(node)) {
325             break;
326         }
327         node = ListGetNextNode(node);
328     }
329 
330     if (node != NULL) {
331         BTM_AclDisconnect(deviceInfo->handle, GAP_HCI_DISC_REASON_AUTH_FAIL);
332     }
333 }
334 
GapWaitEncryptTimeoutTask(void * ctx)335 static void GapWaitEncryptTimeoutTask(void *ctx)
336 {
337     DeviceInfo *dev = ((GapGeneralPointerInfo *)ctx)->pointer;
338 
339     GapDoDiscACLConnection(dev);
340     GapUpdateSecurityRequest(dev, GAP_SEC_EVENT_WAIT_ENC_TIMEOUT, HCI_SUCCESS);
341     GapRequestSecurityProcess();
342 }
343 
GapWaitEncryptTimeout(void * dev)344 static void GapWaitEncryptTimeout(void *dev)
345 {
346     LOG_INFO("%{public}s: ", __FUNCTION__);
347     GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo));
348     if (ctx == NULL) {
349         LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
350         return;
351     }
352 
353     ctx->pointer = dev;
354 
355     int ret = GapRunTaskUnBlockProcess(GapWaitEncryptTimeoutTask, ctx, NULL);
356     if (ret != BT_NO_ERROR) {
357         LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret);
358     }
359 }
360 
GapRemoteDeviceSupportHostSecureSimplePairingCallback(const BtAddr * addr,bool support)361 void GapRemoteDeviceSupportHostSecureSimplePairingCallback(const BtAddr *addr, bool support)
362 {
363     DeviceInfo *devInfo =
364         ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
365     if (devInfo != NULL) {
366         devInfo->supportSSP = support;
367         GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_FEATURE_COMP, HCI_SUCCESS);
368         if (devInfo->waitEncryptAlarm != NULL) {
369             AlarmSet(devInfo->waitEncryptAlarm, GAP_SEC_WAIT_ENCRYPT_TIME, GapWaitEncryptTimeout, devInfo);
370         }
371         GapRequestSecurityProcess();
372     }
373 }
374 
GAP_RequestSecurity(const BtAddr * addr,const GapRequestSecurityParam * param)375 int GAP_RequestSecurity(const BtAddr *addr, const GapRequestSecurityParam *param)
376 {
377     int ret = GAP_SUCCESS;
378     ProfileSecurityInfo *regInfo = NULL;
379 
380     LOG_INFO("%{public}s:%{public}s-%02d-%{public}s",
381         __FUNCTION__,
382         param->info.direction ? "IN" : "OUT",
383         param->info.serviceId,
384         param->info.protocolId ? "RFCOMM" : "L2CAP");
385 
386     do {
387         ListNode *node = ListGetFirstNode(GapGetProfileSecurityBlock()->registerlist);
388         while (node != 0) {
389             regInfo = ListGetNodeData(node);
390             if ((GapIsEmptyAddr(regInfo->addr.addr) || GapAddrCompare(&regInfo->addr, addr)) &&
391                 GapCompareServiceSecurityInfo(&regInfo->info, &param->info)) {
392                 break;
393             }
394             node = ListGetNextNode(node);
395         }
396 
397         if (node == NULL) {
398             LOG_ERROR("%{public}s:Register(%{public}d, %{public}d)not found.", __FUNCTION__, param->info.serviceId, param->info.direction);
399             ret = GAP_ERR_INVAL_PARAM;
400             break;
401         }
402 
403         RequestSecInfo *reqInfo = GapAllocReqSecInfo(addr, param->callback, param->context, regInfo);
404         if (reqInfo == NULL) {
405             LOG_ERROR("%{public}s:reqInfo alloc failed.", __FUNCTION__);
406             ret = GAP_ERR_OUT_OF_RES;
407             break;
408         }
409         ListAddLast(GapGetProfileSecurityBlock()->requestlist, reqInfo);
410 
411         DeviceInfo *deviceInfo =
412             ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
413         if (deviceInfo != NULL) {
414             if (*GapGetSecurityMode() != SEC_MODE_2) {
415                 GapIsRemoteDeviceSupportHostSecureSimplePairingAsync(addr);
416                 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_FEATURE;
417             }
418             GapRequestSecurityProcess();
419         } else {
420             ret = BTM_AclConnect(addr);
421             reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_CONNECT;
422         }
423     } while (0);
424 
425     if (ret != BT_NO_ERROR) {
426         param->callback(GAP_STATUS_FAILED, param->info, param->context);
427         ret = BT_NO_ERROR;
428     }
429 
430     return ret;
431 }
432 
GapWriteSimplePairingMode(uint8_t simplePairingMode)433 static int GapWriteSimplePairingMode(uint8_t simplePairingMode)
434 {
435     int ret;
436 
437     if (BTM_IsControllerSupportSecureSimplePairing()) {
438         HciWriteSimplePairingModeParam hciCmdParam = {
439             .simplePairingMode = simplePairingMode,
440         };
441         ret = HCI_WriteSimplePairingMode(&hciCmdParam);
442     } else {
443         ret = GAP_ERR_NOT_SUPPORT;
444     }
445 
446     return ret;
447 }
448 
GapWriteSecureConnectionsHostSupport(uint8_t support)449 static int GapWriteSecureConnectionsHostSupport(uint8_t support)
450 {
451     int ret;
452     if (BTM_IsControllerSupportSecureConnections()) {
453         HciWriteSecureConnectionsHostSupportParam hciCmdParam = {
454             .secureConnectionsHostSupport = support,
455         };
456 
457         ret = HCI_WriteSecureConnectionsHostSupport(&hciCmdParam);
458     } else {
459         ret = GAP_SUCCESS;
460     }
461 
462     return ret;
463 }
464 
GAP_RegisterSecurityCallback(const GapSecurityCallback * callback,void * context)465 int GAP_RegisterSecurityCallback(const GapSecurityCallback *callback, void *context)
466 {
467     LOG_INFO("%{public}s:%{public}s", __FUNCTION__, callback ? "register" : "NULL");
468     if (callback == NULL) {
469         (void)memset_s(&g_securityCallback.callback,
470             sizeof(g_securityCallback.callback),
471             0x00,
472             sizeof(g_securityCallback.callback));
473     } else {
474         g_securityCallback.callback = *callback;
475     }
476     g_securityCallback.context = context;
477     return GAP_SUCCESS;
478 }
479 
GAP_DeregisterSecurityCallback(void)480 int GAP_DeregisterSecurityCallback(void)
481 {
482     (void)memset_s(
483         &g_securityCallback.callback, sizeof(g_securityCallback.callback), 0x00, sizeof(g_securityCallback.callback));
484     g_securityCallback.context = NULL;
485     return GAP_SUCCESS;
486 }
487 
GAP_SetSecurityMode(GAP_SecurityMode mode)488 int GAP_SetSecurityMode(GAP_SecurityMode mode)
489 {
490     LOG_INFO("%{public}s:mode[%{public}d]", __FUNCTION__, mode);
491 
492     if (mode != SEC_MODE_2 && mode != SEC_MODE_4) {
493         return GAP_ERR_INVAL_PARAM;
494     }
495 
496     if (GapIsBredrEnable() == false) {
497         return GAP_ERR_NOT_ENABLE;
498     }
499 
500     int ret;
501     if (mode == SEC_MODE_4) {
502         ret = GapWriteSimplePairingMode(SIMPLE_PAIRING_ENABLED);
503         if (ret == BT_NO_ERROR) {
504             ret = GapWriteSecureConnectionsHostSupport(SUPPORT_SECURE_CONNECTIONS);
505         }
506     } else {
507         ret = GapWriteSimplePairingMode(SIMPLE_PAIRING_DISABLED);
508         ret |= GapWriteSecureConnectionsHostSupport(UNSUPPORT_SECURE_CONNECTIONS);
509     }
510 
511     if (ret == BT_NO_ERROR) {
512         GAP_SecurityMode *secMode = GapGetSecurityMode();
513         *secMode = mode;
514     }
515 
516     return GAP_SUCCESS;
517 }
518 
GAP_AuthorizeRes(const BtAddr * addr,GAP_Service service,uint8_t accept)519 int GAP_AuthorizeRes(const BtAddr *addr, GAP_Service service, uint8_t accept)
520 {
521     int ret = GAP_SUCCESS;
522     ProfileSecurityBlock *profileSecurityBlock = NULL;
523     ConnectionInfoBlock *connectionInfoBlock = NULL;
524     ListNode *node = NULL;
525     RequestSecInfo *reqInfo = NULL;
526     DeviceInfo *devInfo = NULL;
527 
528     LOG_INFO("%{public}s:" BT_ADDR_FMT " %{public}d, accept[%hhu]", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr), service, accept);
529 
530     if (GapIsBredrEnable() == false) {
531         return GAP_ERR_NOT_ENABLE;
532     }
533 
534     profileSecurityBlock = GapGetProfileSecurityBlock();
535     node = ListGetFirstNode(profileSecurityBlock->requestlist);
536     while (node != 0) {
537         reqInfo = ListGetNodeData(node);
538         if (reqInfo->info.direction == OUTGOING) {
539             node = ListGetNextNode(node);
540             continue;
541         }
542         if (reqInfo->info.serviceId == service && reqInfo->status == GAP_SEC_REQ_STATUS_ACTION) {
543             reqInfo->needAuthorization = false;
544             break;
545         } else {
546             ret = GAP_ERR_INVAL_STATE;
547         }
548         node = ListGetNextNode(node);
549     }
550 
551     connectionInfoBlock = GapGetConnectionInfoBlock();
552     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
553     if (devInfo != NULL) {
554         if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
555             devInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
556         }
557     }
558 
559     GapRequestSecurityProcess();
560     return ret;
561 }
562 
GapDeviceLinkkeyIsAuthenticated(const DeviceInfo * deviceInfo)563 static bool GapDeviceLinkkeyIsAuthenticated(const DeviceInfo *deviceInfo)
564 {
565     if (deviceInfo->linkkeyType == AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P192 ||
566         deviceInfo->linkkeyType == AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256 ||
567         deviceInfo->linkkeyType == COMBINATION_KEY) {
568         return true;
569     } else {
570         return false;
571     }
572 }
573 
GapUpdateSecurityStatusUnauthenticationSuccess(const DeviceInfo * devInfo)574 static void GapUpdateSecurityStatusUnauthenticationSuccess(const DeviceInfo *devInfo)
575 {
576     if (devInfo->actionReq != NULL) {
577         if (devInfo->actionReq->needAuthentication) {
578             devInfo->actionReq->needAuthentication = false;
579             if (devInfo->actionReq->needMITM) {
580                 devInfo->actionReq->status = GAP_SEC_REQ_STATUS_FAILED;
581             } else {
582                 devInfo->actionReq->status = GAP_SEC_REQ_STATUS_SUCCESS;
583             }
584         }
585         if (devInfo->actionReq->needUnauthentication) {
586             devInfo->actionReq->needUnauthentication = false;
587         }
588     }
589 }
590 
GapUpdateSecurityStatusAuthenticationSuccess(const DeviceInfo * devInfo)591 static void GapUpdateSecurityStatusAuthenticationSuccess(const DeviceInfo *devInfo)
592 {
593     ListNode *node = NULL;
594     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
595     RequestSecInfo *reqInfo = NULL;
596 
597     node = ListGetFirstNode(profileSecurityBlock->requestlist);
598     while (node != 0) {
599         reqInfo = ListGetNodeData(node);
600         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->needAuthentication) {
601             reqInfo->needAuthentication = false;
602         }
603         node = ListGetNextNode(node);
604     }
605 }
606 
GapUpdateSecurityStatusEncryptionSuccess(const DeviceInfo * devInfo)607 static void GapUpdateSecurityStatusEncryptionSuccess(const DeviceInfo *devInfo)
608 {
609     ListNode *node = NULL;
610     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
611     RequestSecInfo *reqInfo = NULL;
612 
613     node = ListGetFirstNode(profileSecurityBlock->requestlist);
614     while (node != 0) {
615         reqInfo = ListGetNodeData(node);
616         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->needEncryption) {
617             reqInfo->needEncryption = false;
618         }
619         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
620             reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
621         }
622         node = ListGetNextNode(node);
623     }
624 }
625 
GapUpdateSecurityStatusFailed(const DeviceInfo * devInfo,uint8_t hciStatus)626 static void GapUpdateSecurityStatusFailed(const DeviceInfo *devInfo, uint8_t hciStatus)
627 {
628     ListNode *node = NULL;
629     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
630     RequestSecInfo *reqInfo = NULL;
631 
632     node = ListGetFirstNode(profileSecurityBlock->requestlist);
633     while (node != 0) {
634         reqInfo = ListGetNodeData(node);
635         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_ACTION) {
636             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
637             reqInfo->hciStatus = hciStatus;
638         }
639         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
640             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
641             reqInfo->hciStatus = hciStatus;
642         }
643         node = ListGetNextNode(node);
644     }
645 }
646 
GapUpdateSecurityStatusEncryptionTimeout(const DeviceInfo * devInfo)647 static void GapUpdateSecurityStatusEncryptionTimeout(const DeviceInfo *devInfo)
648 {
649     ListNode *node = NULL;
650     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
651     RequestSecInfo *reqInfo = NULL;
652 
653     node = ListGetFirstNode(profileSecurityBlock->requestlist);
654     while (node != 0) {
655         reqInfo = ListGetNodeData(node);
656         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
657             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
658         }
659         node = ListGetNextNode(node);
660     }
661 }
662 
GapUpdateSecurityStatusAclDisconnect(const DeviceInfo * devInfo,uint8_t hciStatus)663 static void GapUpdateSecurityStatusAclDisconnect(const DeviceInfo *devInfo, uint8_t hciStatus)
664 {
665     ListNode *node = NULL;
666     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
667     RequestSecInfo *reqInfo = NULL;
668 
669     node = ListGetFirstNode(profileSecurityBlock->requestlist);
670     while (node != 0) {
671         reqInfo = ListGetNodeData(node);
672         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr)) {
673             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
674             reqInfo->hciStatus = hciStatus;
675         }
676         node = ListGetNextNode(node);
677     }
678 }
679 
GapUpdateSecurityStatusConnectComplete(const DeviceInfo * devInfo)680 static void GapUpdateSecurityStatusConnectComplete(const DeviceInfo *devInfo)
681 {
682     ListNode *node = NULL;
683     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
684     RequestSecInfo *reqInfo = NULL;
685 
686     node = ListGetFirstNode(profileSecurityBlock->requestlist);
687     while (node != 0) {
688         reqInfo = ListGetNodeData(node);
689         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_CONNECT) {
690             if (*GapGetSecurityMode() == SEC_MODE_2) {
691                 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
692             } else {
693                 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_FEATURE;
694             }
695         }
696         node = ListGetNextNode(node);
697     }
698 }
699 
GapUpdateSecurityStatusFeatureComplete(DeviceInfo * devInfo)700 static void GapUpdateSecurityStatusFeatureComplete(DeviceInfo *devInfo)
701 {
702     ListNode *node = NULL;
703     ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
704     RequestSecInfo *reqInfo = NULL;
705 
706     node = ListGetFirstNode(profileSecurityBlock->requestlist);
707     while (node != NULL) {
708         reqInfo = ListGetNodeData(node);
709         node = ListGetNextNode(node);
710         if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_FEATURE) {
711             if (!devInfo->supportSSP || reqInfo->info.direction == OUTGOING || devInfo->isEncryption) {
712                 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
713                 continue;
714             }
715             reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ENCRYPT;
716             if (devInfo->waitEncryptAlarm == NULL) {
717                 devInfo->waitEncryptAlarm = AlarmCreate("wait encrypt", false);
718             }
719         }
720     }
721 }
722 
GapUpdateSecurityRequest(DeviceInfo * devInfo,enum DeviceSecurityEvent event,uint8_t hciStatus)723 void GapUpdateSecurityRequest(DeviceInfo *devInfo, enum DeviceSecurityEvent event, uint8_t hciStatus)
724 {
725     switch (event) {
726         case GAP_SEC_EVENT_CONNECT_COMP:
727             GapUpdateSecurityStatusConnectComplete(devInfo);
728             break;
729         case GAP_SEC_EVENT_FEATURE_COMP:
730             GapUpdateSecurityStatusFeatureComplete(devInfo);
731             break;
732         case GAP_SEC_EVENT_UNAUTH_SUCCESS:
733             GapUpdateSecurityStatusUnauthenticationSuccess(devInfo);
734             break;
735         case GAP_SEC_EVENT_AUTH_SUCCESS:
736             GapUpdateSecurityStatusAuthenticationSuccess(devInfo);
737             break;
738         case GAP_SEC_EVENT_ENC_SUCCESS:
739             if (devInfo->waitEncryptAlarm != NULL) {
740                 AlarmCancel(devInfo->waitEncryptAlarm);
741                 AlarmDelete(devInfo->waitEncryptAlarm);
742                 devInfo->waitEncryptAlarm = NULL;
743             }
744             GapUpdateSecurityStatusEncryptionSuccess(devInfo);
745             break;
746         case GAP_SEC_EVENT_ENC_FAILED:
747             if (devInfo->waitEncryptAlarm != NULL) {
748                 AlarmCancel(devInfo->waitEncryptAlarm);
749                 AlarmDelete(devInfo->waitEncryptAlarm);
750                 devInfo->waitEncryptAlarm = NULL;
751             }
752             GapUpdateSecurityStatusFailed(devInfo, hciStatus);
753             break;
754         case GAP_SEC_EVENT_AUTH_FAILED:
755             GapUpdateSecurityStatusFailed(devInfo, hciStatus);
756             break;
757         case GAP_SEC_EVENT_WAIT_ENC_TIMEOUT:
758             GapUpdateSecurityStatusEncryptionTimeout(devInfo);
759             break;
760         case GAP_SEC_EVENT_ACL_DISCONNECT:
761             GapUpdateSecurityStatusAclDisconnect(devInfo, hciStatus);
762             break;
763         default:
764             break;
765     }
766 }
767 
GapAuthenticationRequested(uint16_t handle)768 static int GapAuthenticationRequested(uint16_t handle)
769 {
770     HciAuthenticationRequestedParam hciCmdParam = {
771         .connectionHandle = handle,
772     };
773 
774     return HCI_AuthenticationRequested(&hciCmdParam);
775 }
776 
GapAuthenticationWaitRetryTimeoutTask(void * ctx)777 static void GapAuthenticationWaitRetryTimeoutTask(void *ctx)
778 {
779     RequestSecInfo *reqInfo = ListForEachData(
780         GapGetProfileSecurityBlock()->requestlist, GapFindCmpListData, ((GapGeneralPointerInfo *)ctx)->pointer);
781     if (reqInfo != NULL) {
782         DeviceInfo *deviceInfo =
783             ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, &reqInfo->addr);
784         if (deviceInfo != NULL) {
785             deviceInfo->authenticationStatus = GAP_AUTH_STATUS_RETRY;
786             deviceInfo->actionReq = NULL;
787             GapRequestSecurityProcess();
788         } else {
789             BTM_AclConnect(&reqInfo->addr);
790         }
791     }
792 }
793 
GapAuthenticationWaitRetryTimeout(void * parameter)794 static void GapAuthenticationWaitRetryTimeout(void *parameter)
795 {
796     LOG_INFO("%{public}s: ", __FUNCTION__);
797     GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo));
798     if (ctx == NULL) {
799         LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
800         return;
801     }
802 
803     ctx->pointer = parameter;
804 
805     int ret = GapRunTaskUnBlockProcess(GapAuthenticationWaitRetryTimeoutTask, ctx, NULL);
806     if (ret != BT_NO_ERROR) {
807         LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret);
808     }
809 }
810 
GapAuthenticationClearInfo(RequestSecInfo * reqInfo)811 void GapAuthenticationClearInfo(RequestSecInfo *reqInfo)
812 {
813     if (reqInfo->waitRetryalarm != NULL) {
814         AlarmCancel(reqInfo->waitRetryalarm);
815         AlarmDelete(reqInfo->waitRetryalarm);
816         reqInfo->waitRetryalarm = NULL;
817     }
818 }
819 
GapAuthenticationRetry(DeviceInfo * deviceInfo,RequestSecInfo * reqInfo,uint8_t hciStatus)820 void GapAuthenticationRetry(DeviceInfo *deviceInfo, RequestSecInfo *reqInfo, uint8_t hciStatus)
821 {
822     if (reqInfo == NULL) {
823         return;
824     }
825 
826     if (reqInfo->waitRetryalarm == NULL) {
827         reqInfo->waitRetryalarm = AlarmCreate("retry pair", false);
828     }
829 
830     if (++reqInfo->retryCount <= GAP_PAIR_RETRY_COUNT) {
831         AlarmCancel(reqInfo->waitRetryalarm);
832         AlarmSet(reqInfo->waitRetryalarm, GAP_PAIR_RETRY_WAIT_TIME, GapAuthenticationWaitRetryTimeout, reqInfo);
833     } else {
834         if (deviceInfo != NULL) {
835             GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_AUTH_FAILED, hciStatus);
836         } else {
837             reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
838             reqInfo->hciStatus = hciStatus;
839             if (reqInfo->info.serviceId == GAP) {
840                 GapDoAuthenticationCallback(reqInfo);
841             }
842             if (!reqInfo->doCallback) {
843                 reqInfo->doCallback = true;
844                 GapDoSecurityCallback(reqInfo);
845             }
846         }
847     }
848 }
849 
GapOnAuthenticationComplete(const HciAuthenticationCompleteEventParam * eventParam)850 void GapOnAuthenticationComplete(const HciAuthenticationCompleteEventParam *eventParam)
851 {
852     LOG_DEBUG("%{public}s:", __FUNCTION__);
853     bool inDedicatedBonding = false;
854     bool isGapRequest = false;
855     bool callback = true;
856     BtAddr addr = {0};
857 
858     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
859     DeviceInfo *deviceInfo = ListForEachData(
860         connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&eventParam->connectionHandle);
861     if (deviceInfo != NULL) {
862         isGapRequest = (deviceInfo->actionReq && deviceInfo->actionReq->info.serviceId == GAP);
863         deviceInfo->authenticationStatus = GAP_AUTH_STATUS_IDLE;
864         if (eventParam->status == HCI_SUCCESS) {
865             if (GapDeviceLinkkeyIsAuthenticated(deviceInfo)) {
866                 deviceInfo->isAuthentication = true;
867                 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_AUTH_SUCCESS, eventParam->status);
868             } else {
869                 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_UNAUTH_SUCCESS, eventParam->status);
870             }
871             GapReadNewLocalOOBData();
872             GapAuthenticationClearInfo(deviceInfo->actionReq);
873             deviceInfo->actionReq = NULL;
874         } else if ((eventParam->status == HCI_PIN_OR_KEY_MISSING && GapIsKeyMissingRetry()) ||
875                    BtmInteropIsMatchedAddr(INTEROP_AUTO_RETRY_PAIRING, &deviceInfo->addr)) {
876             deviceInfo->authenticationStatus = GAP_AUTH_STATUS_WAIT_RETRY;
877             GapAuthenticationRetry(deviceInfo, deviceInfo->actionReq, eventParam->status);
878             callback = false;
879         } else {
880             GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_AUTH_FAILED, eventParam->status);
881             deviceInfo->actionReq = NULL;
882         }
883         inDedicatedBonding = deviceInfo->inDedicatedBonding;
884         (void)memcpy_s(&addr, sizeof(BtAddr), &deviceInfo->addr, sizeof(BtAddr));
885         if (deviceInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
886             deviceInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
887         }
888     }
889 
890     GapRequestSecurityProcess();
891 
892     if (g_authenticationCallback.callback.authenticationComplete) {
893         if (inDedicatedBonding == true) {
894             if (isGapRequest || callback) {
895                 g_authenticationCallback.callback.authenticationComplete(
896                     &addr, eventParam->status, g_authenticationCallback.context);
897             }
898         } else if (inDedicatedBonding == false && callback) {
899             g_authenticationCallback.callback.authenticationComplete(
900                 &addr, eventParam->status, g_authenticationCallback.context);
901         }
902     }
903 }
904 
GapIOCapabilityRequestReply(const BtAddr * addr,uint8_t ioCapability,uint8_t authReq,uint8_t oobDataPresent)905 static int GapIOCapabilityRequestReply(
906     const BtAddr *addr, uint8_t ioCapability, uint8_t authReq, uint8_t oobDataPresent)
907 {
908     bool isDedicatedBonding = false;
909     uint8_t authenticationRequirements = AUTHENTICATION_UNKNOWN_MITM;
910 
911     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
912     DeviceInfo *devInfo = NULL;
913     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
914     if (devInfo != NULL) {
915         devInfo->localIOCap = ioCapability;
916         isDedicatedBonding = devInfo->inDedicatedBonding;
917         authenticationRequirements = devInfo->remoteAuthReq;
918     }
919 
920     if (authenticationRequirements == AUTHENTICATION_UNKNOWN_MITM) {
921         if (!GapIsBondMode()) {
922             authenticationRequirements = AUTHENTICATION_NO_MITM_NO_BONDING + authReq;
923         } else if (isDedicatedBonding) {
924             authenticationRequirements = AUTHENTICATION_NO_MITM_DEDICATED_BONDING + authReq;
925         } else {
926             authenticationRequirements = AUTHENTICATION_NO_MITM_GENERAL_BONDING + authReq;
927         }
928     }
929 
930     HciIOCapabilityRequestReplyParam hciCmdParam;
931     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
932     hciCmdParam.ioCapability = ioCapability;
933     hciCmdParam.authenticationRequirements = authenticationRequirements;
934     hciCmdParam.oobDataPresent = oobDataPresent;
935 
936     return HCI_IOCapabilityRequestReply(&hciCmdParam);
937 }
938 
GapIOCapabilityRequestNegativeReply(const BtAddr * addr,uint8_t reason)939 static int GapIOCapabilityRequestNegativeReply(const BtAddr *addr, uint8_t reason)
940 {
941     HciIoCapabilityRequestNegativeReplyParam hciCmdParam;
942 
943     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
944     hciCmdParam.reason = reason;
945 
946     return HCI_IOCapabilityRequestNegativeReply(&hciCmdParam);
947 }
948 
GapOnIOCapabilityRequestEvent(const HciIoCapabilityRequestEventParam * eventParam)949 void GapOnIOCapabilityRequestEvent(const HciIoCapabilityRequestEventParam *eventParam)
950 {
951     LOG_DEBUG("%{public}s:" BT_ADDR_FMT "", __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
952     BtAddr addr = BT_ADDR_NULL;
953     bool doReject = false;
954     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
955 
956     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
957     DeviceInfo *devInfo = NULL;
958     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
959     if (devInfo != NULL) {
960         if (devInfo->authenticationStatus == GAP_AUTH_STATUS_IDLE) {
961             GapStartUseAclConnection(devInfo, GAP_USE_ACL_CONNECTION_TIME);
962         }
963         if ((GapIsBondMode() == false) && (devInfo->remoteAuthReq != AUTHENTICATION_UNKNOWN_MITM) &&
964             (devInfo->remoteAuthReq != AUTHENTICATION_MITM_NO_BONDING) &&
965             (devInfo->remoteAuthReq != AUTHENTICATION_NO_MITM_NO_BONDING)) {
966             doReject = true;
967         }
968     }
969 
970     if (doReject) {
971         GapIOCapabilityRequestNegativeReply(&addr, HCI_PAIRING_NOT_ALLOWED);
972     } else {
973         if (g_authenticationCallback.callback.IOCapabilityReq) {
974             g_authenticationCallback.callback.IOCapabilityReq(&addr, g_authenticationCallback.context);
975         } else {
976             LOG_INFO("Not Register");
977             GapIOCapabilityRequestNegativeReply(&addr, HCI_PAIRING_NOT_ALLOWED);
978         }
979     }
980 }
981 
GapIOCapabilityRequestReplyComplete(const HciIOCapabilityRequestReplyReturnParam * param)982 void GapIOCapabilityRequestReplyComplete(const HciIOCapabilityRequestReplyReturnParam *param)
983 {
984     if (param->status != HCI_SUCCESS) {
985         BtAddr addr = BT_ADDR_NULL;
986         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
987         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed: %02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
988         GapIOCapabilityRequestNegativeReply(&addr, HCI_PAIRING_NOT_ALLOWED);
989     }
990 }
991 
GapIOCapabilityRequestNegativeReplyComplete(const HciIoCapabilityRequestNegativeReplyReturnParam * param)992 void GapIOCapabilityRequestNegativeReplyComplete(const HciIoCapabilityRequestNegativeReplyReturnParam *param)
993 {
994     if (param->status != HCI_SUCCESS) {
995         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed: %02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
996     }
997 }
998 
GapOnIOCapabilityResponseEvent(const HciIoCapabilityResponseEventParam * eventParam)999 void GapOnIOCapabilityResponseEvent(const HciIoCapabilityResponseEventParam *eventParam)
1000 {
1001     LOG_DEBUG("%{public}s:" BT_ADDR_FMT "", __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1002     BtAddr addr = BT_ADDR_NULL;
1003 
1004     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1005 
1006     DeviceInfo *devInfo = NULL;
1007     devInfo = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1008     if (devInfo != NULL) {
1009         devInfo->remoteAuthReq = eventParam->authenticationRequirements;
1010     }
1011 
1012     if (g_authenticationCallback.callback.IOCapabilityRsp) {
1013         g_authenticationCallback.callback.IOCapabilityRsp(
1014             &addr, eventParam->IOCapability, g_authenticationCallback.context);
1015     }
1016 }
1017 
GAP_RegisterAuthenticationCallback(const GapAuthenticationCallback * callback,void * context)1018 int GAP_RegisterAuthenticationCallback(const GapAuthenticationCallback *callback, void *context)
1019 {
1020     LOG_INFO("%{public}s:%{public}s", __FUNCTION__, callback ? "register" : "NULL");
1021     if (callback == NULL) {
1022         (void)memset_s(&g_authenticationCallback.callback,
1023             sizeof(g_authenticationCallback.callback),
1024             0x00,
1025             sizeof(g_authenticationCallback.callback));
1026     } else {
1027         g_authenticationCallback.callback = *callback;
1028     }
1029     g_authenticationCallback.context = context;
1030     return GAP_SUCCESS;
1031 }
1032 
GAP_DeregisterAuthenticationCallback(void)1033 int GAP_DeregisterAuthenticationCallback(void)
1034 {
1035     (void)memset_s(&g_authenticationCallback.callback,
1036         sizeof(g_authenticationCallback.callback),
1037         0x00,
1038         sizeof(g_authenticationCallback.callback));
1039     g_authenticationCallback.context = NULL;
1040     return GAP_SUCCESS;
1041 }
1042 
GAP_AuthenticationReq(const BtAddr * addr)1043 int GAP_AuthenticationReq(const BtAddr *addr)
1044 {
1045     int ret = GAP_SUCCESS;
1046     ConnectionInfoBlock *connectionInfoBlock = NULL;
1047     ProfileSecurityBlock *profileSecurityBlock = NULL;
1048     DeviceInfo *deviceInfo = NULL;
1049 
1050     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1051 
1052     if (GapIsBredrEnable() == false) {
1053         return GAP_ERR_NOT_ENABLE;
1054     }
1055 
1056     if (!GapIsBondMode()) {
1057         ret = GAP_ERR_INVAL_STATE;
1058     } else {
1059         RequestSecInfo *secInfo = NULL;
1060         ProfileSecurityInfo tempInfo = {0};
1061         tempInfo.info.serviceId = GAP;
1062         tempInfo.info.direction = OUTGOING;
1063         tempInfo.securityMode = GAP_SEC_OUT_AUTHENTICATION;
1064         connectionInfoBlock = GapGetConnectionInfoBlock();
1065         profileSecurityBlock = GapGetProfileSecurityBlock();
1066         secInfo = GapAllocReqSecInfo(addr, NULL, NULL, &tempInfo);
1067         if (secInfo != NULL) {
1068             ListAddFirst(profileSecurityBlock->requestlist, secInfo);
1069             deviceInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1070             if (deviceInfo != NULL) {
1071                 GapRequestSecurityProcess();
1072             } else {
1073                 ret = BTM_AclConnect(addr);
1074             }
1075         } else {
1076             ret = GAP_ERR_OUT_OF_RES;
1077         }
1078     }
1079 
1080     return ret;
1081 }
1082 
GAP_CancelAuthenticationReq(const BtAddr * addr)1083 int GAP_CancelAuthenticationReq(const BtAddr *addr)
1084 {
1085     if (GapIsBredrEnable() == false) {
1086         return GAP_ERR_NOT_ENABLE;
1087     }
1088 
1089     DeviceInfo *devInfo = NULL;
1090     devInfo = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1091     if (devInfo != NULL) {
1092         if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
1093             devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
1094             BTM_AclRelease(devInfo->handle);
1095         }
1096     }
1097 
1098     return GAP_SUCCESS;
1099 }
1100 
GAP_IOCapabilityRsp(const BtAddr * addr,uint8_t accept,uint8_t ioCapability,uint8_t oobDataPresent,uint8_t authReq)1101 int GAP_IOCapabilityRsp(
1102     const BtAddr *addr, uint8_t accept, uint8_t ioCapability, uint8_t oobDataPresent, uint8_t authReq)
1103 {
1104     int ret;
1105 
1106     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1107 
1108     if (GapIsBredrEnable() == false) {
1109         return GAP_ERR_NOT_ENABLE;
1110     }
1111 
1112     DeviceInfo *devInfo = NULL;
1113     devInfo = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1114     if (devInfo != NULL && devInfo->actionReq != NULL) {
1115         if (!devInfo->actionReq->needAuthentication && devInfo->actionReq->needUnauthentication) {
1116             if (authReq == GAP_MITM_REQUIRED) {
1117                 authReq = GAP_MITM_NOT_REQUIRED;
1118             }
1119         }
1120     }
1121 
1122     if (accept == GAP_ACCEPT) {
1123         ret = GapIOCapabilityRequestReply(addr, ioCapability, authReq, oobDataPresent);
1124     } else if (accept == GAP_NOT_ACCEPT) {
1125         ret = GapIOCapabilityRequestNegativeReply(addr, HCI_PAIRING_NOT_ALLOWED);
1126     } else {
1127         ret = GAP_ERR_INVAL_PARAM;
1128     }
1129 
1130     return ret;
1131 }
1132 
GapUserConfirmationRequestReply(const BtAddr * addr)1133 static int GapUserConfirmationRequestReply(const BtAddr *addr)
1134 {
1135     HciUserConfirmationRequestReplyParam hciCmdParam;
1136 
1137     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1138 
1139     return HCI_UserConfirmationRequestReply(&hciCmdParam);
1140 }
1141 
GapUserConfirmationRequestNegativeReply(const BtAddr * addr)1142 static int GapUserConfirmationRequestNegativeReply(const BtAddr *addr)
1143 {
1144     HciUserConfirmationRequestNegativeReplyParam hciCmdParam;
1145 
1146     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1147 
1148     return HCI_UserConfirmationRequestNegativeReply(&hciCmdParam);
1149 }
1150 
GapOnUserConfirmationRequestEvent(const HciUserConfirmationRequestEventParam * eventParam)1151 void GapOnUserConfirmationRequestEvent(const HciUserConfirmationRequestEventParam *eventParam)
1152 {
1153     LOG_INFO("%{public}s:" BT_ADDR_FMT "", __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1154     BtAddr addr = BT_ADDR_NULL;
1155     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1156     if (g_authenticationCallback.callback.userConfirmReq) {
1157         g_authenticationCallback.callback.userConfirmReq(
1158             &addr, eventParam->numericValue, g_authenticationCallback.context);
1159     } else {
1160         GapUserConfirmationRequestNegativeReply(&addr);
1161     }
1162 }
1163 
GapUserConfirmationRequestReplyComplete(const HciUserConfirmationRequestReplyReturnParam * param)1164 void GapUserConfirmationRequestReplyComplete(const HciUserConfirmationRequestReplyReturnParam *param)
1165 {
1166     if (param->status != HCI_SUCCESS) {
1167         BtAddr addr = BT_ADDR_NULL;
1168         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1169         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1170         GapUserConfirmationRequestNegativeReply(&addr);
1171     }
1172 }
1173 
GapUserConfirmationRequestNegativeReplyComplete(const HciUserConfirmationRequestNegativeReplyReturnParam * param)1174 void GapUserConfirmationRequestNegativeReplyComplete(const HciUserConfirmationRequestNegativeReplyReturnParam *param)
1175 {
1176     if (param->status != HCI_SUCCESS) {
1177         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1178     }
1179 }
1180 
GAP_UserConfirmRsp(const BtAddr * addr,uint8_t accept)1181 int GAP_UserConfirmRsp(const BtAddr *addr, uint8_t accept)
1182 {
1183     int ret;
1184 
1185     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1186 
1187     if (GapIsBredrEnable() == false) {
1188         return GAP_ERR_NOT_ENABLE;
1189     }
1190 
1191     if (accept == GAP_ACCEPT) {
1192         ret = GapUserConfirmationRequestReply(addr);
1193     } else if (accept == GAP_NOT_ACCEPT) {
1194         ret = GapUserConfirmationRequestNegativeReply(addr);
1195     } else {
1196         ret = GAP_ERR_INVAL_PARAM;
1197     }
1198 
1199     return ret;
1200 }
1201 
GapUserPasskeyRequestReply(const BtAddr * addr,int numericValue)1202 static int GapUserPasskeyRequestReply(const BtAddr *addr, int numericValue)
1203 {
1204     HciUserPasskeyRequestReplyParam hciCmdParam;
1205 
1206     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1207     hciCmdParam.numericValue = numericValue;
1208 
1209     return HCI_UserPasskeyRequestReply(&hciCmdParam);
1210 }
1211 
GapUserPasskeyRequestNegativeReply(const BtAddr * addr)1212 static int GapUserPasskeyRequestNegativeReply(const BtAddr *addr)
1213 {
1214     HciUserPasskeyRequestNegativeReplyParam hciCmdParam;
1215 
1216     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1217 
1218     return HCI_UserPasskeyRequestNegativeReply(&hciCmdParam);
1219 }
1220 
GapOnUserPasskeyNotificationEvent(const HciUserPasskeyNotificationEventParam * eventParam)1221 void GapOnUserPasskeyNotificationEvent(const HciUserPasskeyNotificationEventParam *eventParam)
1222 {
1223     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1224     BtAddr addr = BT_ADDR_NULL;
1225 
1226     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1227     if (g_authenticationCallback.callback.userPasskeyNotification) {
1228         g_authenticationCallback.callback.userPasskeyNotification(
1229             &addr, eventParam->passkey, g_authenticationCallback.context);
1230     } else {
1231         LOG_WARN("%{public}s:not register callback", __FUNCTION__);
1232     }
1233 }
1234 
GapOnUserPasskeyRequestEvent(const HciUserPasskeyRequestEventParam * eventParam)1235 void GapOnUserPasskeyRequestEvent(const HciUserPasskeyRequestEventParam *eventParam)
1236 {
1237     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1238     BtAddr addr = BT_ADDR_NULL;
1239 
1240     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1241 
1242     if (g_authenticationCallback.callback.userPasskeyReq) {
1243         g_authenticationCallback.callback.userPasskeyReq(&addr, g_authenticationCallback.context);
1244     } else {
1245         GapUserPasskeyRequestNegativeReply(&addr);
1246     }
1247 }
1248 
GapUserPasskeyRequestReplyComplete(const HciUserPasskeyRequestReplyReturnParam * param)1249 void GapUserPasskeyRequestReplyComplete(const HciUserPasskeyRequestReplyReturnParam *param)
1250 {
1251     if (param->status != HCI_SUCCESS) {
1252         BtAddr addr = BT_ADDR_NULL;
1253         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1254         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1255         GapUserPasskeyRequestNegativeReply(&addr);
1256     }
1257 }
1258 
GapUserPasskeyRequestNegativeReplyComplete(const HciUserPasskeyRequestNegativeReplyReturnParam * param)1259 void GapUserPasskeyRequestNegativeReplyComplete(const HciUserPasskeyRequestNegativeReplyReturnParam *param)
1260 {
1261     if (param->status != HCI_SUCCESS) {
1262         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1263     }
1264 }
1265 
GAP_UserPasskeyRsp(const BtAddr * addr,uint8_t accept,uint32_t number)1266 int GAP_UserPasskeyRsp(const BtAddr *addr, uint8_t accept, uint32_t number)
1267 {
1268     int ret;
1269 
1270     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1271 
1272     if (GapIsBredrEnable() == false) {
1273         return GAP_ERR_NOT_ENABLE;
1274     }
1275 
1276     if (accept == GAP_ACCEPT) {
1277         ret = GapUserPasskeyRequestReply(addr, number);
1278     } else if (accept == GAP_NOT_ACCEPT) {
1279         ret = GapUserPasskeyRequestNegativeReply(addr);
1280     } else {
1281         ret = GAP_ERR_INVAL_PARAM;
1282     }
1283 
1284     return ret;
1285 }
1286 
GapRemoteOOBDataRequestReply(const BtAddr * addr,const uint8_t * c,const uint8_t * r)1287 static int GapRemoteOOBDataRequestReply(const BtAddr *addr, const uint8_t *c, const uint8_t *r)
1288 {
1289     HciRemoteOobDataRequestReplyParam hciCmdParam;
1290     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1291     (void)memcpy_s(hciCmdParam.C, GAP_OOB_DATA_CONFIRM_SIZE, c, GAP_OOB_DATA_CONFIRM_SIZE);
1292     (void)memcpy_s(hciCmdParam.r, GAP_OOB_DATA_RANDOM_SIZE, r, GAP_OOB_DATA_RANDOM_SIZE);
1293 
1294     return HCI_RemoteOOBDataRequestReply(&hciCmdParam);
1295 }
1296 
GapRemoteOOBDataRequestNegativeReply(const BtAddr * addr)1297 static int GapRemoteOOBDataRequestNegativeReply(const BtAddr *addr)
1298 {
1299     HciRemoteOobDataRequestNegativeReplyParam hciCmdParam;
1300 
1301     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1302 
1303     return HCI_RemoteOOBDataRequestNegativeReply(&hciCmdParam);
1304 }
1305 
GapOnRemoteOOBDataRequestEvent(const HciRemoteOobDataRequestEventParam * eventParam)1306 void GapOnRemoteOOBDataRequestEvent(const HciRemoteOobDataRequestEventParam *eventParam)
1307 {
1308     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1309     BtAddr addr;
1310 
1311     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1312 
1313     if (g_authenticationCallback.callback.remoteOobReq) {
1314         g_authenticationCallback.callback.remoteOobReq(&addr, g_authenticationCallback.context);
1315     } else {
1316         GapRemoteOOBDataRequestNegativeReply(&addr);
1317     }
1318 }
1319 
GapRemoteOOBDataRequestReplyComplete(const HciRemoteOobDataRequestReplyReturnParam * param)1320 void GapRemoteOOBDataRequestReplyComplete(const HciRemoteOobDataRequestReplyReturnParam *param)
1321 {
1322     if (param->status != HCI_SUCCESS) {
1323         BtAddr addr;
1324         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1325         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1326         GapRemoteOOBDataRequestNegativeReply(&addr);
1327     }
1328 }
1329 
GapRemoteOOBExtendedDataRequestReplyComplete(const HciRemoteOobExtendedDataRequestReplyReturnParam * param)1330 void GapRemoteOOBExtendedDataRequestReplyComplete(const HciRemoteOobExtendedDataRequestReplyReturnParam *param)
1331 {
1332     if (param->status != HCI_SUCCESS) {
1333         BtAddr addr;
1334         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1335         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1336         GapRemoteOOBDataRequestNegativeReply(&addr);
1337     }
1338 }
1339 
GapRemoteOOBDataRequestNegativeReplyComplete(const HciRemoteOobDataRequestNegativeReplyReturnParam * param)1340 void GapRemoteOOBDataRequestNegativeReplyComplete(const HciRemoteOobDataRequestNegativeReplyReturnParam *param)
1341 {
1342     if (param->status != HCI_SUCCESS) {
1343         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1344     }
1345 }
1346 
GAP_RemoteOobRsp(const BtAddr * addr,uint8_t accept,const GapOOBData * data)1347 int GAP_RemoteOobRsp(const BtAddr *addr, uint8_t accept, const GapOOBData *data)
1348 {
1349     int ret;
1350 
1351     if (GapIsBredrEnable() == false) {
1352         return GAP_ERR_NOT_ENABLE;
1353     }
1354 
1355     if (addr == NULL || data == NULL) {
1356         return GAP_ERR_INVAL_PARAM;
1357     }
1358 
1359     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1360 
1361     if (accept == GAP_ACCEPT) {
1362         ret = GapRemoteOOBDataRequestReply(addr, (uint8_t *)data->C, (uint8_t *)data->R);
1363     } else if (accept == GAP_NOT_ACCEPT) {
1364         ret = GapRemoteOOBDataRequestNegativeReply(addr);
1365     } else {
1366         ret = GAP_ERR_INVAL_PARAM;
1367     }
1368 
1369     return ret;
1370 }
1371 
GapPINCodeRequestReply(const BtAddr * addr,uint8_t pinCode[GAP_PINCODE_SIZE],uint8_t pinCodeLength)1372 static int GapPINCodeRequestReply(const BtAddr *addr, uint8_t pinCode[GAP_PINCODE_SIZE], uint8_t pinCodeLength)
1373 {
1374     HciPinCodeRequestReplyParam hciCmdParam;
1375 
1376     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1377     (void)memcpy_s(hciCmdParam.pinCode, GAP_PINCODE_SIZE, pinCode, GAP_PINCODE_SIZE);
1378     hciCmdParam.pinCodeLength = pinCodeLength;
1379 
1380     return HCI_PINCodeRequestReply(&hciCmdParam);
1381 }
1382 
GapPINCodeRequestNegativeReply(const BtAddr * addr)1383 static int GapPINCodeRequestNegativeReply(const BtAddr *addr)
1384 {
1385     HciPinCodeRequestNegativeReplyParam hciCmdParam;
1386 
1387     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1388 
1389     return HCI_PINCodeRequestNegativeReply(&hciCmdParam);
1390 }
1391 
GapOnPINCodeRequestEvent(const HciPinCodeRequestEventParam * eventParam)1392 void GapOnPINCodeRequestEvent(const HciPinCodeRequestEventParam *eventParam)
1393 {
1394     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1395     BtAddr addr;
1396     bool isBondableMode = false;
1397 
1398     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1399 
1400     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1401     DeviceInfo *devInfo = NULL;
1402     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1403     if (devInfo != NULL) {
1404         if (devInfo->authenticationStatus == GAP_AUTH_STATUS_IDLE) {
1405             GapStartUseAclConnection(devInfo, GAP_USE_ACL_CONNECTION_TIME);
1406         }
1407     }
1408 
1409     isBondableMode = GapIsBondMode();
1410     if (isBondableMode == false) {
1411         GapPINCodeRequestNegativeReply(&addr);
1412     } else if (g_authenticationCallback.callback.pinCodeReq) {
1413         g_authenticationCallback.callback.pinCodeReq(&addr, g_authenticationCallback.context);
1414     } else {
1415         GapPINCodeRequestNegativeReply(&addr);
1416     }
1417 }
1418 
GapPINCodeRequestReplyComplete(const HciPinCodeRequestReplyReturnParam * param)1419 void GapPINCodeRequestReplyComplete(const HciPinCodeRequestReplyReturnParam *param)
1420 {
1421     if (param->status != HCI_SUCCESS) {
1422         BtAddr addr;
1423         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1424         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1425         GapPINCodeRequestNegativeReply(&addr);
1426     }
1427 }
1428 
GapPINCodeRequestNegativeReplyComplete(const HciPinCodeRequestNegativeReplyReturnParam * param)1429 void GapPINCodeRequestNegativeReplyComplete(const HciPinCodeRequestNegativeReplyReturnParam *param)
1430 {
1431     if (param->status != HCI_SUCCESS) {
1432         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1433     }
1434 }
1435 
GAP_PinCodeRsp(const BtAddr * addr,uint8_t accept,const uint8_t * pinCode,uint8_t pinCodeLength)1436 int GAP_PinCodeRsp(const BtAddr *addr, uint8_t accept, const uint8_t *pinCode, uint8_t pinCodeLength)
1437 {
1438     int ret;
1439 
1440     if (GapIsBredrEnable() == false) {
1441         return GAP_ERR_NOT_ENABLE;
1442     }
1443 
1444     if (addr == NULL) {
1445         return GAP_ERR_INVAL_PARAM;
1446     } else if (accept == GAP_ACCEPT && (pinCode == NULL || pinCodeLength > GAP_PINCODE_SIZE)) {
1447         return GAP_ERR_INVAL_PARAM;
1448     }
1449 
1450     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1451 
1452     if (accept == GAP_ACCEPT) {
1453         uint8_t pin[GAP_PINCODE_SIZE] = {0};
1454         (void)memcpy_s(pin, GAP_PINCODE_SIZE, pinCode, pinCodeLength);
1455         ret = GapPINCodeRequestReply(addr, pin, pinCodeLength);
1456     } else if (accept == GAP_NOT_ACCEPT) {
1457         ret = GapPINCodeRequestNegativeReply(addr);
1458     } else {
1459         ret = GAP_ERR_INVAL_PARAM;
1460     }
1461 
1462     return ret;
1463 }
1464 
GapLinkKeyRequestReply(const BtAddr * addr,const uint8_t * linkKey)1465 static int GapLinkKeyRequestReply(const BtAddr *addr, const uint8_t *linkKey)
1466 {
1467     HciLinkKeyRequestReplyParam hciCmdParam;
1468     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1469     if (memcpy_s(hciCmdParam.linkKey, GAP_LINKKEY_SIZE, linkKey, GAP_LINKKEY_SIZE) != EOK) {
1470         return GAP_STATUS_FAILED;
1471     }
1472 
1473     return HCI_LinkKeyRequestReply(&hciCmdParam);
1474 }
1475 
GapLinkKeyRequestNegativeReply(const BtAddr * addr)1476 static int GapLinkKeyRequestNegativeReply(const BtAddr *addr)
1477 {
1478     HciLinkKeyRequestNegativeReplyParam hciCmdParam;
1479 
1480     (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1481 
1482     return HCI_LinkKeyRequestNegativeReply(&hciCmdParam);
1483 }
1484 
GAP_PairIsFromLocal(const BtAddr * addr,bool * isLocal)1485 int GAP_PairIsFromLocal(const BtAddr *addr, bool *isLocal)
1486 {
1487     int ret = GAP_SUCCESS;
1488 
1489     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1490 
1491     if (GapIsBredrEnable() == false) {
1492         return GAP_ERR_NOT_ENABLE;
1493     }
1494 
1495     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1496     DeviceInfo *devInfo = NULL;
1497     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1498     if (devInfo != NULL) {
1499         *isLocal = !!devInfo->authenticationStatus;
1500     } else {
1501         ret = GAP_ERR_INVAL_STATE;
1502     }
1503 
1504     return ret;
1505 }
1506 
GapOnLinkKeyNotificationEvent(const HciLinkKeyNotificationEventParam * eventParam)1507 void GapOnLinkKeyNotificationEvent(const HciLinkKeyNotificationEventParam *eventParam)
1508 {
1509     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1510     BtAddr addr;
1511 
1512     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1513 
1514     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1515     DeviceInfo *devInfo = NULL;
1516     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1517     if (devInfo != NULL) {
1518         devInfo->linkkeyType = eventParam->keyType;
1519     }
1520 
1521     if (g_authenticationCallback.callback.linkKeyNotification) {
1522         g_authenticationCallback.callback.linkKeyNotification(
1523             &addr, (uint8_t *)eventParam->linkKey, eventParam->keyType, g_authenticationCallback.context);
1524     }
1525 }
1526 
GapOnLinkKeyRequestEvent(const HciLinkKeyRequestEventParam * eventParam)1527 void GapOnLinkKeyRequestEvent(const HciLinkKeyRequestEventParam *eventParam)
1528 {
1529     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1530     BtAddr addr;
1531     bool callback = true;
1532 
1533     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1534 
1535     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1536     DeviceInfo *devInfo = NULL;
1537     devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1538     if (devInfo != NULL && devInfo->authenticationStatus == GAP_AUTH_STATUS_RETRY) {
1539         callback = false;
1540         devInfo->authenticationStatus = GAP_AUTH_STATUS_ACTION;
1541     } else if (devInfo != NULL && devInfo->linkkeyType != GAP_LINK_KEY_TYPE_UNKNOWN &&
1542                !GapDeviceLinkkeyIsAuthenticated(devInfo) && devInfo->actionReq != NULL &&
1543                devInfo->actionReq->needAuthentication && devInfo->actionReq->needMITM) {
1544         callback = false;
1545     }
1546 
1547     if (g_authenticationCallback.callback.linkKeyReq) {
1548         if (callback) {
1549             g_authenticationCallback.callback.linkKeyReq(&addr, g_authenticationCallback.context);
1550         } else {
1551             GapLinkKeyRequestNegativeReply(&addr);
1552         }
1553     } else {
1554         GapLinkKeyRequestNegativeReply(&addr);
1555     }
1556 }
1557 
GapLinkKeyRequestReplyComplete(const HciLinkKeyRequestReplyReturnParam * param)1558 void GapLinkKeyRequestReplyComplete(const HciLinkKeyRequestReplyReturnParam *param)
1559 {
1560     if (param->status != HCI_SUCCESS) {
1561         BtAddr addr;
1562         GapChangeHCIAddr(&addr, &param->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1563         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1564         GapLinkKeyRequestNegativeReply(&addr);
1565     }
1566 }
1567 
GapLinkKeyRequestNegativeReplyComplete(const HciLinkKeyRequestNegativeReplyReturnParam * param)1568 void GapLinkKeyRequestNegativeReplyComplete(const HciLinkKeyRequestNegativeReplyReturnParam *param)
1569 {
1570     if (param->status != HCI_SUCCESS) {
1571         LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1572     }
1573 }
1574 
GAP_LinkKeyRsp(const BtAddr * addr,uint8_t accept,const uint8_t linkKey[GAP_LINKKEY_SIZE],uint8_t keyType)1575 int GAP_LinkKeyRsp(const BtAddr *addr, uint8_t accept, const uint8_t linkKey[GAP_LINKKEY_SIZE], uint8_t keyType)
1576 {
1577     int ret;
1578 
1579     if (GapIsBredrEnable() == false) {
1580         return GAP_ERR_NOT_ENABLE;
1581     }
1582 
1583     if (addr == NULL || linkKey == NULL) {
1584         return GAP_ERR_INVAL_PARAM;
1585     }
1586 
1587     LOG_INFO("%{public}s:" BT_ADDR_FMT " %hhu, keyType[%hhu]", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr), accept, keyType);
1588 
1589     if (accept == GAP_ACCEPT) {
1590         ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1591         DeviceInfo *devInfo = NULL;
1592         devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1593         if (devInfo != NULL) {
1594             devInfo->linkkeyType = keyType;
1595         }
1596         ret = GapLinkKeyRequestReply(addr, linkKey);
1597     } else if (accept == GAP_NOT_ACCEPT) {
1598         ret = GapLinkKeyRequestNegativeReply(addr);
1599     } else {
1600         ret = GAP_ERR_INVAL_PARAM;
1601     }
1602 
1603     return ret;
1604 }
1605 
GapOnSimplePairingComplete(const HciSimplePairingCompleteEventParam * eventParam)1606 void GapOnSimplePairingComplete(const HciSimplePairingCompleteEventParam *eventParam)
1607 {
1608     LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1609     BtAddr addr;
1610 
1611     GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1612 
1613     if (g_authenticationCallback.callback.simplePairComplete) {
1614         g_authenticationCallback.callback.simplePairComplete(
1615             &addr, eventParam->status, g_authenticationCallback.context);
1616     }
1617 }
1618 
GapOnEncryptionChangeEvent(const HciEncryptionChangeEventParam * eventParam)1619 void GapOnEncryptionChangeEvent(const HciEncryptionChangeEventParam *eventParam)
1620 {
1621     BtAddr addr = {0};
1622     GapEncryptionChangeCallback callback = NULL;
1623     void *context = NULL;
1624 
1625     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1626     DeviceInfo *devInfo = NULL;
1627     devInfo = ListForEachData(
1628         connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&eventParam->connectionHandle);
1629     if (devInfo != NULL) {
1630         devInfo->encryptionStatus = GAP_ENC_STATUS_IDLE;
1631         (void)memcpy_s(&addr, sizeof(BtAddr), &devInfo->addr, sizeof(BtAddr));
1632         if (eventParam->status == HCI_SUCCESS) {
1633             if (eventParam->encryptionEnabled) {
1634                 devInfo->isEncryption = true;
1635             } else {
1636                 devInfo->isEncryption = false;
1637             }
1638             GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_SUCCESS, eventParam->status);
1639         } else {
1640             GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_FAILED, eventParam->status);
1641         }
1642         devInfo->actionReq = NULL;
1643         if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
1644             devInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
1645         }
1646     }
1647 
1648     GapRequestSecurityProcess();
1649 
1650     EncryptionBlock *encryptionBlock = GapGetEncryptionBlock();
1651     if (encryptionBlock->status == GAP_SET_ENCRYPTION_STATUS_SETTING) {
1652         callback = encryptionBlock->callback;
1653         context = encryptionBlock->context;
1654     }
1655 
1656     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr));
1657 
1658     if (devInfo != NULL) {
1659         if (g_authenticationCallback.callback.encryptionChangeCallback) {
1660             g_authenticationCallback.callback.encryptionChangeCallback(&addr,
1661                 eventParam->encryptionEnabled ? GAP_ENCRYPTION_ON : GAP_ENCRYPTION_OFF,
1662                 g_authenticationCallback.context);
1663         }
1664         if (callback) {
1665             callback(&addr, eventParam->encryptionEnabled ? GAP_ENCRYPTION_ON : GAP_ENCRYPTION_OFF, context);
1666         }
1667     }
1668 
1669     GapLeEncryptionComplete(eventParam->connectionHandle, eventParam->status);
1670 }
1671 
GapOnEncryptionKeyRefreshComplete(const HciEncryptionKeyRefreshCompleteEventParam * eventParam)1672 void GapOnEncryptionKeyRefreshComplete(const HciEncryptionKeyRefreshCompleteEventParam *eventParam)
1673 {
1674     BtAddr addr = {0};
1675 
1676     ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1677     DeviceInfo *devInfo = NULL;
1678     devInfo = ListForEachData(
1679         connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&eventParam->connectionHandle);
1680     if (devInfo != NULL) {
1681         devInfo->encryptionStatus = GAP_ENC_STATUS_IDLE;
1682         (void)memcpy_s(&addr, sizeof(BtAddr), &devInfo->addr, sizeof(BtAddr));
1683         if (eventParam->status == HCI_SUCCESS) {
1684             GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_SUCCESS, eventParam->status);
1685         } else {
1686             GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_FAILED, eventParam->status);
1687         }
1688         devInfo->actionReq = NULL;
1689         if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
1690             devInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
1691         }
1692     }
1693     GapRequestSecurityProcess();
1694     LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr));
1695 }
1696 
GapSetConnectionEncryption(uint16_t handle,uint8_t encryptionEnable)1697 static int GapSetConnectionEncryption(uint16_t handle, uint8_t encryptionEnable)
1698 {
1699     HciSetConnectionEncryptionParam hciCmdParam = {
1700         .connectionHandle = handle,
1701         .encryptionEnable = encryptionEnable,
1702     };
1703 
1704     return HCI_SetConnectionEncryption(&hciCmdParam);
1705 }