Update content of files

This commit is contained in:
GitHub Action 2024-08-08 08:52:55 +00:00
parent aa4282b563
commit 5a77239cb6
3 changed files with 212 additions and 217 deletions
data/web/corefork.telegram.org

View file

@ -63,9 +63,8 @@
<li>Added more details about the <a href="/api/push-updates#possible-notifications">READ_REACTION »</a>, <a href="/api/push-updates#possible-notifications">READ_STORIES »</a>, <a href="/api/push-updates#possible-notifications">STORY_DELETED »</a> push notifications.</li>
<li>Improved the <a href="/api/updates">updates</a> documentation, specifically:<ul>
<li>Clarified that <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> does <em>not</em> have to be invoked on startup for all channels, as it will be automatically triggered (only for channels that need catching up) by a set of <a href="/constructor/updateChannelTooLong">updateChannelTooLong</a> updates that will be returned by <a href="/method/updates.getDifference">updates.getDifference</a> (that <em>does</em> need to be called on startup).</li>
<li>Clarified that <a href="/api/updates#subscribing-to-updates-of-channels-supergroups">users should short-poll updates.getChannelDifference for currently opened channels/supergroups (including subscribed ones) »</a>.</li>
<li>Clarified that <a href="/api/updates#subscribing-to-updates-of-channels-supergroups">users should short-poll updates.getChannelDifference for currently opened channels/supergroups (including subscribed ones, max 10 overall) »</a>.</li>
<li>Clarified that <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> should not be short-polled via <code>timeout</code> by bots, or if the user is currently not viewing the channel/supergroup.</li>
<li>Clarified that clients should limit to 10 the maximum number of concurrent <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> calls.</li>
</ul>
</li>
</ul>

View file

@ -153,19 +153,15 @@ The intermediate status, represented by the <strong>pts</strong>, must be saved
<p>For performance reasons and for better user experience, client can set maximum gap size to be filled: <code>pts_total_limit</code> parameter of <a href="/method/updates.getDifference">updates.getDifference</a> and <code>limit</code> parameter for <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> can be used.</p>
<p>If the gap is too large and there are too many updates to fetch, a <code>*TooLong</code> constructor will be returned. In this case, the client must <a href="#fetching-state">re-fetch the state</a>, re-start fetching updates from that state and follow the instructions that can be found <a href="/constructor/updates.channelDifferenceTooLong">here</a>.</p>
<p>It is recommended to use limit <code>10-100</code> for channels and <code>1000-10000</code> otherwise.</p>
<p>Limit the maximum number of concurrent <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> calls to 10. </p>
<p>Do not re-invoke <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> if the returned difference is <code>final</code>, unless <a href="#subscribing-to-updates-of-channels-supergroups">the user has opened the channel/supergroup</a> or <a href="#subscribing-to-updates-of-channels-supergroups-we-havent-joined">we're fetching updates from a channel/supergroup we're not a member of</a>. </p>
<p>Do not re-invoke <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> if the returned difference is <code>final</code>, unless <a href="#subscribing-to-updates-of-channels-supergroups">the user has opened the channel/supergroup »</a>. </p>
<h3><a class="anchor" href="#subscribing-to-updates-of-channels-supergroups" id="subscribing-to-updates-of-channels-supergroups" name="subscribing-to-updates-of-channels-supergroups"><i class="anchor-icon"></i></a>Subscribing to updates of channels/supergroups</h3>
<p>The API will automatically send passive updates (i.e. as standalone <a href="/type/Updates">Updates</a> constructors in the socket) for channels/supergroups the user/bot is a member of. </p>
<p>The API will automatically send passive updates (i.e. as standalone <a href="/type/Updates">Updates</a> constructors in the socket) for channels/supergroups the user/bot is a member of. </p>
<p>However, clients (user accounts only) should also additionally invoke <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> periodically for channels and supergroups the user is currently viewing (i.e. explicitly opened channels/supergroups in one or more tabs/windows). </p>
<p>If the returned difference is non-<code>final</code>, the method should be called immediately with the new parameters <a href="#recovering-gaps">as usual</a>. </p>
<p>If the returned difference is <code>final</code>, and the user is still viewing the messages of the supergroup/channel (i.e. via distinct tabs/windows), <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> should be re-invoked after <code>timeout</code> seconds (if the flag is specified, otherwise after 1 second). </p>
<p>Clients should stop <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> polling once the user closes the channel/supergroup: this will not interrupt reception of passive updates, as long as the user is subscribed to the channel/supergroup. </p>
<p>Note that the shortpolling mechanism described above is also used to <a href="#subscribing-to-updates-of-channels-supergroups-we-havent-joined">enable passive delivery of updates from a channel/supergroup we're not a member of</a>. </p>
<h3><a class="anchor" href="#subscribing-to-updates-of-channels-supergroups-we-havent-joined" id="subscribing-to-updates-of-channels-supergroups-we-havent-joined" name="subscribing-to-updates-of-channels-supergroups-we-havent-joined"><i class="anchor-icon"></i></a>Subscribing to updates of channels/supergroups we haven't joined</h3>
<p>Clients may ask the API to passively send them updates for <a href="/api/channel">channels/supergroups</a> they haven't joined, by simply making a <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> query. </p>
<p>If the specified channel or supergroup is public, or is private but temporarily available for a limited time thanks to a <a href="/constructor/chatInvitePeek">chatInvitePeek</a>, the API will start passively sending updates (i.e. as standalone <a href="/type/Updates">Updates</a> constructors in the socket, as is already the case for normal channels/supergroups we've already joined) to all logged-in sessions, as long as any of the sessions continues to periodically invoke <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> every <code>timeout</code> seconds (returned by the method, or every second if the <code>timeout</code> flag is absent from the return value of the method, or immediately with the new parameters if the returned difference is non-<code>final</code>). </p>
<p>To stop passively receiving updates, simply stop invoking <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a>, and the API will automatically stop passively sending updates after a while. </p>
<p>This mechanism may also be used to enable <em>passive</em> reception of updates from channels or supergroups we're <em>not</em> a member of: if the specified channel or supergroup is public, or is private but temporarily available for a limited time thanks to a <a href="/constructor/chatInvitePeek">chatInvitePeek</a>, the API will start passively sending updates (i.e. as standalone <a href="/type/Updates">Updates</a> constructors in the socket, as is already the case for normal channels/supergroups we've already joined) to all logged-in sessions, as long as any of the sessions continues to periodically invoke <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> every <code>timeout</code> seconds (returned by the method, or every second if the <code>timeout</code> flag is absent from the return value of the method, or immediately with the new parameters if the returned difference is non-<code>final</code>). </p>
<p>Clients should stop <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> polling once the user closes the channel/supergroup: the API will continue emitting passive updates <strong>only</strong> if the user is a member of the channel/supergroup. </p>
<p>Clients should also limit to 10 the maximum number of channels/supergroups shortpolled using the above mechanism (i.e. if the user opens 11 windows on 11 different channels, shortpoll with <a href="/method/updates.getChannelDifference">updates.getChannelDifference</a> only the first 10). </p>
<h3><a class="anchor" href="#example-implementations" id="example-implementations" name="example-implementations"><i class="anchor-icon"></i></a>Example implementations</h3>
<p>Implementations also have to take care to postpone updates received via the socket while filling gaps in the event and Update sequences, as well as avoid filling gaps in the same sequence.</p>
<p>Example implementations: <a href="https://github.com/tdlib/td">tdlib</a>, <a href="https://github.com/danog/MadelineProto">MadelineProto</a>. </p>

View file

