mtproto 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.env.example +4 -0
- data/ext/aes_ige/extconf.rb +3 -9
- data/ext/factorization/extconf.rb +2 -0
- data/lib/mtproto/auth_key_generator.rb +66 -103
- data/lib/mtproto/binary.rb +21 -0
- data/lib/mtproto/client/api/check_password.rb +41 -0
- data/lib/mtproto/client/api/export_login_token.rb +27 -0
- data/lib/mtproto/client/api/get_updates_difference.rb +21 -0
- data/lib/mtproto/client/api/get_updates_state.rb +14 -0
- data/lib/mtproto/client/api/get_users.rb +14 -0
- data/lib/mtproto/client/api/import_login_token.rb +23 -0
- data/lib/mtproto/client/api/send_code.rb +21 -0
- data/lib/mtproto/client/api/sign_in.rb +27 -0
- data/lib/mtproto/client/api.rb +28 -0
- data/lib/mtproto/client/rpc/response.rb +63 -0
- data/lib/mtproto/client/rpc.rb +67 -107
- data/lib/mtproto/client.rb +176 -31
- data/lib/mtproto/crypto/dh_key_exchange.rb +1 -2
- data/lib/mtproto/crypto/dh_validator.rb +17 -19
- data/lib/mtproto/crypto/factorization.rb +1 -1
- data/lib/mtproto/crypto/rsa_key.rb +2 -2
- data/lib/mtproto/crypto/srp.rb +117 -0
- data/lib/mtproto/delegate_methods.rb +11 -0
- data/lib/mtproto/message/message.rb +85 -0
- data/lib/mtproto/session.rb +1 -1
- data/lib/mtproto/tl/constructors.rb +2269 -0
- data/lib/mtproto/tl/object.rb +25 -0
- data/lib/mtproto/tl/objects/account_password.rb +72 -0
- data/lib/mtproto/tl/objects/authorization.rb +73 -0
- data/lib/mtproto/tl/objects/check_password.rb +46 -0
- data/lib/mtproto/tl/objects/client_dh_inner_data.rb +47 -0
- data/lib/mtproto/tl/objects/dh_gen_response.rb +50 -0
- data/lib/mtproto/tl/objects/export_login_token.rb +51 -0
- data/lib/mtproto/tl/objects/get_config.rb +15 -0
- data/lib/mtproto/tl/objects/get_difference.rb +36 -0
- data/lib/mtproto/tl/objects/get_password.rb +15 -0
- data/lib/mtproto/tl/objects/get_state.rb +15 -0
- data/lib/mtproto/tl/objects/get_users.rb +20 -0
- data/lib/mtproto/tl/objects/help_config.rb +77 -0
- data/lib/mtproto/tl/objects/import_login_token.rb +39 -0
- data/lib/mtproto/tl/objects/init_connection.rb +59 -0
- data/lib/mtproto/tl/objects/invoke_with_layer.rb +22 -0
- data/lib/mtproto/tl/objects/login_token.rb +82 -0
- data/lib/mtproto/tl/objects/pq_inner_data.rb +69 -0
- data/lib/mtproto/tl/objects/req_dh_params.rb +65 -0
- data/lib/mtproto/tl/objects/req_pq_multi.rb +23 -0
- data/lib/mtproto/tl/objects/res_pq.rb +75 -0
- data/lib/mtproto/tl/objects/send_code.rb +50 -0
- data/lib/mtproto/tl/objects/sent_code.rb +79 -0
- data/lib/mtproto/tl/objects/server_dh_inner_data.rb +74 -0
- data/lib/mtproto/tl/objects/server_dh_params.rb +53 -0
- data/lib/mtproto/tl/objects/set_client_dh_params.rb +48 -0
- data/lib/mtproto/tl/objects/sign_in.rb +47 -0
- data/lib/mtproto/tl/objects/update.rb +80 -0
- data/lib/mtproto/tl/objects/update_short.rb +22 -0
- data/lib/mtproto/tl/objects/update_short_message.rb +67 -0
- data/lib/mtproto/tl/objects/updates_difference.rb +157 -0
- data/lib/mtproto/tl/objects/updates_state.rb +37 -0
- data/lib/mtproto/tl/objects/users.rb +86 -0
- data/lib/mtproto/transport/abridged_packet_codec.rb +35 -12
- data/lib/mtproto/transport/connection.rb +23 -0
- data/lib/mtproto/transport/errors.rb +11 -0
- data/lib/mtproto/transport/packet.rb +19 -0
- data/lib/mtproto/transport/tcp_connection.rb +57 -46
- data/lib/mtproto/{tl → type}/bad_msg_notification.rb +11 -11
- data/lib/mtproto/{tl → type}/client_dh_inner_data.rb +1 -1
- data/lib/mtproto/{tl → type}/gzip_packed.rb +6 -4
- data/lib/mtproto/{tl → type}/message.rb +3 -3
- data/lib/mtproto/{tl → type}/msg_container.rb +1 -1
- data/lib/mtproto/{tl → type}/new_session_created.rb +1 -1
- data/lib/mtproto/{tl/p_q_inner_data.rb → type/pq_inner_data.rb} +1 -1
- data/lib/mtproto/{tl → type}/rpc_error.rb +1 -2
- data/lib/mtproto/{tl → type}/serializer.rb +1 -1
- data/lib/mtproto/{tl → type}/server_dh_inner_data.rb +1 -1
- data/lib/mtproto/updates_poller.rb +37 -33
- data/lib/mtproto/version.rb +1 -1
- data/lib/mtproto.rb +21 -22
- data/scripts/generate_constructors.rb +65 -0
- metadata +80 -49
- data/lib/mtproto/rpc/get_config.rb +0 -37
- data/lib/mtproto/rpc/get_contacts.rb +0 -22
- data/lib/mtproto/rpc/get_updates_difference.rb +0 -33
- data/lib/mtproto/rpc/get_updates_state.rb +0 -22
- data/lib/mtproto/rpc/get_users.rb +0 -22
- data/lib/mtproto/rpc/ping.rb +0 -26
- data/lib/mtproto/rpc/send_code.rb +0 -44
- data/lib/mtproto/rpc/send_message.rb +0 -31
- data/lib/mtproto/rpc/sign_in.rb +0 -52
- data/lib/mtproto/tl/auth_key/dh_gen_response.rb +0 -37
- data/lib/mtproto/tl/auth_key/req_dh_params.rb +0 -31
- data/lib/mtproto/tl/auth_key/req_pq_multi.rb +0 -18
- data/lib/mtproto/tl/auth_key/res_pq.rb +0 -62
- data/lib/mtproto/tl/auth_key/server_dh_params.rb +0 -43
- data/lib/mtproto/tl/auth_key/set_client_dh_params.rb +0 -25
- data/lib/mtproto/tl/code_settings.rb +0 -25
- data/lib/mtproto/tl/config.rb +0 -124
- data/lib/mtproto/tl/method_builder.rb +0 -29
- data/lib/mtproto/tl/rpc/auth/authorization.rb +0 -107
- data/lib/mtproto/tl/rpc/auth/send_code.rb +0 -28
- data/lib/mtproto/tl/rpc/auth/sent_code.rb +0 -36
- data/lib/mtproto/tl/rpc/auth/sign_in.rb +0 -32
- data/lib/mtproto/tl/rpc/contacts/contacts.rb +0 -155
- data/lib/mtproto/tl/rpc/contacts/get_contacts.rb +0 -18
- data/lib/mtproto/tl/rpc/help/config.rb +0 -35
- data/lib/mtproto/tl/rpc/help/get_config.rb +0 -17
- data/lib/mtproto/tl/rpc/messages/send_message.rb +0 -43
- data/lib/mtproto/tl/rpc/messages/updates.rb +0 -87
- data/lib/mtproto/tl/rpc/ping.rb +0 -18
- data/lib/mtproto/tl/rpc/pong.rb +0 -46
- data/lib/mtproto/tl/rpc/updates/difference.rb +0 -332
- data/lib/mtproto/tl/rpc/updates/get_difference.rb +0 -42
- data/lib/mtproto/tl/rpc/updates/get_state.rb +0 -17
- data/lib/mtproto/tl/rpc/updates/state.rb +0 -59
- data/lib/mtproto/tl/rpc/users/get_users.rb +0 -25
- data/lib/mtproto/tl/rpc/users/users.rb +0 -99
- data/lib/mtproto/tl/sent_code.rb +0 -128
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module MTProto
|
|
4
|
+
class Message
|
|
5
|
+
include Binary
|
|
6
|
+
extend Binary
|
|
7
|
+
|
|
8
|
+
attr_reader :auth_key_id, :msg_id, :body,
|
|
9
|
+
:msg_key, :encrypted_data,
|
|
10
|
+
:server_salt, :session_id, :seq_no
|
|
11
|
+
|
|
12
|
+
def initialize(body, msg_id: self.class.generate_msg_id, auth_key_id: 0)
|
|
13
|
+
@auth_key_id = auth_key_id
|
|
14
|
+
@msg_id = msg_id
|
|
15
|
+
@body = body
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.parse(packet)
|
|
19
|
+
data = packet.data
|
|
20
|
+
auth_key_id = b_u64(data[0, 8])
|
|
21
|
+
|
|
22
|
+
if auth_key_id.zero?
|
|
23
|
+
parse_unencrypted(data)
|
|
24
|
+
else
|
|
25
|
+
parse_encrypted(data, auth_key_id)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def encrypted?
|
|
30
|
+
!@auth_key_id.zero?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def decrypt(auth_key:, sender: :server)
|
|
34
|
+
raise 'Message is not encrypted' unless encrypted?
|
|
35
|
+
|
|
36
|
+
keys = Crypto::MessageKey.derive_aes_key_iv(auth_key, @msg_key, sender: sender)
|
|
37
|
+
plaintext = Crypto::AES_IGE.decrypt_ige(@encrypted_data, keys[:aes_key], keys[:aes_iv])
|
|
38
|
+
|
|
39
|
+
expected_msg_key = Crypto::MessageKey.generate_msg_key(auth_key, plaintext, sender: sender)
|
|
40
|
+
raise 'msg_key mismatch!' unless @msg_key == expected_msg_key
|
|
41
|
+
|
|
42
|
+
offset = 0
|
|
43
|
+
@server_salt = plaintext[offset, 8].unpack1('Q<')
|
|
44
|
+
offset += 8
|
|
45
|
+
@session_id = plaintext[offset, 8].unpack1('Q<')
|
|
46
|
+
offset += 8
|
|
47
|
+
@msg_id = plaintext[offset, 8].unpack1('Q<')
|
|
48
|
+
offset += 8
|
|
49
|
+
@seq_no = plaintext[offset, 4].unpack1('L<')
|
|
50
|
+
offset += 4
|
|
51
|
+
body_length = plaintext[offset, 4].unpack1('L<')
|
|
52
|
+
offset += 4
|
|
53
|
+
@body = plaintext[offset, body_length].bytes
|
|
54
|
+
|
|
55
|
+
self
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def bytes
|
|
59
|
+
u64_b(@auth_key_id) +
|
|
60
|
+
u64_b(@msg_id) +
|
|
61
|
+
u32_b(@body.length) +
|
|
62
|
+
@body
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def self.generate_msg_id
|
|
66
|
+
(Time.now.to_f * (2**32)).to_i & ~3
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private_class_method def self.parse_unencrypted(data)
|
|
70
|
+
msg_id = b_u64(data[8, 8])
|
|
71
|
+
body_length = b_u32(data[16, 4])
|
|
72
|
+
body = data[20, body_length]
|
|
73
|
+
|
|
74
|
+
new(body, msg_id: msg_id, auth_key_id: 0)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private_class_method def self.parse_encrypted(data, auth_key_id)
|
|
78
|
+
msg = allocate
|
|
79
|
+
msg.instance_variable_set(:@auth_key_id, auth_key_id)
|
|
80
|
+
msg.instance_variable_set(:@msg_key, data[8, 16].pack('C*'))
|
|
81
|
+
msg.instance_variable_set(:@encrypted_data, data[24..].pack('C*'))
|
|
82
|
+
msg
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
data/lib/mtproto/session.rb
CHANGED