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