<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SecurityControl 0x10 vs 0x30 — is authentication-only just a DLMS checksum?]]></title><description><![CDATA[<p dir="auto">I am reviewing two protected DLMS captures and want to confirm the correct terminology.</p>
<p dir="auto">Our older parser labels <code>0x10</code> as "checksum protection" and <code>0x30</code> as "encrypted protection".</p>
<p dir="auto">That naming now looks wrong to me.</p>
<p dir="auto">The simplified traces below are synthetic, but preserve the structure I am seeing.</p>
<h4>Capture A — authentication protection</h4>
<pre><code class="language-text">C8 xx
10
00 00 00 2A
C0 01 C1 00 01 00 00 01 00 00 FF 02 00
7D 91 2A 44 35 8E 10 A0 B1 C2 D3 E4
</code></pre>
<p dir="auto">My current byte-level interpretation:</p>
<pre><code class="language-text">C8
└─ glo_GetRequest

10
└─ Security Control = authentication

00 00 00 2A
└─ Invocation Counter = 42

C0 01 C1 00 01 00 00 01 00 00 FF 02 00
└─ inner GET APDU remains visible in this example

7D 91 2A 44 35 8E 10 A0 B1 C2 D3 E4
└─ example authentication tag
</code></pre>
<p dir="auto">If I flip one byte in the visible GET APDU, the receiver rejects the packet even though the APDU is not confidential.</p>
<h4>Capture B — authentication + encryption</h4>
<pre><code class="language-text">C8 xx
30
00 00 00 2B
7A 91 C4 08 2D A0 9F 6B 11 85 D2 31
4C 83 6E A2 6D 73 05 91 9A 20 31 7F
...
</code></pre>
<p dir="auto">Interpretation:</p>
<pre><code class="language-text">C8
└─ glo_GetRequest

30
└─ Security Control = authentication + encryption

00 00 00 2B
└─ Invocation Counter = 43

7A 91 C4 08 ...
└─ protected payload; the original GET APDU is no longer
   directly readable from the wire
</code></pre>
<p dir="auto">So should <code>0x10</code> be described as <strong>integrity/authenticity protection</strong>, rather than a checksum?</p>
<p dir="auto">And is the practical difference:</p>
<pre><code class="language-text">0x10 → readable payload + cryptographic authentication
0x30 → encrypted payload + cryptographic authentication
</code></pre>
<p dir="auto">?</p>
]]></description><link>https://dlms.sharur.org/topic/52/securitycontrol-0x10-vs-0x30-is-authentication-only-just-a-dlms-checksum</link><generator>RSS for Node</generator><lastBuildDate>Fri, 16 Oct 2026 19:25:58 GMT</lastBuildDate><atom:link href="https://dlms.sharur.org/topic/52.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Aug 2026 12:44:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SecurityControl 0x10 vs 0x30 — is authentication-only just a DLMS checksum? on Sat, 22 Aug 2026 12:44:39 GMT]]></title><description><![CDATA[<p dir="auto">One more thing: the invocation counter belongs in your security troubleshooting dashboard.</p>
<p dir="auto">A lot of "wrong key" incidents are actually:</p>
<pre><code class="language-text">counter reused
counter lower than meter expects
counter read from the wrong security context
counter reset after restart
</code></pre>
<p dir="auto">So when a protected packet fails, log at least:</p>
<pre><code class="language-text">securityControl
securitySuite
invocationCounter
systemTitle
direction
APDU type
verification result
</code></pre>
<p dir="auto">Do not log live keys.</p>
<p dir="auto">That usually tells you whether you have:</p>
<pre><code class="language-text">a DLMS parser problem
a replay/counter problem
a security-context problem
or an actual key mismatch
</code></pre>
<p dir="auto">before you start changing cryptographic configuration.</p>
]]></description><link>https://dlms.sharur.org/post/139</link><guid isPermaLink="true">https://dlms.sharur.org/post/139</guid><dc:creator><![CDATA[david_miller]]></dc:creator><pubDate>Sat, 22 Aug 2026 12:44:39 GMT</pubDate></item><item><title><![CDATA[Reply to SecurityControl 0x10 vs 0x30 — is authentication-only just a DLMS checksum? on Sat, 22 Aug 2026 12:44:38 GMT]]></title><description><![CDATA[<p dir="auto">For field debugging I normally parse protected APDUs in this order:</p>
<pre><code class="language-text">1. Protected APDU type
2. Security Control
3. Security Suite bits
4. Invocation Counter
5. Sender System Title / security context
6. Authentication and ciphering parameters
7. Verify authentication
8. Decrypt if encryption is enabled
9. Parse the inner xDLMS APDU
</code></pre>
<p dir="auto">The order matters.</p>
<p dir="auto">If the packet starts with:</p>
<pre><code class="language-text">30 00 00 00 2B ...
^^
</code></pre>
<p dir="auto">and <code>0x30</code> is the Security Control, there is little value in searching the following ciphertext for:</p>
<pre><code class="language-text">OBIS
class-id
attribute-id
GET tag
</code></pre>
<p dir="auto">until protection processing succeeds.</p>
<p dir="auto">For <code>0x10</code>, seeing a recognizable GET body does <strong>not</strong> mean the protection is optional. A single modified byte can still invalidate the authentication tag.</p>
]]></description><link>https://dlms.sharur.org/post/138</link><guid isPermaLink="true">https://dlms.sharur.org/post/138</guid><dc:creator><![CDATA[elena_rostova]]></dc:creator><pubDate>Sat, 22 Aug 2026 12:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to SecurityControl 0x10 vs 0x30 — is authentication-only just a DLMS checksum? on Sat, 22 Aug 2026 12:44:38 GMT]]></title><description><![CDATA[<p dir="auto">Also keep link-layer FCS and DLMS data protection separate.</p>
<p dir="auto">For HDLC you can have:</p>
<pre><code class="language-text">HDLC FCS
+
DLMS security protection
</code></pre>
<p dir="auto">at the same time.</p>
<p dir="auto">They solve different problems.</p>
<p dir="auto">The FCS is unkeyed transport error detection.</p>
<p dir="auto">The DLMS authentication tag is keyed cryptographic protection.</p>
<p dir="auto">And if you are using the DLMS Wrapper interface, there is no HDLC FCS around the Wrapper frame anyway, so calling <code>0x10</code> a "checksum" becomes even more confusing.</p>
<p dir="auto">I would avoid this log message:</p>
<pre><code class="language-text">checksum verification failed
</code></pre>
<p dir="auto">and use something explicit:</p>
<pre><code class="language-text">DLMS authentication tag verification failed
</code></pre>
]]></description><link>https://dlms.sharur.org/post/137</link><guid isPermaLink="true">https://dlms.sharur.org/post/137</guid><dc:creator><![CDATA[marcus_vance]]></dc:creator><pubDate>Sat, 22 Aug 2026 12:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to SecurityControl 0x10 vs 0x30 — is authentication-only just a DLMS checksum? on Sat, 22 Aug 2026 12:44:37 GMT]]></title><description><![CDATA[<p dir="auto">That is the better terminology.</p>
<p dir="auto"><code>0x10</code> is not a normal checksum mode.</p>
<p dir="auto">A CRC/FCS answers something like:</p>
<pre><code class="language-text">"Did these bits probably change during transmission?"
</code></pre>
<p dir="auto">The authenticated DLMS protection answers a stronger question:</p>
<pre><code class="language-text">"Was this protected message produced by a party holding the
required cryptographic material, and was the protected data modified?"
</code></pre>
<p dir="auto">So I would label the modes:</p>
<pre><code class="language-text">0x10 = Authentication / integrity protection
0x30 = Authentication + encryption
</code></pre>
<p dir="auto">With <code>0x10</code>, confidentiality is not the goal. A sniffer may still understand the inner APDU.</p>
<p dir="auto">With <code>0x30</code>, the receiver must first validate/decrypt the protected content before you can meaningfully parse the GET/SET/ACTION body.</p>
]]></description><link>https://dlms.sharur.org/post/136</link><guid isPermaLink="true">https://dlms.sharur.org/post/136</guid><dc:creator><![CDATA[alex_turner]]></dc:creator><pubDate>Sat, 22 Aug 2026 12:44:37 GMT</pubDate></item></channel></rss>