layer-mtproto
MTProto 2.0 session management, DH key exchange, and message framing for Rust.
Installation
[]
= "0.4.7"
= { = "0.4.7", = ["tl-mtproto"] }
Overview
layer-mtproto implements the full MTProto 2.0 session layer. It handles:
- 3-step DH key exchange
- Encrypted sessions (AES-IGE pack/unpack)
- Message framing: salt, session_id, message_id, sequence numbers
msg_containerandgzip_packedsupport- Salt management and auto-correction
- Error recovery:
bad_msg_notification,bad_server_salt,msg_resend_req - Acknowledgements via
MsgsAck
Core Types
EncryptedSession
Manages the live MTProto session after key exchange.
use EncryptedSession;
let session = new;
let wire_bytes = session.pack?;
let wire_bytes = session.pack_serializable?;
let msg = session.unpack?;
3-Step DH Handshake
use authentication as auth;
let = step1?;
// send req1, receive res_pq
let = step2?;
// send req2, receive server_DH_params
let = step3?;
// send req3, receive dh_answer
let done = finish?;
// done.auth_key [u8; 256]
// done.first_salt i64
// done.time_offset i32
Message
Session (plaintext)
Used only before an auth key exists, for the initial DH handshake messages.
use Session;
let mut plain = new;
let framed = plain.pack_plain?;
Message Framing
Every outgoing MTProto message:
server_salt 8 bytes
session_id 8 bytes
message_id 8 bytes (Unix time * 2^32, monotonically increasing)
seq_no 4 bytes
message_length 4 bytes
payload N bytes
padding 12-1024 random bytes (total % 16 == 0)
Prefixed by a 32-byte msg_key after encryption.
msg_key is SHA-256 of (auth_key[88..120] || plaintext) for client-to-server, and (auth_key[96..128] || plaintext) for server-to-client.
Stack position
layer-client
└ layer-mtproto <-- here
├ layer-tl-types (tl-mtproto feature)
└ layer-crypto
License
MIT or Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE.
Ankit Chaubey - github.com/ankit-chaubey