Alur konek ke RPC server telegram
step ini dibuat oleh seseorang dari masa lalu sekitar tahun 2020 yang akunnya telah terhapus, credit kepada Butthx
`originals written in telegram chat, but because I want to preserve it. I write it here
step 1:
Bikin koneksi ke server telegram pakai TCP yang tersedia (disini gwa pakai TCPIntermediate)
step 2:
Bikin random nonce dengan value int128
step 3:
Kirim bytes dari ReqPqMulti dengan value bytes dari nonce tadi.
step 4:
pick salah satu dari beberapa publick fingerprints yang diberikan dari results step3.
step 5:
Lakuin faktor bilangan pq yang diberikan dari results step3, dapetin lagi hasil pembagian dari pq tadi dengan hasil faktor, terus urutkan dari yang terkecil. untuk yang kecil di kasih nama p dan yang besar kasih nama g.
step 6:
bikin nonce baru (jangan ubah nonce yang lama) dengan value random int256.
step 7:
bikin hash (sha1) dari bytes PQInnerData ke telegram: bytes[pq,bytes p,bytes q,nonce,nonce baru,server nonce (dapet dari step3)]
step 8:
bikin padding dengan random bytes dengan panjang -(length bytes PQInnerData + length sha1) mod 255
step 9:
encrypt bytes[sha,bytes PQInnerData,padding] dengan RSA (pakai publik fingerprints tadi)
step 10:
kirim bytes ReqDhParams: bytes[nonce,server nonce, bytes p, bytes q, encrypted data (step9) ,fingerprint]
step 11:
bikin temporary aes key: bytes[sha1[bytes nonce baru, bytes server nonce],sha1[bytes server nonce, bytes nonce baru] slice 0 – 12]
step 12:
bikin temporary aes initial vector (IV): bytes[sha1[bytes server nonce, bytes nonce baru] slice 12 – end, sha1[bytes nonce baru,bytes nonce baru], bytes[nonce baru] slice 0 – 4 ]
step 13:
decrypt encryptedAnswer (dapet dari step 10) menggunakan AES-256-IGE pakai key sama iv tadi.
step 14:
parse decrypted answer tadi ke TLSchema/TLObject
step 15:
bikin random int(panjang 256 bytes, bukan int256 ygy) kita beri nama b
step 16:
dapetin g_b dengan (g ** b) mod dh_prime
- g, dh_prime → dapet dari step 14
step 17:
bikin hash sha1 dari bytes[ClientDhInnerData[nonce, server nonce, 0,unsigned big bytes g_b length 256]]
step 18:
bikin padding dengan length -(length bytes ClientDhInnerData + length sha1) mod 16
step 19:
encrypt bytes[bytes step 17,bytes ClientDhInnerData, padding ] dengan AES-256-IGE, key sama iv masih menggunakan yang step 11.
step 20:
kirim bytes[SetClientDhParams[nonce, server nonce, bytes step 19]]
step 21:
Bikin auth key dengan big-unsigned-bytes[big-u-int(g_a) ** b mod dhPrime] length 256
step 22:
Lakuin security check..
notes: Untuk format pengiriman bytes:
bytes[sessionId,messageId,length content,content]
karena belum ada authkey, jadi sessionId = Buffer.alloc(8)
untuk dapetin real data dari telegram, slice bytes yang di terima dari 20 – end
pengiriman content selalu bentuk bytes, jadi semua parameter jadiin bytes :)
/**
* tgsnake - Telegram MTProto framework for nodejs.
* Copyright (C) 2022 butthx <https://github.com/butthx>
*
* THIS FILE IS PART OF TGSNAKE
*
* tgsnake is a free software : you can redistribute it and/or modify
* it under the terms of the MIT License as published.
*/
export const DCTest = {
1: '149.154.175.10',
2: '149.154.167.40',
3: '149.154.175.117',
};
export const DCProd = {
1: '149.154.175.53',
2: '149.154.167.51',
3: '149.154.175.100',
4: '149.154.167.91',
5: '91.108.56.130',
};
export const DCProdMedia = {
2: '149.154.167.151',
4: '149.154.164.250',
};
export const DCTestIPV6 = {
1: '2001:b28:f23d:f001::e',
2: '2001:67c:4e8:f002::e',
3: '2001:b28:f23d:f003::e',
};
export const DCProdIPV6 = {
1: '2001:b28:f23d:f001::a',
2: '2001:67c:4e8:f002::a',
3: '2001:b28:f23d:f003::a',
4: '2001:67c:4e8:f004::a',
5: '2001:b28:f23f:f005::a',
};
export const DCProdMediaIPV6 = {
2: '2001:067c:04e8:f002:0000:0000:0000:000b',
4: '2001:067c:04e8:f004:0000:0000:0000:000b',
};
export function DataCenter(
dcId: number,
testMode: boolean,
ipv6: boolean,
media: boolean
): [ip: string, port: number] {
if (testMode) {
return [ipv6 ? DCTestIPV6[dcId] : DCTest[dcId], 80];
} else {
if (media) {
return [ipv6 ? DCProdMediaIPV6[dcId] : DCProdMedia[dcId], 443];
} else {
return [ipv6 ? DCProdIPV6[dcId] : DCProd[dcId], 443];
}
}
}