Update content of files

This commit is contained in:
GitHub Action 2023-06-28 21:11:38 +00:00
parent b88fbd4ce3
commit efb69d9602
2 changed files with 222 additions and 231 deletions

View file

@ -52,7 +52,7 @@
<pre><code>resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector long = ResPQ;</code></pre>
<p>Here, string pq is a representation of a natural number (in binary big endian format). This number is the product of two different odd prime numbers. Normally, pq is less than or equal to 2^63-1. The value of <em>server_nonce</em> is selected randomly by the server; following this step, it is known to all.</p>
<p><code>server_public_key_fingerprints</code> is a list of public RSA key fingerprints (64 lower-order bits of SHA1 (server_public_key); the public key is represented as a bare type <code>rsa_public_key n:string e:string = RSAPublicKey</code>, where, as usual, n and e are numbers in big endian format serialized as strings of bytes, following which SHA1 is computed) received by the server.</p>
<p>All subsequent messages contain the pair (nonce, server_nonce) both in the plain-text, and the encrypted portions which makes it possible to identify a “temporary session” — one run of the key generation protocol described on this page that uses the same (nonce, server_nonce) pair. An intruder could not create a parallel session with the server with the same parameters and reuse parts of server- or client-encrypted messages for its own purposes in such a parallel session, because a different server_nonce would be selected by the server for any new “temporary session”.</p>
<p>All subsequent messages contain the pair (nonce, server_nonce) both in the plain-text, and the encrypted portions which makes it possible to identify a “temporary session” — one run of the key generation protocol described on this page that uses the same (nonce, server_nonce) pair. An intruder could not create a parallel session with the server with the same parameters and reuse parts of server- or client-encrypted messages for its own purposes in such a parallel session, because a different server_nonce would be selected by the server for any new “temporary session”.</p>
<h4><a class="anchor" href="#proof-of-work" id="proof-of-work" name="proof-of-work"><i class="anchor-icon"></i></a>Proof of work</h4>
<h5><a class="anchor" href="#3-client-decomposes-pq-into-prime-factors-such-that-p--q" id="3-client-decomposes-pq-into-prime-factors-such-that-p--q" name="3-client-decomposes-pq-into-prime-factors-such-that-p--q"><i class="anchor-icon"></i></a>3) Client decomposes pq into prime factors such that p &lt; q.</h5>
<p>This starts a round of Diffie-Hellman key exchanges.</p>
@ -76,7 +76,7 @@
</li>
</ul>
<p>Someone might intercept the query and replace it with their own, independently decomposing pq into factors instead of the client. The only field that it makes sense to modify is new_nonce which would be the one an intruder would have to re-generate (because an intruder cannot decrypt the encrypted data sent by the client). Since all subsequent messages are encrypted using new_nonce or contain new_nonce_hash, they will not be processed by the client (an intruder would not be able to make it look as though they had been generated by the server because they would not contain new_nonce). Therefore, this intercept will only result in the intruder's completing the authorization key generation protocol in place of the client and creating a new key (that has nothing to do with the client); however, the same effect could be achieved simply by creating a new key in one's own name.</p>
<p>An alternative form of inner data (<code>p_q_inner_data_temp_dc</code>) is used to create temporary keys, that are only stored in the server RAM and are discarded after at most <code>expires_in</code> seconds. The server is free to discard its copy earlier. In all other respects the temporary key generation protocol is the same. After a temporary key is created, the client usually binds it to its principal authorisation key by means of the <a href="/method/auth.bindTempAuthKey">auth.bindTempAuthKey</a> method, and uses it for all client-server communication until it expires; then a new temporary key is generated. Thus Perfect Forward Secrecy (PFS) in client-server communication is achieved. <a href="/api/pfs">Read more about PFS »</a></p>
<p>An alternative form of inner data (<code>p_q_inner_data_temp_dc</code>) is used to create temporary keys, that are only stored in the server RAM and are discarded after at most <code>expires_in</code> seconds. The server is free to discard its copy earlier. In all other respects the temporary key generation protocol is the same. After a temporary key is created, the client usually binds it to its principal authorisation key by means of the <a href="/method/auth.bindTempAuthKey">auth.bindTempAuthKey</a> method, and uses it for all client-server communication until it expires; then a new temporary key is generated. Thus Perfect Forward Secrecy (PFS) in client-server communication is achieved. <a href="/api/pfs">Read more about PFS »</a></p>
<h5><a class="anchor" href="#41-rsa-paddata-server-public-key-mentioned-above-is-implemented-as-follows" id="41-rsa-paddata-server-public-key-mentioned-above-is-implemented-as-follows" name="41-rsa-paddata-server-public-key-mentioned-above-is-implemented-as-follows"><i class="anchor-icon"></i></a>4.1) <code>RSA_PAD(data, server_public_key)</code> mentioned above is implemented as follows:</h5>
<ul>
<li>data_with_padding := data + random_padding_bytes; -- where random_padding_bytes are chosen so that the resulting length of data_with_padding is precisely 192 bytes, and data is the TL-serialized data to be encrypted as before. One has to check that data is not longer than 144 bytes.</li>
@ -120,7 +120,7 @@ A <code>-444</code> error may also be returned if a test DC ID is passed in <cod
<li>data_with_hash := SHA1(data) + data + (0-15 random bytes); such that length be divisible by 16;</li>
<li>encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);</li>
</ul>
<p>The retry_id field is equal to zero at the time of the first attempt; otherwise, it is equal to auth_key_aux_hash from the previous failed attempt (see Item 9).</p>
<p>The retry_id field is equal to zero at the time of the first attempt; otherwise, it is equal to auth_key_aux_hash from the previous failed attempt (see <a href="#9-server-responds-in-one-of-three-ways">Item 9</a>).</p>
<h5><a class="anchor" href="#7-thereafter-auth-key-equals-powg-ab-mod-dh-prime-on-the-server-it-is-computed-as-powg-b-a-mod-dh-prime-and-on-the-client-as-g-ab-mod-dh-prime" id="7-thereafter-auth-key-equals-powg-ab-mod-dh-prime-on-the-server-it-is-computed-as-powg-b-a-mod-dh-prime-and-on-the-client-as-g-ab-mod-dh-prime" name="7-thereafter-auth-key-equals-powg-ab-mod-dh-prime-on-the-server-it-is-computed-as-powg-b-a-mod-dh-prime-and-on-the-client-as-g-ab-mod-dh-prime"><i class="anchor-icon"></i></a>7) Thereafter, auth_key equals <code>pow(g, {ab}) mod dh_prime</code>; on the server, it is computed as <code>pow(g_b, a) mod dh_prime</code>, and on the client as <code>(g_a)^b mod dh_prime</code>.</h5>
<h5><a class="anchor" href="#8-auth-key-hash-is-computed--64-lower-order-bits-of-sha1-auth-key-the-server-checks-whether-there-already-is-another-key-with-the-same-auth-key-hash-and-responds-in-one-of-the-following-ways" id="8-auth-key-hash-is-computed--64-lower-order-bits-of-sha1-auth-key-the-server-checks-whether-there-already-is-another-key-with-the-same-auth-key-hash-and-responds-in-one-of-the-following-ways" name="8-auth-key-hash-is-computed--64-lower-order-bits-of-sha1-auth-key-the-server-checks-whether-there-already-is-another-key-with-the-same-auth-key-hash-and-responds-in-one-of-the-following-ways"><i class="anchor-icon"></i></a>8) auth_key_hash is computed := 64 lower-order bits of SHA1 (auth_key). The server checks whether there already is another key with the same auth_key_hash and responds in one of the following ways.</h5>
<h4><a class="anchor" href="#dh-key-exchange-complete" id="dh-key-exchange-complete" name="dh-key-exchange-complete"><i class="anchor-icon"></i></a>DH key exchange complete</h4>
@ -132,7 +132,7 @@ dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = S
<li>new_nonce_hash1, new_nonce_hash2, and new_nonce_hash3 are obtained as the 128 lower-order bits of SHA1 of the byte string derived from the new_nonce string by adding a single byte with the value of 1, 2, or 3, and followed by another 8 bytes with auth_key_aux_hash. Different values are required to prevent an intruder from changing server response dh_gen_ok into dh_gen_retry.</li>
<li>auth_key_aux_hash is the 64 <em>higher-order</em> bits of SHA1(auth_key). It must not be confused with auth_key_hash.</li>
</ul>
<p>In the other case, the client goes to Item 6) generating a new <em>b</em>.
<p>In the other case, the client goes to <a href="/mtproto/auth_key#6-client-computes-random-2048-bit-number-b-using-a-sufficient-amount-of-entropy-and-sends-the-server-a-message">Item 6)</a> generating a new <em>b</em>.
In the first case, the client and the server have negotiated auth_key, following which they forget all other temporary data, and the client creates another encrypted session using auth_key. At the same time, server_salt is initially set to <code>substr(new_nonce, 0, 8) XOR substr(server_nonce, 0, 8)</code>. If required, the client stores the difference between server_time received in 5) and its local time, to be able always to have a good approximation of server time which is required to generate correct message identifiers.</p>
<p><strong>IMPORTANT</strong>: Apart from the conditions on the Diffie-Hellman prime <strong>dh_prime</strong> and generator <strong>g</strong>, both sides are to check that <strong>g</strong>, <strong>g_a</strong> and <strong>g_b</strong> are greater than <strong>1</strong> and less than <strong>dh_prime - 1</strong>. We recommend checking that <strong>g_a</strong> and <strong>g_b</strong> are between <strong>2^{2048-64}</strong> and <strong>dh_prime - 2^{2048-64}</strong> as well.</p>
<h4><a class="anchor" href="#error-handling-lost-queries-and-responses" id="error-handling-lost-queries-and-responses" name="error-handling-lost-queries-and-responses"><i class="anchor-icon"></i></a>Error Handling (Lost Queries and Responses)</h4>

View file

