• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 "input_event_transmission/input_event_serialization.h"
17 
18 #include "extra_data.h"
19 #ifdef OHOS_BUILD_ENABLE_SECURITY_PART
20 #include "sec_comp_enhance_kit.h"
21 #endif // OHOS_BUILD_ENABLE_SECURITY_PART
22 
23 #include "devicestatus_define.h"
24 
25 #undef LOG_TAG
26 #define LOG_TAG "InputEventSerialization"
27 
28 namespace OHOS {
29 namespace Msdp {
30 namespace DeviceStatus {
31 namespace Cooperate {
32 namespace {
33 constexpr int32_t MAX_KEY_SIZE { 395 };
34 } // namespace
35 
KeyEventToNetPacket(const std::shared_ptr<MMI::KeyEvent> key,NetPacket & pkt)36 int32_t InputEventSerialization::KeyEventToNetPacket(
37     const std::shared_ptr<MMI::KeyEvent> key, NetPacket &pkt)
38 {
39     CHKPR(key, RET_ERR);
40     if (SerializeInputEvent(key, pkt) != RET_OK) {
41         FI_HILOGE("Serialize input event failed");
42         return RET_ERR;
43     }
44     pkt << key->GetKeyCode() << key->GetKeyAction() << key->GetKeyIntention();
45     auto keys = key->GetKeyItems();
46     int32_t size = static_cast<int32_t>(keys.size());
47     if (size > MAX_KEY_SIZE) {
48         FI_HILOGE("Key exceeds the max range");
49         return RET_ERR;
50     }
51     pkt << size;
52     for (const auto &item : keys) {
53         pkt << item.GetKeyCode() << item.GetDownTime()
54             << item.GetDeviceId() << item.IsPressed() << item.GetUnicode();
55     }
56     pkt << key->GetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY)
57         << key->GetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY)
58         << key->GetFunctionKey(MMI::KeyEvent::SCROLL_LOCK_FUNCTION_KEY);
59     if (pkt.ChkRWError()) {
60         FI_HILOGE("Packet write key event failed");
61         return RET_ERR;
62     }
63     return RET_OK;
64 }
65 
NetPacketToKeyEvent(NetPacket & pkt,std::shared_ptr<MMI::KeyEvent> key)66 int32_t InputEventSerialization::NetPacketToKeyEvent(NetPacket &pkt, std::shared_ptr<MMI::KeyEvent> key)
67 {
68     CHKPR(key, RET_ERR);
69     if (DeserializeInputEvent(pkt, key) != RET_OK) {
70         FI_HILOGE("Deserialize input event failed");
71         return RET_ERR;
72     }
73     int32_t data = 0;
74     pkt >> data;
75     key->SetKeyCode(data);
76     pkt >> data;
77     key->SetKeyAction(data);
78     pkt >> data;
79     key->SetKeyIntention(data);
80     int32_t size = 0;
81     pkt >> size;
82     if (size > MAX_KEY_SIZE) {
83         FI_HILOGE("Key exceeds the max range");
84         return RET_ERR;
85     }
86     if (pkt.ChkRWError()) {
87         FI_HILOGE("Packet read size failed");
88         return RET_ERR;
89     }
90     bool isPressed = false;
91     for (int32_t i = 0; i < size; i++) {
92         MMI::KeyEvent::KeyItem keyItem;
93         pkt >> data;
94         keyItem.SetKeyCode(data);
95         int64_t datatime = 0;
96         pkt >> datatime;
97         keyItem.SetDownTime(datatime);
98         pkt >> data;
99         keyItem.SetDeviceId(data);
100         pkt >> isPressed;
101         if (pkt.ChkRWError()) {
102             FI_HILOGE("Packet read item isPressed failed");
103             return RET_ERR;
104         }
105         keyItem.SetPressed(isPressed);
106         uint32_t unicode;
107         pkt >> unicode;
108         keyItem.SetUnicode(unicode);
109         key->AddKeyItem(keyItem);
110     }
111     ReadFunctionKeys(pkt, key);
112     return RET_OK;
113 }
114 
ReadFunctionKeys(NetPacket & pkt,std::shared_ptr<MMI::KeyEvent> key)115 void InputEventSerialization::ReadFunctionKeys(NetPacket &pkt, std::shared_ptr<MMI::KeyEvent> key)
116 {
117     CHKPV(key);
118     bool state = false;
119     pkt >> state;
120     key->SetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY, state);
121     pkt >> state;
122     key->SetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY, state);
123     pkt >> state;
124     key->SetFunctionKey(MMI::KeyEvent::SCROLL_LOCK_FUNCTION_KEY, state);
125 }
126 
SwitchEventToNetPacket(const std::shared_ptr<MMI::SwitchEvent> swEvent,NetPacket & pkt)127 int32_t InputEventSerialization::SwitchEventToNetPacket(
128     const std::shared_ptr<MMI::SwitchEvent> swEvent, NetPacket &pkt)
129 {
130     if (SerializeInputEvent(swEvent, pkt) != RET_OK) {
131         FI_HILOGE("Serialize input event failed");
132         return RET_ERR;
133     }
134     pkt << swEvent->GetSwitchValue() << swEvent->GetSwitchMask();
135     if (pkt.ChkRWError()) {
136         FI_HILOGE("Packet write key event failed");
137         return RET_ERR;
138     }
139     return RET_OK;
140 }
141 
NetPacketToSwitchEvent(NetPacket & pkt,std::shared_ptr<MMI::SwitchEvent> swEvent)142 int32_t InputEventSerialization::NetPacketToSwitchEvent(NetPacket &pkt, std::shared_ptr<MMI::SwitchEvent> swEvent)
143 {
144     if (DeserializeInputEvent(pkt, swEvent) != RET_OK) {
145         FI_HILOGE("Deserialize input event failed");
146         return RET_ERR;
147     }
148     int32_t data = 0;
149     pkt >> data;
150     swEvent->SetSwitchValue(data);
151     pkt >> data;
152     swEvent->SetSwitchMask(data);
153     return RET_OK;
154 }
155 
SerializeInputEvent(std::shared_ptr<MMI::InputEvent> event,NetPacket & pkt)156 int32_t InputEventSerialization::SerializeInputEvent(std::shared_ptr<MMI::InputEvent> event, NetPacket &pkt)
157 {
158     CHKPR(event, ERROR_NULL_POINTER);
159     pkt << event->GetEventType() << event->GetId() << event->GetActionTime()
160         << event->GetAction() << event->GetActionStartTime() << event->GetSensorInputTime() << event->GetDeviceId()
161         << event->GetSourceType() << event->GetTargetDisplayId() << event->GetTargetWindowId()
162         << event->GetAgentWindowId() << event->GetFlag();
163     if (pkt.ChkRWError()) {
164         FI_HILOGE("Serialize packet is failed");
165         return RET_ERR;
166     }
167     return RET_OK;
168 }
169 
DeserializeInputEvent(NetPacket & pkt,std::shared_ptr<MMI::InputEvent> event)170 int32_t InputEventSerialization::DeserializeInputEvent(NetPacket &pkt, std::shared_ptr<MMI::InputEvent> event)
171 {
172     CHKPR(event, ERROR_NULL_POINTER);
173     int32_t tField = 0;
174     pkt >> tField;
175     pkt >> tField;
176     event->SetId(tField);
177     int64_t rField = 0;
178     pkt >> rField;
179     event->SetActionTime(rField);
180     pkt >> tField;
181     event->SetAction(tField);
182     pkt >> rField;
183     event->SetActionStartTime(rField);
184     uint64_t sensorTime;
185     pkt >> sensorTime;
186     event->SetSensorInputTime(sensorTime);
187     pkt >> tField;
188     event->SetDeviceId(tField);
189     pkt >> tField;
190     event->SetSourceType(tField);
191     pkt >> tField;
192     event->SetTargetDisplayId(tField);
193     pkt >> tField;
194     event->SetTargetWindowId(tField);
195     pkt >> tField;
196     event->SetAgentWindowId(tField);
197     uint32_t tFlag = MMI::InputEvent::EVENT_FLAG_NONE;
198     pkt >> tFlag;
199     if (pkt.ChkRWError()) {
200         FI_HILOGE("Deserialize packet is failed");
201         return RET_ERR;
202     }
203     event->AddFlag(tFlag);
204     return RET_OK;
205 }
206 
SerializeBaseInfo(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)207 int32_t InputEventSerialization::SerializeBaseInfo(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
208 {
209     int32_t pointerAction = event->GetPointerAction();
210     int32_t pointerId = event->GetPointerId();
211     int32_t sourceType = event->GetSourceType();
212     int32_t btnId = event->GetButtonId();
213     int32_t fingerCnt = event->GetFingerCount();
214     float zOrder = event->GetZOrder();
215 
216     pkt << pointerAction << pointerId << sourceType << btnId << fingerCnt << zOrder;
217     if (pkt.ChkRWError()) {
218         FI_HILOGE("Failed to serialize base information of pointer event");
219         return RET_ERR;
220     }
221     return RET_OK;
222 }
223 
DeserializeBaseInfo(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)224 int32_t InputEventSerialization::DeserializeBaseInfo(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
225 {
226     int32_t pointerAction {};
227     int32_t pointerId {};
228     int32_t sourceType {};
229     int32_t btnId {};
230     int32_t fingerCnt {};
231     float zOrder {};
232 
233     pkt >> pointerAction >> pointerId >> sourceType >> btnId >> fingerCnt >> zOrder;
234     if (pkt.ChkRWError()) {
235         FI_HILOGE("Failed to deserialize base information of pointer event");
236         return RET_ERR;
237     }
238     event->SetPointerAction(pointerAction);
239     event->SetPointerId(pointerId);
240     event->SetSourceType(sourceType);
241     event->SetButtonId(btnId);
242     event->SetFingerCount(fingerCnt);
243     event->SetZOrder(zOrder);
244     return RET_OK;
245 }
246 
SerializeAxes(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)247 int32_t InputEventSerialization::SerializeAxes(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
248 {
249     uint32_t axes = event->GetAxes();
250     pkt << axes;
251 
252     for (int32_t i = MMI::PointerEvent::AXIS_TYPE_UNKNOWN; i < MMI::PointerEvent::AXIS_TYPE_MAX; ++i) {
253         if (event->HasAxis(static_cast<MMI::PointerEvent::AxisType>(i))) {
254             double axisValue = event->GetAxisValue(static_cast<MMI::PointerEvent::AxisType>(i));
255             pkt << axisValue;
256         }
257     }
258     if (pkt.ChkRWError()) {
259         FI_HILOGE("Failed to serialize axes");
260         return RET_ERR;
261     }
262     return RET_OK;
263 }
264 
DeserializeAxes(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)265 int32_t InputEventSerialization::DeserializeAxes(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
266 {
267     uint32_t axes {};
268     double axisValue {};
269 
270     pkt >> axes;
271 
272     for (int32_t i = MMI::PointerEvent::AXIS_TYPE_UNKNOWN; i < MMI::PointerEvent::AXIS_TYPE_MAX; ++i) {
273         if (MMI::PointerEvent::HasAxis(axes, static_cast<MMI::PointerEvent::AxisType>(i))) {
274             pkt >> axisValue;
275             event->SetAxisValue(static_cast<MMI::PointerEvent::AxisType>(i), axisValue);
276         }
277     }
278     if (pkt.ChkRWError()) {
279         FI_HILOGE("Failed to deserialize axes");
280         return RET_ERR;
281     }
282     return RET_OK;
283 }
284 
SerializePressedButtons(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)285 int32_t InputEventSerialization::SerializePressedButtons(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
286 {
287     std::set<int32_t> pressedBtns = event->GetPressedButtons();
288     std::set<int32_t>::size_type nPressed = pressedBtns.size();
289 
290     pkt << nPressed;
291 
292     for (int32_t btnId : pressedBtns) {
293         pkt << btnId;
294     }
295     if (pkt.ChkRWError()) {
296         FI_HILOGE("Failed to serialize pressed buttons");
297         return RET_ERR;
298     }
299     return RET_OK;
300 }
301 
DeserializePressedButtons(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)302 int32_t InputEventSerialization::DeserializePressedButtons(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
303 {
304     std::set<int32_t>::size_type nPressed;
305     int32_t btnId {};
306 
307     pkt >> nPressed;
308 
309     for (; nPressed > 0; --nPressed) {
310         pkt >> btnId;
311         event->SetButtonPressed(btnId);
312     }
313     if (pkt.ChkRWError()) {
314         FI_HILOGE("Failed to deserialize pressed buttons");
315         return RET_ERR;
316     }
317     return RET_OK;
318 }
319 
SerializePointerItem(NetPacket & pkt,MMI::PointerEvent::PointerItem & item)320 int32_t InputEventSerialization::SerializePointerItem(NetPacket &pkt, MMI::PointerEvent::PointerItem &item)
321 {
322     pkt << item;
323     if (pkt.ChkRWError()) {
324         FI_HILOGE("Failed to serialize pointer item");
325         return RET_ERR;
326     }
327     return RET_OK;
328 }
329 
DeserializePointerItem(NetPacket & pkt,MMI::PointerEvent::PointerItem & item)330 int32_t InputEventSerialization::DeserializePointerItem(NetPacket &pkt, MMI::PointerEvent::PointerItem &item)
331 {
332     pkt >> item;
333     if (pkt.ChkRWError()) {
334         FI_HILOGE("Failed to deserialize pointer item");
335         return RET_ERR;
336     }
337     return RET_OK;
338 }
339 
SerializePointers(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)340 int32_t InputEventSerialization::SerializePointers(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
341 {
342     std::vector<int32_t> pointerIds = event->GetPointerIds();
343     std::vector<int32_t>::size_type nPointers = pointerIds.size();
344 
345     pkt << nPointers;
346 
347     for (const auto &pointerId : pointerIds) {
348         MMI::PointerEvent::PointerItem item;
349 
350         if (!event->GetPointerItem(pointerId, item)) {
351             FI_HILOGE("Get pointer item failed");
352             return RET_ERR;
353         }
354         if (SerializePointerItem(pkt, item) != RET_OK) {
355             FI_HILOGE("Failed to serialize one pointer item");
356             return RET_ERR;
357         }
358     }
359     if (pkt.ChkRWError()) {
360         FI_HILOGE("Failed to serialize pointers");
361         return RET_ERR;
362     }
363     return RET_OK;
364 }
365 
DeserializePointers(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)366 int32_t InputEventSerialization::DeserializePointers(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
367 {
368     std::vector<int32_t>::size_type nPointers;
369     pkt >> nPointers;
370 
371     for (; nPointers > 0; --nPointers) {
372         MMI::PointerEvent::PointerItem item;
373 
374         if (DeserializePointerItem(pkt, item) != RET_OK) {
375             FI_HILOGE("Failed to deserialize one pointer item");
376             return RET_ERR;
377         }
378         event->AddPointerItem(item);
379     }
380     if (pkt.ChkRWError()) {
381         FI_HILOGE("Failed to deserialize pointers");
382         return RET_ERR;
383     }
384     return RET_OK;
385 }
386 
SerializePressedKeys(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)387 int32_t InputEventSerialization::SerializePressedKeys(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
388 {
389     std::vector<int32_t> pressedKeys = event->GetPressedKeys();
390     std::vector<int32_t>::size_type nPressed = pressedKeys.size();
391 
392     pkt << nPressed;
393 
394     for (std::vector<int32_t>::size_type i = 0; i < nPressed; ++i) {
395         int32_t keyCode = pressedKeys[i];
396         pkt << keyCode;
397     }
398     if (pkt.ChkRWError()) {
399         FI_HILOGE("Failed to serialize pressed keys");
400         return RET_ERR;
401     }
402     return RET_OK;
403 }
404 
DeserializePressedKeys(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)405 int32_t InputEventSerialization::DeserializePressedKeys(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
406 {
407     std::vector<int32_t>::size_type nPressed {};
408     pkt >> nPressed;
409 
410     std::vector<int32_t> pressedKeys;
411     int32_t keyCode {};
412 
413     for (; nPressed > 0; --nPressed) {
414         pkt >> keyCode;
415         pressedKeys.push_back(keyCode);
416     }
417     if (pkt.ChkRWError()) {
418         FI_HILOGE("Failed to deserialize pressed keys");
419         return RET_ERR;
420     }
421     event->SetPressedKeys(pressedKeys);
422     return RET_OK;
423 }
424 
SerializeBuffer(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)425 int32_t InputEventSerialization::SerializeBuffer(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
426 {
427     std::vector<uint8_t> buffer = event->GetBuffer();
428     if (buffer.size() > MMI::ExtraData::MAX_BUFFER_SIZE) {
429         FI_HILOGE("buffer is oversize:%{public}zu", buffer.size());
430         return RET_ERR;
431     }
432     std::vector<uint8_t>::size_type bufSize = buffer.size();
433     pkt << bufSize;
434 
435     for (std::vector<uint8_t>::size_type i = 0; i < bufSize; ++i) {
436         uint8_t item = buffer[i];
437         pkt << item;
438     }
439     if (pkt.ChkRWError()) {
440         FI_HILOGE("Failed to serialize buffer");
441         return RET_ERR;
442     }
443     return RET_OK;
444 }
445 
DeserializeBuffer(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)446 int32_t InputEventSerialization::DeserializeBuffer(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
447 {
448     std::vector<uint8_t>::size_type bufSize {};
449     pkt >> bufSize;
450 
451     std::vector<uint8_t> buffer;
452     uint8_t item {};
453 
454     for (; bufSize > 0; --bufSize) {
455         pkt >> item;
456         buffer.push_back(item);
457     }
458     if (pkt.ChkRWError()) {
459         FI_HILOGE("Failed to deserialize buffer");
460         return RET_ERR;
461     }
462     event->SetBuffer(buffer);
463     return RET_OK;
464 }
465 
Marshalling(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)466 int32_t InputEventSerialization::Marshalling(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
467 {
468     CALL_DEBUG_ENTER;
469     CHKPR(event, ERROR_NULL_POINTER);
470 
471     if (SerializeInputEvent(event, pkt) != RET_OK) {
472         FI_HILOGE("Serialize input event failed");
473         return RET_ERR;
474     }
475     if (SerializeBaseInfo(event, pkt) != RET_OK) {
476         FI_HILOGE("Failed to serialize base information of pointer event");
477         return RET_ERR;
478     }
479     if (SerializeAxes(event, pkt) != RET_OK) {
480         FI_HILOGE("Failed to serialize axes");
481         return RET_ERR;
482     }
483     if (SerializePressedButtons(event, pkt) != RET_OK) {
484         FI_HILOGE("Failed to serialize pressed buttons");
485         return RET_ERR;
486     }
487     if (SerializePointers(event, pkt) != RET_OK) {
488         FI_HILOGE("Failed to serialize pointers");
489         return RET_ERR;
490     }
491     if (SerializePressedKeys(event, pkt) != RET_OK) {
492         FI_HILOGE("Failed to serialize pressed keys");
493         return RET_ERR;
494     }
495     if (SerializeBuffer(event, pkt) != RET_OK) {
496         FI_HILOGE("Failed to serialize buffer");
497         return RET_ERR;
498     }
499     return RET_OK;
500 }
501 
Unmarshalling(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)502 int32_t InputEventSerialization::Unmarshalling(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
503 {
504     CALL_DEBUG_ENTER;
505     CHKPR(event, ERROR_NULL_POINTER);
506 
507     if (DeserializeInputEvent(pkt, event) != RET_OK) {
508         FI_HILOGE("Failed to deserialize input event");
509         return RET_ERR;
510     }
511     if (DeserializeBaseInfo(pkt, event) != RET_OK) {
512         FI_HILOGE("Failed to deserialize base information of pointer event");
513         return RET_ERR;
514     }
515     if (DeserializeAxes(pkt, event) != RET_OK) {
516         FI_HILOGE("Failed to deserialize axes");
517         return RET_ERR;
518     }
519     if (DeserializePressedButtons(pkt, event) != RET_OK) {
520         FI_HILOGE("Failed to deserialize pressed buttons");
521         return RET_ERR;
522     }
523     if (DeserializePointers(pkt, event) != RET_OK) {
524         FI_HILOGE("Failed to deserialize pointers");
525         return RET_ERR;
526     }
527     if (DeserializePressedKeys(pkt, event) != RET_OK) {
528         FI_HILOGE("Failed to deserialize pressed keys");
529         return RET_ERR;
530     }
531     if (DeserializeBuffer(pkt, event) != RET_OK) {
532         FI_HILOGE("Failed to deserialize buffer");
533         return RET_ERR;
534     }
535     return RET_OK;
536 }
537 
538 #ifdef OHOS_BUILD_ENABLE_SECURITY_PART
MarshallingEnhanceData(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)539 int32_t InputEventSerialization::MarshallingEnhanceData(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
540 {
541     CHKPR(event, ERROR_NULL_POINTER);
542     int32_t pointerId = event->GetPointerId();
543     MMI::PointerEvent::PointerItem pointerItem;
544     if (!event->GetPointerItem(pointerId, pointerItem)) {
545         FI_HILOGE("Can't find pointer item, pointer:%{public}d", pointerId);
546         return RET_ERR;
547     }
548     SecCompPointEvent *secCompPointEvent = static_cast<SecCompPointEvent*>(malloc(sizeof(SecCompPointEvent)));
549     if (secCompPointEvent == NULL) {
550         FI_HILOGE("Malloc failed");
551         return RET_ERR;
552     }
553     secCompPointEvent->touchX = pointerItem.GetDisplayX();
554     secCompPointEvent->touchY = pointerItem.GetDisplayY();
555     secCompPointEvent->timeStamp = event->GetActionTime();
556     uint32_t dataLen = sizeof(*secCompPointEvent);
557     uint8_t outBuf[MAX_HMAC_SIZE] = { 0 };
558     uint8_t* enHanceData = reinterpret_cast<uint8_t *>(&outBuf[0]);
559     uint32_t enHanceDataLen = MAX_HMAC_SIZE;
560     int32_t result = Security::SecurityComponent::SecCompEnhanceKit::GetPointerEventEnhanceData(secCompPointEvent,
561         dataLen, enHanceData, enHanceDataLen);
562     if (result != 0 || enHanceDataLen > MAX_HMAC_SIZE) {
563         pkt << 0;
564         free(secCompPointEvent);
565         secCompPointEvent = nullptr;
566         FI_HILOGD("GetPointerEventEnhanceData failed!");
567         return RET_ERR;
568     }
569     pkt << enHanceDataLen;
570     std::vector<uint8_t> realBuf;
571     for (size_t i = 0; i < enHanceDataLen; i++) {
572         realBuf.push_back(enHanceData[i]);
573         pkt << realBuf[i];
574     }
575     free(secCompPointEvent);
576     secCompPointEvent = nullptr;
577     if (pkt.ChkRWError()) {
578         FI_HILOGE("Marshalling enhanceData failed");
579         return RET_ERR;
580     }
581     return RET_OK;
582 }
583 
UnmarshallingEnhanceData(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)584 int32_t InputEventSerialization::UnmarshallingEnhanceData(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
585 {
586     uint32_t enHanceDataLen;
587     pkt >> enHanceDataLen;
588     if (enHanceDataLen == 0) {
589         return RET_OK;
590     }
591     uint8_t enhanceDataBuf[enHanceDataLen];
592     std::vector<uint8_t> enhanceData;
593     for (size_t i = 0; i < enHanceDataLen; i++) {
594         pkt >> enhanceDataBuf[i];
595         enhanceData.push_back(enhanceDataBuf[i]);
596     }
597     if (pkt.ChkRWError()) {
598         FI_HILOGE("UnmarshallingEnhanceData pointer event failed");
599         return RET_ERR;
600     }
601     event->SetEnhanceData(enhanceData);
602     return RET_OK;
603 }
604 
605 struct keyEventEnhanceData {
606     int64_t timestamp;
607     int32_t keyCode;
608 };
609 
MarshallingEnhanceData(std::shared_ptr<MMI::KeyEvent> event,NetPacket & pkt)610 int32_t InputEventSerialization::MarshallingEnhanceData(std::shared_ptr<MMI::KeyEvent> event, NetPacket &pkt)
611 {
612     CHKPR(event, ERROR_NULL_POINTER);
613     struct keyEventEnhanceData secCompKeyEvent;
614     secCompKeyEvent.timestamp = event->GetActionTime();
615     secCompKeyEvent.keyCode = event->GetKeyCode();
616     uint32_t dataLen = sizeof(secCompKeyEvent);
617     uint8_t outBuf[MAX_HMAC_SIZE] = { 0 };
618     uint8_t* enHanceData = reinterpret_cast<uint8_t *>(&outBuf[0]);
619     uint32_t enHanceDataLen = MAX_HMAC_SIZE;
620     int32_t result = Security::SecurityComponent::SecCompEnhanceKit::GetPointerEventEnhanceData(&secCompKeyEvent,
621         dataLen, enHanceData, enHanceDataLen);
622     if (result != 0 || enHanceDataLen > MAX_HMAC_SIZE) {
623         pkt << 0;
624         FI_HILOGD("GetKeyEventEnhanceData failed!");
625         return RET_ERR;
626     }
627     pkt << enHanceDataLen;
628     std::vector<uint8_t> realBuf;
629     for (size_t i = 0; i < enHanceDataLen; i++) {
630         realBuf.push_back(enHanceData[i]);
631         pkt << realBuf[i];
632     }
633     if (pkt.ChkRWError()) {
634         FI_HILOGE("Marshalling enhanceData failed");
635         return RET_ERR;
636     }
637     return RET_OK;
638 }
639 
UnmarshallingEnhanceData(NetPacket & pkt,std::shared_ptr<MMI::KeyEvent> event)640 int32_t InputEventSerialization::UnmarshallingEnhanceData(NetPacket &pkt, std::shared_ptr<MMI::KeyEvent> event)
641 {
642     uint32_t enHanceDataLen;
643     pkt >> enHanceDataLen;
644     if (enHanceDataLen == 0 || enHanceDataLen > MAX_HMAC_SIZE) {
645         return RET_OK;
646     }
647     uint8_t enhanceDataBuf[enHanceDataLen];
648     std::vector<uint8_t> enhanceData;
649     for (size_t i = 0; i < enHanceDataLen; i++) {
650         pkt >> enhanceDataBuf[i];
651         enhanceData.push_back(enhanceDataBuf[i]);
652     }
653     if (pkt.ChkRWError()) {
654         FI_HILOGE("UnmarshallingEnhanceData key event failed");
655         return RET_ERR;
656     }
657     event->SetEnhanceData(enhanceData);
658     return RET_OK;
659 }
660 #endif // OHOS_BUILD_ENABLE_SECURITY_PART
661 } // namespace Cooperate
662 } // namespace DeviceStatus
663 } // namespace Msdp
664 } // namespace OHOS
665