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(®Info->addr, addr)) &&
392 GapCompareServiceSecurityInfo(®Info->info, ¶m->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, ¶m->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, ¶m->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, ¶m->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, ¶m->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, ¶m->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, ¶m->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, ¶m->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