@ -2,14 +2,12 @@
<html class="">
<head>
<meta charset="utf-8">
<title>samples-auth_key</title>
<title>Auth key generation example</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="description" content="In the examples below, the transport headers are omitted:
For example, for the abridged version of the transport », the…">
<meta property="og:title" content="samples-auth_key">
<meta property="description" content="A full auth key generation example">
<meta property="og:title" content="Auth key generation example">
<meta property="og:image" content="71a15765997de28d38">
<meta property="og:description" content="In the examples below, the transport headers are omitted:
For example, for the abridged version of the transport », the…">
<meta property="og:description" content="A full auth key generation example">
<link rel="icon" type="image/svg+xml" href="/img/website_icon.svg?4">
<link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png">
@ -41,11 +39,10 @@ For example, for the abridged version of the transport », the…">
<div class="container clearfix">
<div class="dev_page">
<div id="dev_page_content_wrap" class=" ">
<div class="dev_page_bread_crumbs"><ul class="breadcrumb clearfix"><li><a href="/mtproto" >Mobile Protocol</a></li><i class="icon icon-breadcrumb-divider"></i><li><a href="/mtproto/samples-auth_key" >samples-auth_key</a></li></ul></div>
<h1 id="dev_page_title">samples-auth_key</h1>
<div class="dev_page_bread_crumbs"><ul class="breadcrumb clearfix"><li><a href="/mtproto" >Mobile Protocol</a></li><i class="icon icon-breadcrumb-divider"></i><li><a href="/mtproto/samples-auth_key" >Auth key generation example</a></li></ul></div>
<h1 id="dev_page_title">Auth key generation example</h1>
<div id="dev_page_content"><h1><a class="anchor" href="#" id="" name=""><i class="anchor-icon"></i></a></h1>
<p>In the examples below, the <a href="/mtproto#transport">transport</a> headers are omitted:</p>
<div id="dev_page_content"><p>In the examples below, the <a href="/mtproto#transport">transport</a> headers are omitted:</p>
<blockquote>
<p>For example, for the <a href="/mtproto/mtproto-transports#abridged">abridged version of the transport »</a>, the client sends <code>0xef</code> as the first byte (<strong>important:</strong> only prior to the very first data packet), then the packet length is encoded with a single byte (<code>0x01-0x7e</code> = data length divided by 4; or <code>0x7f</code> followed by 3 bytes (little endian) divided by 4) followed by the data itself. In this case, server responses have the same structure (although the server does not send <code>0xef</code>as the first byte).</p>
</blockquote>
@ -53,9 +50,9 @@ For example, for the abridged version of the transport », the…">
<h1><a class="anchor" href="#1-request-req-pq-multi" id="1-request-req-pq-multi" name="1-request-req-pq-multi"><i class="anchor-icon"></i></a>1. request req_pq_multi</h1>
<!-- start req_pq_multi -->
<p>Sent payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 00 00 00 00 58 9A 9C 64
0010 | 14 00 00 00 F1 8E 7E BE 61 07 9B D3 CE 40 0A AA
0020 | C0 6A 7E C0 F9 E7 0A F2</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 00 00 00 00 DC 9D 9C 64
0010 | 14 00 00 00 F1 8E 7E BE 36 5B 3A 12 7C 5B 59 09
0020 | 49 0E 6C 3A EC EC 01 26</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>req_pq_multi#be7e8ef1 nonce:int128 = ResPQ;</code></pre>
<table class="table">
@ -77,7 +74,7 @@ For example, for the abridged version of the transport », the…">
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>00000000589A9C64</code></td>
<td><code>00000000DC9D9C64</code></td>
<td>Exact <code>unixtime*2^32</code>, <code>+(4*N)</code> if N messages with the same message ID were already generated</td>
</tr>
<tr>
@ -95,7 +92,7 @@ For example, for the abridged version of the transport », the…">
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Random number</td>
</tr>
</tbody>
@ -104,11 +101,11 @@ For example, for the abridged version of the transport », the…">
<h1><a class="anchor" href="#2-response-respq" id="2-response-respq" name="2-response-respq"><i class="anchor-icon"></i></a>2. response respq</h1>
<!-- start resPQ -->
<p>Received payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 68 EB F7 58 9A 9C 64
0010 | 7C 00 00 00 63 24 16 05 61 07 9B D3 CE 40 0A AA
0020 | C0 6A 7E C0 F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A
0030 | EE 2D 08 5D 77 13 F5 B1 08 14 E0 52 91 6A AF 01
0040 | 01 00 00 00 15 C4 B5 1C 03 00 00 00 A5 B7 F7 09
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 90 2F 78 DC 9D 9C 64
0010 | 54 00 00 00 63 24 16 05 36 5B 3A 12 7C 5B 59 09
0020 | 49 0E 6C 3A EC EC 01 26 C2 18 4E 38 BA C1 64 9C
0030 | 35 FD 28 FC 20 E9 A7 EA 08 25 35 F6 04 92 13 80
0040 | 5B 00 00 00 15 C4 B5 1C 03 00 00 00 A5 B7 F7 09
0050 | 35 5F C3 0B 21 6B E8 6C 02 2B B4 C3 85 FD 64 DE
0060 | 85 1D 9D D0</code></pre>
<p>Payload (de)serialization:</p>
@ -132,13 +129,13 @@ For example, for the abridged version of the transport », the…">
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>0168EBF7589A9C64</code></td>
<td><code>01902F78DC9D9C64</code></td>
<td>Exact <code>unixtime*2^32</code>, <code>+(4*N)</code> if N messages with the same message ID were already generated</td>
</tr>
<tr>
<td>message_length</td>
<td>16, 4</td>
<td><code>7C000000</code> (124 in decimal)</td>
<td><code>54000000</code> (84 in decimal)</td>
<td>Message body length</td>
</tr>
<tr>
@ -150,19 +147,19 @@ For example, for the abridged version of the transport », the…">
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Server-generated random number</td>
</tr>
<tr>
<td>pq</td>
<td>56, 12</td>
<td><code>0814E052916AAF0101000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1504293060055335169</td>
<td><code>082535F6049213805B000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 2681319652660052059</td>
<td>Single-byte prefix denoting length, an 8-byte string, and three bytes of padding</td>
</tr>
<tr>
@ -207,26 +204,23 @@ For example, for the abridged version of the transport », the…">
<!-- end fingerprints -->
<h1><a class="anchor" href="#21-decompose-p-and-q" id="21-decompose-p-and-q" name="21-decompose-p-and-q"><i class="anchor-icon"></i></a>2.1. decompose p and q</h1>
<!-- start pq -->
<pre><code>pq = 1504293060055335169</code></pre>
<p>Decompose into 2 prime cofactors: <code>1504293060055335169 = 1019397109 * 1475669341</code></p>
<pre><code>p = 1019397109
q = 1475669341</code></pre>
<pre><code>pq = 2681319652660052059</code></pre>
<p>Decompose into 2 prime cofactors: <code>2681319652660052059 = 1608915439 * 1666538581</code></p>
<pre><code>p = 1608915439
q = 1666538581</code></pre>
<!-- end pq -->
<h1><a class="anchor" href="#22-encrypted-data-generation" id="22-encrypted-data-generation" name="22-encrypted-data-generation"><i class="anchor-icon"></i></a>2.2. encrypted_data generation</h1>
<!-- start p_q_inner_data_dc -->
<p>Generated payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 95 5F F5 A9 08 14 E0 52 91 6A AF 01 01 00 00 00
0010 | 04 3C C2 C3 F5 00 00 00 04 57 F4 ED 5D 00 00 00
0020 | 61 07 9B D3 CE 40 0A AA C0 6A 7E C0 F9 E7 0A F2
0030 | F3 3B CB F4 A8 C2 3D 6A EE 2D 08 5D 77 13 F5 B1
0040 | 77 C0 A6 8B C9 A6 9D B0 E0 49 94 75 DD 0E ED 08
0050 | 0B F0 59 CA 67 9B A9 AB AC B5 BB CF 69 25 76 FA
<pre><code>0000 | 95 5F F5 A9 08 25 35 F6 04 92 13 80 5B 00 00 00
0010 | 04 5F E6 19 EF 00 00 00 04 63 55 5C 55 00 00 00
0020 | 36 5B 3A 12 7C 5B 59 09 49 0E 6C 3A EC EC 01 26
0030 | C2 18 4E 38 BA C1 64 9C 35 FD 28 FC 20 E9 A7 EA
0040 | AA BB EA 0C 77 25 B4 A6 27 D8 E4 05 7B C3 BD A4
0050 | DF B4 30 72 30 91 E0 E2 0F BD 94 FC D0 F2 6F 24
0060 | 02 00 00 00</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>p_q_inner_data_dc#a9f55f95 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int = P_Q_inner_data;
p_q_inner_data_temp_dc#56fddf88 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int expires_in:int = P_Q_inner_data;
p_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data;
p_q_inner_data_temp#3c6a84d4 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 expires_in:int = P_Q_inner_data;</code></pre>
<pre><code>p_q_inner_data_dc#a9f55f95 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int = P_Q_inner_data;</code></pre>
<table class="table">
<thead>
<tr>
@ -246,37 +240,37 @@ p_q_inner_data_temp#3c6a84d4 pq:string p:string q:string nonce:int128 server_non
<tr>
<td>pq</td>
<td>4, 12</td>
<td><code>0814E052916AAF0101000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1504293060055335169</td>
<td><code>082535F6049213805B000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 2681319652660052059</td>
<td>Single-byte prefix denoting length, 8-byte string, and three bytes of padding</td>
</tr>
<tr>
<td>p</td>
<td>16, 8</td>
<td><code>043CC2C3F5000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1019397109</td>
<td><code>045FE619EF000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1608915439</td>
<td>First prime cofactor: single-byte prefix denoting length, 4-byte string, and three bytes of padding</td>
</tr>
<tr>
<td>q</td>
<td>24, 8</td>
<td><code>0457F4ED5D000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1475669341</td>
<td><code>0463555C55000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1666538581</td>
<td>Second prime cofactor: single-byte prefix denoting length, 4-byte string, and three bytes of padding</td>
</tr>
<tr>
<td>nonce</td>
<td>32, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>48, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>new_nonce</td>
<td>64, 32</td>
<td><code>77C0A68BC9A69DB0E0499475DD0EED08</code> <code>0BF059CA679BA9ABACB5BBCF692576FA</code></td>
<td><code>AABBEA0C7725B4A627D8E4057BC3BDA4</code> <code>DFB430723091E0E20FBD94FCD0F26F24</code></td>
<td>Client-generated random number</td>
</tr>
<tr>
@ -291,39 +285,39 @@ p_q_inner_data_temp#3c6a84d4 pq:string p:string q:string nonce:int128 server_non
<p>The serialization of <em>P_Q_inner_data</em> produces <strong>data</strong>, which is used to generate <strong>encrypted_data</strong> as specified in <a href="/mtproto/auth_key">step 4.1</a>.<br>
These are the inputs to the algorithm specified in <a href="/mtproto/auth_key">step 4.1</a>:</p>
<!-- start p_q_inner_data_input -->
<pre><code>data = 955FF5A90814E052916AAF0101000000043CC2C3F50000000457F4ED5D00000061079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B177C0A68BC9A69DB0E0499475DD0EED080BF059CA679BA9ABACB5BBCF692576FA02000000
random_padding_bytes = E5019A0D9F552D15ACB43E2264CD899B8F87534B8D3C6BD8DEBA75BBFD953DBD9141C0C87E30E96A343AAF4EA390489899E3325E01CC03C40198DDEA8CB382D6BCCB30380AD5FFA5AD054B2DC9BEB280C0039AF3C7DC0D6C62ED3703</code></pre>
<pre><code>data = 955FF5A9082535F6049213805B000000045FE619EF0000000463555C55000000365B3A127C5B5909490E6C3AECEC0126C2184E38BAC1649C35FD28FC20E9A7EAAABBEA0C7725B4A627D8E4057BC3BDA4DFB430723091E0E20FBD94FCD0F26F2402000000
random_padding_bytes = 216450FD2A974A81475A90261BAE56428354F18BEE55BFB415135941FFA2607DA534FB9099CB6B7A33FBF9E40ADCD43CB29C14B8E4C16DC2E0471A1E92D21966398AF8FF1EFEEF787DEB0D5AB1AA674D154799D1C9E9DBECA2682FD5</code></pre>
<!-- end p_q_inner_data_input -->
<p>And this is the output:</p>
<!-- start p_q_inner_data_output -->
<pre><code>encrypted_data = CFCCD0A2FE4CE6DA364CAD61560586C2A0481427128257864AF9BA9B047612F7030BECC81F3A911A8A9178E2EA0205297B3A70B9C4001273E817C289613DC2F80033EEE5B41ED7B6C8EBB2CDAAFBB1115B800F736D0B5651FD279F13D7E23B13365FBE0F561137D7D33A32BCD2FAEB8091FF528BEFD48EF6EAAB42BE1201E879259EC477AD033CBD13C2C1607F9EB61663CE372DD5E7999FC5F0CE6B7903AE812BDDA619551BFBE69218BEC7E550B2E5E8428C2C8AF615ACD34F53D25737B87280E28BB2157B34987C00C1F45D734D79364166BB1FA275DA0563DBE09EFBC03450450947196C526A580A09B25F4CB23786ABFB00862AE177183A9FADA88E86D3</code></pre>
<pre><code>encrypted_data = 272390AE7D9BD642310E05D77A4C34AE44CA3790AA81FAA4D18DE327DF7DF575105FDD874416F2E907C97AA97A0697D460E3824C51397675E5314196EBF6E1E771436830844417671E295822E1FB892DC830CEFC756EBBF5926703930918FC0FA379B350D5C4F74C8221622C58BD0561E898DDC1F614AE73A6D6E727D1857361E7940A233DB206A23F7B02A109C0D694DF29CC9C63085A98F6C478A726C7D01889DB009A471C2C471530AD95FDD7989B13D6216345314BEF01E84C8D673786861343A9979C54DD937BFA1A1B12C02B303EAFC9F69F16DBBED0AD5689495B90DD2F4062562DCF7934B75F5F00C9059005CE581DC2EE704548703E74C975EED2E4</code></pre>
<!-- end p_q_inner_data_output -->
<p>The length of the final string is 256 bytes.</p>
<h1><a class="anchor" href="#3-request-req-dh-params" id="3-request-req-dh-params" name="3-request-req-dh-params"><i class="anchor-icon"></i></a>3. request req_dh_params</h1>
<!-- start req_DH_params -->
<p>Sent payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 00 00 00 00 59 9A 9C 64
0010 | 40 01 00 00 BE E4 12 D7 61 07 9B D3 CE 40 0A AA
0020 | C0 6A 7E C0 F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A
0030 | EE 2D 08 5D 77 13 F5 B1 04 3C C2 C3 F5 00 00 00
0040 | 04 57 F4 ED 5D 00 00 00 85 FD 64 DE 85 1D 9D D0
0050 | FE 00 01 00 CF CC D0 A2 FE 4C E6 DA 36 4C AD 61
0060 | 56 05 86 C2 A0 48 14 27 12 82 57 86 4A F9 BA 9B
0070 | 04 76 12 F7 03 0B EC C8 1F 3A 91 1A 8A 91 78 E2
0080 | EA 02 05 29 7B 3A 70 B9 C4 00 12 73 E8 17 C2 89
0090 | 61 3D C2 F8 00 33 EE E5 B4 1E D7 B6 C8 EB B2 CD
00A0 | AA FB B1 11 5B 80 0F 73 6D 0B 56 51 FD 27 9F 13
00B0 | D7 E2 3B 13 36 5F BE 0F 56 11 37 D7 D3 3A 32 BC
00C0 | D2 FA EB 80 91 FF 52 8B EF D4 8E F6 EA AB 42 BE
00D0 | 12 01 E8 79 25 9E C4 77 AD 03 3C BD 13 C2 C1 60
00E0 | 7F 9E B6 16 63 CE 37 2D D5 E7 99 9F C5 F0 CE 6B
00F0 | 79 03 AE 81 2B DD A6 19 55 1B FB E6 92 18 BE C7
0100 | E5 50 B2 E5 E8 42 8C 2C 8A F6 15 AC D3 4F 53 D2
0110 | 57 37 B8 72 80 E2 8B B2 15 7B 34 98 7C 00 C1 F4
0120 | 5D 73 4D 79 36 41 66 BB 1F A2 75 DA 05 63 DB E0
0130 | 9E FB C0 34 50 45 09 47 19 6C 52 6A 58 0A 09 B2
0140 | 5F 4C B2 37 86 AB FB 00 86 2A E1 77 18 3A 9F AD
0150 | A8 8E 86 D3</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 04 00 00 00 DC 9D 9C 64
0010 | 40 01 00 00 BE E4 12 D7 36 5B 3A 12 7C 5B 59 09
0020 | 49 0E 6C 3A EC EC 01 26 C2 18 4E 38 BA C1 64 9C
0030 | 35 FD 28 FC 20 E9 A7 EA 04 5F E6 19 EF 00 00 00
0040 | 04 63 55 5C 55 00 00 00 85 FD 64 DE 85 1D 9D D0
0050 | FE 00 01 00 27 23 90 AE 7D 9B D6 42 31 0E 05 D7
0060 | 7A 4C 34 AE 44 CA 37 90 AA 81 FA A4 D1 8D E3 27
0070 | DF 7D F5 75 10 5F DD 87 44 16 F2 E9 07 C9 7A A9
0080 | 7A 06 97 D4 60 E3 82 4C 51 39 76 75 E5 31 41 96
0090 | EB F6 E1 E7 71 43 68 30 84 44 17 67 1E 29 58 22
00A0 | E1 FB 89 2D C8 30 CE FC 75 6E BB F5 92 67 03 93
00B0 | 09 18 FC 0F A3 79 B3 50 D5 C4 F7 4C 82 21 62 2C
00C0 | 58 BD 05 61 E8 98 DD C1 F6 14 AE 73 A6 D6 E7 27
00D0 | D1 85 73 61 E7 94 0A 23 3D B2 06 A2 3F 7B 02 A1
00E0 | 09 C0 D6 94 DF 29 CC 9C 63 08 5A 98 F6 C4 78 A7
00F0 | 26 C7 D0 18 89 DB 00 9A 47 1C 2C 47 15 30 AD 95
0100 | FD D7 98 9B 13 D6 21 63 45 31 4B EF 01 E8 4C 8D
0110 | 67 37 86 86 13 43 A9 97 9C 54 DD 93 7B FA 1A 1B
0120 | 12 C0 2B 30 3E AF C9 F6 9F 16 DB BE D0 AD 56 89
0130 | 49 5B 90 DD 2F 40 62 56 2D CF 79 34 B7 5F 5F 00
0140 | C9 05 90 05 CE 58 1D C2 EE 70 45 48 70 3E 74 C9
0150 | 75 EE D2 E4</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params;</code></pre>
<table class="table">
@ -345,7 +339,7 @@ random_padding_bytes = E5019A0D9F552D15ACB43E2264CD899B8F87534B8D3C6BD8DEBA75BBF
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>00000000599A9C64</code></td>
<td><code>04000000DC9D9C64</code></td>
<td>Exact <code>unixtime*2^32</code>, <code>+(4*N)</code> if N messages with the same message ID were already generated</td>
</tr>
<tr>
@ -363,25 +357,25 @@ random_padding_bytes = E5019A0D9F552D15ACB43E2264CD899B8F87534B8D3C6BD8DEBA75BBF
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>p</td>
<td>56, 8</td>
<td><code>043CC2C3F5000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1019397109</td>
<td><code>045FE619EF000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1608915439</td>
<td>First prime cofactor: single-byte prefix denoting length, 4-byte string, and three bytes of padding</td>
</tr>
<tr>
<td>q</td>
<td>64, 8</td>
<td><code>0457F4ED5D000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1475669341</td>
<td><code>0463555C55000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1666538581</td>
<td>Second prime cofactor: single-byte prefix denoting length, 4-byte string, and three bytes of padding</td>
</tr>
<tr>
@ -393,7 +387,7 @@ random_padding_bytes = E5019A0D9F552D15ACB43E2264CD899B8F87534B8D3C6BD8DEBA75BBF
<tr>
<td>encrypted_data</td>
<td>80, 260</td>
<td><code>FE000100CFCCD0A2FE4CE6DA364CAD61</code> <code>560586C2A0481427128257864AF9BA9B</code> <code>047612F7030BECC81F3A911A8A9178E2</code> <code>EA0205297B3A70B9C4001273E817C289</code> <code>613DC2F80033EEE5B41ED7B6C8EBB2CD</code> <code>AAFBB1115B800F736D0B5651FD279F13</code> <code>D7E23B13365FBE0F561137D7D33A32BC</code> <code>D2FAEB8091FF528BEFD48EF6EAAB42BE</code> <code>1201E879259EC477AD033CBD13C2C160</code> <code>7F9EB61663CE372DD5E7999FC5F0CE6B</code> <code>7903AE812BDDA619551BFBE69218BEC7</code> <code>E550B2E5E8428C2C8AF615ACD34F53D2</code> <code>5737B87280E28BB2157B34987C00C1F4</code> <code>5D734D79364166BB1FA275DA0563DBE0</code> <code>9EFBC03450450947196C526A580A09B2</code> <code>5F4CB23786ABFB00862AE177183A9FAD</code><br> <code>A88E86D3</code></td>
<td><code>FE000100272390AE7D9BD642310E05D7</code> <code>7A4C34AE44CA3790AA81FAA4D18DE327</code> <code>DF7DF575105FDD874416F2E907C97AA9</code> <code>7A0697D460E3824C51397675E5314196</code> <code>EBF6E1E771436830844417671E295822</code> <code>E1FB892DC830CEFC756EBBF592670393</code> <code>0918FC0FA379B350D5C4F74C8221622C</code> <code>58BD0561E898DDC1F614AE73A6D6E727</code> <code>D1857361E7940A233DB206A23F7B02A1</code> <code>09C0D694DF29CC9C63085A98F6C478A7</code> <code>26C7D01889DB009A471C2C471530AD95</code> <code>FDD7989B13D6216345314BEF01E84C8D</code> <code>673786861343A9979C54DD937BFA1A1B</code> <code>12C02B303EAFC9F69F16DBBED0AD5689</code> <code>495B90DD2F4062562DCF7934B75F5F00</code> <code>C9059005CE581DC2EE704548703E74C9</code><br> <code>75EED2E4</code></td>
<td>See <a href="#generation-of-encrypted-data">Generation of encrypted_data »</a></td>
</tr>
</tbody>
@ -402,50 +396,49 @@ random_padding_bytes = E5019A0D9F552D15ACB43E2264CD899B8F87534B8D3C6BD8DEBA75BBF
<h1><a class="anchor" href="#4-response-server-dh-params-ok" id="4-response-server-dh-params-ok" name="4-response-server-dh-params-ok"><i class="anchor-icon"></i></a>4. response server_dh_params_ok</h1>
<!-- start server_DH_params_ok -->
<p>Received payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 64 79 85 59 9A 9C 64
0010 | E8 02 00 00 5C 07 E8 D0 61 07 9B D3 CE 40 0A AA
0020 | C0 6A 7E C0 F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A
0030 | EE 2D 08 5D 77 13 F5 B1 FE 50 02 00 F1 B0 F8 E0
0040 | E2 34 D3 3F 9E 48 D8 71 E1 2F C9 0C E8 8E A5 36
0050 | E0 A5 61 EE 54 63 15 8E 72 20 8C F7 90 CD AD 29
0060 | A3 31 6D D8 F3 6F B9 4C DD 11 9B D7 7B 4C 7A 62
0070 | EF BC 3E 6E DC 40 10 E8 9E 72 08 65 1C 72 62 15
0080 | 5C 79 1F 23 52 EB F9 7F C6 88 3C 59 BB 94 03 3E
0090 | DE 00 6E 25 2C 46 FA 2F 7B 0B CA C6 35 4A F4 23
00A0 | 87 3F 70 5B DE 51 AC 92 4F 1B 59 25 8C DB 03 AB
00B0 | CA 67 AD 5B 2F F1 84 7C F5 DB 3F 0F 0A 65 52 5D
00C0 | EA B4 E0 FE A2 B3 BD F7 CB 47 52 15 CF CB BF 07
00D0 | 82 14 4B 7A 09 15 3A F9 AC B6 37 AC 8C 37 38 97
00E0 | 7A 48 0A 1C 36 7F 13 95 40 43 40 E9 34 F6 46 28
00F0 | C1 7C D3 3F E5 FD CB 36 26 38 AD C4 18 34 CE B6
0100 | B4 3C 25 F8 07 25 93 D2 17 2F B2 93 1A E1 D7 4D
0110 | 5F 62 49 3A 29 EC 52 B3 1C 91 19 56 AD 8B 10 57
0120 | CE AB 92 0B A1 02 A7 0D B6 78 A1 FE 5D 5A 7A 42
0130 | 87 16 F5 CC 06 3E BB EC F6 77 6A F4 AE 2D D2 E2
0140 | BA CB A2 82 40 B9 0E 26 76 B0 5C E2 7F 39 12 75
0150 | 10 44 12 A6 5E 5B 56 FC 74 1B 62 FE A8 BA 1D 61
0160 | 2C F1 FF 83 AE 51 32 26 42 B6 2B 60 58 25 84 D2
0170 | 45 9C 94 6A 49 72 25 C7 55 C0 3C A5 21 9C FA 50
0180 | F9 00 68 5C FD 26 D7 5E 11 26 7F F4 82 A3 CE A1
0190 | DC 50 FA B8 7E 08 CB 91 4F A4 F6 58 3A 1A 69 10
01A0 | 4E 03 4D BA 05 46 70 F2 2A D2 66 FE 80 0D 87 24
01B0 | 28 B5 16 5D C5 4D 87 FF E9 92 D3 1B 25 A0 E0 4F
01C0 | FC 70 08 D7 E5 BE 02 24 30 63 03 30 D3 65 D7 B2
01D0 | 8D 33 EC 8F 54 D4 DF 5C 5E D0 D9 E8 A1 75 35 C8
01E0 | A0 3B 25 F4 B2 97 D4 EC 03 6D 6A EE DF 84 65 3E
01F0 | 63 DD DE E7 A2 B9 1A 0F 0C 24 64 FE 56 CD 63 D6
0200 | 43 15 F7 7D DF 6B 44 29 E6 C1 EC 71 69 FC 1F 74
0210 | 96 31 54 73 8E 34 DF 12 01 E6 8B D0 3B 5D 7C BC
0220 | C6 D7 E2 82 0C 4C 05 B5 1A F1 67 43 7E 42 63 E2
0230 | 43 E4 52 93 24 6A C6 3C 3B 7A EE 5D F2 95 63 85
0240 | 38 21 61 C8 76 D7 81 22 84 5E 70 BF 4A 37 C1 48
0250 | E3 CB EF 47 49 FE 92 E6 6B 9D BA 10 32 1B EA F7
0260 | 72 81 89 CD CE 8A 0D 80 54 8F A1 6A 36 9A 8F 66
0270 | 89 B6 E2 FC E5 65 20 C4 95 14 22 F2 B2 13 D9 17
0280 | A5 6F F9 4F 4D 91 BB 96 86 7A 87 61</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 F4 AA 18 DD 9D 9C 64
0010 | 84 02 00 00 5C 07 E8 D0 36 5B 3A 12 7C 5B 59 09
0020 | 49 0E 6C 3A EC EC 01 26 C2 18 4E 38 BA C1 64 9C
0030 | 35 FD 28 FC 20 E9 A7 EA FE 50 02 00 70 2F F1 03
0040 | 2B 5B A7 26 4B 04 CD 20 AA 98 0F B8 21 79 D0 16
0050 | 27 46 00 12 8E C8 6B 8E 70 5D 09 B6 C9 23 9A A6
0060 | 97 A9 9D 0D 6B 9F 39 7B 58 12 2C 49 20 5C 60 62
0070 | 90 C6 4B 67 FD 47 AA 12 5E BC 78 20 89 1E 11 7C
0080 | 99 10 98 4D 5F 82 4F 3B 51 3E 11 2E 73 3D 3A 79
0090 | 5C 0C 82 F1 59 36 4B 35 9F ED 51 E0 65 AE 46 4E
00A0 | 0A DF F0 5E 65 75 95 EF 0D DE 7D 28 D7 3A 86 42
00B0 | 04 85 48 3C BD 77 AD EE 1B AF CB 00 02 07 4D 76
00C0 | 6A C6 B7 C3 0D 4B 41 2F E2 DE 9B C7 0E FD 5D C2
00D0 | E7 BA A4 D5 2E 96 AF E6 8A FB 4D E4 C1 8E 16 03
00E0 | 4E 1F 0D 1E D8 93 07 B7 32 45 95 BF 8F DF 83 4C
00F0 | 10 9E A1 E0 B9 D9 D0 B6 56 A3 B3 BB B1 C3 FC 36
0100 | 27 FF F3 DE 47 0D 22 C8 37 5B 6C 76 99 AD 67 EF
0110 | 0F 72 0B 16 F9 EA 69 5C 53 0D 13 E5 85 A7 E6 12
0120 | 90 99 58 17 CB 21 ED 22 CD 74 BB 94 21 8C 39 CB
0130 | A8 60 F6 65 3E 43 BB C7 2C 02 A0 47 B8 11 CD 4D
0140 | 6A 48 46 EF A8 D3 F9 19 06 D9 05 6A AF 89 0E 0E
0150 | F5 1E A3 A7 2D FC 7F B6 CE 81 74 6F 1E A0 45 CF
0160 | B5 71 4D 2A E0 4E C0 12 CF 9A 44 24 CC B2 3C CC
0170 | BB 4C 84 82 CE BF 06 4B EE 18 EE AF 2A 43 85 01
0180 | 99 C7 44 31 ED BB 10 5C 63 CA 66 BA 31 37 84 40
0190 | 5D B0 E7 4F DD 70 D0 D5 E2 2E FD 16 57 2B 79 0F
01A0 | 9C E2 03 5E 51 E6 8B 82 7B 1B 7C 8E 36 48 E2 C3
01B0 | 7F BE F2 4A D2 5D 7E 97 95 B9 18 3D B2 C8 6E 30
01C0 | 8B 31 04 6E E2 92 3C C6 58 12 2F C9 02 40 95 C2
01D0 | 93 F7 E7 F7 E9 59 6C C0 75 0F 55 86 F2 0F 85 6A
01E0 | 56 1F A6 E2 FE 66 06 7C C7 5B A0 F1 A9 ED 76 C9
01F0 | FE DC 8B 13 77 FB DB 9C CC D0 29 37 DD 8E EA 22
0200 | 58 54 5A AA AB 6C BC 77 D9 1D 3F 22 87 41 DE 65
0210 | AB 49 26 4B 36 1B 93 6D 7B E2 06 AA D1 90 4C A5
0220 | 3D 29 14 48 DA D1 98 8B B2 77 9F 15 F6 F9 E8 26
0230 | 2A 7E C2 69 0D 8A 19 4F 0A 66 E8 0C 2C 18 90 1C
0240 | FD 81 1B 7C 2A 6A 07 DE 5A 62 AC 53 E6 BC F0 67
0250 | 9B A3 00 C4 E3 50 1D DF C5 0B 2E 5E 64 69 5A 2F
0260 | 38 C8 97 AD 6C DF 59 6B EB C7 5F 57 AB C5 F2 92
0270 | 8D 7C AE E7 9C 23 66 BA 19 72 FE 1D 98 95 04 1D
0280 | 4D 7F C8 48 3C 96 46 BB 1E BE FB 4D</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>server_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params;
server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;</code></pre>
<pre><code>server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;</code></pre>
<table class="table">
<thead>
<tr>
@ -465,13 +458,13 @@ server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:s
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>01647985599A9C64</code></td>
<td><code>01F4AA18DD9D9C64</code></td>
<td>Exact <code>unixtime*2^32</code>, <code>+(4*N)</code> if N messages with the same message ID were already generated</td>
</tr>
<tr>
<td>message_length</td>
<td>16, 4</td>
<td><code>E8020000</code> (744 in decimal)</td>
<td><code>84020000</code> (644 in decimal)</td>
<td>Message body length</td>
</tr>
<tr>
@ -483,19 +476,19 @@ server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:s
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>encrypted_answer</td>
<td>56, 596</td>
<td><code>FE500200F1B0F8E0E234D33F9E48D871</code> <code>E12FC90CE88EA536E0A561EE5463158E</code> <code>72208CF790CDAD29A3316DD8F36FB94C</code> <code>DD119BD77B4C7A62EFBC3E6EDC4010E8</code> <code>9E7208651C7262155C791F2352EBF97F</code> <code>C6883C59BB94033EDE006E252C46FA2F</code> <code>7B0BCAC6354AF423873F705BDE51AC92</code> <code>4F1B59258CDB03ABCA67AD5B2FF1847C</code> <code>F5DB3F0F0A65525DEAB4E0FEA2B3BDF7</code> <code>CB475215CFCBBF0782144B7A09153AF9</code> <code>ACB637AC8C3738977A480A1C367F1395</code> <code>404340E934F64628C17CD33FE5FDCB36</code> <code>2638ADC41834CEB6B43C25F8072593D2</code> <code>172FB2931AE1D74D5F62493A29EC52B3</code> <code>1C911956AD8B1057CEAB920BA102A70D</code> <code>B678A1FE5D5A7A428716F5CC063EBBEC</code> <code>F6776AF4AE2DD2E2BACBA28240B90E26</code> <code>76B05CE27F391275104412A65E5B56FC</code> <code>741B62FEA8BA1D612CF1FF83AE513226</code> <code>42B62B60582584D2459C946A497225C7</code> <code>55C03CA5219CFA50F900685CFD26D75E</code> <code>11267FF482A3CEA1DC50FAB87E08CB91</code> <code>4FA4F6583A1A69104E034DBA054670F2</code> <code>2AD266FE800D872428B5165DC54D87FF</code> <code>E992D31B25A0E04FFC7008D7E5BE0224</code> <code>30630330D365D7B28D33EC8F54D4DF5C</code> <code>5ED0D9E8A17535C8A03B25F4B297D4EC</code> <code>036D6AEEDF84653E63DDDEE7A2B91A0F</code> <code>0C2464FE56CD63D64315F77DDF6B4429</code> <code>E6C1EC7169FC1F74963154738E34DF12</code> <code>01E68BD03B5D7CBCC6D7E2820C4C05B5</code> <code>1AF167437E4263E243E45293246AC63C</code> <code>3B7AEE5DF2956385382161C876D78122</code> <code>845E70BF4A37C148E3CBEF4749FE92E6</code> <code>6B9DBA10321BEAF7728189CDCE8A0D80</code> <code>548FA16A369A8F6689B6E2FCE56520C4</code> <code>951422F2B213D917A56FF94F4D91BB96</code><br> <code>867A8761</code></td>
<td><code>FE500200702FF1032B5BA7264B04CD20</code> <code>AA980FB82179D016274600128EC86B8E</code> <code>705D09B6C9239AA697A99D0D6B9F397B</code> <code>58122C49205C606290C64B67FD47AA12</code> <code>5EBC7820891E117C9910984D5F824F3B</code> <code>513E112E733D3A795C0C82F159364B35</code> <code>9FED51E065AE464E0ADFF05E657595EF</code> <code>0DDE7D28D73A86420485483CBD77ADEE</code> <code>1BAFCB0002074D766AC6B7C30D4B412F</code> <code>E2DE9BC70EFD5DC2E7BAA4D52E96AFE6</code> <code>8AFB4DE4C18E16034E1F0D1ED89307B7</code> <code>324595BF8FDF834C109EA1E0B9D9D0B6</code> <code>56A3B3BBB1C3FC3627FFF3DE470D22C8</code> <code>375B6C7699AD67EF0F720B16F9EA695C</code> <code>530D13E585A7E61290995817CB21ED22</code> <code>CD74BB94218C39CBA860F6653E43BBC7</code> <code>2C02A047B811CD4D6A4846EFA8D3F919</code> <code>06D9056AAF890E0EF51EA3A72DFC7FB6</code> <code>CE81746F1EA045CFB5714D2AE04EC012</code> <code>CF9A4424CCB23CCCBB4C8482CEBF064B</code> <code>EE18EEAF2A43850199C74431EDBB105C</code> <code>63CA66BA313784405DB0E74FDD70D0D5</code> <code>E22EFD16572B790F9CE2035E51E68B82</code> <code>7B1B7C8E3648E2C37FBEF24AD25D7E97</code> <code>95B9183DB2C86E308B31046EE2923CC6</code> <code>58122FC9024095C293F7E7F7E9596CC0</code> <code>750F5586F20F856A561FA6E2FE66067C</code> <code>C75BA0F1A9ED76C9FEDC8B1377FBDB9C</code> <code>CCD02937DD8EEA2258545AAAAB6CBC77</code> <code>D91D3F228741DE65AB49264B361B936D</code> <code>7BE206AAD1904CA53D291448DAD1988B</code> <code>B2779F15F6F9E8262A7EC2690D8A194F</code> <code>0A66E80C2C18901CFD811B7C2A6A07DE</code> <code>5A62AC53E6BCF0679BA300C4E3501DDF</code> <code>C50B2E5E64695A2F38C897AD6CDF596B</code> <code>EBC75F57ABC5F2928D7CAEE79C2366BA</code> <code>1972FE1D9895041D4D7FC8483C9646BB</code><br> <code>1EBEFB4D</code></td>
<td>See <a href="#conversion-of-encrypted-answer-into-answer">Decomposition of encrypted_answer »</a></td>
</tr>
</tbody>
@ -504,20 +497,20 @@ server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:s
<h1><a class="anchor" href="#41-server-dh-inner-data-decryption-and-deserialization" id="41-server-dh-inner-data-decryption-and-deserialization" name="41-server-dh-inner-data-decryption-and-deserialization"><i class="anchor-icon"></i></a>4.1 server_dh_inner_data decryption and deserialization</h1>
<p>Decrypt <code>encrypted_answer</code> using the reverse of the process specified in <a href="/mtproto/auth_key#5-server-responds-with">step 5</a>:</p>
<!-- start server_DH_inner_data_input -->
<pre><code>encrypted_answer = F1B0F8E0E234D33F9E48D871E12FC90CE88EA536E0A561EE5463158E72208CF790CDAD29A3316DD8F36FB94CDD119BD77B4C7A62EFBC3E6EDC4010E89E7208651C7262155C791F2352EBF97FC6883C59BB94033EDE006E252C46FA2F7B0BCAC6354AF423873F705BDE51AC924F1B59258CDB03ABCA67AD5B2FF1847CF5DB3F0F0A65525DEAB4E0FEA2B3BDF7CB475215CFCBBF0782144B7A09153AF9ACB637AC8C3738977A480A1C367F1395404340E934F64628C17CD33FE5FDCB362638ADC41834CEB6B43C25F8072593D2172FB2931AE1D74D5F62493A29EC52B31C911956AD8B1057CEAB920BA102A70DB678A1FE5D5A7A428716F5CC063EBBECF6776AF4AE2DD2E2BACBA28240B90E2676B05CE27F391275104412A65E5B56FC741B62FEA8BA1D612CF1FF83AE51322642B62B60582584D2459C946A497225C755C03CA5219CFA50F900685CFD26D75E11267FF482A3CEA1DC50FAB87E08CB914FA4F6583A1A69104E034DBA054670F22AD266FE800D872428B5165DC54D87FFE992D31B25A0E04FFC7008D7E5BE022430630330D365D7B28D33EC8F54D4DF5C5ED0D9E8A17535C8A03B25F4B297D4EC036D6AEEDF84653E63DDDEE7A2B91A0F0C2464FE56CD63D64315F77DDF6B4429E6C1EC7169FC1F74963154738E34DF1201E68BD03B5D7CBCC6D7E2820C4C05B51AF167437E4263E243E45293246AC63C3B7AEE5DF2956385382161C876D78122845E70BF4A37C148E3CBEF4749FE92E66B9DBA10321BEAF7728189CDCE8A0D80548FA16A369A8F6689B6E2FCE56520C4951422F2B213D917A56FF94F4D91BB96867A8761
tmp_aes_key = 83E6FC26B9543A3D5FE6357D7DF98DC7E5EDA4B1791A2973A414443CD6736E2B
tmp_aes_iv = F61B20DAF8A413BCEBE132A7EE9410C958F7B1C3537E82A7C35E899F77C0A68B</code></pre>
<pre><code>encrypted_answer = 702FF1032B5BA7264B04CD20AA980FB82179D016274600128EC86B8E705D09B6C9239AA697A99D0D6B9F397B58122C49205C606290C64B67FD47AA125EBC7820891E117C9910984D5F824F3B513E112E733D3A795C0C82F159364B359FED51E065AE464E0ADFF05E657595EF0DDE7D28D73A86420485483CBD77ADEE1BAFCB0002074D766AC6B7C30D4B412FE2DE9BC70EFD5DC2E7BAA4D52E96AFE68AFB4DE4C18E16034E1F0D1ED89307B7324595BF8FDF834C109EA1E0B9D9D0B656A3B3BBB1C3FC3627FFF3DE470D22C8375B6C7699AD67EF0F720B16F9EA695C530D13E585A7E61290995817CB21ED22CD74BB94218C39CBA860F6653E43BBC72C02A047B811CD4D6A4846EFA8D3F91906D9056AAF890E0EF51EA3A72DFC7FB6CE81746F1EA045CFB5714D2AE04EC012CF9A4424CCB23CCCBB4C8482CEBF064BEE18EEAF2A43850199C74431EDBB105C63CA66BA313784405DB0E74FDD70D0D5E22EFD16572B790F9CE2035E51E68B827B1B7C8E3648E2C37FBEF24AD25D7E9795B9183DB2C86E308B31046EE2923CC658122FC9024095C293F7E7F7E9596CC0750F5586F20F856A561FA6E2FE66067CC75BA0F1A9ED76C9FEDC8B1377FBDB9CCCD02937DD8EEA2258545AAAAB6CBC77D91D3F228741DE65AB49264B361B936D7BE206AAD1904CA53D291448DAD1988BB2779F15F6F9E8262A7EC2690D8A194F0A66E80C2C18901CFD811B7C2A6A07DE5A62AC53E6BCF0679BA300C4E3501DDFC50B2E5E64695A2F38C897AD6CDF596BEBC75F57ABC5F2928D7CAEE79C2366BA1972FE1D9895041D4D7FC8483C9646BB1EBEFB4D
tmp_aes_key = 81A769A19DC0ED0D3DABE397D479407674D72119F479C1425094F54AB0188100
tmp_aes_iv = 3C22B0B11A532C2778AEB3002E5331A7B5D59D62E0E72FA734EB7B62AABBEA0C</code></pre>
<!-- end server_DH_inner_data_input -->
<p>Yielding:</p>
<!-- start server_DH_inner_data_output -->
<pre><code>answer_with_hash = B0130D06F5DE68C63D9D8BAD16F534BEE3EE354BBA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B103000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE0001002E356F542ED36C7C234A0C6DBA49CDF1B1D4510968CEF23450B0FC42F20B63757B95D5AFC1DCA0ED8E146219B411B0D254A7C740457F54E51C4EC8B6B9C97B84A23EA77E36D38A4230BE5D7B1E65BB3F0A4E6D486B22CB279703634AFE013962427A67D78C81FC74AD292FB970B3DFB4F00F93F0FB172B3C9069234E2154AC2D2CD52EA2015D693CF37308D81F1A27B92EE69B260B056A34ADBFC6496A419A24E2D8F54B048FCDD66AB99D0A3CD0DA36DE726019C11750F39FF63BAC6ADD9758286D44275535BB19B53AB57C7C890E0DE9DA13A50DC6F3E9F3C6EBD637489D6968960CC9991F69B0E2E1C306144395D303284C0C12D4376CB56BA051C060FCFF599A9C64A0D61A12CE49CCFA
answer = BA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B103000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE0001002E356F542ED36C7C234A0C6DBA49CDF1B1D4510968CEF23450B0FC42F20B63757B95D5AFC1DCA0ED8E146219B411B0D254A7C740457F54E51C4EC8B6B9C97B84A23EA77E36D38A4230BE5D7B1E65BB3F0A4E6D486B22CB279703634AFE013962427A67D78C81FC74AD292FB970B3DFB4F00F93F0FB172B3C9069234E2154AC2D2CD52EA2015D693CF37308D81F1A27B92EE69B260B056A34ADBFC6496A419A24E2D8F54B048FCDD66AB99D0A3CD0DA36DE726019C11750F39FF63BAC6ADD9758286D44275535BB19B53AB57C7C890E0DE9DA13A50DC6F3E9F3C6EBD637489D6968960CC9991F69B0E2E1C306144395D303284C0C12D4376CB56BA051C060FCFF599A9C64A0D61A12CE49CCFA</code></pre>
<pre><code>answer_with_hash = B5268655881048B58B35EEAD840D915DB708F81EBA0D89B5365B3A127C5B5909490E6C3AECEC0126C2184E38BAC1649C35FD28FC20E9A7EA03000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE000100AA3BB529DC2EF3C74A49AB7F8C9A84BFE86F5CC3ACBBBB5EE047566E5AF06CE56F10627D75F886ECD2777D1679B87E81523BB585DC50F768C9A419C22C260B6924B17A8F153B9F260FC161ECE1D595380FC33CDBDF552F019FB829E0701C005A7B849A71F9EF8C5141E01F152466F41BB9F13B0FEF8E0EFC3091DAF7C4A9E4F65F77B4D3F15EC3977FFA6CB6BAB7F995E2CE25398E09DA9EAD7AAA4BF05A9133B954080F7B258F20C0FADE9E44A7B2AA73E51D91AC86720335CBB38A3DB90689D85233899F292228EFB6FD285923760A5E220ADC3F52B3E0265BFC5AB23E4DDC2D4E14E18B2811EE656B5A16586663289D02422C48F1B8D77017EFFCD276E5EDDD9D9C64A1FEA3302BD58173
answer = BA0D89B5365B3A127C5B5909490E6C3AECEC0126C2184E38BAC1649C35FD28FC20E9A7EA03000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE000100AA3BB529DC2EF3C74A49AB7F8C9A84BFE86F5CC3ACBBBB5EE047566E5AF06CE56F10627D75F886ECD2777D1679B87E81523BB585DC50F768C9A419C22C260B6924B17A8F153B9F260FC161ECE1D595380FC33CDBDF552F019FB829E0701C005A7B849A71F9EF8C5141E01F152466F41BB9F13B0FEF8E0EFC3091DAF7C4A9E4F65F77B4D3F15EC3977FFA6CB6BAB7F995E2CE25398E09DA9EAD7AAA4BF05A9133B954080F7B258F20C0FADE9E44A7B2AA73E51D91AC86720335CBB38A3DB90689D85233899F292228EFB6FD285923760A5E220ADC3F52B3E0265BFC5AB23E4DDC2D4E14E18B2811EE656B5A16586663289D02422C48F1B8D77017EFFCD276E5EDDD9D9C64A1FEA3302BD58173</code></pre>
<!-- end server_DH_inner_data_output -->
<!-- start server_DH_inner_data -->
<p>Generated payload (excluding transport headers/trailers):</p>
<pre><code>0000 | BA 0D 89 B5 61 07 9B D3 CE 40 0A AA C0 6A 7E C0
0010 | F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A EE 2D 08 5D
0020 | 77 13 F5 B1 03 00 00 00 FE 00 01 00 C7 1C AE B9
<pre><code>0000 | BA 0D 89 B5 36 5B 3A 12 7C 5B 59 09 49 0E 6C 3A
0010 | EC EC 01 26 C2 18 4E 38 BA C1 64 9C 35 FD 28 FC
0020 | 20 E9 A7 EA 03 00 00 00 FE 00 01 00 C7 1C AE B9
0030 | C6 B1 C9 04 8E 6C 52 2F 70 F1 3F 73 98 0D 40 23
0040 | 8E 3E 21 C1 49 34 D0 37 56 3D 93 0F 48 19 8A 0A
0050 | A7 C1 40 58 22 94 93 D2 25 30 F4 DB FA 33 6F 6E
@ -534,23 +527,23 @@ answer = BA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B
0100 | F4 7B F9 59 D9 56 85 0C E9 29 85 1F 0D 81 15 F6
0110 | 35 B1 05 EE 2E 4E 15 D0 4B 24 54 BF 6F 4F AD F0
0120 | 34 B1 04 03 11 9C D8 E3 B9 2F CC 5B FE 00 01 00
0130 | 2E 35 6F 54 2E D3 6C 7C 23 4A 0C 6D BA 49 CD F1
0140 | B1 D4 51 09 68 CE F2 34 50 B0 FC 42 F2 0B 63 75
0150 | 7B 95 D5 AF C1 DC A0 ED 8E 14 62 19 B4 11 B0 D2
0160 | 54 A7 C7 40 45 7F 54 E5 1C 4E C8 B6 B9 C9 7B 84
0170 | A2 3E A7 7E 36 D3 8A 42 30 BE 5D 7B 1E 65 BB 3F
0180 | 0A 4E 6D 48 6B 22 CB 27 97 03 63 4A FE 01 39 62
0190 | 42 7A 67 D7 8C 81 FC 74 AD 29 2F B9 70 B3 DF B4
01A0 | F0 0F 93 F0 FB 17 2B 3C 90 69 23 4E 21 54 AC 2D
01B0 | 2C D5 2E A2 01 5D 69 3C F3 73 08 D8 1F 1A 27 B9
01C0 | 2E E6 9B 26 0B 05 6A 34 AD BF C6 49 6A 41 9A 24
01D0 | E2 D8 F5 4B 04 8F CD D6 6A B9 9D 0A 3C D0 DA 36
01E0 | DE 72 60 19 C1 17 50 F3 9F F6 3B AC 6A DD 97 58
01F0 | 28 6D 44 27 55 35 BB 19 B5 3A B5 7C 7C 89 0E 0D
0200 | E9 DA 13 A5 0D C6 F3 E9 F3 C6 EB D6 37 48 9D 69
0210 | 68 96 0C C9 99 1F 69 B0 E2 E1 C3 06 14 43 95 D3
0220 | 03 28 4C 0C 12 D4 37 6C B5 6B A0 51 C0 60 FC FF
0230 | 59 9A 9C 64</code></pre>
0130 | AA 3B B5 29 DC 2E F3 C7 4A 49 AB 7F 8C 9A 84 BF
0140 | E8 6F 5C C3 AC BB BB 5E E0 47 56 6E 5A F0 6C E5
0150 | 6F 10 62 7D 75 F8 86 EC D2 77 7D 16 79 B8 7E 81
0160 | 52 3B B5 85 DC 50 F7 68 C9 A4 19 C2 2C 26 0B 69
0170 | 24 B1 7A 8F 15 3B 9F 26 0F C1 61 EC E1 D5 95 38
0180 | 0F C3 3C DB DF 55 2F 01 9F B8 29 E0 70 1C 00 5A
0190 | 7B 84 9A 71 F9 EF 8C 51 41 E0 1F 15 24 66 F4 1B
01A0 | B9 F1 3B 0F EF 8E 0E FC 30 91 DA F7 C4 A9 E4 F6
01B0 | 5F 77 B4 D3 F1 5E C3 97 7F FA 6C B6 BA B7 F9 95
01C0 | E2 CE 25 39 8E 09 DA 9E AD 7A AA 4B F0 5A 91 33
01D0 | B9 54 08 0F 7B 25 8F 20 C0 FA DE 9E 44 A7 B2 AA
01E0 | 73 E5 1D 91 AC 86 72 03 35 CB B3 8A 3D B9 06 89
01F0 | D8 52 33 89 9F 29 22 28 EF B6 FD 28 59 23 76 0A
0200 | 5E 22 0A DC 3F 52 B3 E0 26 5B FC 5A B2 3E 4D DC
0210 | 2D 4E 14 E1 8B 28 11 EE 65 6B 5A 16 58 66 63 28
0220 | 9D 02 42 2C 48 F1 B8 D7 70 17 EF FC D2 76 E5 ED
0230 | DD 9D 9C 64</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>server_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data;</code></pre>
<table class="table">
@ -572,13 +565,13 @@ answer = BA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B
<tr>
<td>nonce</td>
<td>4, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>20, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
@ -596,13 +589,13 @@ answer = BA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B
<tr>
<td>g_a</td>
<td>300, 260</td>
<td><code>FE0001002E356F542ED36C7C234A0C6D</code> <code>BA49CDF1B1D4510968CEF23450B0FC42</code> <code>F20B63757B95D5AFC1DCA0ED8E146219</code> <code>B411B0D254A7C740457F54E51C4EC8B6</code> <code>B9C97B84A23EA77E36D38A4230BE5D7B</code> <code>1E65BB3F0A4E6D486B22CB279703634A</code> <code>FE013962427A67D78C81FC74AD292FB9</code> <code>70B3DFB4F00F93F0FB172B3C9069234E</code> <code>2154AC2D2CD52EA2015D693CF37308D8</code> <code>1F1A27B92EE69B260B056A34ADBFC649</code> <code>6A419A24E2D8F54B048FCDD66AB99D0A</code> <code>3CD0DA36DE726019C11750F39FF63BAC</code> <code>6ADD9758286D44275535BB19B53AB57C</code> <code>7C890E0DE9DA13A50DC6F3E9F3C6EBD6</code> <code>37489D6968960CC9991F69B0E2E1C306</code> <code>144395D303284C0C12D4376CB56BA051</code><br> <code>C060FCFF</code></td>
<td><code>FE000100AA3BB529DC2EF3C74A49AB7F</code> <code>8C9A84BFE86F5CC3ACBBBB5EE047566E</code> <code>5AF06CE56F10627D75F886ECD2777D16</code> <code>79B87E81523BB585DC50F768C9A419C2</code> <code>2C260B6924B17A8F153B9F260FC161EC</code> <code>E1D595380FC33CDBDF552F019FB829E0</code> <code>701C005A7B849A71F9EF8C5141E01F15</code> <code>2466F41BB9F13B0FEF8E0EFC3091DAF7</code> <code>C4A9E4F65F77B4D3F15EC3977FFA6CB6</code> <code>BAB7F995E2CE25398E09DA9EAD7AAA4B</code> <code>F05A9133B954080F7B258F20C0FADE9E</code> <code>44A7B2AA73E51D91AC86720335CBB38A</code> <code>3DB90689D85233899F292228EFB6FD28</code> <code>5923760A5E220ADC3F52B3E0265BFC5A</code> <code>B23E4DDC2D4E14E18B2811EE656B5A16</code> <code>586663289D02422C48F1B8D77017EFFC</code><br> <code>D276E5ED</code></td>
<td><code>g_a</code> diffie-hellman parameter</td>
</tr>
<tr>
<td>server_time</td>
<td>560, 4</td>
<td><code>599A9C64</code> (1687984729 in decimal)</td>
<td><code>DD9D9C64</code> (1687985629 in decimal)</td>
<td>Server time</td>
</tr>
</tbody>
@ -611,34 +604,34 @@ answer = BA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B
<h1><a class="anchor" href="#42-generate-diffie-helman-parameters" id="42-generate-diffie-helman-parameters" name="42-generate-diffie-helman-parameters"><i class="anchor-icon"></i></a>4.2. generate diffie-helman parameters</h1>
<p>First, generate a secure random 2048-bit number b:</p>
<!-- start b -->
<pre><code>b = BEB68C99A15F26F3590BB9E035CF2285590CDC8BCEC7DC112973D0D68FC78DD283FB7C38D39450FDA2B65BD7B4EBB25C042C4C1D7B52DAEEA7C40898984279DE8A5B4101D94A9621D2B4EF405864B0975FF21C6971B039161190346706C8A35473CA5B9E8CF0A1E3819D2DFA294270CEB6652DF940C26555425987513EAFD09CDD6F70C889DBBC1D1BBF287154760CC4BB3E80A8B313914F4017C22314A3DCDC634AE3BB7C33A45835E87A093706280FD7BEF2C1C3952BC19C55F2086E966EB374A635CC66D8B70899236C6E0944FF2353DE77610C9567ACC221FF036F29F463C0593DA02E90DE1AF4F65C1C709482610A76E71E20B1068B7DFC5D990E865D66</code></pre>
<pre><code>b = 3333AB3DDBC89A3297AFD5C1FD314F9F6F90D3FDFB47EEC50B6710C2378B98D18EDDB06FD1977780D8B10A5DE2B5CBAD8FADD3F6526F3ECB8AF27ADF629915701287D23BC30EC426C4DCF8663DA2D700A98617E74EEFDDA53F4F6DEC2086406FC9FD1EBF423380E57C796B599978B6A028A70CA23D9D53318A9CD17C4AF652CA9119AFB6031EBD15293D1BFEA24183FE033113FF79BCC7C9A472CFC4CEFC800793CBC2366777525895056107937C7C52C34CD318F91F8B59D5DAA100AE11A2C4381D2FC16086C8C46BA641CF25036F52575688956773C91C734D7BF63FBC699795669B832A879A93B06238720B35A46B4C8878627D96C18577C978BFE9499157</code></pre>
<!-- end b -->
<p>Then compute <code>g_b = pow(g, b) mod dh_prime</code></p>
<!-- start g_b -->
<pre><code>g_b = 2F96BE7689D134320851F8247F8B92A541EA353EFBE190F0B79A54451121A3A21B3AE5AD1F744A957804362EFFCB1199342FEB787873032801CC9B991349E86B9E6973A1337A67AE94A5E73BD312DD146B0659B25460A838612055B5A5823814F3AAA8DFBD54B8094C42994541407C11293DFC08FCEDB50665104207ECAAC3DEE4B5AEBC1742159B39F8B00D4CD49616F8C3AF5E50A69EBEE7B7913B91369BD9736F9A42B4697F0DB7B11B95A7C927DF7D72DD90A42B2B3B9D3F2281D27454F1CFE659B33832855DD95E65EB6CF34EAE308F7B2972016BBBDEB20C30782B587CA16C8CDEB87A5108975A6069BAAB97EDBBFB1E2C0B7C190142F66B4970C2D130</code></pre>
<pre><code>g_b = 3DE753B9F0985A68E14BD95E3B720FCB617EB5899AA28772C8B477BAD4FA9544C671AA9D4B3E2F90ABDC55B25A61AD4FE5132AD3CFEDC5EA196110F4E4F02656F57D61FCE05D660F129DD1B817A003F73783BA041103A199B0AAB76A13FFFC339C35DB8A368FCBB4B35387CB82A019886FEFB17227616BBE287818B5553E339247890288C2DC6077FE721F769F92751F637E1731D1101803E522F293D4BEB4B17FDF121FB5C23B8D0EF2B02A0706638FD6415B5A7E90B8A55AE6CA13E2F238BF4C7856D1406ED546D7A6A79CBCEDDBF2209C0F074502067B7A15B2AD28EE139D2250006ECE5A2449C87F2B0EAA0B2CB75CD97D775055495DB03C7E03F9F614DF</code></pre>
<!-- end g_b -->
<h1><a class="anchor" href="#43-generation-of-encrypted-data" id="43-generation-of-encrypted-data" name="43-generation-of-encrypted-data"><i class="anchor-icon"></i></a>4.3 generation of encrypted_data</h1>
<!-- start client_DH_inner_data -->
<p>Generated payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 54 B6 43 66 61 07 9B D3 CE 40 0A AA C0 6A 7E C0
0010 | F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A EE 2D 08 5D
0020 | 77 13 F5 B1 00 00 00 00 00 00 00 00 FE 00 01 00
0030 | 2F 96 BE 76 89 D1 34 32 08 51 F8 24 7F 8B 92 A5
0040 | 41 EA 35 3E FB E1 90 F0 B7 9A 54 45 11 21 A3 A2
0050 | 1B 3A E5 AD 1F 74 4A 95 78 04 36 2E FF CB 11 99
0060 | 34 2F EB 78 78 73 03 28 01 CC 9B 99 13 49 E8 6B
0070 | 9E 69 73 A1 33 7A 67 AE 94 A5 E7 3B D3 12 DD 14
0080 | 6B 06 59 B2 54 60 A8 38 61 20 55 B5 A5 82 38 14
0090 | F3 AA A8 DF BD 54 B8 09 4C 42 99 45 41 40 7C 11
00A0 | 29 3D FC 08 FC ED B5 06 65 10 42 07 EC AA C3 DE
00B0 | E4 B5 AE BC 17 42 15 9B 39 F8 B0 0D 4C D4 96 16
00C0 | F8 C3 AF 5E 50 A6 9E BE E7 B7 91 3B 91 36 9B D9
00D0 | 73 6F 9A 42 B4 69 7F 0D B7 B1 1B 95 A7 C9 27 DF
00E0 | 7D 72 DD 90 A4 2B 2B 3B 9D 3F 22 81 D2 74 54 F1
00F0 | CF E6 59 B3 38 32 85 5D D9 5E 65 EB 6C F3 4E AE
0100 | 30 8F 7B 29 72 01 6B BB DE B2 0C 30 78 2B 58 7C
0110 | A1 6C 8C DE B8 7A 51 08 97 5A 60 69 BA AB 97 ED
0120 | BB FB 1E 2C 0B 7C 19 01 42 F6 6B 49 70 C2 D1 30</code></pre>
<pre><code>0000 | 54 B6 43 66 36 5B 3A 12 7C 5B 59 09 49 0E 6C 3A
0010 | EC EC 01 26 C2 18 4E 38 BA C1 64 9C 35 FD 28 FC
0020 | 20 E9 A7 EA 00 00 00 00 00 00 00 00 FE 00 01 00
0030 | 3D E7 53 B9 F0 98 5A 68 E1 4B D9 5E 3B 72 0F CB
0040 | 61 7E B5 89 9A A2 87 72 C8 B4 77 BA D4 FA 95 44
0050 | C6 71 AA 9D 4B 3E 2F 90 AB DC 55 B2 5A 61 AD 4F
0060 | E5 13 2A D3 CF ED C5 EA 19 61 10 F4 E4 F0 26 56
0070 | F5 7D 61 FC E0 5D 66 0F 12 9D D1 B8 17 A0 03 F7
0080 | 37 83 BA 04 11 03 A1 99 B0 AA B7 6A 13 FF FC 33
0090 | 9C 35 DB 8A 36 8F CB B4 B3 53 87 CB 82 A0 19 88
00A0 | 6F EF B1 72 27 61 6B BE 28 78 18 B5 55 3E 33 92
00B0 | 47 89 02 88 C2 DC 60 77 FE 72 1F 76 9F 92 75 1F
00C0 | 63 7E 17 31 D1 10 18 03 E5 22 F2 93 D4 BE B4 B1
00D0 | 7F DF 12 1F B5 C2 3B 8D 0E F2 B0 2A 07 06 63 8F
00E0 | D6 41 5B 5A 7E 90 B8 A5 5A E6 CA 13 E2 F2 38 BF
00F0 | 4C 78 56 D1 40 6E D5 46 D7 A6 A7 9C BC ED DB F2
0100 | 20 9C 0F 07 45 02 06 7B 7A 15 B2 AD 28 EE 13 9D
0110 | 22 50 00 6E CE 5A 24 49 C8 7F 2B 0E AA 0B 2C B7
0120 | 5C D9 7D 77 50 55 49 5D B0 3C 7E 03 F9 F6 14 DF</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>client_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data;</code></pre>
<table class="table">
@ -660,73 +653,73 @@ answer = BA0D89B561079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B
<tr>
<td>nonce</td>
<td>4, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>20, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>g_b</td>
<td>36, 260</td>
<td><code>FE0001002F96BE7689D134320851F824</code> <code>7F8B92A541EA353EFBE190F0B79A5445</code> <code>1121A3A21B3AE5AD1F744A957804362E</code> <code>FFCB1199342FEB787873032801CC9B99</code> <code>1349E86B9E6973A1337A67AE94A5E73B</code> <code>D312DD146B0659B25460A838612055B5</code> <code>A5823814F3AAA8DFBD54B8094C429945</code> <code>41407C11293DFC08FCEDB50665104207</code> <code>ECAAC3DEE4B5AEBC1742159B39F8B00D</code> <code>4CD49616F8C3AF5E50A69EBEE7B7913B</code> <code>91369BD9736F9A42B4697F0DB7B11B95</code> <code>A7C927DF7D72DD90A42B2B3B9D3F2281</code> <code>D27454F1CFE659B33832855DD95E65EB</code> <code>6CF34EAE308F7B2972016BBBDEB20C30</code> <code>782B587CA16C8CDEB87A5108975A6069</code> <code>BAAB97EDBBFB1E2C0B7C190142F66B49</code><br> <code>70C2D130</code></td>
<td><code>FE0001003DE753B9F0985A68E14BD95E</code> <code>3B720FCB617EB5899AA28772C8B477BA</code> <code>D4FA9544C671AA9D4B3E2F90ABDC55B2</code> <code>5A61AD4FE5132AD3CFEDC5EA196110F4</code> <code>E4F02656F57D61FCE05D660F129DD1B8</code> <code>17A003F73783BA041103A199B0AAB76A</code> <code>13FFFC339C35DB8A368FCBB4B35387CB</code> <code>82A019886FEFB17227616BBE287818B5</code> <code>553E339247890288C2DC6077FE721F76</code> <code>9F92751F637E1731D1101803E522F293</code> <code>D4BEB4B17FDF121FB5C23B8D0EF2B02A</code> <code>0706638FD6415B5A7E90B8A55AE6CA13</code> <code>E2F238BF4C7856D1406ED546D7A6A79C</code> <code>BCEDDBF2209C0F074502067B7A15B2AD</code> <code>28EE139D2250006ECE5A2449C87F2B0E</code> <code>AA0B2CB75CD97D775055495DB03C7E03</code><br> <code>F9F614DF</code></td>
<td>Single-byte prefix denoting length, a 256-byte (2048-bit) string, and zero bytes of padding</td>
</tr>
<tr>
<td>retry_id</td>
<td>296, 8</td>
<td><code>0000000000000000</code></td>
<td>Equal to zero at the time of the first attempt; otherwise, it is equal to <code>auth_key_aux_hash</code> from the previous failed attempt (see Item 7).</td>
<td>Equal to zero at the time of the first attempt; otherwise, it is equal to <code>auth_key_aux_hash</code> from the previous failed attempt (see <a href="/mtproto/auth_key#9-server-responds-in-one-of-three-ways">Item 9</a>).</td>
</tr>
</tbody>
</table>
<!-- end client_DH_inner_data -->
<p>The serialization of <em>Client_DH_Inner_Data</em> produces a string <strong>data</strong>. This is used to generate <strong>encrypted_data</strong> as specified in <a href="#6-client-computes-random-2048-bit-number-b-using-a-sufficient-amount-of-entropy-and-sends-the-server-a-message">step 6</a>, using the following inputs:</p>
<!-- start client_DH_inner_data_input -->
<pre><code>data = 54B6436661079BD3CE400AAAC06A7EC0F9E70AF2F33BCBF4A8C23D6AEE2D085D7713F5B10000000000000000FE0001002F96BE7689D134320851F8247F8B92A541EA353EFBE190F0B79A54451121A3A21B3AE5AD1F744A957804362EFFCB1199342FEB787873032801CC9B991349E86B9E6973A1337A67AE94A5E73BD312DD146B0659B25460A838612055B5A5823814F3AAA8DFBD54B8094C42994541407C11293DFC08FCEDB50665104207ECAAC3DEE4B5AEBC1742159B39F8B00D4CD49616F8C3AF5E50A69EBEE7B7913B91369BD9736F9A42B4697F0DB7B11B95A7C927DF7D72DD90A42B2B3B9D3F2281D27454F1CFE659B33832855DD95E65EB6CF34EAE308F7B2972016BBBDEB20C30782B587CA16C8CDEB87A5108975A6069BAAB97EDBBFB1E2C0B7C190142F66B4970C2D130
padding = 3F278A4C4010D41218A1D70F
tmp_aes_key = 83E6FC26B9543A3D5FE6357D7DF98DC7E5EDA4B1791A2973A414443CD6736E2B
tmp_aes_iv = F61B20DAF8A413BCEBE132A7EE9410C958F7B1C3537E82A7C35E899F77C0A68B</code></pre>
<pre><code>data = 54B64366365B3A127C5B5909490E6C3AECEC0126C2184E38BAC1649C35FD28FC20E9A7EA0000000000000000FE0001003DE753B9F0985A68E14BD95E3B720FCB617EB5899AA28772C8B477BAD4FA9544C671AA9D4B3E2F90ABDC55B25A61AD4FE5132AD3CFEDC5EA196110F4E4F02656F57D61FCE05D660F129DD1B817A003F73783BA041103A199B0AAB76A13FFFC339C35DB8A368FCBB4B35387CB82A019886FEFB17227616BBE287818B5553E339247890288C2DC6077FE721F769F92751F637E1731D1101803E522F293D4BEB4B17FDF121FB5C23B8D0EF2B02A0706638FD6415B5A7E90B8A55AE6CA13E2F238BF4C7856D1406ED546D7A6A79CBCEDDBF2209C0F074502067B7A15B2AD28EE139D2250006ECE5A2449C87F2B0EAA0B2CB75CD97D775055495DB03C7E03F9F614DF
padding = 8FD908884FACC949D9DC73DE
tmp_aes_key = 81A769A19DC0ED0D3DABE397D479407674D72119F479C1425094F54AB0188100
tmp_aes_iv = 3C22B0B11A532C2778AEB3002E5331A7B5D59D62E0E72FA734EB7B62AABBEA0C</code></pre>
<!-- end client_DH_inner_data_input -->
<p>Process:</p>
<pre><code>data_with_hash := SHA1(data) + data + padding (0-15 random bytes such that total length is divisible by 16)
encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);</code></pre>
<p>Output:</p>
<!-- start client_DH_inner_data_output -->
<pre><code>encrypted_data = 430A36E55F18CB44BFFFAC0272BCBE6F1FCFC589D2FD35A96EF285F383800F6CBBCC0B0A576827B237A41894BFFEFA5D9C880340CBB1CD4E016BE6A089ED80C41456397EFE2791707BBBD629C5CBAE237856BCFF5D3B057A26C9FA8917B6B218B10D1B7ADB62F471AEFDA26D2678C492B569D636E38DC46B1BDE833A980C16E4A1D8E7CDE40AF26DD28E00CA34A8C01BE311550C81681B0E070CD627333E837E395980C93F69417BCA8864AECCF4211E949EA79FC3556F415E4F8C1B0454217759E8436132323A4251BBB051F17E4191C40BA003757918180EDF9537AC791C15093FED041F1FC0F0A88C39BAF6E463F1A90BAC6D7A3BE0C6195F3230DB264047341E2CB4067404FE078EB89E0745903DB1AA4BBDAB03E1DA91083D7F8D57AD0AC69948D00A380912E7F297CF86C316F7517798869B2185E9AEFADB2BDC07E2893D4B9FD06E723AC2FE0A96BD7532A424</code></pre>
<pre><code>encrypted_data = 93330604E44C6F993349C60F05C23EDC56B844B57C654AEDF19B44F5EF8DB9590F7D9A9F8E81C50C377E3481D8DF9DD585D45AE25D3B9E51CE4FF584130236697C14C6BBFD65599D53132AB5FB31FF4AAC92EC7F256B5F9CE8FFB747F77E9F81588D277E3DFFB9F14E3642ACD2A1F9BBE66054608627027692D2A08DCC6671A4E6A43EFF37053E7F57DA1E04D8D6395D27BD09D7D49F46713CF0232073B342A3E2F34D23D9D8CD70E154A713B0AFACC27910ABC49D99EBA882FEBC22F6A5E7FD5AE5ABF49352372FA64D9D11BF4380197C59AEDE23D11DD7E09FABDD85A6173CD0CB8F1DFD7D0301C6DD4E40FDDC9C3A80C1E5ABDC51ADFEF357753C7B7D4DE4E8A4CAF10DF7248BCDACE125A08A35CBF4A021CFA1D78F606EE604BA14F012B13F22252C952FD52B0560679C63168188B07805E45613C7EFEE8C5495E72931C2553A0FCA7BB11D3ED48F1A5043DC776D</code></pre>
<!-- end client_DH_inner_data_output -->
<p>The length of the final string is 336 bytes.</p>
<h1><a class="anchor" href="#5-request-set-client-dh-params" id="5-request-set-client-dh-params" name="5-request-set-client-dh-params"><i class="anchor-icon"></i></a>5. request set_client_dh_params</h1>
<!-- start set_client_DH_params -->
<p>Sent payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 04 00 00 00 59 9A 9C 64
0010 | 78 01 00 00 1F 5F 04 F5 61 07 9B D3 CE 40 0A AA
0020 | C0 6A 7E C0 F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A
0030 | EE 2D 08 5D 77 13 F5 B1 FE 50 01 00 43 0A 36 E5
0040 | 5F 18 CB 44 BF FF AC 02 72 BC BE 6F 1F CF C5 89
0050 | D2 FD 35 A9 6E F2 85 F3 83 80 0F 6C BB CC 0B 0A
0060 | 57 68 27 B2 37 A4 18 94 BF FE FA 5D 9C 88 03 40
0070 | CB B1 CD 4E 01 6B E6 A0 89 ED 80 C4 14 56 39 7E
0080 | FE 27 91 70 7B BB D6 29 C5 CB AE 23 78 56 BC FF
0090 | 5D 3B 05 7A 26 C9 FA 89 17 B6 B2 18 B1 0D 1B 7A
00A0 | DB 62 F4 71 AE FD A2 6D 26 78 C4 92 B5 69 D6 36
00B0 | E3 8D C4 6B 1B DE 83 3A 98 0C 16 E4 A1 D8 E7 CD
00C0 | E4 0A F2 6D D2 8E 00 CA 34 A8 C0 1B E3 11 55 0C
00D0 | 81 68 1B 0E 07 0C D6 27 33 3E 83 7E 39 59 80 C9
00E0 | 3F 69 41 7B CA 88 64 AE CC F4 21 1E 94 9E A7 9F
00F0 | C3 55 6F 41 5E 4F 8C 1B 04 54 21 77 59 E8 43 61
0100 | 32 32 3A 42 51 BB B0 51 F1 7E 41 91 C4 0B A0 03
0110 | 75 79 18 18 0E DF 95 37 AC 79 1C 15 09 3F ED 04
0120 | 1F 1F C0 F0 A8 8C 39 BA F6 E4 63 F1 A9 0B AC 6D
0130 | 7A 3B E0 C6 19 5F 32 30 DB 26 40 47 34 1E 2C B4
0140 | 06 74 04 FE 07 8E B8 9E 07 45 90 3D B1 AA 4B BD
0150 | AB 03 E1 DA 91 08 3D 7F 8D 57 AD 0A C6 99 48 D0
0160 | 0A 38 09 12 E7 F2 97 CF 86 C3 16 F7 51 77 98 86
0170 | 9B 21 85 E9 AE FA DB 2B DC 07 E2 89 3D 4B 9F D0
0180 | 6E 72 3A C2 FE 0A 96 BD 75 32 A4 24</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 00 00 00 00 DD 9D 9C 64
0010 | 78 01 00 00 1F 5F 04 F5 36 5B 3A 12 7C 5B 59 09
0020 | 49 0E 6C 3A EC EC 01 26 C2 18 4E 38 BA C1 64 9C
0030 | 35 FD 28 FC 20 E9 A7 EA FE 50 01 00 93 33 06 04
0040 | E4 4C 6F 99 33 49 C6 0F 05 C2 3E DC 56 B8 44 B5
0050 | 7C 65 4A ED F1 9B 44 F5 EF 8D B9 59 0F 7D 9A 9F
0060 | 8E 81 C5 0C 37 7E 34 81 D8 DF 9D D5 85 D4 5A E2
0070 | 5D 3B 9E 51 CE 4F F5 84 13 02 36 69 7C 14 C6 BB
0080 | FD 65 59 9D 53 13 2A B5 FB 31 FF 4A AC 92 EC 7F
0090 | 25 6B 5F 9C E8 FF B7 47 F7 7E 9F 81 58 8D 27 7E
00A0 | 3D FF B9 F1 4E 36 42 AC D2 A1 F9 BB E6 60 54 60
00B0 | 86 27 02 76 92 D2 A0 8D CC 66 71 A4 E6 A4 3E FF
00C0 | 37 05 3E 7F 57 DA 1E 04 D8 D6 39 5D 27 BD 09 D7
00D0 | D4 9F 46 71 3C F0 23 20 73 B3 42 A3 E2 F3 4D 23
00E0 | D9 D8 CD 70 E1 54 A7 13 B0 AF AC C2 79 10 AB C4
00F0 | 9D 99 EB A8 82 FE BC 22 F6 A5 E7 FD 5A E5 AB F4
0100 | 93 52 37 2F A6 4D 9D 11 BF 43 80 19 7C 59 AE DE
0110 | 23 D1 1D D7 E0 9F AB DD 85 A6 17 3C D0 CB 8F 1D
0120 | FD 7D 03 01 C6 DD 4E 40 FD DC 9C 3A 80 C1 E5 AB
0130 | DC 51 AD FE F3 57 75 3C 7B 7D 4D E4 E8 A4 CA F1
0140 | 0D F7 24 8B CD AC E1 25 A0 8A 35 CB F4 A0 21 CF
0150 | A1 D7 8F 60 6E E6 04 BA 14 F0 12 B1 3F 22 25 2C
0160 | 95 2F D5 2B 05 60 67 9C 63 16 81 88 B0 78 05 E4
0170 | 56 13 C7 EF EE 8C 54 95 E7 29 31 C2 55 3A 0F CA
0180 | 7B B1 1D 3E D4 8F 1A 50 43 DC 77 6D</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer;</code></pre>
<table class="table">
@ -748,7 +741,7 @@ encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);<
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>04000000599A9C64</code></td>
<td><code>00000000DD9D9C64</code></td>
<td>Exact <code>unixtime*2^32</code>, <code>+(4*N)</code> if N messages with the same message ID were already generated</td>
</tr>
<tr>
@ -766,20 +759,20 @@ encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);<
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>encrypted_data</td>
<td>56, 340</td>
<td><code>FE500100430A36E55F18CB44BFFFAC02</code> <code>72BCBE6F1FCFC589D2FD35A96EF285F3</code> <code>83800F6CBBCC0B0A576827B237A41894</code> <code>BFFEFA5D9C880340CBB1CD4E016BE6A0</code> <code>89ED80C41456397EFE2791707BBBD629</code> <code>C5CBAE237856BCFF5D3B057A26C9FA89</code> <code>17B6B218B10D1B7ADB62F471AEFDA26D</code> <code>2678C492B569D636E38DC46B1BDE833A</code> <code>980C16E4A1D8E7CDE40AF26DD28E00CA</code> <code>34A8C01BE311550C81681B0E070CD627</code> <code>333E837E395980C93F69417BCA8864AE</code> <code>CCF4211E949EA79FC3556F415E4F8C1B</code> <code>0454217759E8436132323A4251BBB051</code> <code>F17E4191C40BA003757918180EDF9537</code> <code>AC791C15093FED041F1FC0F0A88C39BA</code> <code>F6E463F1A90BAC6D7A3BE0C6195F3230</code> <code>DB264047341E2CB4067404FE078EB89E</code> <code>0745903DB1AA4BBDAB03E1DA91083D7F</code> <code>8D57AD0AC69948D00A380912E7F297CF</code> <code>86C316F7517798869B2185E9AEFADB2B</code> <code>DC07E2893D4B9FD06E723AC2FE0A96BD</code><br> <code>7532A424</code></td>
<td>Encrypted client_DH_inner_data generated previously</td>
<td><code>FE50010093330604E44C6F993349C60F</code> <code>05C23EDC56B844B57C654AEDF19B44F5</code> <code>EF8DB9590F7D9A9F8E81C50C377E3481</code> <code>D8DF9DD585D45AE25D3B9E51CE4FF584</code> <code>130236697C14C6BBFD65599D53132AB5</code> <code>FB31FF4AAC92EC7F256B5F9CE8FFB747</code> <code>F77E9F81588D277E3DFFB9F14E3642AC</code> <code>D2A1F9BBE66054608627027692D2A08D</code> <code>CC6671A4E6A43EFF37053E7F57DA1E04</code> <code>D8D6395D27BD09D7D49F46713CF02320</code> <code>73B342A3E2F34D23D9D8CD70E154A713</code> <code>B0AFACC27910ABC49D99EBA882FEBC22</code> <code>F6A5E7FD5AE5ABF49352372FA64D9D11</code> <code>BF4380197C59AEDE23D11DD7E09FABDD</code> <code>85A6173CD0CB8F1DFD7D0301C6DD4E40</code> <code>FDDC9C3A80C1E5ABDC51ADFEF357753C</code> <code>7B7D4DE4E8A4CAF10DF7248BCDACE125</code> <code>A08A35CBF4A021CFA1D78F606EE604BA</code> <code>14F012B13F22252C952FD52B0560679C</code> <code>63168188B07805E45613C7EFEE8C5495</code> <code>E72931C2553A0FCA7BB11D3ED48F1A50</code><br> <code>43DC776D</code></td>
<td>Encrypted client_DH_inner_data generated previously, serialized as a TL byte string</td>
</tr>
</tbody>
</table>
@ -787,21 +780,19 @@ encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);<
<h1><a class="anchor" href="#6-auth-key-generation" id="6-auth-key-generation" name="6-auth-key-generation"><i class="anchor-icon"></i></a>6. auth key generation</h1>
<p>The client computes the auth_key using formula <code>g_a^b mod dh_prime</code>:</p>
<!-- start auth_key -->
<pre><code>auth_key = 387F13DD24C48755BB0B3F4EF874E0AE86EAE3236676695D30BCC0005ECD0836F9968DAB19B362E4A2C0E0A1DDB1E0DCDA225A2571D5D911EFBE764CA97123799117B3AC18FA749F287B304156427DCECF1D4C16A2922C9727D0CF004EA075C22A37B0D901933DEFAF27A6D1D7FC57024E02E5D12ECF9D6C1ADF1E7A1B5A85284FA29B09DA5BD5ACB0DAE6580B88C026E97F2BFDCFF183C9661DFD639804B3DFB175EA755E9D9B02DA907B299C4A84B070C0A517E27F395B8ABA67C923583BF0493A27559C9716951B554669D0A33AD6E9A8D78C5EE1E89A03A177B06833B45DD60A5680E46F6B03B7C94ECAF5E7E31B3B03D28F59E237D764E80973C1F05C98</code></pre>
<pre><code>auth_key = 05ACE659A2FCCFDE0B093E1FAC47A3FA50D252047AE565F40311FC448366518D7419AA9E1ACE2AAB527BAF62405988E30B8A604BA8FADFEDCB0E36A0C9DD11CEF496105F252996DDC7925D5BB0DDA956448F460AC373FAF99575CC8D477C77B90261092265F272DF7B82753DEBDC86831D36FFF971F05CD9D9E5A09088FE293F2E9BCF08A75B66A9FE01D91CD75707B8F91BEAFD541EA235CB831CCF7694DFAB9C7E1BECF60CCBF2A38C1CD413DCB9D2E109153F66693A54E5DECAB905BBF1D7434D6FCF6A7C8D5A9787DA866ACC25B9F1317D7DD34C185ADD5A90861CF592DD0B8C09F825D26FDE8F3E17AE16478BB5D7F95AE11D4F674D8D21EAF6CC67CF29</code></pre>
<!-- end auth_key -->
<h1><a class="anchor" href="#7-reply-set-client-dh-params-answer" id="7-reply-set-client-dh-params-answer" name="7-reply-set-client-dh-params-answer"><i class="anchor-icon"></i></a>7. reply set_client_dh_params_answer</h1>
<p>The server verifies and confirms that auth_key_hash is unique: since it's unique, it replies with the following:</p>
<!-- start dh_gen_ok -->
<p>Received payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 CC C6 CE 59 9A 9C 64
0010 | 54 00 00 00 34 F7 CB 3B 61 07 9B D3 CE 40 0A AA
0020 | C0 6A 7E C0 F9 E7 0A F2 F3 3B CB F4 A8 C2 3D 6A
0030 | EE 2D 08 5D 77 13 F5 B1 C9 C0 EC 9D DD 5F 1A 18
0040 | 52 51 15 70 51 A6 94 1E</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 A8 E5 65 DD 9D 9C 64
0010 | A0 00 00 00 34 F7 CB 3B 36 5B 3A 12 7C 5B 59 09
0020 | 49 0E 6C 3A EC EC 01 26 C2 18 4E 38 BA C1 64 9C
0030 | 35 FD 28 FC 20 E9 A7 EA 20 6C 98 37 3F A1 E0 49
0040 | 14 C0 9B E1 57 2B 96 3C</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>dh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer;
dh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer;
dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer;</code></pre>
<pre><code>dh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer;</code></pre>
<table class="table">
<thead>
<tr>
@ -821,13 +812,13 @@ dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = S
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>01CCC6CE599A9C64</code></td>
<td><code>01A8E565DD9D9C64</code></td>
<td>Exact <code>unixtime*2^32</code>, <code>+(4*N)</code> if N messages with the same message ID were already generated</td>
</tr>
<tr>
<td>message_length</td>
<td>16, 4</td>
<td><code>54000000</code> (84 in decimal)</td>
<td><code>A0000000</code> (160 in decimal)</td>
<td>Message body length</td>
</tr>
<tr>
@ -839,19 +830,19 @@ dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = S
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>61079BD3CE400AAAC06A7EC0F9E70AF2</code></td>
<td><code>365B3A127C5B5909490E6C3AECEC0126</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>F33BCBF4A8C23D6AEE2D085D7713F5B1</code></td>
<td><code>C2184E38BAC1649C35FD28FC20E9A7EA</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>new_nonce_hash1</td>
<td>56, 16</td>
<td><code>C9C0EC9DDD5F1A185251157051A6941E</code></td>
<td><code>206C98373FA1E04914C09BE1572B963C</code></td>
<td>The 128 lower-order bits of SHA1 of the byte string derived from the <code>new_nonce</code> string by adding a single byte with the value of 1, 2, or 3, and followed by another 8 bytes with <code>auth_key_aux_hash</code>. Different values are required to prevent an intruder from changing server response dh_gen_ok into dh_gen_retry.</td>
</tr>
</tbody>