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 }