1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "smp_oob.h"
17
18 #include <string.h>
19
20 #include "btm/btm_thread.h"
21 #include "log.h"
22 #include "platform/include/random.h"
23 #include "smp.h"
24 #include "smp_cmd.h"
25 #include "smp_common.h"
26 #include "smp_def.h"
27 #include "smp_send.h"
28 #include "smp_tool.h"
29
30 static SMP_ScOobMng g_smpScOobMng = {0x00};
31
32 static void SMP_GenScOobDataTimeoutTask(void *context);
33
SMP_GenerateScOobDataStep1(const SMP_StepParam * param)34 void SMP_GenerateScOobDataStep1(const SMP_StepParam *param)
35 {
36 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
37 return;
38 }
39 uint32_t number;
40 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
41 uint8_t offset = 0x00;
42 HciLeEncryptParam encryptParam;
43 const HciLeReadLocalP256PublicKeyCompleteEventParam *eventParam =
44 (HciLeReadLocalP256PublicKeyCompleteEventParam *)param->data;
45
46 LOG_DEBUG("%{public}s", __FUNCTION__);
47
48 (void)memcpy_s(g_smpScOobMng.publicKey, SMP_PUBLICKEY_LEN, eventParam->localP256PublicKey, SMP_PUBLICKEY_LEN);
49 number = RandomGenerate();
50 (void)memcpy_s(g_smpScOobMng.random, SMP_RANDOM_DATA_LEN, &number, sizeof(number));
51 offset += sizeof(number);
52 number = RandomGenerate();
53 (void)memcpy_s(g_smpScOobMng.random + offset, SMP_RANDOM_DATA_LEN, &number, sizeof(number));
54 offset += sizeof(number);
55 number = RandomGenerate();
56 (void)memcpy_s(g_smpScOobMng.random + offset, SMP_RANDOM_DATA_LEN, &number, sizeof(number));
57 offset += sizeof(number);
58 number = RandomGenerate();
59 (void)memcpy_s(g_smpScOobMng.random + offset, SMP_RANDOM_DATA_LEN, &number, sizeof(number));
60
61 (void)memset_s(cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN, 0x00, CRYPT_AESCMAC_Z_LEN);
62 (void)memcpy_s(encryptParam.key, sizeof(encryptParam.key), g_smpScOobMng.random, SMP_RANDOM_DATA_LEN);
63 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
64 LOG_DEBUG("SMP_GENERATE_SC_OOB_DATA_STEP_2 started.");
65 int ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_GENERATE_SC_OOB_DATA_STEP_2, NULL, SMP_USING_HW_AES128_PAIR);
66 if (ret != SMP_SUCCESS) {
67 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_FAILED, NULL, NULL);
68 }
69 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
70 }
71
SMP_GenerateScOobDataStep2(const SMP_StepParam * param)72 void SMP_GenerateScOobDataStep2(const SMP_StepParam *param)
73 {
74 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
75 return;
76 }
77 int ret;
78 SMP_CryptF4Param cryptF4Param;
79 SMP_EncData *encData = (SMP_EncData *)param->data;
80 SMP_CryptAesCmacStep3Param cryptAescmacStep3Param;
81 LOG_DEBUG("%{public}s", __FUNCTION__);
82 if (g_smpScOobMng.state != SMP_STATE_SC_OOB_DATA_GENERATING) {
83 LOG_ERROR("It's not SC OOB data generating state.");
84 return;
85 }
86 if (encData->encRetParam->status) {
87 LOG_ERROR("returnParam->status = %hhu.", encData->encRetParam->status);
88 ret = SMP_ERR_INVAL_PARAM;
89 } else {
90 SMP_GetPublicKeyX(g_smpScOobMng.publicKey, cryptF4Param.U, sizeof(cryptF4Param.U));
91 SMP_GetPublicKeyX(g_smpScOobMng.publicKey, cryptF4Param.V, sizeof(cryptF4Param.V));
92 cryptF4Param.Z[0x00] = 0x00;
93 SMP_CryptographicF4(&cryptF4Param);
94 SMP_ConstituteAesCmacStep3Param(encData, cryptF4Param.output, CRYPT_F4_OUT_LEN, &cryptAescmacStep3Param);
95 cryptAescmacStep3Param.stepA = SMP_GENERATE_SC_OOB_DATA_STEP_3;
96 cryptAescmacStep3Param.stepB = SMP_GENERATE_SC_OOB_DATA_STEP_4;
97 ret = SMP_CryptographicAesCmacStep3(&cryptAescmacStep3Param);
98 }
99 if (ret != SMP_SUCCESS) {
100 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_FAILED, NULL, NULL);
101 }
102 (void)memset_s(cryptAescmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
103 }
104
SMP_GenerateScOobDataStep3(const SMP_StepParam * param)105 void SMP_GenerateScOobDataStep3(const SMP_StepParam *param)
106 {
107 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
108 return;
109 }
110 SMP_EncData *encData = (SMP_EncData *)param->data;
111 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
112 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
113
114 LOG_DEBUG("%{public}s", __FUNCTION__);
115 if (g_smpScOobMng.state != SMP_STATE_SC_OOB_DATA_GENERATING) {
116 LOG_ERROR("It's not SC OOB data generating state");
117 return;
118 }
119 if (returnParam->status) {
120 LOG_ERROR("returnParam->status = %hhu", returnParam->status);
121 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_FAILED, NULL, NULL);
122 return;
123 }
124 cryptAesCmacStep4Param.stepA = SMP_GENERATE_SC_OOB_DATA_STEP_3;
125 cryptAesCmacStep4Param.stepB = SMP_GENERATE_SC_OOB_DATA_STEP_4;
126 cryptAesCmacStep4Param.pEncCmdData = encData->encCmd;
127 (void)memcpy_s(cryptAesCmacStep4Param.X, CRYPT_AESCMAC_X_LEN, returnParam->encryptedData, CRYPT_AESCMAC_X_LEN);
128 cryptAesCmacStep4Param.isUsingHwAes128 = SMP_USING_HW_AES128_PAIR;
129 int ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
130 if (ret != SMP_SUCCESS) {
131 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_FAILED, NULL, NULL);
132 }
133 }
134
SMP_GenerateScOobDataStep4(const SMP_StepParam * param)135 void SMP_GenerateScOobDataStep4(const SMP_StepParam *param)
136 {
137 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
138 return;
139 }
140 SMP_EncData *encData = (SMP_EncData *)param->data;
141 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
142 uint8_t confirmTmp[SMP_CONFIRM_DATA_LEN];
143 uint8_t randomTmp[SMP_RANDOM_DATA_LEN];
144
145 LOG_DEBUG("%{public}s", __FUNCTION__);
146 if (g_smpScOobMng.state != SMP_STATE_SC_OOB_DATA_GENERATING) {
147 LOG_ERROR("It's not SC OOB data generating state.");
148 return;
149 }
150 if (returnParam->status) {
151 LOG_ERROR("returnParam->status = %hhu.", returnParam->status);
152 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_FAILED, NULL, NULL);
153 return;
154 }
155 g_smpScOobMng.step = 0x00;
156 g_smpScOobMng.state = SMP_STATE_SC_OOB_DATA_GENERATED;
157 if (g_smpScOobMng.alarm != NULL) {
158 AlarmDelete(g_smpScOobMng.alarm);
159 g_smpScOobMng.alarm = NULL;
160 }
161 (void)memcpy_s(g_smpScOobMng.confirm, SMP_CONFIRM_DATA_LEN, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
162 SMP_MemoryReverseCopy(randomTmp, g_smpScOobMng.random, SMP_RANDOM_DATA_LEN);
163 SMP_MemoryReverseCopy(confirmTmp, g_smpScOobMng.confirm, SMP_CONFIRM_DATA_LEN);
164 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_SUCCESS, randomTmp, confirmTmp);
165 }
166
SMP_GenerateScOobDataTimeout(void * parameter)167 void SMP_GenerateScOobDataTimeout(void *parameter)
168 {
169 LOG_INFO("%{public}s", __FUNCTION__);
170 int ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_SMP, SMP_GenScOobDataTimeoutTask, NULL);
171 if (ret != SMP_SUCCESS) {
172 return;
173 }
174 (void)parameter;
175 }
176
SMP_GenScOobDataTimeoutTask(void * context)177 static void SMP_GenScOobDataTimeoutTask(void *context)
178 {
179 LOG_DEBUG("%{public}s", __FUNCTION__);
180 if (g_smpScOobMng.state != SMP_STATE_SC_OOB_DATA_GENERATING) {
181 LOG_ERROR("It's not SC OOB data generating state.");
182 return;
183 }
184 LOG_DEBUG("step:%hu.", g_smpScOobMng.step);
185 SMP_ClearScOobData(false);
186 SMP_NotifyCbGenScOobData(SMP_GENERATE_SC_OOB_DATA_FAILED, NULL, NULL);
187 }
188
SMP_ClearScOobData(bool isCancelTimer)189 void SMP_ClearScOobData(bool isCancelTimer)
190 {
191 if (g_smpScOobMng.alarm != NULL) {
192 if (isCancelTimer) {
193 AlarmCancel(g_smpScOobMng.alarm);
194 }
195 AlarmDelete(g_smpScOobMng.alarm);
196 }
197 (void)memset_s(&g_smpScOobMng, sizeof(SMP_ScOobMng), 0x00, sizeof(SMP_ScOobMng));
198 }
199
SMP_GetScOobMng()200 SMP_ScOobMng *SMP_GetScOobMng()
201 {
202 return &g_smpScOobMng;
203 }