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