<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JONATHAN SIMON</title>
    <description>The latest articles on DEV Community by JONATHAN SIMON (@dejetem).</description>
    <link>https://dev.to/dejetem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F435246%2F7da3ae95-4e67-46e2-862a-37e5256ab5cf.png</url>
      <title>DEV Community: JONATHAN SIMON</title>
      <link>https://dev.to/dejetem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dejetem"/>
    <language>en</language>
    <item>
      <title>Basic Handshake protocol</title>
      <dc:creator>JONATHAN SIMON</dc:creator>
      <pubDate>Thu, 07 Aug 2025 18:25:42 +0000</pubDate>
      <link>https://dev.to/dejetem/basic-handshake-protocol-2ca8</link>
      <guid>https://dev.to/dejetem/basic-handshake-protocol-2ca8</guid>
      <description>&lt;p&gt;I wrote a basic handshake protocol in Rust. Let's break down the entire implementation step-by-step, explaining each component and how it addresses the requirements for a secure handshake protocol.&lt;/p&gt;

&lt;p&gt;A. Protocol Design Overview&lt;br&gt;
The protocol implements mutual authentication using pre-shared keys (PSK) with the following message sequence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ClientHello:&lt;br&gt;
Client ID (variable length)&lt;br&gt;
Client Nonce (16-byte random value)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ServerHello:&lt;br&gt;
Server Nonce (16-byte random value)&lt;br&gt;
HMAC(PSK, ClientNonce + ServerNonce + "Server")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ClientAuth:&lt;br&gt;
HMAC(PSK, ClientNonce + ServerNonce + "Client")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ServerAck:&lt;br&gt;
"AUTH_SUCCESS" confirmation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;B. Security Features Implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mutual Authentication: Both client and server prove knowledge of PSK&lt;/li&gt;
&lt;li&gt;Replay Attack Prevention: Unique nonces for each session&lt;/li&gt;
&lt;li&gt;Message Integrity: HMAC-SHA256 protects against tampering&lt;/li&gt;
&lt;li&gt;Context Separation: Different HMAC contexts for client/server roles&lt;/li&gt;
&lt;li&gt;Freshness Guarantee: Nonces ensure responses are current&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C. Key Components Explained:&lt;/p&gt;

