172833b2fba97751b31b27422d117b05f718760fdBrian Duddie/*
272833b2fba97751b31b27422d117b05f718760fdBrian Duddie * Copyright (C) 2017 The Android Open Source Project
372833b2fba97751b31b27422d117b05f718760fdBrian Duddie *
472833b2fba97751b31b27422d117b05f718760fdBrian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
572833b2fba97751b31b27422d117b05f718760fdBrian Duddie * you may not use this file except in compliance with the License.
672833b2fba97751b31b27422d117b05f718760fdBrian Duddie * You may obtain a copy of the License at
772833b2fba97751b31b27422d117b05f718760fdBrian Duddie *
872833b2fba97751b31b27422d117b05f718760fdBrian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
972833b2fba97751b31b27422d117b05f718760fdBrian Duddie *
1072833b2fba97751b31b27422d117b05f718760fdBrian Duddie * Unless required by applicable law or agreed to in writing, software
1172833b2fba97751b31b27422d117b05f718760fdBrian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
1272833b2fba97751b31b27422d117b05f718760fdBrian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372833b2fba97751b31b27422d117b05f718760fdBrian Duddie * See the License for the specific language governing permissions and
1472833b2fba97751b31b27422d117b05f718760fdBrian Duddie * limitations under the License.
1572833b2fba97751b31b27422d117b05f718760fdBrian Duddie */
1672833b2fba97751b31b27422d117b05f718760fdBrian Duddie
177621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#include "chre/platform/shared/host_protocol_common.h"
1872833b2fba97751b31b27422d117b05f718760fdBrian Duddie
197621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie#include <string.h>
2072833b2fba97751b31b27422d117b05f718760fdBrian Duddie
2172833b2fba97751b31b27422d117b05f718760fdBrian Duddie#include "chre/platform/shared/host_messages_generated.h"
2272833b2fba97751b31b27422d117b05f718760fdBrian Duddie
2372833b2fba97751b31b27422d117b05f718760fdBrian Duddieusing flatbuffers::FlatBufferBuilder;
247621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddieusing flatbuffers::Offset;
257621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddieusing flatbuffers::Vector;
2672833b2fba97751b31b27422d117b05f718760fdBrian Duddie
2772833b2fba97751b31b27422d117b05f718760fdBrian Duddienamespace chre {
2872833b2fba97751b31b27422d117b05f718760fdBrian Duddie
29f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddievoid HostProtocolCommon::encodeNanoappMessage(
30f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie    FlatBufferBuilder& builder, uint64_t appId, uint32_t messageType,
31f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie    uint16_t hostEndpoint, const void *messageData, size_t messageDataLen) {
32f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie  auto messageDataOffset = builder.CreateVector(
33f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie      static_cast<const uint8_t *>(messageData), messageDataLen);
34f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie
35f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie  auto nanoappMessage = fbs::CreateNanoappMessage(
36f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie      builder, appId, messageType, hostEndpoint, messageDataOffset);
37f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie  finalize(builder, fbs::ChreMessage::NanoappMessage, nanoappMessage.Union());
38f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie}
39f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie
407621b3267fd2ff1068d7aa7d75441d68646226abBrian DuddieOffset<Vector<int8_t>> HostProtocolCommon::addStringAsByteVector(
417621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie    FlatBufferBuilder& builder, const char *str) {
427621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie  return builder.CreateVector(reinterpret_cast<const int8_t *>(str),
437621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie                              strlen(str) + 1);
447621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie}
457621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie
46f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddievoid HostProtocolCommon::finalize(
47f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie    FlatBufferBuilder& builder, fbs::ChreMessage messageType,
48f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie    flatbuffers::Offset<void> message, uint16_t hostClientId) {
49f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie  fbs::HostAddress hostAddr(hostClientId);
50f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie  auto container = fbs::CreateMessageContainer(
51f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie      builder, messageType, message, &hostAddr);
52f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie  builder.Finish(container);
53f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie}
54f685db3a6b34f8dd6942964ae99836bda87c8134Brian Duddie
557621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddiebool HostProtocolCommon::verifyMessage(const void *message, size_t messageLen) {
567621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie  bool valid = false;
577621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie
587621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie  if (message != nullptr) {
597621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie    flatbuffers::Verifier verifier(static_cast<const uint8_t *>(message),
607621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie                                   messageLen);
617621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie
627621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie    valid = fbs::VerifyMessageContainerBuffer(verifier);
637621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie  }
647621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie
657621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie  return valid;
667621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie}
677621b3267fd2ff1068d7aa7d75441d68646226abBrian Duddie
6872833b2fba97751b31b27422d117b05f718760fdBrian Duddie
6972833b2fba97751b31b27422d117b05f718760fdBrian Duddie}  // namespace chre
70