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 }