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