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