1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "cast/common/channel/message_framer.h" 6 7 #include <stdlib.h> 8 #include <string.h> 9 10 #include <limits> 11 12 #include "cast/common/channel/proto/cast_channel.pb.h" 13 #include "util/big_endian.h" 14 #include "util/osp_logging.h" 15 16 namespace openscreen { 17 namespace cast { 18 namespace message_serialization { 19 20 namespace { 21 22 static constexpr size_t kHeaderSize = sizeof(uint32_t); 23 24 // Cast specifies a max message body size of 64 KiB. 25 static constexpr size_t kMaxBodySize = 65536; 26 27 } // namespace 28 Serialize(const::cast::channel::CastMessage & message)29ErrorOr<std::vector<uint8_t>> Serialize( 30 const ::cast::channel::CastMessage& message) { 31 const size_t message_size = message.ByteSizeLong(); 32 if (message_size > kMaxBodySize || message_size == 0) { 33 return Error::Code::kCastV2InvalidMessage; 34 } 35 std::vector<uint8_t> out(message_size + kHeaderSize, 0); 36 WriteBigEndian<uint32_t>(message_size, out.data()); 37 if (!message.SerializeToArray(&out[kHeaderSize], message_size)) { 38 return Error::Code::kCastV2InvalidMessage; 39 } 40 return out; 41 } 42 TryDeserialize(absl::Span<const uint8_t> input)43ErrorOr<DeserializeResult> TryDeserialize(absl::Span<const uint8_t> input) { 44 if (input.size() < kHeaderSize) { 45 return Error::Code::kInsufficientBuffer; 46 } 47 48 const uint32_t message_size = ReadBigEndian<uint32_t>(input.data()); 49 if (message_size > kMaxBodySize) { 50 return Error::Code::kCastV2InvalidMessage; 51 } 52 53 if (input.size() < (kHeaderSize + message_size)) { 54 return Error::Code::kInsufficientBuffer; 55 } 56 57 DeserializeResult result; 58 if (!result.message.ParseFromArray(input.data() + kHeaderSize, 59 message_size)) { 60 return Error::Code::kCastV2InvalidMessage; 61 } 62 result.length = kHeaderSize + message_size; 63 64 return result; 65 } 66 67 } // namespace message_serialization 68 } // namespace cast 69 } // namespace openscreen 70