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