summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/mtproto/Handshake.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/mtproto/Handshake.h')
-rw-r--r--protocols/Telegram/tdlib/td/td/mtproto/Handshake.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/td/mtproto/Handshake.h b/protocols/Telegram/tdlib/td/td/mtproto/Handshake.h
new file mode 100644
index 0000000000..8c7ae7baac
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/td/mtproto/Handshake.h
@@ -0,0 +1,102 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// 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)
+//
+#pragma once
+
+#include "td/mtproto/AuthKey.h"
+#include "td/mtproto/crypto.h"
+
+#include "td/utils/buffer.h"
+#include "td/utils/int_types.h"
+#include "td/utils/Slice.h"
+#include "td/utils/Status.h"
+
+namespace td {
+class Storer;
+namespace mtproto {
+class AuthKeyHandshakeContext {
+ public:
+ virtual ~AuthKeyHandshakeContext() = default;
+ virtual DhCallback *get_dh_callback() = 0;
+ virtual PublicRsaKeyInterface *get_public_rsa_key_interface() = 0;
+};
+class AuthKeyHandshake {
+ public:
+ class Callback {
+ public:
+ Callback() = default;
+ Callback(const Callback &) = delete;
+ Callback &operator=(const Callback &) = delete;
+ virtual ~Callback() = default;
+ virtual void send_no_crypto(const Storer &storer) = 0;
+ };
+ using Context = AuthKeyHandshakeContext;
+ enum class Mode { Unknown, Main, Temp };
+ AuthKey auth_key;
+ double server_time_diff = 0;
+ uint64 server_salt = 0;
+
+ bool is_ready_for_start();
+ Status start_main(Callback *connection) TD_WARN_UNUSED_RESULT;
+ Status start_tmp(Callback *connection, int32 expire_in) TD_WARN_UNUSED_RESULT;
+
+ bool is_ready_for_message(const UInt128 &message_nonce);
+
+ bool is_ready_for_finish();
+ void on_finish();
+
+ explicit AuthKeyHandshake(int32 expire_in = 0) {
+ if (expire_in == 0) {
+ mode_ = Mode::Main;
+ } else {
+ mode_ = Mode::Temp;
+ expire_in_ = expire_in;
+ }
+ }
+ void init_main() {
+ clear();
+ mode_ = Mode::Main;
+ }
+ void init_temp(int32 expire_in) {
+ clear();
+ mode_ = Mode::Temp;
+ expire_in_ = expire_in;
+ }
+ void resume(Callback *connection);
+ Status on_message(Slice message, Callback *connection, Context *context) TD_WARN_UNUSED_RESULT;
+ bool is_ready() {
+ return is_ready_for_finish();
+ }
+ void clear();
+
+ private:
+ using State = enum { Start, ResPQ, ServerDHParams, DHGenResponse, Finish };
+ State state_ = Start;
+ Mode mode_ = Mode::Unknown;
+ int32 expire_in_;
+ double expire_at_ = 0;
+
+ UInt128 nonce;
+ UInt128 server_nonce;
+ UInt256 new_nonce;
+ UInt256 tmp_aes_key;
+ UInt256 tmp_aes_iv;
+
+ BufferSlice last_query_;
+
+ template <class DataT>
+ Result<size_t> fill_data_with_hash(uint8 *data_with_hash, const DataT &data) TD_WARN_UNUSED_RESULT;
+
+ void send(Callback *connection, const Storer &storer);
+ void do_send(Callback *connection, const Storer &storer);
+
+ Status on_start(Callback *connection) TD_WARN_UNUSED_RESULT;
+ Status on_res_pq(Slice message, Callback *connection, PublicRsaKeyInterface *public_rsa_key) TD_WARN_UNUSED_RESULT;
+ Status on_server_dh_params(Slice message, Callback *connection, DhCallback *dh_callback) TD_WARN_UNUSED_RESULT;
+ Status on_dh_gen_response(Slice message, Callback *connection) TD_WARN_UNUSED_RESULT;
+};
+} // namespace mtproto
+} // namespace td