summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp68
1 files changed, 4 insertions, 64 deletions
diff --git a/protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp b/protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp
index d46baddf39..c10ad1dfd7 100644
--- a/protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp
+++ b/protocols/Telegram/tdlib/td/td/mtproto/TcpTransport.cpp
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -69,7 +69,7 @@ void IntermediateTransport::write_prepare_inplace(BufferWriter *message, bool qu
message->confirm_append(append.size());
}
- as<uint32>(message->as_slice().begin()) = static_cast<uint32>(size + append_size);
+ as<uint32>(message->as_mutable_slice().begin()) = static_cast<uint32>(size + append_size);
}
void IntermediateTransport::init_output_stream(ChainBufferWriter *stream) {
@@ -77,64 +77,6 @@ void IntermediateTransport::init_output_stream(ChainBufferWriter *stream) {
stream->append(Slice(reinterpret_cast<const char *>(&magic), 4));
}
-size_t AbridgedTransport::read_from_stream(ChainBufferReader *stream, BufferSlice *message, uint32 *quick_ack) {
- if (stream->empty()) {
- return 1;
- }
- uint8 byte = 0;
- stream->clone().advance(1, MutableSlice(&byte, 1));
- size_t header_size;
- uint32 data_size;
- if (byte < 0x7f) {
- header_size = 1;
- data_size = byte * 4u;
- } else {
- if (stream->size() < 4) {
- return 4;
- }
- header_size = 4;
- stream->clone().advance(4, MutableSlice(reinterpret_cast<char *>(&data_size), sizeof(data_size)));
- data_size >>= 8;
- data_size = data_size * 4;
- }
-
- size_t total_size = header_size + data_size;
- if (stream->size() < total_size) {
- // optimization
- // stream->make_solid(total_size);
- return total_size;
- }
-
- stream->advance(header_size);
- *message = stream->cut_head(data_size).move_as_buffer_slice();
- return 0;
-}
-
-void AbridgedTransport::write_prepare_inplace(BufferWriter *message, bool quick_ack) {
- CHECK(!quick_ack);
- size_t size = message->size() / 4;
- CHECK(size % 4 == 0);
- CHECK(size < 1 << 24);
-
- size_t prepend_size = size >= 0x7f ? 4 : 1;
-
- MutableSlice prepend = message->prepare_prepend();
- CHECK(prepend.size() >= prepend_size);
- message->confirm_prepend(prepend_size);
-
- MutableSlice data = message->as_slice();
- if (size >= 0x7f) {
- uint32 size_encoded = 0x7f + (static_cast<uint32>(size) << 8);
- as<uint32>(data.begin()) = size_encoded;
- } else {
- as<uint8>(data.begin()) = static_cast<uint8>(size);
- }
-}
-
-void AbridgedTransport::init_output_stream(ChainBufferWriter *stream) {
- stream->append("\xef");
-}
-
void ObfuscatedTransport::init(ChainBufferReader *input, ChainBufferWriter *output) {
input_ = input;
output_ = output;
@@ -164,8 +106,6 @@ void ObfuscatedTransport::init(ChainBufferReader *input, ChainBufferWriter *outp
}
break;
}
- // TODO: It is actually IntermediateTransport::init_output_stream, so it will work only with
- // TransportImpl==IntermediateTransport
as<uint32>(header_slice.begin() + 56) = impl_.with_padding() ? 0xdddddddd : 0xeeeeeeee;
if (dc_id_ != 0) {
as<int16>(header_slice.begin() + 60) = dc_id_;
@@ -181,7 +121,7 @@ void ObfuscatedTransport::init(ChainBufferReader *input, ChainBufferWriter *outp
state.init();
state.feed(as_slice(key));
state.feed(proxy_secret);
- state.extract(as_slice(key));
+ state.extract(as_mutable_slice(key));
}
};
fix_key(key);
@@ -213,7 +153,7 @@ Result<size_t> ObfuscatedTransport::read_next(BufferSlice *message, uint32 *quic
void ObfuscatedTransport::write(BufferWriter &&message, bool quick_ack) {
impl_.write_prepare_inplace(&message, quick_ack);
- output_state_.encrypt(message.as_slice(), message.as_slice());
+ output_state_.encrypt(message.as_slice(), message.as_mutable_slice());
if (secret_.emulate_tls()) {
do_write_tls(std::move(message));
} else {