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