&lt;p&gt;a. KeyStore (protocol.rs)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[derive(Clone)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nf"&gt;KeyStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Purpose: Stores pre-shared keys for clients&lt;/li&gt;
&lt;li&gt;Implementation:

&lt;ul&gt;
&lt;li&gt;Uses HashMap for client ID → key mapping&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[derive(Clone)]&lt;/code&gt; enables safe sharing between threads&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_key()&lt;/code&gt; retrieves key with error handling&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;b. Nonce Generation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;generate_nonce&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;NONCE_SIZE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;NONCE_SIZE&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nn"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rngs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OsRng&lt;/span&gt;&lt;span class="nf"&gt;.fill_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;nonce&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Security Importance:

&lt;ul&gt;
&lt;li&gt;Prevents replay attacks&lt;/li&gt;
&lt;li&gt;Ensures session uniqueness&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Implementation:

&lt;ul&gt;
&lt;li&gt;Uses cryptographically secure OsRng&lt;/li&gt;
&lt;li&gt;Generates 16 random bytes (128 bits)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;c. HMAC Operations&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;compute_hmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HmacSha256&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new_from_slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="nf"&gt;.update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="nf"&gt;.finalize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.into_bytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Security Properties:

&lt;ul&gt;
&lt;li&gt;Keyed-Hash Message Authentication Code&lt;/li&gt;
&lt;li&gt;SHA-256 provides collision resistance&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Implementation Notes:

&lt;ul&gt;
&lt;li&gt;Concatenates inputs: [c_nonce, s_nonce, role]&lt;/li&gt;
&lt;li&gt;Role strings ("Client"/"Server") prevent reflection attacks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;D. Server Implementation (server.rs)&lt;br&gt;
a. Initialization&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"127.0.0.1:8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;keystore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;KeyStore&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Concurrency Handling:

&lt;ul&gt;
&lt;li&gt;Arc enables thread-safe reference counting&lt;/li&gt;
&lt;li&gt;Allows sharing keystore across connections&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;b. Connection Handling&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Handshake logic&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Asynchronous Design:

&lt;ul&gt;
&lt;li&gt;Uses Tokio runtime for async I/O&lt;/li&gt;
&lt;li&gt;Spawns new task per connection&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;c. Handshake Sequence&lt;br&gt;
i. Receive ClientHello:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client_id_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.read_u8&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.read_exact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;client_id_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;client_id_len&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.read_exact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;c_nonce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Reads client ID (length-prefixed)&lt;/li&gt;
&lt;li&gt;Reads 16-byte client nonce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ii. Send ServerHello:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;server_hmac&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_hmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;psk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;b"Server"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s_nonce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_hmac&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Proves server knows PSK&lt;/li&gt;
&lt;li&gt;Binds response to client's nonce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iii. Verify ClientAuth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nf"&gt;verify_hmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;psk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;b"Client"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;client_hmac&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Validates client knows PSK&lt;/li&gt;
&lt;li&gt;Ensures client received server's nonce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iv. Send Acknowledgement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;b"AUTH_SUCCESS"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;12-byte fixed message confirms auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E. Client Implementation (client.rs)&lt;br&gt;
a. Handshake Sequence&lt;br&gt;
i. Send ClientHello:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_u8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="nf"&gt;.as_bytes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c_nonce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Length-prefixed client ID&lt;/li&gt;
&lt;li&gt;Random client nonce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ii. Verify ServerHello:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nf"&gt;verify_hmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;psk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;b"Server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_hmac&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Validates server identity&lt;/li&gt;
&lt;li&gt;Ensures response is fresh (contains client nonce)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iii. Send ClientAuth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client_hmac&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_hmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;psk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s_nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;b"Client"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="nf"&gt;.write_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;client_hmac&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Proves client knows PSK&lt;/li&gt;
&lt;li&gt;Binds response to server's nonce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iv. Verify ServerAck:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ack&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;b"AUTH_SUCCESS"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Authenticated with server!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Final confirmation of successful auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;F. Protocol Security Analysis&lt;br&gt;
a. Replay Attack Prevention&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client Nonce: Ensures server response is fresh&lt;/li&gt;
&lt;li&gt;Server Nonce: Ensures client authentication is fresh&lt;/li&gt;
&lt;li&gt;HMAC Context: Includes both nonces in all authentication tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;b. Authentication Strength&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mutual Authentication: Both parties prove PSK knowledge&lt;/li&gt;
&lt;li&gt;Context Separation: Different HMAC strings for client/server roles&lt;/li&gt;
&lt;li&gt;Key Binding: All HMACs incorporate both parties' nonces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;c. Message Sequencing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strict state machine enforced by:

&lt;ul&gt;
&lt;li&gt;Server waits for ClientHello before responding&lt;/li&gt;
&lt;li&gt;Client waits for ServerHello before authenticating&lt;/li&gt;
&lt;li&gt;Server waits for ClientAuth before acking&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;d. Minimal Security Concepts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication: HMAC proves PSK knowledge&lt;/li&gt;
&lt;li&gt;Integrity: HMAC protects against message tampering&lt;/li&gt;
&lt;li&gt;Freshness: Nonces guarantee message recency&lt;/li&gt;
&lt;li&gt;Key Confidentiality: PSK never transmitted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This implementation provides a solid foundation for secure protocol design, demonstrating core concepts like mutual authentication, nonce-based freshness, and HMAC-based message integrity. The Rust implementation leverages async I/O for performance and type safety for correctness.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>rust</category>
    </item>
    <item>
      <title>Rendering( or How to Render) Animation in JSON format with LottieFiles animation in React application</title>
      <dc:creator>JONATHAN SIMON</dc:creator>
      <pubDate>Fri, 12 Apr 2024 11:53:00 +0000</pubDate>
      <link>https://dev.to/dejetem/rendering-or-how-to-render-animation-in-json-format-with-lottiefiles-animation-in-react-application-1ha8</link>
      <guid>https://dev.to/dejetem/rendering-or-how-to-render-animation-in-json-format-with-lottiefiles-animation-in-react-application-1ha8</guid>
      <description>&lt;p&gt;A Lottie is a JSON-based animation file format that allows you to ship animations on any platform as easily as shipping static assets. &lt;a href="https://lottiefiles.com/what-is-lottie"&gt;lottiefiles.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lottie is a library that parses animations exported as JSON and renders them natively on the web, iOS, and Android.&lt;/p&gt;

&lt;p&gt;Using JSON format animation in a React application is straightforward, you need to install one library called lottie-web.&lt;/p&gt;

&lt;p&gt;Here's how you can render JSON format animation in a React component using Lottie:&lt;/p&gt;

&lt;p&gt;The first step, install the &lt;code&gt;lottie-web&lt;/code&gt; library using npm or yarn:&lt;br&gt;
&lt;code&gt;npm install --save lottie-web&lt;/code&gt; for npm &lt;br&gt;
&lt;code&gt;yarn add lottie-web&lt;/code&gt; for yarn&lt;/p&gt;

&lt;p&gt;The second step, Import the library and the JSON animation file in your React component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useRef } from 'react';
import lottie from 'lottie-web';
import yourAnimationData from './your_animation_data.json'; // Replace 'your_animation_data.json' with the path to your own JSON animation file

export default function MyLottieAnimation() {
  const animationContainer = useRef(null);

  useEffect(() =&amp;gt; {
    const anim = lottie.loadAnimation({
      container: animationContainer.current,
      renderer: 'svg', // Change the renderer type if needed (canvas, html)
      loop: true,
      autoplay: true,
      animationData: yourAnimationData  // Your own JSON animation data
    });

    return () =&amp;gt; {
      anim.destroy();// Clean up when component unmounts
    };
  }, []);
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;h1&amp;gt;Animation in JSON format&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;with LottieFiles animation in React application&amp;lt;/h2&amp;gt;
      &amp;lt;div ref={animationContainer}&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the above block of the code we first import the React and two React hooks, useEffect and useRef. Then we import the lottie-web library we installed and next, we import the JSON format animation into our component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/lottie-web"&gt;lottie-web&lt;/a&gt;:Lottie is a library that parses animations exported as JSON and renders them natively on the web, iOS, and Android.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://react.dev/reference/react/useEffect"&gt;useEffect&lt;/a&gt;: useEffect is a React Hook that lets you synchronize a component with an external system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://react.dev/reference/react/useRef"&gt;useRef&lt;/a&gt;: useRef is a React Hook that lets you reference a value that's not needed for rendering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
This post talks about how to render JSON format animation in a React component using Lottie and it's a straightforward process.&lt;/p&gt;

&lt;p&gt;Now you can render the animationContainer in your part of the MyLottieAnimation component you want to display the animation.&lt;br&gt;
Here is a link to a &lt;a href="https://codesandbox.io/p/sandbox/proud-snow-skq7ks?file=%2Fsrc%2Findex.js"&gt;sandbox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also create a reusable component for Lottie animation so you don't have to repeat the base configuration, all you have to do is pass your yourAnimationData as a prop to the reusable component and then pass the yourAnimationData to the animationData inside the useEffect hook.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
