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