• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "softbus_message_open_channel.h"
17 
18 #include <securec.h>
19 
20 #include "softbus_adapter_crypto.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_adapter_socket.h"
23 #include "softbus_errcode.h"
24 #include "softbus_json_utils.h"
25 
26 #define BASE64KEY 45 // Base64 encrypt SessionKey length
27 
28 static int32_t g_tdcPktHeadSeq = 1024;
29 
PackError(int errCode,const char * errDesc)30 NO_SANITIZE("cfi") char *PackError(int errCode, const char *errDesc)
31 {
32     if (errDesc == NULL) {
33         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s]invalid param", __func__);
34         return NULL;
35     }
36     cJSON *json =  cJSON_CreateObject();
37     if (json == NULL) {
38         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Cannot create cJSON object");
39         return NULL;
40     }
41     if (!AddNumberToJsonObject(json, CODE, CODE_OPEN_CHANNEL) ||
42         !AddNumberToJsonObject(json, ERR_CODE, errCode) ||
43         !AddStringToJsonObject(json, ERR_DESC, errDesc)) {
44         cJSON_Delete(json);
45         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "add to cJSON object failed");
46         return NULL;
47     }
48     char *data = cJSON_PrintUnformatted(json);
49     if (data == NULL) {
50         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "cJSON_PrintUnformatted failed");
51     }
52     cJSON_Delete(json);
53     return data;
54 }
55 
PackFirstData(const AppInfo * appInfo,cJSON * json)56 static int PackFirstData(const AppInfo *appInfo, cJSON *json)
57 {
58     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "begin to pack first data");
59     uint8_t *encodeFastData = (uint8_t *)SoftBusMalloc(BASE64_FAST_DATA_LEN);
60     if (encodeFastData == NULL) {
61         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc encode fast data fail.");
62         return SOFTBUS_ERR;
63     }
64     size_t fastDataSize = 0;
65     uint32_t outLen;
66     char *buf = TransTdcPackFastData(appInfo, &outLen);
67     if (buf == NULL) {
68         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "failed to pack bytes.");
69         SoftBusFree(encodeFastData);
70         return SOFTBUS_ENCRYPT_ERR;
71     }
72     if (outLen != appInfo->fastTransDataSize + FAST_TDC_EXT_DATA_SIZE) {
73         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "pack bytes len error, len: %d", outLen);
74         SoftBusFree(buf);
75         SoftBusFree(encodeFastData);
76         return SOFTBUS_ENCRYPT_ERR;
77     }
78     int32_t ret = SoftBusBase64Encode(encodeFastData, BASE64_FAST_DATA_LEN, &fastDataSize,
79         (const unsigned char *)buf, outLen);
80     if (ret != 0) {
81         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "mbedtls base64 encode failed.");
82         SoftBusFree(encodeFastData);
83         SoftBusFree(buf);
84         return SOFTBUS_ERR;
85     }
86     if (!AddStringToJsonObject(json, FIRST_DATA, (char *)encodeFastData)) {
87         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "add first data failed.");
88         SoftBusFree(encodeFastData);
89         SoftBusFree(buf);
90         return SOFTBUS_ERR;
91     }
92     SoftBusFree(encodeFastData);
93     SoftBusFree(buf);
94     return SOFTBUS_OK;
95 }
96 
PackRequest(const AppInfo * appInfo)97 char *PackRequest(const AppInfo *appInfo)
98 {
99     if (appInfo == NULL) {
100         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s]invalid param.", __func__);
101         return NULL;
102     }
103 
104     cJSON *json =  cJSON_CreateObject();
105     if (json == NULL) {
106         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Cannot create cJSON object");
107         return NULL;
108     }
109     if (!AddNumber16ToJsonObject(json, FIRST_DATA_SIZE, appInfo->fastTransDataSize)) {
110         cJSON_Delete(json);
111         return NULL;
112     }
113     if (appInfo->fastTransDataSize > 0) {
114         if (PackFirstData(appInfo, json) != SOFTBUS_OK) {
115             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "pack first data failed");
116             cJSON_Delete(json);
117             return NULL;
118         }
119     }
120     unsigned char encodeSessionKey[BASE64KEY] = {0};
121     size_t keyLen = 0;
122     int32_t ret = SoftBusBase64Encode(encodeSessionKey, BASE64KEY, &keyLen, (unsigned char*)appInfo->sessionKey,
123         SESSION_KEY_LENGTH);
124     if (ret != 0) {
125         cJSON_Delete(json);
126         return NULL;
127     }
128     if (!AddNumberToJsonObject(json, CODE, CODE_OPEN_CHANNEL) ||
129         !AddNumberToJsonObject(json, API_VERSION, appInfo->myData.apiVersion) ||
130         !AddStringToJsonObject(json, BUS_NAME, appInfo->peerData.sessionName) ||
131         !AddStringToJsonObject(json, GROUP_ID, appInfo->groupId) ||
132         !AddNumberToJsonObject(json, UID, appInfo->myData.uid) ||
133         !AddNumberToJsonObject(json, PID, appInfo->myData.pid) ||
134         !AddStringToJsonObject(json, SESSION_KEY, (char*)encodeSessionKey) ||
135         !AddNumberToJsonObject(json, MTU_SIZE, appInfo->myData.dataConfig)) {
136         cJSON_Delete(json);
137         return NULL;
138     }
139     char *authState = (char*)appInfo->myData.authState;
140     if (appInfo->myData.apiVersion != API_V1) {
141         if (!AddStringToJsonObject(json, PKG_NAME, appInfo->myData.pkgName) ||
142             !AddStringToJsonObject(json, CLIENT_BUS_NAME, appInfo->myData.sessionName) ||
143             !AddStringToJsonObject(json, AUTH_STATE, authState) ||
144             !AddNumberToJsonObject(json, MSG_ROUTE_TYPE, appInfo->routeType)) {
145             cJSON_Delete(json);
146             return NULL;
147         }
148     }
149     (void)AddNumberToJsonObject(json, BUSINESS_TYPE, appInfo->businessType);
150     (void)AddNumberToJsonObject(json, AUTO_CLOSE_TIME, appInfo->autoCloseTime);
151     (void)AddNumberToJsonObject(json, TRANS_FLAGS, TRANS_FLAG_HAS_CHANNEL_AUTH);
152     (void)AddNumberToJsonObject(json, MY_HANDLE_ID, appInfo->myHandleId);
153     (void)AddNumberToJsonObject(json, PEER_HANDLE_ID, appInfo->peerHandleId);
154     char *data = cJSON_PrintUnformatted(json);
155     if (data == NULL) {
156         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "cJSON_PrintUnformatted failed");
157     }
158     cJSON_Delete(json);
159     return data;
160 }
161 
UnpackFirstData(AppInfo * appInfo,const cJSON * json)162 static int UnpackFirstData(AppInfo *appInfo, const cJSON *json)
163 {
164     if (!GetJsonObjectNumber16Item(json, FIRST_DATA_SIZE, &(appInfo->fastTransDataSize))) {
165         appInfo->fastTransDataSize = 0;
166     }
167     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_DBG, "fast data size=%d", appInfo->fastTransDataSize);
168     if (appInfo->fastTransDataSize > 0 && appInfo->fastTransDataSize <= MAX_FAST_DATA_LEN) {
169         uint8_t *encodeFastData = (uint8_t *)SoftBusMalloc(BASE64_FAST_DATA_LEN);
170         if (encodeFastData == NULL) {
171             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc encode fast data fail.");
172             return SOFTBUS_ERR;
173         }
174         size_t fastDataSize = 0;
175         if (!GetJsonObjectStringItem(json, FIRST_DATA, (char *)encodeFastData, BASE64_FAST_DATA_LEN)) {
176             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get fast data");
177             SoftBusFree(encodeFastData);
178             return SOFTBUS_ERR;
179         }
180         appInfo->fastTransData = (uint8_t *)SoftBusMalloc(appInfo->fastTransDataSize + FAST_TDC_EXT_DATA_SIZE);
181         if (appInfo->fastTransData == NULL) {
182             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc fast data fail.");
183             return SOFTBUS_ERR;
184         }
185         int32_t ret = SoftBusBase64Decode((unsigned char *)appInfo->fastTransData, appInfo->fastTransDataSize +
186             FAST_TDC_EXT_DATA_SIZE, &fastDataSize, encodeFastData, strlen((char*)encodeFastData));
187         if (ret != 0) {
188             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "mbedtls decode failed.");
189             SoftBusFree((void *)appInfo->fastTransData);
190             SoftBusFree(encodeFastData);
191             return SOFTBUS_ERR;
192         }
193         SoftBusFree(encodeFastData);
194     }
195     return SOFTBUS_OK;
196 }
197 
UnpackRequest(const cJSON * msg,AppInfo * appInfo)198 int UnpackRequest(const cJSON *msg, AppInfo *appInfo)
199 {
200     if (msg == NULL || appInfo == NULL) {
201         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s]invalid param", __func__);
202         return SOFTBUS_ERR;
203     }
204     if (UnpackFirstData(appInfo, msg) != SOFTBUS_OK) {
205         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "unpack first data failed");
206         SoftBusFree((void *)appInfo->fastTransData);
207         return SOFTBUS_ERR;
208     }
209     int apiVersion = API_V1;
210     (void)GetJsonObjectNumberItem(msg, API_VERSION, &apiVersion);
211     char sessionKey[BASE64KEY] = {0};
212     if (!GetJsonObjectStringItem(msg, BUS_NAME, (appInfo->myData.sessionName), SESSION_NAME_SIZE_MAX) ||
213         !GetJsonObjectStringItem(msg, GROUP_ID, (appInfo->groupId), GROUP_ID_SIZE_MAX) ||
214         !GetJsonObjectStringItem(msg, SESSION_KEY, sessionKey, sizeof(sessionKey))) {
215         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get BUS_NAME");
216         return SOFTBUS_ERR;
217     }
218     if (!GetJsonObjectNumberItem(msg, MTU_SIZE, (int32_t *)&(appInfo->peerData.dataConfig))) {
219         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "peer dataconfig is null.");
220     }
221     appInfo->peerData.apiVersion = (ApiVersion)apiVersion;
222     appInfo->peerData.uid = -1;
223     appInfo->peerData.pid = -1;
224     (void)GetJsonObjectNumberItem(msg, UID, &appInfo->peerData.uid);
225     (void)GetJsonObjectNumberItem(msg, PID, &appInfo->peerData.pid);
226     appInfo->myHandleId = -1;
227     appInfo->peerHandleId = -1;
228     if (!GetJsonObjectInt32Item(msg, MY_HANDLE_ID, &(appInfo->peerHandleId)) ||
229         !GetJsonObjectInt32Item(msg, PEER_HANDLE_ID, &(appInfo->myHandleId))) {
230             appInfo->myHandleId = -1;
231             appInfo->peerHandleId = -1;
232     }
233 
234     size_t len = 0;
235     int32_t ret = SoftBusBase64Decode((unsigned char *)appInfo->sessionKey, SESSION_KEY_LENGTH,
236         &len, (unsigned char *)sessionKey, strlen(sessionKey));
237     (void)memset_s(sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
238     if (len != SESSION_KEY_LENGTH) {
239         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to decode sessionKey %d, len %zu", ret, len);
240         return SOFTBUS_ERR;
241     }
242     if (apiVersion == API_V1) {
243         return SOFTBUS_OK;
244     }
245 
246     if (!GetJsonObjectStringItem(msg, PKG_NAME, (appInfo->peerData.pkgName), PKG_NAME_SIZE_MAX) ||
247         !GetJsonObjectStringItem(msg, CLIENT_BUS_NAME, (appInfo->peerData.sessionName), SESSION_NAME_SIZE_MAX) ||
248         !GetJsonObjectStringItem(msg, AUTH_STATE, (appInfo->peerData.authState), AUTH_STATE_SIZE_MAX)) {
249         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get pkgName");
250         return SOFTBUS_ERR;
251     }
252     int32_t routeType = WIFI_STA;
253     if (GetJsonObjectNumberItem(msg, MSG_ROUTE_TYPE, &routeType) != SOFTBUS_OK) {
254         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get route type");
255     }
256     appInfo->routeType = (RouteType)routeType;
257 
258     if (!GetJsonObjectNumberItem(msg, BUSINESS_TYPE, (int*)&appInfo->businessType)) {
259         appInfo->businessType = BUSINESS_TYPE_NOT_CARE;
260     }
261     int transFlag = TRANS_FLAG_HAS_CHANNEL_AUTH;
262     (void)GetJsonObjectNumberItem(msg, AUTO_CLOSE_TIME, (int*)&appInfo->autoCloseTime);
263     (void)GetJsonObjectNumberItem(msg, TRANS_FLAGS, &transFlag);
264 
265     return SOFTBUS_OK;
266 }
267 
PackReply(const AppInfo * appInfo)268 NO_SANITIZE("cfi") char *PackReply(const AppInfo *appInfo)
269 {
270     if (appInfo == NULL) {
271         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s]invalid param", __func__);
272         return NULL;
273     }
274     cJSON *json =  cJSON_CreateObject();
275     if (json == NULL) {
276         return NULL;
277     }
278     if (!AddNumberToJsonObject(json, CODE, CODE_OPEN_CHANNEL) ||
279         !AddNumberToJsonObject(json, API_VERSION, appInfo->myData.apiVersion) ||
280         !AddStringToJsonObject(json, DEVICE_ID, appInfo->myData.deviceId) ||
281         !AddNumberToJsonObject(json, UID, appInfo->myData.uid) ||
282         !AddNumberToJsonObject(json, PID, appInfo->myData.pid)) {
283         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to add items");
284         cJSON_Delete(json);
285         return NULL;
286     }
287     if (appInfo->peerData.dataConfig != 0) {
288         if (!AddNumberToJsonObject(json, MTU_SIZE, appInfo->myData.dataConfig)) {
289             cJSON_Delete(json);
290             return NULL;
291         }
292     }
293     if (!AddNumber16ToJsonObject(json, FIRST_DATA_SIZE, appInfo->fastTransDataSize)) {
294         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to add trans data size");
295         cJSON_Delete(json);
296         return NULL;
297     }
298     if (appInfo->myData.apiVersion != API_V1) {
299         char *authState = (char *)appInfo->myData.authState;
300         if (!AddStringToJsonObject(json, PKG_NAME, appInfo->myData.pkgName) ||
301             !AddStringToJsonObject(json, AUTH_STATE, authState)) {
302             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to add pkgName or authState");
303             cJSON_Delete(json);
304             return NULL;
305         }
306     }
307     (void)AddNumberToJsonObject(json, MY_HANDLE_ID, appInfo->myHandleId);
308     (void)AddNumberToJsonObject(json, PEER_HANDLE_ID, appInfo->peerHandleId);
309     char *data = cJSON_PrintUnformatted(json);
310     if (data == NULL) {
311         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "cJSON_PrintUnformatted failed");
312     }
313     cJSON_Delete(json);
314     return data;
315 }
316 
UnpackReply(const cJSON * msg,AppInfo * appInfo,uint16_t * fastDataSize)317 int UnpackReply(const cJSON *msg, AppInfo *appInfo, uint16_t *fastDataSize)
318 {
319     if (msg == NULL || appInfo == NULL) {
320         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s]invalid param", __func__);
321         return SOFTBUS_ERR;
322     }
323 
324     char uuid[DEVICE_ID_SIZE_MAX] = {0};
325     if (!GetJsonObjectStringItem(msg, DEVICE_ID, uuid, DEVICE_ID_SIZE_MAX)) {
326         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get uuid");
327         return SOFTBUS_ERR;
328     }
329     if (strcmp(uuid, appInfo->peerData.deviceId) != 0) {
330         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid uuid");
331         return SOFTBUS_ERR;
332     }
333     if (!GetJsonObjectNumber16Item(msg, FIRST_DATA_SIZE, fastDataSize)) {
334         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get fast data size");
335     }
336 
337     int apiVersion = API_V1;
338     (void)GetJsonObjectNumberItem(msg, API_VERSION, &apiVersion);
339     appInfo->peerData.apiVersion = (ApiVersion)apiVersion;
340     appInfo->peerData.uid = -1;
341     appInfo->peerData.pid = -1;
342     (void)GetJsonObjectNumberItem(msg, UID, &appInfo->peerData.uid);
343     (void)GetJsonObjectNumberItem(msg, PID, &appInfo->peerData.pid);
344     if (!GetJsonObjectInt32Item(msg, MY_HANDLE_ID, &(appInfo->peerHandleId)) ||
345         !GetJsonObjectInt32Item(msg, PEER_HANDLE_ID, &(appInfo->myHandleId))) {
346             appInfo->myHandleId = -1;
347             appInfo->peerHandleId = -1;
348     }
349     if (!GetJsonObjectNumberItem(msg, MTU_SIZE, (int32_t *)&(appInfo->peerData.dataConfig))) {
350         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "peer dataconfig is null.");
351     }
352     if (apiVersion != API_V1) {
353         if (!GetJsonObjectStringItem(msg, PKG_NAME, (appInfo->peerData.pkgName), PKG_NAME_SIZE_MAX) ||
354             !GetJsonObjectStringItem(msg, AUTH_STATE, (appInfo->peerData.authState), AUTH_STATE_SIZE_MAX)) {
355             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to get pkgName or authState");
356             return SOFTBUS_ERR;
357         }
358     }
359     return SOFTBUS_OK;
360 }
361 
UnpackReplyErrCode(const cJSON * msg,int32_t * errCode)362 int UnpackReplyErrCode(const cJSON *msg, int32_t *errCode)
363 {
364     if ((msg == NULL) && (errCode == NULL)) {
365         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s]invalid param", __func__);
366         return SOFTBUS_ERR;
367     }
368 
369     if (!GetJsonObjectInt32Item(msg, ERR_CODE, errCode)) {
370         return SOFTBUS_ERR;
371     }
372 
373     return SOFTBUS_OK;
374 }
375 
TransTdcEncrypt(const char * sessionKey,const char * in,uint32_t inLen,char * out,uint32_t * outLen)376 static int32_t TransTdcEncrypt(const char *sessionKey, const char *in, uint32_t inLen, char *out, uint32_t *outLen)
377 {
378     AesGcmCipherKey cipherKey = {0};
379     cipherKey.keyLen = SESSION_KEY_LENGTH;
380     if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, sessionKey, SESSION_KEY_LENGTH) != EOK) {
381         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "memcpy key error.");
382         return SOFTBUS_ERR;
383     }
384     int32_t ret = SoftBusEncryptData(&cipherKey, (unsigned char*)in, inLen, (unsigned char*)out, outLen);
385     (void)memset_s(&cipherKey, sizeof(AesGcmCipherKey), 0, sizeof(AesGcmCipherKey));
386     if (ret != SOFTBUS_OK) {
387         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "SoftBusEncryptData fail(=%d).", ret);
388         return SOFTBUS_ENCRYPT_ERR;
389     }
390     return SOFTBUS_OK;
391 }
392 
PackTcpFastDataPacketHead(TcpFastDataPacketHead * data)393 static void PackTcpFastDataPacketHead(TcpFastDataPacketHead *data)
394 {
395     data->magicNumber = SoftBusHtoLl(data->magicNumber);
396     data->seq = (int32_t)SoftBusHtoLl((uint32_t)data->seq);
397     data->flags = SoftBusHtoLl(data->flags);
398     data->dataLen = SoftBusHtoLl(data->dataLen);
399 }
400 
TransTdcPackFastData(const AppInfo * appInfo,uint32_t * outLen)401 char *TransTdcPackFastData(const AppInfo *appInfo, uint32_t *outLen)
402 {
403 #define MAGIC_NUMBER 0xBABEFACE
404     uint32_t dataLen = appInfo->fastTransDataSize + OVERHEAD_LEN;
405     char *buf = (char *)SoftBusMalloc(dataLen + FAST_DATA_HEAD_SIZE);
406     if (buf == NULL) {
407         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc failed.");
408         return NULL;
409     }
410     TcpFastDataPacketHead pktHead = {
411         .magicNumber = MAGIC_NUMBER,
412         .seq = g_tdcPktHeadSeq++,
413         .flags = (appInfo->businessType == BUSINESS_TYPE_BYTE) ? FLAG_BYTES : FLAG_MESSAGE,
414         .dataLen = dataLen,
415     };
416     PackTcpFastDataPacketHead(&pktHead);
417     if (memcpy_s(buf, FAST_DATA_HEAD_SIZE, &pktHead, sizeof(TcpFastDataPacketHead)) != EOK) {
418         SoftBusFree(buf);
419         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "memcpy_s error");
420         return NULL;
421     }
422     if (TransTdcEncrypt(appInfo->sessionKey, (const char *)appInfo->fastTransData,
423         appInfo->fastTransDataSize, buf + FAST_DATA_HEAD_SIZE, &dataLen) != SOFTBUS_OK) {
424         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "encrypt error");
425         SoftBusFree(buf);
426         return NULL;
427     }
428     *outLen = dataLen + FAST_DATA_HEAD_SIZE;
429     return buf;
430 }