@ -53,9 +53,9 @@
<h5><a class="anchor" href="#1-client-sends-query-to-server" id="1-client-sends-query-to-server" name="1-client-sends-query-to-server"><i class="anchor-icon"></i></a>1) Client sends query to server</h5>
<!-- start req_pq_multi -->
<p>Sent payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 BC 85 0A 00 73 74 B3 66
0010 | 14 00 00 00 F1 8E 7E BE B7 33 52 C7 A5 7A D9 D6
0020 | 69 33 9B FF 67 CA A2 5D</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 08 C3 0C 00 CF 86 B4 66
0010 | 14 00 00 00 F1 8E 7E BE 7B D0 9C F3 4A 78 7B 68
0020 | 00 C2 38 51 E9 C5 4D AA</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>req_pq_multi#be7e8ef1 nonce:int128 = ResPQ;</code></pre>
<table class="table">
@ -77,7 +77,7 @@
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>BC850A007374B366</code></td>
<td><code>08C30C00CF86B466</code></td>
<td>Message ID generated as specified <a href="/mtproto/description#message-identifier-msg-id">here »</a> (unixtime() &lt;&lt; 32) + (N*4)</td>
</tr>
<tr>
@ -95,7 +95,7 @@
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Random number</td>
</tr>
</tbody>
@ -104,11 +104,11 @@
<h5><a class="anchor" href="#2-server-sends-response-of-the-form" id="2-server-sends-response-of-the-form" name="2-server-sends-response-of-the-form"><i class="anchor-icon"></i></a>2) Server sends response of the form</h5>
<!-- start resPQ -->
<p>Received payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 74 5A AB 73 74 B3 66
0010 | 74 00 00 00 63 24 16 05 B7 33 52 C7 A5 7A D9 D6
0020 | 69 33 9B FF 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB
0030 | D3 29 F1 17 B8 FD E8 74 08 1F 36 DC 1B BB 7F 36
0040 | 45 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 AC 29 F9 D0 86 B4 66
0010 | B4 00 00 00 63 24 16 05 7B D0 9C F3 4A 78 7B 68
0020 | 00 C2 38 51 E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2
0030 | 5A DF 65 38 56 25 59 30 08 11 CD 1A 7F F4 47 6C
0040 | EB 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 +132,13 @@
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>01745AAB7374B366</code></td>
<td><code>01AC29F9D086B466</code></td>
<td>Message ID generated as specified <a href="/mtproto/description#message-identifier-msg-id">here »</a> (unixtime() &lt;&lt; 32) + (N*4)</td>
</tr>
<tr>
<td>message_length</td>
<td>16, 4</td>
<td><code>74000000</code> (116 in decimal)</td>
<td><code>B4000000</code> (180 in decimal)</td>
<td>Message body length</td>
</tr>
<tr>
@ -150,19 +150,19 @@
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Server-generated random number</td>
</tr>
<tr>
<td>pq</td>
<td>56, 12</td>
<td><code>081F36DC1BBB7F3645000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 2249227075586045509</td>
<td><code>0811CD1A7FF4476CEB000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1282710605731949803</td>
<td>Single-byte prefix denoting length, an 8-byte string, and three bytes of padding</td>
</tr>
<tr>
@ -208,22 +208,22 @@
<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-lt-q" id="3-client-decomposes-pq-into-prime-factors-such-that-p-lt-q" name="3-client-decomposes-pq-into-prime-factors-such-that-p-lt-q"><i class="anchor-icon"></i></a>3) Client decomposes pq into prime factors such that p &lt; q.</h5>
<!-- start pq -->
<pre><code>pq = 2249227075586045509</code></pre>
<p>Decompose into 2 prime cofactors <code>p &lt; q</code>: <code>2249227075586045509 = 1308253673 * 1719259133</code></p>
<pre><code>p = 1308253673
q = 1719259133</code></pre>
<pre><code>pq = 1282710605731949803</code></pre>
<p>Decompose into 2 prime cofactors <code>p &lt; q</code>: <code>1282710605731949803 = 1010888009 * 1268894867</code></p>
<pre><code>p = 1010888009
q = 1268894867</code></pre>
<!-- end pq -->
<h4><a class="anchor" href="#presenting-proof-of-work-server-authentication" id="presenting-proof-of-work-server-authentication" name="presenting-proof-of-work-server-authentication"><i class="anchor-icon"></i></a>Presenting proof of work; Server authentication</h4>
<h5><a class="anchor" href="#4-encrypted-data-payload-generation" id="4-encrypted-data-payload-generation" name="4-encrypted-data-payload-generation"><i class="anchor-icon"></i></a>4) <code>encrypted_data</code> payload generation</h5>
<p>First of all, generate an <code>encrypted_data</code> payload as follows:</p>
<!-- start p_q_inner_data_dc -->
<p>Generated payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 95 5F F5 A9 08 1F 36 DC 1B BB 7F 36 45 00 00 00
0010 | 04 4D FA 5D E9 00 00 00 04 66 79 CF FD 00 00 00
0020 | B7 33 52 C7 A5 7A D9 D6 69 33 9B FF 67 CA A2 5D
0030 | A3 3A 8C A2 66 C8 FC AB D3 29 F1 17 B8 FD E8 74
0040 | A1 B0 46 B7 C0 7B C0 EE 61 38 83 07 36 73 2C C0
0050 | 4C 56 41 CD 1A 66 29 CC C4 92 25 0D 3A D4 B1 2E
<pre><code>0000 | 95 5F F5 A9 08 11 CD 1A 7F F4 47 6C EB 00 00 00
0010 | 04 3C 40 ED 49 00 00 00 04 4B A1 CC 93 00 00 00
0020 | 7B D0 9C F3 4A 78 7B 68 00 C2 38 51 E9 C5 4D AA
0030 | C6 DF 0C 6A AF C0 E1 E2 5A DF 65 38 56 25 59 30
0040 | E5 27 5D A6 B8 4C 33 5B DA 78 85 FD 06 5A C1 B1
0050 | 07 CD C4 5E 97 F6 DF 66 46 2A B6 24 97 7F 2D 0A
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;</code></pre>
@ -246,37 +246,37 @@ q = 1719259133</code></pre>
<tr>
<td>pq</td>
<td>4, 12</td>
<td><code>081F36DC1BBB7F3645000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 2249227075586045509</td>
<td><code>0811CD1A7FF4476CEB000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1282710605731949803</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>044DFA5DE9000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1308253673</td>
<td><code>043C40ED49000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1010888009</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>046679CFFD000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1719259133</td>
<td><code>044BA1CC93000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1268894867</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>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>48, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>new_nonce</td>
<td>64, 32</td>
<td><code>A1B046B7C07BC0EE6138830736732CC0</code> <code>4C5641CD1A6629CCC492250D3AD4B12E</code></td>
<td><code>E5275DA6B84C335BDA7885FD065AC1B1</code> <code>07CDC45E97F6DF66462AB624977F2D0A</code></td>
<td>Client-generated random number</td>
</tr>
<tr>
@ -291,39 +291,39 @@ q = 1719259133</code></pre>
<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 = 955FF5A9081F36DC1BBB7F3645000000044DFA5DE9000000046679CFFD000000B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE874A1B046B7C07BC0EE6138830736732CC04C5641CD1A6629CCC492250D3AD4B12E02000000
random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4FFA8AA31B3AC72030245C079DF10DFE71D0451744CBD3526704F9116C2332CBA711183055033093FF40F3DD78A814A30163162E907A2D0CD94C733B5FF5FEB0</code></pre>
<pre><code>data = 955FF5A90811CD1A7FF4476CEB000000043C40ED49000000044BA1CC930000007BD09CF34A787B6800C23851E9C54DAAC6DF0C6AAFC0E1E25ADF653856255930E5275DA6B84C335BDA7885FD065AC1B107CDC45E97F6DF66462AB624977F2D0A02000000
random_padding_bytes = 7AFED3ADE8049D4B312DBC99135E78B356A04E57DA3F178FB3439B457F4A2088C0A8A143BC4F11A114DE10F43A28A8D333883B9851F3288EC09B9CF4DC110860BA751068FA0DD974897097CC5B73474FE90FA9D98F1E95CA9F5135A6</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 = 016EA9464BFFD80E8B8788CC16F9EDEC5DD685DB020A99C6E09E82B043D11E5B420D19D9A0BE810F40216D59A85E66F9BE796118124C0FEB6F96D01C07ACA044B58C91ED10FB75C43148C4B4976166102D444056B60583FB3B2B4A3776679A527179E9CBF75A1FBAAAC4209E8111B527A06488E9844EE0E60E8153D54D694C7869DC74EF63D906231EB7274E3B51733573232FC3D60DC12E4DAC4B53C674320A12A4F61761D6CD4CCD4BB4EE86C4BAC43AFDB8C093F3737A0098795AE46B76E9277208702B32AE4F74AC745DDCF03F0C2DF0356677C8EE247C852AC7B97E1CD07E5C604DD1DB6F833BFE433BBE99385EA69668418466396C13E7405952D8204B</code></pre>
<pre><code>encrypted_data = 24DAA34BCCAD2FBBD2208DB6DB23111EE68D22C54E7B85227146E3EF4D18F4DE1180F263A0683C83BD388F05BC4286A1840D3C025F1F2F6E12E05CBD64662F2837B5408A37E49A6A02597DF5FBA55A5039E453C7A29202104E5BA6D81977D483C6CA95816E1108C0957636ED792A583A29EFBB6E58A5CE580B60EAC14CB4BE11717353DCC25B022355EC0A20BA34CE884ACB4D7DBA189DBE013D62C009EB1890F43D598FAEDFF5BAEFCD1146DDEC1368D1718A51D2E4D067A9A04225A01CFE6CE64131F31108EAF186A943C15AA420E9FE8BF9F0E147D539E811B31F3E4FE3AF1593448C9E7FE203BE10DEF79BE0CA2928DE794990B3E98503B1D3A2666A210E</code></pre>
<!-- end p_q_inner_data_output -->
<p>The length of the final string is 256 bytes.</p>
<h5><a class="anchor" href="#5-send-req-dh-params-query-with-generated-encrypted-data" id="5-send-req-dh-params-query-with-generated-encrypted-data" name="5-send-req-dh-params-query-with-generated-encrypted-data"><i class="anchor-icon"></i></a>5) Send req_DH_params query with generated <code>encrypted_data</code></h5>
<!-- start req_DH_params -->
<p>Sent payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 8C F9 0B 00 73 74 B3 66
0010 | 40 01 00 00 BE E4 12 D7 B7 33 52 C7 A5 7A D9 D6
0020 | 69 33 9B FF 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB
0030 | D3 29 F1 17 B8 FD E8 74 04 4D FA 5D E9 00 00 00
0040 | 04 66 79 CF FD 00 00 00 85 FD 64 DE 85 1D 9D D0
0050 | FE 00 01 00 01 6E A9 46 4B FF D8 0E 8B 87 88 CC
0060 | 16 F9 ED EC 5D D6 85 DB 02 0A 99 C6 E0 9E 82 B0
0070 | 43 D1 1E 5B 42 0D 19 D9 A0 BE 81 0F 40 21 6D 59
0080 | A8 5E 66 F9 BE 79 61 18 12 4C 0F EB 6F 96 D0 1C
0090 | 07 AC A0 44 B5 8C 91 ED 10 FB 75 C4 31 48 C4 B4
00A0 | 97 61 66 10 2D 44 40 56 B6 05 83 FB 3B 2B 4A 37
00B0 | 76 67 9A 52 71 79 E9 CB F7 5A 1F BA AA C4 20 9E
00C0 | 81 11 B5 27 A0 64 88 E9 84 4E E0 E6 0E 81 53 D5
00D0 | 4D 69 4C 78 69 DC 74 EF 63 D9 06 23 1E B7 27 4E
00E0 | 3B 51 73 35 73 23 2F C3 D6 0D C1 2E 4D AC 4B 53
00F0 | C6 74 32 0A 12 A4 F6 17 61 D6 CD 4C CD 4B B4 EE
0100 | 86 C4 BA C4 3A FD B8 C0 93 F3 73 7A 00 98 79 5A
0110 | E4 6B 76 E9 27 72 08 70 2B 32 AE 4F 74 AC 74 5D
0120 | DC F0 3F 0C 2D F0 35 66 77 C8 EE 24 7C 85 2A C7
0130 | B9 7E 1C D0 7E 5C 60 4D D1 DB 6F 83 3B FE 43 3B
0140 | BE 99 38 5E A6 96 68 41 84 66 39 6C 13 E7 40 59
0150 | 52 D8 20 4B</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 CC 13 07 00 D0 86 B4 66
0010 | 40 01 00 00 BE E4 12 D7 7B D0 9C F3 4A 78 7B 68
0020 | 00 C2 38 51 E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2
0030 | 5A DF 65 38 56 25 59 30 04 3C 40 ED 49 00 00 00
0040 | 04 4B A1 CC 93 00 00 00 85 FD 64 DE 85 1D 9D D0
0050 | FE 00 01 00 24 DA A3 4B CC AD 2F BB D2 20 8D B6
0060 | DB 23 11 1E E6 8D 22 C5 4E 7B 85 22 71 46 E3 EF
0070 | 4D 18 F4 DE 11 80 F2 63 A0 68 3C 83 BD 38 8F 05
0080 | BC 42 86 A1 84 0D 3C 02 5F 1F 2F 6E 12 E0 5C BD
0090 | 64 66 2F 28 37 B5 40 8A 37 E4 9A 6A 02 59 7D F5
00A0 | FB A5 5A 50 39 E4 53 C7 A2 92 02 10 4E 5B A6 D8
00B0 | 19 77 D4 83 C6 CA 95 81 6E 11 08 C0 95 76 36 ED
00C0 | 79 2A 58 3A 29 EF BB 6E 58 A5 CE 58 0B 60 EA C1
00D0 | 4C B4 BE 11 71 73 53 DC C2 5B 02 23 55 EC 0A 20
00E0 | BA 34 CE 88 4A CB 4D 7D BA 18 9D BE 01 3D 62 C0
00F0 | 09 EB 18 90 F4 3D 59 8F AE DF F5 BA EF CD 11 46
0100 | DD EC 13 68 D1 71 8A 51 D2 E4 D0 67 A9 A0 42 25
0110 | A0 1C FE 6C E6 41 31 F3 11 08 EA F1 86 A9 43 C1
0120 | 5A A4 20 E9 FE 8B F9 F0 E1 47 D5 39 E8 11 B3 1F
0130 | 3E 4F E3 AF 15 93 44 8C 9E 7F E2 03 BE 10 DE F7
0140 | 9B E0 CA 29 28 DE 79 49 90 B3 E9 85 03 B1 D3 A2
0150 | 66 6A 21 0E</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 +345,7 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>8CF90B007374B366</code></td>
<td><code>CC130700D086B466</code></td>
<td>Message ID generated as specified <a href="/mtproto/description#message-identifier-msg-id">here »</a> (unixtime() &lt;&lt; 32) + (N*4)</td>
</tr>
<tr>
@ -363,25 +363,25 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>p</td>
<td>56, 8</td>
<td><code>044DFA5DE9000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1308253673</td>
<td><code>043C40ED49000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1010888009</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>046679CFFD000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1719259133</td>
<td><code>044BA1CC93000000</code><br>TL byte deserialization <br>=&gt; bigendian conversion to decimal<br>=&gt; 1268894867</td>
<td>Second prime cofactor: single-byte prefix denoting length, 4-byte string, and three bytes of padding</td>
</tr>
<tr>
@ -393,7 +393,7 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<tr>
<td>encrypted_data</td>
<td>80, 260</td>
<td><code>FE000100016EA9464BFFD80E8B8788CC</code> <code>16F9EDEC5DD685DB020A99C6E09E82B0</code> <code>43D11E5B420D19D9A0BE810F40216D59</code> <code>A85E66F9BE796118124C0FEB6F96D01C</code> <code>07ACA044B58C91ED10FB75C43148C4B4</code> <code>976166102D444056B60583FB3B2B4A37</code> <code>76679A527179E9CBF75A1FBAAAC4209E</code> <code>8111B527A06488E9844EE0E60E8153D5</code> <code>4D694C7869DC74EF63D906231EB7274E</code> <code>3B51733573232FC3D60DC12E4DAC4B53</code> <code>C674320A12A4F61761D6CD4CCD4BB4EE</code> <code>86C4BAC43AFDB8C093F3737A0098795A</code> <code>E46B76E9277208702B32AE4F74AC745D</code> <code>DCF03F0C2DF0356677C8EE247C852AC7</code> <code>B97E1CD07E5C604DD1DB6F833BFE433B</code> <code>BE99385EA69668418466396C13E74059</code><br> <code>52D8204B</code></td>
<td><code>FE00010024DAA34BCCAD2FBBD2208DB6</code> <code>DB23111EE68D22C54E7B85227146E3EF</code> <code>4D18F4DE1180F263A0683C83BD388F05</code> <code>BC4286A1840D3C025F1F2F6E12E05CBD</code> <code>64662F2837B5408A37E49A6A02597DF5</code> <code>FBA55A5039E453C7A29202104E5BA6D8</code> <code>1977D483C6CA95816E1108C0957636ED</code> <code>792A583A29EFBB6E58A5CE580B60EAC1</code> <code>4CB4BE11717353DCC25B022355EC0A20</code> <code>BA34CE884ACB4D7DBA189DBE013D62C0</code> <code>09EB1890F43D598FAEDFF5BAEFCD1146</code> <code>DDEC1368D1718A51D2E4D067A9A04225</code> <code>A01CFE6CE64131F31108EAF186A943C1</code> <code>5AA420E9FE8BF9F0E147D539E811B31F</code> <code>3E4FE3AF1593448C9E7FE203BE10DEF7</code> <code>9BE0CA2928DE794990B3E98503B1D3A2</code><br> <code>666A210E</code></td>
<td>Value generated above</td>
</tr>
</tbody>
@ -402,47 +402,47 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<h5><a class="anchor" href="#6-server-responds-with" id="6-server-responds-with" name="6-server-responds-with"><i class="anchor-icon"></i></a>6) Server responds with:</h5>
<!-- 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 9C 60 73 74 74 B3 66
0010 | B0 02 00 00 5C 07 E8 D0 B7 33 52 C7 A5 7A D9 D6
0020 | 69 33 9B FF 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB
0030 | D3 29 F1 17 B8 FD E8 74 FE 50 02 00 CF 35 5B 5D
0040 | B7 CD F1 DF 0D D3 4A 72 4C 1C 77 CB B0 71 ED D8
0050 | F0 91 40 D5 4B 69 AD 97 91 F5 2D DE B2 8E A7 5D
0060 | 99 E0 CA BB 3F B3 49 8F 24 CB 12 68 E8 5B 4A E9
0070 | 6A 50 5F AF 1D 42 2E 2D D1 46 CF 44 BE AD B9 04
0080 | 13 03 6A F2 AE 72 62 1C 4B EC F2 35 77 39 79 1F
0090 | C4 E8 99 89 46 C7 95 E3 BB 91 6B 60 40 D5 39 5F
00A0 | EF 84 8B 24 6E AF D9 72 DA 79 63 A5 46 1D 7E 6B
00B0 | B1 21 E1 F2 6F 0A BC E6 02 06 24 EA 79 76 64 96
00C0 | A1 39 57 2A 94 5F 00 2E 98 C1 0F FF 3E F1 09 88
00D0 | B6 8E 9C 15 1C EC 90 07 D3 BA 03 C1 8B 33 3F 7D
00E0 | EF 63 67 B6 4B 66 E8 63 BC 61 04 02 57 20 AF 1A
00F0 | AE 57 ED 18 53 D4 DE D3 91 C5 99 A9 6A 73 1B EC
0100 | 3F 8C 51 29 7F 57 81 AA C8 2C E8 6E E8 E2 59 D4
0110 | 08 B1 62 18 29 3B 47 60 E6 09 B4 FF 48 04 8D 30
0120 | 6F 8B F8 37 58 67 76 00 01 86 BB 08 83 F4 44 83
0130 | B1 B7 81 B0 7F 9E BF 8E AB 1C C4 40 47 92 CC 17
0140 | 9D 6A 9B E2 71 2B 34 42 9F 99 62 82 01 85 A4 00
0150 | 6E 3E 65 C3 2A 35 F9 51 87 F5 EB 93 F5 A4 0A 95
0160 | 75 9D DF 38 E7 74 78 FB 65 AE 2A BB 24 EE 64 A6
0170 | 22 4B 69 CD EB E0 CF 56 15 FC FC D2 14 52 D3 07
0180 | 0E 05 52 7B 89 BD 44 D5 2F FE AC 3E BE D0 4E D6
0190 | AE 61 A3 0E 6C 1F ED F4 AA EE B1 8A AE 92 7D 93
01A0 | 8A 00 AB B0 CA 27 4D 20 6E 60 D5 79 7D A2 0C 3A
01B0 | D2 6A 63 FA C0 CC 21 7C FB 22 65 01 BF D2 D7 FF
01C0 | B6 85 9E C5 3D 82 4A A0 33 CE A9 77 B9 B1 E9 B8
01D0 | 3F 0B BB 29 0C 15 6D D9 C5 86 12 4E E9 49 8C 9A
01E0 | 3B 8B 73 CA 64 52 7E DE B3 9E 21 FE 7A 17 50 43
01F0 | A1 4F 6C 46 74 A2 77 09 B9 C5 7D A5 A2 02 A2 A9
0200 | A1 0A 99 67 2C 6A FB E1 1A BF BC 97 95 7F F2 89
0210 | FC 29 41 4A 55 B0 4F C2 37 8C 7C D9 EE C0 89 99
0220 | BD 1B DA F7 21 65 9A AD 62 AC EA F1 D3 88 1A A7
0230 | 4A 09 42 0D 04 9D 1A 61 C9 7D B6 0F 03 5F AD CD
0240 | 32 7D 1A 37 1C 8A 59 11 AE A9 6C CF 8C 4E E2 E4
0250 | C2 38 AE 45 2F F6 A0 FA 29 F5 DC EC DA AB 8D B5
0260 | A9 6D 2B BB 09 02 43 53 D2 58 39 F0 0E 76 F1 00
0270 | 59 BB EA AF 00 BF 3C 8D 21 30 94 AE 0A 3E 8D ED
0280 | 5C 30 88 32 7C C8 94 7A 90 62 9D 78</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 64 B3 D6 D1 86 B4 66
0010 | E4 02 00 00 5C 07 E8 D0 7B D0 9C F3 4A 78 7B 68
0020 | 00 C2 38 51 E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2
0030 | 5A DF 65 38 56 25 59 30 FE 50 02 00 41 7D 04 C1
0040 | 9F EC 88 C7 9A ED 8F 36 45 AB 2F FF 82 FB 75 84
0050 | 4F B3 26 9A 9F 14 4E 6C B3 DA D0 03 E7 BC 89 BA
0060 | DE F3 00 13 55 F9 9B 08 04 BD 83 64 C9 0C D2 79
0070 | 8C 22 6B E2 5B 4E 1E 44 EA 7F 22 1B 91 F9 63 36
0080 | 21 6E 8C 04 DD F6 54 7A 5D 3A 8F 4A EF FA 35 34
0090 | 00 63 6D 4D 6F 9A 4A 0B 01 36 17 55 CD FC 0C F6
00A0 | E9 33 03 DA 4B 38 51 F3 0A 66 7A 57 0E 79 2B 4F
00B0 | A3 57 47 2D 1B CF A7 C5 15 EA 42 03 1C D5 C0 6E
00C0 | 49 3B 85 86 D1 E7 9C 27 57 80 C7 E4 A9 AA 10 C8
00D0 | EE A8 B4 7A 1C 45 00 D8 AC 1D 31 12 66 1C 0E 4B
00E0 | 9E 0A 65 A5 E2 FC B4 C0 6F 12 64 34 08 C7 E7 F5
00F0 | F5 AB 42 BA CD 4B 10 C2 A6 B9 0F 01 44 9D 62 2A
0100 | E4 3E 1B 40 43 27 DE 59 E7 F4 59 FF 64 2E FE 23
0110 | 6F C3 49 08 5F D4 D8 A7 D2 EB 2C A0 BC 20 7A A4
0120 | D3 C4 6B 66 A2 AF 0A B1 59 AC 2F 41 0A 48 D0 ED
0130 | 87 90 D3 DC 97 8A 4A 37 31 4D B3 80 A2 F1 1A 75
0140 | 58 EE 07 5B DC 2F 87 57 13 25 DA 6E 48 C6 61 31
0150 | 63 B0 12 43 7D 88 7B 23 0D EB AF B2 2D 5D 37 E5
0160 | 98 75 FD 51 DA 92 AF 68 36 0D 6E B5 11 C5 E0 AE
0170 | 19 DC 66 45 DD 97 D1 BE A6 90 FE 32 42 B2 2A A0
0180 | 9F 34 4E A2 9F A3 28 A0 50 A1 F3 67 98 28 DD 4C
0190 | AD 06 66 6E 6F F6 CD 5E 93 7C F7 69 E5 03 8F 05
01A0 | 9A A0 60 2B B3 FD 75 EA 92 39 AF 67 C2 00 40 7E
01B0 | EB 18 92 66 76 71 93 D3 2B A8 BF AD EF 55 81 AC
01C0 | 58 33 E7 E9 84 96 6A D3 4A 69 88 5D BC 79 C9 15
01D0 | A4 9E 82 36 2E 8D 30 7D 2A A6 B4 61 5F 55 FA 23
01E0 | 67 A0 82 17 C3 3E 40 92 DB F8 C1 D6 76 1D B8 A8
01F0 | F4 AA DB 2A F4 EE 5E 10 B5 59 BD C3 C3 7E 69 AF
0200 | 31 B6 4B 65 E8 85 8A 9C 0C C1 06 1D 12 1D 00 82
0210 | 7C 24 BF 3C CF 28 44 BE DF 5A 67 15 94 14 31 CF
0220 | 81 E0 46 DC 75 23 26 F2 C2 96 8D 8B 82 FF DE A5
0230 | 7D 81 A6 6A FC 77 7E 18 BC B5 60 9C 62 D6 59 48
0240 | A5 04 8C FE DE CE 4E 49 68 CD 35 3F 1F 5A 12 3F
0250 | 3A FD 1A 62 65 4D 82 6A A2 1C C4 04 E2 85 61 4B
0260 | 1C 45 96 FC 9A F2 4A 88 78 FF 0F 13 F4 60 38 09
0270 | 42 90 28 8E C3 A4 0D 23 5F F0 57 A9 FB CD 1A EE
0280 | F4 BC 81 6E 6E 49 0F 13 8C 92 EA D0</code></pre>
<p>Payload (de)serialization:</p>
<pre><code>server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;</code></pre>
<table class="table">
@ -464,13 +464,13 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<tr>
<td>message_id</td>
<td>8, 8</td>
<td><code>019C60737474B366</code></td>
<td><code>0164B3D6D186B466</code></td>
<td>Message ID generated as specified <a href="/mtproto/description#message-identifier-msg-id">here »</a> (unixtime() &lt;&lt; 32) + (N*4)</td>
</tr>
<tr>
<td>message_length</td>
<td>16, 4</td>
<td><code>B0020000</code> (688 in decimal)</td>
<td><code>E4020000</code> (740 in decimal)</td>
<td>Message body length</td>
</tr>
<tr>
@ -482,19 +482,19 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>encrypted_answer</td>
<td>56, 596</td>
<td><code>FE500200CF355B5DB7CDF1DF0DD34A72</code> <code>4C1C77CBB071EDD8F09140D54B69AD97</code> <code>91F52DDEB28EA75D99E0CABB3FB3498F</code> <code>24CB1268E85B4AE96A505FAF1D422E2D</code> <code>D146CF44BEADB90413036AF2AE72621C</code> <code>4BECF2357739791FC4E8998946C795E3</code> <code>BB916B6040D5395FEF848B246EAFD972</code> <code>DA7963A5461D7E6BB121E1F26F0ABCE6</code> <code>020624EA79766496A139572A945F002E</code> <code>98C10FFF3EF10988B68E9C151CEC9007</code> <code>D3BA03C18B333F7DEF6367B64B66E863</code> <code>BC6104025720AF1AAE57ED1853D4DED3</code> <code>91C599A96A731BEC3F8C51297F5781AA</code> <code>C82CE86EE8E259D408B16218293B4760</code> <code>E609B4FF48048D306F8BF83758677600</code> <code>0186BB0883F44483B1B781B07F9EBF8E</code> <code>AB1CC4404792CC179D6A9BE2712B3442</code> <code>9F9962820185A4006E3E65C32A35F951</code> <code>87F5EB93F5A40A95759DDF38E77478FB</code> <code>65AE2ABB24EE64A6224B69CDEBE0CF56</code> <code>15FCFCD21452D3070E05527B89BD44D5</code> <code>2FFEAC3EBED04ED6AE61A30E6C1FEDF4</code> <code>AAEEB18AAE927D938A00ABB0CA274D20</code> <code>6E60D5797DA20C3AD26A63FAC0CC217C</code> <code>FB226501BFD2D7FFB6859EC53D824AA0</code> <code>33CEA977B9B1E9B83F0BBB290C156DD9</code> <code>C586124EE9498C9A3B8B73CA64527EDE</code> <code>B39E21FE7A175043A14F6C4674A27709</code> <code>B9C57DA5A202A2A9A10A99672C6AFBE1</code> <code>1ABFBC97957FF289FC29414A55B04FC2</code> <code>378C7CD9EEC08999BD1BDAF721659AAD</code> <code>62ACEAF1D3881AA74A09420D049D1A61</code> <code>C97DB60F035FADCD327D1A371C8A5911</code> <code>AEA96CCF8C4EE2E4C238AE452FF6A0FA</code> <code>29F5DCECDAAB8DB5A96D2BBB09024353</code> <code>D25839F00E76F10059BBEAAF00BF3C8D</code> <code>213094AE0A3E8DED5C3088327CC8947A</code><br> <code>90629D78</code></td>
<td><code>FE500200417D04C19FEC88C79AED8F36</code> <code>45AB2FFF82FB75844FB3269A9F144E6C</code> <code>B3DAD003E7BC89BADEF3001355F99B08</code> <code>04BD8364C90CD2798C226BE25B4E1E44</code> <code>EA7F221B91F96336216E8C04DDF6547A</code> <code>5D3A8F4AEFFA353400636D4D6F9A4A0B</code> <code>01361755CDFC0CF6E93303DA4B3851F3</code> <code>0A667A570E792B4FA357472D1BCFA7C5</code> <code>15EA42031CD5C06E493B8586D1E79C27</code> <code>5780C7E4A9AA10C8EEA8B47A1C4500D8</code> <code>AC1D3112661C0E4B9E0A65A5E2FCB4C0</code> <code>6F12643408C7E7F5F5AB42BACD4B10C2</code> <code>A6B90F01449D622AE43E1B404327DE59</code> <code>E7F459FF642EFE236FC349085FD4D8A7</code> <code>D2EB2CA0BC207AA4D3C46B66A2AF0AB1</code> <code>59AC2F410A48D0ED8790D3DC978A4A37</code> <code>314DB380A2F11A7558EE075BDC2F8757</code> <code>1325DA6E48C6613163B012437D887B23</code> <code>0DEBAFB22D5D37E59875FD51DA92AF68</code> <code>360D6EB511C5E0AE19DC6645DD97D1BE</code> <code>A690FE3242B22AA09F344EA29FA328A0</code> <code>50A1F3679828DD4CAD06666E6FF6CD5E</code> <code>937CF769E5038F059AA0602BB3FD75EA</code> <code>9239AF67C200407EEB189266767193D3</code> <code>2BA8BFADEF5581AC5833E7E984966AD3</code> <code>4A69885DBC79C915A49E82362E8D307D</code> <code>2AA6B4615F55FA2367A08217C33E4092</code> <code>DBF8C1D6761DB8A8F4AADB2AF4EE5E10</code> <code>B559BDC3C37E69AF31B64B65E8858A9C</code> <code>0CC1061D121D00827C24BF3CCF2844BE</code> <code>DF5A6715941431CF81E046DC752326F2</code> <code>C2968D8B82FFDEA57D81A66AFC777E18</code> <code>BCB5609C62D65948A5048CFEDECE4E49</code> <code>68CD353F1F5A123F3AFD1A62654D826A</code> <code>A21CC404E285614B1C4596FC9AF24A88</code> <code>78FF0F13F46038094290288EC3A40D23</code> <code>5FF057A9FBCD1AEEF4BC816E6E490F13</code><br> <code>8C92EAD0</code></td>
<td>See below</td>
</tr>
</tbody>
@ -502,20 +502,20 @@ random_padding_bytes = E101DF91AE9B58729158A5E28D0F6B3556983A9202BF4D8A90C1F77A4
<!-- end server_DH_params_ok -->
<p>Decrypt <code>encrypted_answer</code> using the reverse of the process specified in <a href="/mtproto/auth_key#6-server-responds-with">step 6</a>:</p>
<!-- start server_DH_inner_data_input -->
<pre><code>encrypted_answer = CF355B5DB7CDF1DF0DD34A724C1C77CBB071EDD8F09140D54B69AD9791F52DDEB28EA75D99E0CABB3FB3498F24CB1268E85B4AE96A505FAF1D422E2DD146CF44BEADB90413036AF2AE72621C4BECF2357739791FC4E8998946C795E3BB916B6040D5395FEF848B246EAFD972DA7963A5461D7E6BB121E1F26F0ABCE6020624EA79766496A139572A945F002E98C10FFF3EF10988B68E9C151CEC9007D3BA03C18B333F7DEF6367B64B66E863BC6104025720AF1AAE57ED1853D4DED391C599A96A731BEC3F8C51297F5781AAC82CE86EE8E259D408B16218293B4760E609B4FF48048D306F8BF837586776000186BB0883F44483B1B781B07F9EBF8EAB1CC4404792CC179D6A9BE2712B34429F9962820185A4006E3E65C32A35F95187F5EB93F5A40A95759DDF38E77478FB65AE2ABB24EE64A6224B69CDEBE0CF5615FCFCD21452D3070E05527B89BD44D52FFEAC3EBED04ED6AE61A30E6C1FEDF4AAEEB18AAE927D938A00ABB0CA274D206E60D5797DA20C3AD26A63FAC0CC217CFB226501BFD2D7FFB6859EC53D824AA033CEA977B9B1E9B83F0BBB290C156DD9C586124EE9498C9A3B8B73CA64527EDEB39E21FE7A175043A14F6C4674A27709B9C57DA5A202A2A9A10A99672C6AFBE11ABFBC97957FF289FC29414A55B04FC2378C7CD9EEC08999BD1BDAF721659AAD62ACEAF1D3881AA74A09420D049D1A61C97DB60F035FADCD327D1A371C8A5911AEA96CCF8C4EE2E4C238AE452FF6A0FA29F5DCECDAAB8DB5A96D2BBB09024353D25839F00E76F10059BBEAAF00BF3C8D213094AE0A3E8DED5C3088327CC8947A90629D78
tmp_aes_key = 95C19DED56EE87B886F460FE1CDD48254C94D09EBE0DBE3B8E2B72ADA56315D4
tmp_aes_iv = 85FC1734018FBD70D76EB3CE48C64F7ACEFCA80548D635B54833A341A1B046B7</code></pre>
<pre><code>encrypted_answer = 417D04C19FEC88C79AED8F3645AB2FFF82FB75844FB3269A9F144E6CB3DAD003E7BC89BADEF3001355F99B0804BD8364C90CD2798C226BE25B4E1E44EA7F221B91F96336216E8C04DDF6547A5D3A8F4AEFFA353400636D4D6F9A4A0B01361755CDFC0CF6E93303DA4B3851F30A667A570E792B4FA357472D1BCFA7C515EA42031CD5C06E493B8586D1E79C275780C7E4A9AA10C8EEA8B47A1C4500D8AC1D3112661C0E4B9E0A65A5E2FCB4C06F12643408C7E7F5F5AB42BACD4B10C2A6B90F01449D622AE43E1B404327DE59E7F459FF642EFE236FC349085FD4D8A7D2EB2CA0BC207AA4D3C46B66A2AF0AB159AC2F410A48D0ED8790D3DC978A4A37314DB380A2F11A7558EE075BDC2F87571325DA6E48C6613163B012437D887B230DEBAFB22D5D37E59875FD51DA92AF68360D6EB511C5E0AE19DC6645DD97D1BEA690FE3242B22AA09F344EA29FA328A050A1F3679828DD4CAD06666E6FF6CD5E937CF769E5038F059AA0602BB3FD75EA9239AF67C200407EEB189266767193D32BA8BFADEF5581AC5833E7E984966AD34A69885DBC79C915A49E82362E8D307D2AA6B4615F55FA2367A08217C33E4092DBF8C1D6761DB8A8F4AADB2AF4EE5E10B559BDC3C37E69AF31B64B65E8858A9C0CC1061D121D00827C24BF3CCF2844BEDF5A6715941431CF81E046DC752326F2C2968D8B82FFDEA57D81A66AFC777E18BCB5609C62D65948A5048CFEDECE4E4968CD353F1F5A123F3AFD1A62654D826AA21CC404E285614B1C4596FC9AF24A8878FF0F13F46038094290288EC3A40D235FF057A9FBCD1AEEF4BC816E6E490F138C92EAD0
tmp_aes_key = 40B6732602856F6EE65A440754D4D649C0EA440BA91054B5AEB8469DA6F64660
tmp_aes_iv = CE4B145477DA8934B9D6C79304FED9A787000E60091DD4938CAB4799E5275DA6</code></pre>
<!-- end server_DH_inner_data_input -->
<p>Yielding:</p>
<!-- start server_DH_inner_data_output -->
<pre><code>answer_with_hash = 6EF19EDC8E06BAB25550BEE3ED04EF1ED15CECB5BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87403000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE0001002B5E698C38AB6B114FEFF494F781198F322693AA72890B2F51C113CF582CF8B8142BB24A4304BFCD1FD34639ED1668CE98D941EC846A6E781888C48B8BF05702A72AA06998658FB763BAE2D0A5BD250D7B5147B5F090600C7C970C6B104FC9CDC50DBF99ED03DAAEFAD56B6A865D296E1929EB0F7942CC770A9E0CCB2F3A488437CB157EB939BF9930AAEC071C0554CA2A02708F97B4B1130B10BAF50D42EA9AAF3E06CAC7ABDAE5843BEE9F5FDED162E25700B5B7A9DC08283FA37274B5639CE665A67FA1DFE2C96BF3D42BCA7FF15AFF131333CABFBAC508ECBA80CFAFCABBA7B18BE9C08D34BE4E06DED284A067F60BF65BE16142A09A4EDD7ADFCD1F811C7474B3666B6DBCDE0BBD1266
answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87403000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE0001002B5E698C38AB6B114FEFF494F781198F322693AA72890B2F51C113CF582CF8B8142BB24A4304BFCD1FD34639ED1668CE98D941EC846A6E781888C48B8BF05702A72AA06998658FB763BAE2D0A5BD250D7B5147B5F090600C7C970C6B104FC9CDC50DBF99ED03DAAEFAD56B6A865D296E1929EB0F7942CC770A9E0CCB2F3A488437CB157EB939BF9930AAEC071C0554CA2A02708F97B4B1130B10BAF50D42EA9AAF3E06CAC7ABDAE5843BEE9F5FDED162E25700B5B7A9DC08283FA37274B5639CE665A67FA1DFE2C96BF3D42BCA7FF15AFF131333CABFBAC508ECBA80CFAFCABBA7B18BE9C08D34BE4E06DED284A067F60BF65BE16142A09A4EDD7ADFCD1F811C7474B3666B6DBCDE0BBD1266</code></pre>
<pre><code>answer_with_hash = FBCF51CDEA13F4DA73B70521F53FF72AC5FB2515BA0D89B57BD09CF34A787B6800C23851E9C54DAAC6DF0C6AAFC0E1E25ADF65385625593003000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE000100599250D19D9B3790FB63E9F73A6A890FBB6294DB99087DC8B484C720FB9B0960B34F2704523D90EA534802922D3475696543E49C0240ED7609A7C557ED3B5F416DBA23971B00A3AFCB4BEE7ACAB12CDA914C186ACC7E65897FCE222563DFBD96791156EA6E1EFFA8987C32700E86E26AA2F6E4CC42A1C45EE34DC630C5DA448B723660A500E4D96A8896112A297E3A24F5118615B7FA2FA8F1D0C504618FC1FE9E2AA01CEE99E8DD58220ED5D54EA9993D5A85C7D724C4EA6239554423F1D43C12D96E9210E08D8D6A6EB5CB3C3CD6CD943BE376C8B3E7D62BD5C50EB048FEF326DA71DC468678AC6DC70441DF419E55E0AEEF4D1B2AFEC64D97F573FDD9C265D186B466855637A8F90B72DF
answer = BA0D89B57BD09CF34A787B6800C23851E9C54DAAC6DF0C6AAFC0E1E25ADF65385625593003000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE000100599250D19D9B3790FB63E9F73A6A890FBB6294DB99087DC8B484C720FB9B0960B34F2704523D90EA534802922D3475696543E49C0240ED7609A7C557ED3B5F416DBA23971B00A3AFCB4BEE7ACAB12CDA914C186ACC7E65897FCE222563DFBD96791156EA6E1EFFA8987C32700E86E26AA2F6E4CC42A1C45EE34DC630C5DA448B723660A500E4D96A8896112A297E3A24F5118615B7FA2FA8F1D0C504618FC1FE9E2AA01CEE99E8DD58220ED5D54EA9993D5A85C7D724C4EA6239554423F1D43C12D96E9210E08D8D6A6EB5CB3C3CD6CD943BE376C8B3E7D62BD5C50EB048FEF326DA71DC468678AC6DC70441DF419E55E0AEEF4D1B2AFEC64D97F573FDD9C265D186B466855637A8F90B72DF</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 B7 33 52 C7 A5 7A D9 D6 69 33 9B FF
0010 | 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB D3 29 F1 17
0020 | B8 FD E8 74 03 00 00 00 FE 00 01 00 C7 1C AE B9
<pre><code>0000 | BA 0D 89 B5 7B D0 9C F3 4A 78 7B 68 00 C2 38 51
0010 | E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2 5A DF 65 38
0020 | 56 25 59 30 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
@ -532,23 +532,23 @@ answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87
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 | 2B 5E 69 8C 38 AB 6B 11 4F EF F4 94 F7 81 19 8F
0140 | 32 26 93 AA 72 89 0B 2F 51 C1 13 CF 58 2C F8 B8
0150 | 14 2B B2 4A 43 04 BF CD 1F D3 46 39 ED 16 68 CE
0160 | 98 D9 41 EC 84 6A 6E 78 18 88 C4 8B 8B F0 57 02
0170 | A7 2A A0 69 98 65 8F B7 63 BA E2 D0 A5 BD 25 0D
0180 | 7B 51 47 B5 F0 90 60 0C 7C 97 0C 6B 10 4F C9 CD
0190 | C5 0D BF 99 ED 03 DA AE FA D5 6B 6A 86 5D 29 6E
01A0 | 19 29 EB 0F 79 42 CC 77 0A 9E 0C CB 2F 3A 48 84
01B0 | 37 CB 15 7E B9 39 BF 99 30 AA EC 07 1C 05 54 CA
01C0 | 2A 02 70 8F 97 B4 B1 13 0B 10 BA F5 0D 42 EA 9A
01D0 | AF 3E 06 CA C7 AB DA E5 84 3B EE 9F 5F DE D1 62
01E0 | E2 57 00 B5 B7 A9 DC 08 28 3F A3 72 74 B5 63 9C
01F0 | E6 65 A6 7F A1 DF E2 C9 6B F3 D4 2B CA 7F F1 5A
0200 | FF 13 13 33 CA BF BA C5 08 EC BA 80 CF AF CA BB
0210 | A7 B1 8B E9 C0 8D 34 BE 4E 06 DE D2 84 A0 67 F6
0220 | 0B F6 5B E1 61 42 A0 9A 4E DD 7A DF CD 1F 81 1C
0230 | 74 74 B3 66</code></pre>
0130 | 59 92 50 D1 9D 9B 37 90 FB 63 E9 F7 3A 6A 89 0F
0140 | BB 62 94 DB 99 08 7D C8 B4 84 C7 20 FB 9B 09 60
0150 | B3 4F 27 04 52 3D 90 EA 53 48 02 92 2D 34 75 69
0160 | 65 43 E4 9C 02 40 ED 76 09 A7 C5 57 ED 3B 5F 41
0170 | 6D BA 23 97 1B 00 A3 AF CB 4B EE 7A CA B1 2C DA
0180 | 91 4C 18 6A CC 7E 65 89 7F CE 22 25 63 DF BD 96
0190 | 79 11 56 EA 6E 1E FF A8 98 7C 32 70 0E 86 E2 6A
01A0 | A2 F6 E4 CC 42 A1 C4 5E E3 4D C6 30 C5 DA 44 8B
01B0 | 72 36 60 A5 00 E4 D9 6A 88 96 11 2A 29 7E 3A 24
01C0 | F5 11 86 15 B7 FA 2F A8 F1 D0 C5 04 61 8F C1 FE
01D0 | 9E 2A A0 1C EE 99 E8 DD 58 22 0E D5 D5 4E A9 99
01E0 | 3D 5A 85 C7 D7 24 C4 EA 62 39 55 44 23 F1 D4 3C
01F0 | 12 D9 6E 92 10 E0 8D 8D 6A 6E B5 CB 3C 3C D6 CD
0200 | 94 3B E3 76 C8 B3 E7 D6 2B D5 C5 0E B0 48 FE F3
0210 | 26 DA 71 DC 46 86 78 AC 6D C7 04 41 DF 41 9E 55
0220 | E0 AE EF 4D 1B 2A FE C6 4D 97 F5 73 FD D9 C2 65
0230 | D1 86 B4 66</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">
@ -570,13 +570,13 @@ answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87
<tr>
<td>nonce</td>
<td>4, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>20, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
@ -594,13 +594,13 @@ answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87
<tr>
<td>g_a</td>
<td>300, 260</td>
<td><code>FE0001002B5E698C38AB6B114FEFF494</code> <code>F781198F322693AA72890B2F51C113CF</code> <code>582CF8B8142BB24A4304BFCD1FD34639</code> <code>ED1668CE98D941EC846A6E781888C48B</code> <code>8BF05702A72AA06998658FB763BAE2D0</code> <code>A5BD250D7B5147B5F090600C7C970C6B</code> <code>104FC9CDC50DBF99ED03DAAEFAD56B6A</code> <code>865D296E1929EB0F7942CC770A9E0CCB</code> <code>2F3A488437CB157EB939BF9930AAEC07</code> <code>1C0554CA2A02708F97B4B1130B10BAF5</code> <code>0D42EA9AAF3E06CAC7ABDAE5843BEE9F</code> <code>5FDED162E25700B5B7A9DC08283FA372</code> <code>74B5639CE665A67FA1DFE2C96BF3D42B</code> <code>CA7FF15AFF131333CABFBAC508ECBA80</code> <code>CFAFCABBA7B18BE9C08D34BE4E06DED2</code> <code>84A067F60BF65BE16142A09A4EDD7ADF</code><br> <code>CD1F811C</code></td>
<td><code>FE000100599250D19D9B3790FB63E9F7</code> <code>3A6A890FBB6294DB99087DC8B484C720</code> <code>FB9B0960B34F2704523D90EA53480292</code> <code>2D3475696543E49C0240ED7609A7C557</code> <code>ED3B5F416DBA23971B00A3AFCB4BEE7A</code> <code>CAB12CDA914C186ACC7E65897FCE2225</code> <code>63DFBD96791156EA6E1EFFA8987C3270</code> <code>0E86E26AA2F6E4CC42A1C45EE34DC630</code> <code>C5DA448B723660A500E4D96A8896112A</code> <code>297E3A24F5118615B7FA2FA8F1D0C504</code> <code>618FC1FE9E2AA01CEE99E8DD58220ED5</code> <code>D54EA9993D5A85C7D724C4EA62395544</code> <code>23F1D43C12D96E9210E08D8D6A6EB5CB</code> <code>3C3CD6CD943BE376C8B3E7D62BD5C50E</code> <code>B048FEF326DA71DC468678AC6DC70441</code> <code>DF419E55E0AEEF4D1B2AFEC64D97F573</code><br> <code>FDD9C265</code></td>
<td><code>g_a</code> diffie-hellman parameter</td>
</tr>
<tr>
<td>server_time</td>
<td>560, 4</td>
<td><code>7474B366</code> (1723036788 in decimal)</td>
<td><code>D186B466</code> (1723107025 in decimal)</td>
<td>Server time</td>
</tr>
</tbody>
@ -609,34 +609,34 @@ answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87
<h5><a class="anchor" href="#7-client-computes-random-2048-bit-number-b-using-a-sufficient-amount-of-entropy-and-sends-the-server-a-message" id="7-client-computes-random-2048-bit-number-b-using-a-sufficient-amount-of-entropy-and-sends-the-server-a-message" name="7-client-computes-random-2048-bit-number-b-using-a-sufficient-amount-of-entropy-and-sends-the-server-a-message"><i class="anchor-icon"></i></a>7) Client computes random 2048-bit number <em>b</em> (using a sufficient amount of entropy) and sends the server a message</h5>
<p>First, generate a secure random 2048-bit number b:</p>
<!-- start b -->
<pre><code>b = 197A14BA77AF7D6D4091A451CD8D99D5D0CAC51A383733DF01F64478B5247692BB6AB43C8FD3CD668ED452E6B131FE55496551BB6C67F3C875CE6E2EB9EBD340AB24F0D64C1B916181D2CE4FEBEE35596BE7DCD7660FA360E8CF89F1F7EB8165B814CAE126B4A35A71AA4E7BA9917DDDF0C0FD3D34796DA61355A99B8CDDC62C97A5B4B6BE1EF45CC9250A4AEB84CABD89D32E10B5AAE0D59EA946B0A94E191759B8E4993F0DC4DDD11DC15985A985A5F677E14B73D39EA28128B988AB62C3117E37B0DDE3D0F165C63F413DD82B15408ADA820FBA16E1DE92368D5A9B525DA729FC8834F9B8AF671EE64E660EB160AC5CF4EDD3D1CEB6A297AC9F80EB25EE0E</code></pre>
<pre><code>b = 45B9C32453692EBEBC16E1FCF7F821531522BF17939B60FAC74707BA527BC4DB4B98B25EFC01A77A7150468ECCEB3FB457690B48A21B7C1208BFD200A56EB40CC376B90B7C677392B8E2571CD1BCCBACC2C653E36760CCE065CD7D67071ADCEAC14EF7D834211333B814A2E95E524D4106242FEF20BA36CA8F47BAB6866CC9DB2EC663E439994649CAEB2765855F07C7CDDCBBC6ED0C5726CF627E4AD315010CC09866785FC23DECBF6205F4BF433C53D9CFC68B5886F8591CEF52BDC78DF8710412C7FEDA349C88CCC1E16F7267459B0FD809398792C171B28A8AB039C7F85C252201276998C95A5B4B8E1A93483186F295FFB9791B66F12CA9DA1DF960158F</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 = 3B4237CD8D7324EAAE784E54BC7EE6914F2B4E6C43BB48B2C3A7DC2A145F76544183A594007067550061B2AED3CA473EE24293967FA9F9E8BF17F7A0AB427DD1E163B83A7BC466093390AAB30D30395C89B2399DF270D9E0989EACA1A6D78F89EE74C3C6D46B6D366F9F3BF515F0920B3628AE05E19E44F81621B7C0417EA85FF8BAB418CA979796654EAB56FA7F71A1FB9BA44F5EFAD48F91FEA29031BF8A460183DA3AC9786F89B8516BD98303FB0DA926BE642405E1C784571445EC34544828E123FEC1AF7CFAE50BF2FB510E6FABDBB7AA1FEE649C2609AB8B7099B974250B453F898388C3317271EFE57ED95A68CB7DC80C916AE7DFB1B59F87A4EE6F3F</code></pre>
<pre><code>g_b = 10C3445D110331FC26F48F8827480015DF98A8BFF7DEF60B60F6CDB65E99A662D1493D974D04E3543F4E949A7E0BA60438629071D79EA0D47A021F867F197B6203F67393C6949B32CD8D422757296AEA0ACBCCBF42A4EA9D0BCF765440CC9CC75A7078862418D53646B4360BCA3D00A63272622314907A1CB6534F2913C3638EBD04D15ECE501D47F860B1D7E41DD796679ACD31BF650218EEFE802BC5E01AD0295CADC5E8F97FAE9D352E592E9D416A133EDE579EBF0E40BA19E24CB6E90A3938469D41BE0E32C78B9C394657A4388FC838086305B6BE7DA6B618698EBB393A2D96BF6E323BE850007DA5809A001D5447E23FE3BE7D246C88E8E4A7B9FD8E36</code></pre>
<!-- end g_b -->
<h6>7.1) generation of encrypted_data</h6>
<!-- start client_DH_inner_data -->
<p>Generated payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 54 B6 43 66 B7 33 52 C7 A5 7A D9 D6 69 33 9B FF
0010 | 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB D3 29 F1 17
0020 | B8 FD E8 74 00 00 00 00 00 00 00 00 FE 00 01 00
0030 | 3B 42 37 CD 8D 73 24 EA AE 78 4E 54 BC 7E E6 91
0040 | 4F 2B 4E 6C 43 BB 48 B2 C3 A7 DC 2A 14 5F 76 54
0050 | 41 83 A5 94 00 70 67 55 00 61 B2 AE D3 CA 47 3E
0060 | E2 42 93 96 7F A9 F9 E8 BF 17 F7 A0 AB 42 7D D1
0070 | E1 63 B8 3A 7B C4 66 09 33 90 AA B3 0D 30 39 5C
0080 | 89 B2 39 9D F2 70 D9 E0 98 9E AC A1 A6 D7 8F 89
0090 | EE 74 C3 C6 D4 6B 6D 36 6F 9F 3B F5 15 F0 92 0B
00A0 | 36 28 AE 05 E1 9E 44 F8 16 21 B7 C0 41 7E A8 5F
00B0 | F8 BA B4 18 CA 97 97 96 65 4E AB 56 FA 7F 71 A1
00C0 | FB 9B A4 4F 5E FA D4 8F 91 FE A2 90 31 BF 8A 46
00D0 | 01 83 DA 3A C9 78 6F 89 B8 51 6B D9 83 03 FB 0D
00E0 | A9 26 BE 64 24 05 E1 C7 84 57 14 45 EC 34 54 48
00F0 | 28 E1 23 FE C1 AF 7C FA E5 0B F2 FB 51 0E 6F AB
0100 | DB B7 AA 1F EE 64 9C 26 09 AB 8B 70 99 B9 74 25
0110 | 0B 45 3F 89 83 88 C3 31 72 71 EF E5 7E D9 5A 68
0120 | CB 7D C8 0C 91 6A E7 DF B1 B5 9F 87 A4 EE 6F 3F</code></pre>
<pre><code>0000 | 54 B6 43 66 7B D0 9C F3 4A 78 7B 68 00 C2 38 51
0010 | E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2 5A DF 65 38
0020 | 56 25 59 30 00 00 00 00 00 00 00 00 FE 00 01 00
0030 | 10 C3 44 5D 11 03 31 FC 26 F4 8F 88 27 48 00 15
0040 | DF 98 A8 BF F7 DE F6 0B 60 F6 CD B6 5E 99 A6 62
0050 | D1 49 3D 97 4D 04 E3 54 3F 4E 94 9A 7E 0B A6 04
0060 | 38 62 90 71 D7 9E A0 D4 7A 02 1F 86 7F 19 7B 62
0070 | 03 F6 73 93 C6 94 9B 32 CD 8D 42 27 57 29 6A EA
0080 | 0A CB CC BF 42 A4 EA 9D 0B CF 76 54 40 CC 9C C7
0090 | 5A 70 78 86 24 18 D5 36 46 B4 36 0B CA 3D 00 A6
00A0 | 32 72 62 23 14 90 7A 1C B6 53 4F 29 13 C3 63 8E
00B0 | BD 04 D1 5E CE 50 1D 47 F8 60 B1 D7 E4 1D D7 96
00C0 | 67 9A CD 31 BF 65 02 18 EE FE 80 2B C5 E0 1A D0
00D0 | 29 5C AD C5 E8 F9 7F AE 9D 35 2E 59 2E 9D 41 6A
00E0 | 13 3E DE 57 9E BF 0E 40 BA 19 E2 4C B6 E9 0A 39
00F0 | 38 46 9D 41 BE 0E 32 C7 8B 9C 39 46 57 A4 38 8F
0100 | C8 38 08 63 05 B6 BE 7D A6 B6 18 69 8E BB 39 3A
0110 | 2D 96 BF 6E 32 3B E8 50 00 7D A5 80 9A 00 1D 54
0120 | 47 E2 3F E3 BE 7D 24 6C 88 E8 E4 A7 B9 FD 8E 36</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">
@ -658,19 +658,19 @@ answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87
<tr>
<td>nonce</td>
<td>4, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>20, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>g_b</td>
<td>36, 260</td>
<td><code>FE0001003B4237CD8D7324EAAE784E54</code> <code>BC7EE6914F2B4E6C43BB48B2C3A7DC2A</code> <code>145F76544183A594007067550061B2AE</code> <code>D3CA473EE24293967FA9F9E8BF17F7A0</code> <code>AB427DD1E163B83A7BC466093390AAB3</code> <code>0D30395C89B2399DF270D9E0989EACA1</code> <code>A6D78F89EE74C3C6D46B6D366F9F3BF5</code> <code>15F0920B3628AE05E19E44F81621B7C0</code> <code>417EA85FF8BAB418CA979796654EAB56</code> <code>FA7F71A1FB9BA44F5EFAD48F91FEA290</code> <code>31BF8A460183DA3AC9786F89B8516BD9</code> <code>8303FB0DA926BE642405E1C784571445</code> <code>EC34544828E123FEC1AF7CFAE50BF2FB</code> <code>510E6FABDBB7AA1FEE649C2609AB8B70</code> <code>99B974250B453F898388C3317271EFE5</code> <code>7ED95A68CB7DC80C916AE7DFB1B59F87</code><br> <code>A4EE6F3F</code></td>
<td><code>FE00010010C3445D110331FC26F48F88</code> <code>27480015DF98A8BFF7DEF60B60F6CDB6</code> <code>5E99A662D1493D974D04E3543F4E949A</code> <code>7E0BA60438629071D79EA0D47A021F86</code> <code>7F197B6203F67393C6949B32CD8D4227</code> <code>57296AEA0ACBCCBF42A4EA9D0BCF7654</code> <code>40CC9CC75A7078862418D53646B4360B</code> <code>CA3D00A63272622314907A1CB6534F29</code> <code>13C3638EBD04D15ECE501D47F860B1D7</code> <code>E41DD796679ACD31BF650218EEFE802B</code> <code>C5E01AD0295CADC5E8F97FAE9D352E59</code> <code>2E9D416A133EDE579EBF0E40BA19E24C</code> <code>B6E90A3938469D41BE0E32C78B9C3946</code> <code>57A4388FC838086305B6BE7DA6B61869</code> <code>8EBB393A2D96BF6E323BE850007DA580</code> <code>9A001D5447E23FE3BE7D246C88E8E4A7</code><br> <code>B9FD8E36</code></td>
<td>Single-byte prefix denoting length, a 256-byte (2048-bit) string, and zero bytes of padding</td>
</tr>
<tr>
@ -684,47 +684,47 @@ answer = BA0D89B5B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE87
<!-- 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="#7-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 = 54B64366B73352C7A57AD9D669339BFF67CAA25DA33A8CA266C8FCABD329F117B8FDE8740000000000000000FE0001003B4237CD8D7324EAAE784E54BC7EE6914F2B4E6C43BB48B2C3A7DC2A145F76544183A594007067550061B2AED3CA473EE24293967FA9F9E8BF17F7A0AB427DD1E163B83A7BC466093390AAB30D30395C89B2399DF270D9E0989EACA1A6D78F89EE74C3C6D46B6D366F9F3BF515F0920B3628AE05E19E44F81621B7C0417EA85FF8BAB418CA979796654EAB56FA7F71A1FB9BA44F5EFAD48F91FEA29031BF8A460183DA3AC9786F89B8516BD98303FB0DA926BE642405E1C784571445EC34544828E123FEC1AF7CFAE50BF2FB510E6FABDBB7AA1FEE649C2609AB8B7099B974250B453F898388C3317271EFE57ED95A68CB7DC80C916AE7DFB1B59F87A4EE6F3F
padding = BB5205ED4C4B6A1E93A44B1F
tmp_aes_key = 95C19DED56EE87B886F460FE1CDD48254C94D09EBE0DBE3B8E2B72ADA56315D4
tmp_aes_iv = 85FC1734018FBD70D76EB3CE48C64F7ACEFCA80548D635B54833A341A1B046B7</code></pre>
<pre><code>data = 54B643667BD09CF34A787B6800C23851E9C54DAAC6DF0C6AAFC0E1E25ADF6538562559300000000000000000FE00010010C3445D110331FC26F48F8827480015DF98A8BFF7DEF60B60F6CDB65E99A662D1493D974D04E3543F4E949A7E0BA60438629071D79EA0D47A021F867F197B6203F67393C6949B32CD8D422757296AEA0ACBCCBF42A4EA9D0BCF765440CC9CC75A7078862418D53646B4360BCA3D00A63272622314907A1CB6534F2913C3638EBD04D15ECE501D47F860B1D7E41DD796679ACD31BF650218EEFE802BC5E01AD0295CADC5E8F97FAE9D352E592E9D416A133EDE579EBF0E40BA19E24CB6E90A3938469D41BE0E32C78B9C394657A4388FC838086305B6BE7DA6B618698EBB393A2D96BF6E323BE850007DA5809A001D5447E23FE3BE7D246C88E8E4A7B9FD8E36
padding = B456048A0A7A890CDF5F49A4
tmp_aes_key = 40B6732602856F6EE65A440754D4D649C0EA440BA91054B5AEB8469DA6F64660
tmp_aes_iv = CE4B145477DA8934B9D6C79304FED9A787000E60091DD4938CAB4799E5275DA6</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 = 25C8CC63C8973491B618B9A4823E1E4ED70DF97B2897D103188171DDA02DD97A69A67C3E4A10236E39432039D3B2CEACF8F415C76DB4789BC46C8788EFC5500E9A9A447BA2B7E4197860CA70E5560F419898FD1976E378276ED931CB6EC768DDA046C419CC0FD2D7B2E3C389D33778002508108001654792061020D3EB593163731D92D5544B86D54FD10675BF126A5628EED83FE31626C9B356938BF7B6BF4F2C887ABA8C899FC723F865BF4F094AE6447BEE14BF2D4FDF26F1A557BB660C171A1F54F0F797858B0EB79F62514D409F7E82E67BC52B5413992B31E6F7163C021D026425BE12447B1678EDE014F09BCFEDA590C26F80D396F16FFD006425BCD81C93D8D397446C2B1F357E648A6D38B5F8363A9B01EA0BA6E59BE1FA5DA136031FF08904A4CD59B29CC70D7EA6E2F8BCCF10F1FCADECA93D0055DBDBD6DF9A7D163F1C8AE17C63AE87932A4DAACE93B9</code></pre>
<pre><code>encrypted_data = D9B2FE48E960432E4AFAABA9EBD7417A8B70EA09552DF8D3ACF49001D9135AE9C52377C66AB9A25DFE8691CBC5E58BB60E8723E943795134867D486191581AE748DF0E732497C47C79A3A886358405A4114322DE6ED3BE97A398F277DE2F9D6C5EF67963F0B682AD0DF74F11EBB74B5858447854B089E09785235F3C2BD26D7182F2386867B3F16B506718C369A00F99A10681671FC16F2ADDAE894B5B320ECC4EE0DF16EBE2FDC6AF159671B5E0F7CDAA16D866546252B3EF475A9953819A8718B22DAA6AEC3CDE3EA4C8179837A2E060CCED41A7A83061A6721352705514D620FDFCAD3811D489FE4669EF66AB3E39D0E62D197EB24DC2FF53D43DE0A28009B806DB200FE1FEE5452FDFD88991101316F3C91CD5D14A4039D12CF1729200B9E698BE6CD4F5A53794BDCCBAF5951A1E7B79EB606C0EEB99728F00FC4B474CE3AA3F23FEE7AC37DAF4806EE772C3B92F</code></pre>
<!-- end client_DH_inner_data_output -->
<p>The length of the final string is 336 bytes.</p>
<h6>7.2) set_client_DH_params query</h6>
<!-- start set_client_DH_params -->
<p>Sent payload (excluding transport headers/trailers):</p>
<pre><code>0000 | 00 00 00 00 00 00 00 00 CC F1 0A 00 74 74 B3 66
0010 | 78 01 00 00 1F 5F 04 F5 B7 33 52 C7 A5 7A D9 D6
0020 | 69 33 9B FF 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB
0030 | D3 29 F1 17 B8 FD E8 74 FE 50 01 00 25 C8 CC 63
0040 | C8 97 34 91 B6 18 B9 A4 82 3E 1E 4E D7 0D F9 7B
0050 | 28 97 D1 03 18 81 71 DD A0 2D D9 7A 69 A6 7C 3E
0060 | 4A 10 23 6E 39 43 20 39 D3 B2 CE AC F8 F4 15 C7
0070 | 6D B4 78 9B C4 6C 87 88 EF C5 50 0E 9A 9A 44 7B
0080 | A2 B7 E4 19 78 60 CA 70 E5 56 0F 41 98 98 FD 19
0090 | 76 E3 78 27 6E D9 31 CB 6E C7 68 DD A0 46 C4 19
00A0 | CC 0F D2 D7 B2 E3 C3 89 D3 37 78 00 25 08 10 80
00B0 | 01 65 47 92 06 10 20 D3 EB 59 31 63 73 1D 92 D5
00C0 | 54 4B 86 D5 4F D1 06 75 BF 12 6A 56 28 EE D8 3F
00D0 | E3 16 26 C9 B3 56 93 8B F7 B6 BF 4F 2C 88 7A BA
00E0 | 8C 89 9F C7 23 F8 65 BF 4F 09 4A E6 44 7B EE 14
00F0 | BF 2D 4F DF 26 F1 A5 57 BB 66 0C 17 1A 1F 54 F0
0100 | F7 97 85 8B 0E B7 9F 62 51 4D 40 9F 7E 82 E6 7B
0110 | C5 2B 54 13 99 2B 31 E6 F7 16 3C 02 1D 02 64 25
0120 | BE 12 44 7B 16 78 ED E0 14 F0 9B CF ED A5 90 C2
0130 | 6F 80 D3 96 F1 6F FD 00 64 25 BC D8 1C 93 D8 D3
0140 | 97 44 6C 2B 1F 35 7E 64 8A 6D 38 B5 F8 36 3A 9B
0150 | 01 EA 0B A6 E5 9B E1 FA 5D A1 36 03 1F F0 89 04
0160 | A4 CD 59 B2 9C C7 0D 7E A6 E2 F8 BC CF 10 F1 FC
0170 | AD EC A9 3D 00 55 DB DB D6 DF 9A 7D 16 3F 1C 8A
0180 | E1 7C 63 AE 87 93 2A 4D AA CE 93 B9</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 A0 D3 01 00 D1 86 B4 66
0010 | 78 01 00 00 1F 5F 04 F5 7B D0 9C F3 4A 78 7B 68
0020 | 00 C2 38 51 E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2
0030 | 5A DF 65 38 56 25 59 30 FE 50 01 00 D9 B2 FE 48
0040 | E9 60 43 2E 4A FA AB A9 EB D7 41 7A 8B 70 EA 09
0050 | 55 2D F8 D3 AC F4 90 01 D9 13 5A E9 C5 23 77 C6
0060 | 6A B9 A2 5D FE 86 91 CB C5 E5 8B B6 0E 87 23 E9
0070 | 43 79 51 34 86 7D 48 61 91 58 1A E7 48 DF 0E 73
0080 | 24 97 C4 7C 79 A3 A8 86 35 84 05 A4 11 43 22 DE
0090 | 6E D3 BE 97 A3 98 F2 77 DE 2F 9D 6C 5E F6 79 63
00A0 | F0 B6 82 AD 0D F7 4F 11 EB B7 4B 58 58 44 78 54
00B0 | B0 89 E0 97 85 23 5F 3C 2B D2 6D 71 82 F2 38 68
00C0 | 67 B3 F1 6B 50 67 18 C3 69 A0 0F 99 A1 06 81 67
00D0 | 1F C1 6F 2A DD AE 89 4B 5B 32 0E CC 4E E0 DF 16
00E0 | EB E2 FD C6 AF 15 96 71 B5 E0 F7 CD AA 16 D8 66
00F0 | 54 62 52 B3 EF 47 5A 99 53 81 9A 87 18 B2 2D AA
0100 | 6A EC 3C DE 3E A4 C8 17 98 37 A2 E0 60 CC ED 41
0110 | A7 A8 30 61 A6 72 13 52 70 55 14 D6 20 FD FC AD
0120 | 38 11 D4 89 FE 46 69 EF 66 AB 3E 39 D0 E6 2D 19
0130 | 7E B2 4D C2 FF 53 D4 3D E0 A2 80 09 B8 06 DB 20
0140 | 0F E1 FE E5 45 2F DF D8 89 91 10 13 16 F3 C9 1C
0150 | D5 D1 4A 40 39 D1 2C F1 72 92 00 B9 E6 98 BE 6C
0160 | D4 F5 A5 37 94 BD CC BA F5 95 1A 1E 7B 79 EB 60
0170 | 6C 0E EB 99 72 8F 00 FC 4B 47 4C E3 AA 3F 23 FE
0180 | E7 AC 37 DA F4 80 6E E7 72 C3 B9 2F</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">
@ -746,7 +746,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>CCF10A007474B366</code></td>
<td><code>A0D30100D186B466</code></td>
<td>Message ID generated as specified <a href="/mtproto/description#message-identifier-msg-id">here »</a> (unixtime() &lt;&lt; 32) + (N*4)</td>
</tr>
<tr>
@ -764,19 +764,19 @@ encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);<
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>encrypted_data</td>
<td>56, 340</td>
<td><code>FE50010025C8CC63C8973491B618B9A4</code> <code>823E1E4ED70DF97B2897D103188171DD</code> <code>A02DD97A69A67C3E4A10236E39432039</code> <code>D3B2CEACF8F415C76DB4789BC46C8788</code> <code>EFC5500E9A9A447BA2B7E4197860CA70</code> <code>E5560F419898FD1976E378276ED931CB</code> <code>6EC768DDA046C419CC0FD2D7B2E3C389</code> <code>D33778002508108001654792061020D3</code> <code>EB593163731D92D5544B86D54FD10675</code> <code>BF126A5628EED83FE31626C9B356938B</code> <code>F7B6BF4F2C887ABA8C899FC723F865BF</code> <code>4F094AE6447BEE14BF2D4FDF26F1A557</code> <code>BB660C171A1F54F0F797858B0EB79F62</code> <code>514D409F7E82E67BC52B5413992B31E6</code> <code>F7163C021D026425BE12447B1678EDE0</code> <code>14F09BCFEDA590C26F80D396F16FFD00</code> <code>6425BCD81C93D8D397446C2B1F357E64</code> <code>8A6D38B5F8363A9B01EA0BA6E59BE1FA</code> <code>5DA136031FF08904A4CD59B29CC70D7E</code> <code>A6E2F8BCCF10F1FCADECA93D0055DBDB</code> <code>D6DF9A7D163F1C8AE17C63AE87932A4D</code><br> <code>AACE93B9</code></td>
<td><code>FE500100D9B2FE48E960432E4AFAABA9</code> <code>EBD7417A8B70EA09552DF8D3ACF49001</code> <code>D9135AE9C52377C66AB9A25DFE8691CB</code> <code>C5E58BB60E8723E943795134867D4861</code> <code>91581AE748DF0E732497C47C79A3A886</code> <code>358405A4114322DE6ED3BE97A398F277</code> <code>DE2F9D6C5EF67963F0B682AD0DF74F11</code> <code>EBB74B5858447854B089E09785235F3C</code> <code>2BD26D7182F2386867B3F16B506718C3</code> <code>69A00F99A10681671FC16F2ADDAE894B</code> <code>5B320ECC4EE0DF16EBE2FDC6AF159671</code> <code>B5E0F7CDAA16D866546252B3EF475A99</code> <code>53819A8718B22DAA6AEC3CDE3EA4C817</code> <code>9837A2E060CCED41A7A83061A6721352</code> <code>705514D620FDFCAD3811D489FE4669EF</code> <code>66AB3E39D0E62D197EB24DC2FF53D43D</code> <code>E0A28009B806DB200FE1FEE5452FDFD8</code> <code>8991101316F3C91CD5D14A4039D12CF1</code> <code>729200B9E698BE6CD4F5A53794BDCCBA</code> <code>F5951A1E7B79EB606C0EEB99728F00FC</code> <code>4B474CE3AA3F23FEE7AC37DAF4806EE7</code><br> <code>72C3B92F</code></td>
<td>Encrypted client_DH_inner_data generated previously, serialized as a TL byte string</td>
</tr>
</tbody>
@ -785,17 +785,17 @@ encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);<
<h5><a class="anchor" href="#8-auth-key-generation" id="8-auth-key-generation" name="8-auth-key-generation"><i class="anchor-icon"></i></a>8) Auth key generation</h5>
<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 = 878705E799FEE22506D8BC65C19DAFDD36F341EBA0AD4D5269B6647EF0BA90D49EDFECA28E08F57E37E3F735C22CCE2C13F977467D9091A19020A20051057EE4DF07902255E02CCAD7F2C10611484FEE29B5D3D0CB549223A16FC60E7298878A8B822BA8DAEF05FC1BF51DA9240D3C8BE8047AD10354085A672957D7D5FFF0065DD779504F1AFEEFD982F4E16A670CDB84ABCF26D82C7743FF10048E6E6C954C41622B5FC8D1CBB4BAC8F36AFD1DD8B79DCF3DDCF0F2016A42F4F62E55089FC27DA88AD3B240B8ED1CF729AB4D54401679EBC3775FDF4CB755522691397B397F4873CD5E334E1AE0FAD79C80B61A7847E9D4CD6B914A1821E6BC5D4175C8F918</code></pre>
<pre><code>auth_key = 2A026F2B9C149C34EDE732FE5FCCCE57EB0052F8B564ECFA70DAB818A3B096DBBFFF4E73342351734FDF48CC0CD21C311E13468E644585CA2FAB93D96C6ED85BAF2E01178F8F2BE059CD176576F60367AB15265D97F9E01514BD8AB0C9DEF78F0FFF839ABFC8DB92365EE8160393D49D0B48AF46D390191C20B3F6CBB18E42E097767287F23872E313234025B597D90864DA7FFC9CF64D5F111C44317E96D4EA00ED2F41C34D9EA3707F6B665E5833A7781878DC642AD3F7CC5F7518338CEEE17D224E4DFE754378D9F7D1EAD9DB5DE8E20EB692DE435B9EF356709F1D23F336F8B3AC8117F985FB4B00C2A816B569E1269AB289F3C5B1B762D932CC36AF2989</code></pre>
<!-- end auth_key -->
<h5><a class="anchor" href="#9-final-server-reply" id="9-final-server-reply" name="9-final-server-reply"><i class="anchor-icon"></i></a>9) Final server reply</h5>
<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 30 59 03 75 74 B3 66
0010 | 90 00 00 00 34 F7 CB 3B B7 33 52 C7 A5 7A D9 D6
0020 | 69 33 9B FF 67 CA A2 5D A3 3A 8C A2 66 C8 FC AB
0030 | D3 29 F1 17 B8 FD E8 74 FE AB A0 FD 45 DC BF 35
0040 | DD BA FE 91 7C EA 05 70</code></pre>
<pre><code>0000 | 00 00 00 00 00 00 00 00 01 58 E2 D0 D2 86 B4 66
0010 | A8 00 00 00 34 F7 CB 3B 7B D0 9C F3 4A 78 7B 68
0020 | 00 C2 38 51 E9 C5 4D AA C6 DF 0C 6A AF C0 E1 E2
0030 | 5A DF 65 38 56 25 59 30 0D 81 6B 3B 60 DF 19 81
0040 | 01 A5 16 6B CE 44 35 17</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;</code></pre>
<table class="table">
@ -817,13 +817,13 @@ 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>013059037574B366</code></td>
<td><code>0158E2D0D286B466</code></td>
<td>Message ID generated as specified <a href="/mtproto/description#message-identifier-msg-id">here »</a> (unixtime() &lt;&lt; 32) + (N*4)</td>
</tr>
<tr>
<td>message_length</td>
<td>16, 4</td>
<td><code>90000000</code> (144 in decimal)</td>
<td><code>A8000000</code> (168 in decimal)</td>
<td>Message body length</td>
</tr>
<tr>
@ -835,19 +835,19 @@ encrypted_data := AES256_ige_encrypt (data_with_hash, tmp_aes_key, tmp_aes_iv);<
<tr>
<td>nonce</td>
<td>24, 16</td>
<td><code>B73352C7A57AD9D669339BFF67CAA25D</code></td>
<td><code>7BD09CF34A787B6800C23851E9C54DAA</code></td>
<td>Value generated by client in Step 1</td>
</tr>
<tr>
<td>server_nonce</td>
<td>40, 16</td>
<td><code>A33A8CA266C8FCABD329F117B8FDE874</code></td>
<td><code>C6DF0C6AAFC0E1E25ADF653856255930</code></td>
<td>Value received from server in Step 2</td>
</tr>
<tr>
<td>new_nonce_hash1</td>
<td>56, 16</td>
<td><code>FEABA0FD45DCBF35DDBAFE917CEA0570</code></td>
<td><code>0D816B3B60DF198101A5166BCE443517</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>