<?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: Sadjad</title>
    <description>The latest articles on DEV Community by Sadjad (@lvlrsajjad).</description>
    <link>https://dev.to/lvlrsajjad</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112085%2Feb0fc5c3-7818-4072-940c-dd86196210e8.jpg</url>
      <title>DEV Community: Sadjad</title>
      <link>https://dev.to/lvlrsajjad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lvlrsajjad"/>
    <language>en</language>
    <item>
      <title>Everyone agrees on the risk. They disagree on the price.</title>
      <dc:creator>Sadjad</dc:creator>
      <pubDate>Sun, 06 Sep 2026 09:56:50 +0000</pubDate>
      <link>https://dev.to/lvlrsajjad/everyone-agrees-on-the-risk-they-disagree-on-the-price-44fl</link>
      <guid>https://dev.to/lvlrsajjad/everyone-agrees-on-the-risk-they-disagree-on-the-price-44fl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Published 2026-09-06&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every regulatory claim here was read from the primary document on that&lt;br&gt;
date, and each is cited in&lt;br&gt;
&lt;a href="//../policy-sources.md"&gt;the policy sources&lt;/a&gt;. Guidance moves — the ASD ISM&lt;br&gt;
is revised roughly monthly — so check the sources before acting on any of&lt;br&gt;
it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Germany's BSI recommends that post-quantum key establishment be deployed&lt;br&gt;
alongside a classical algorithm. So does France's ANSSI. So does the EU's&lt;br&gt;
coordinated roadmap. Australia's ASD recommends against it. The NSA says do not&lt;br&gt;
use one on national security systems at all, outside named exceptions.&lt;/p&gt;

&lt;p&gt;The obvious story is that the authorities disagree about whether hybrid&lt;br&gt;
cryptography is safe. That story is wrong, and the real one is more useful.&lt;/p&gt;
&lt;h2&gt;
  
  
  They are all making the same argument
&lt;/h2&gt;

&lt;p&gt;Here is ANSSI, explaining why it wants a classical algorithm kept alongside the&lt;br&gt;
post-quantum one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"even if the post-quantum algorithms have gained a lot of attention, they are&lt;br&gt;
still not mature enough to solely ensure the security. For example, several&lt;br&gt;
post-quantum schemes have suffered from classical attacks in the past years"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The citation attached to that sentence is Beullens, &lt;em&gt;Breaking Rainbow takes a&lt;br&gt;
weekend on a laptop&lt;/em&gt;. Rainbow and SIKE both fell to &lt;strong&gt;classical&lt;/strong&gt; cryptanalysis&lt;br&gt;
during the NIST competition — no quantum computer involved. The concern is not&lt;br&gt;
that ML-KEM will be broken by a quantum computer. It is that it might be broken&lt;br&gt;
by a mathematician.&lt;/p&gt;

&lt;p&gt;BSI reaches the same place, and states the design requirement precisely:&lt;br&gt;
hybridisation "should be implemented in such a way that the hybrid signature&lt;br&gt;
scheme is secure as long as at least one of the schemes is secure."&lt;/p&gt;

&lt;p&gt;Now here is ASD, the agency that recommends &lt;em&gt;against&lt;/em&gt; hybrids:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Generally, such schemes have the advantage of the security offered by the&lt;br&gt;
traditional cryptographic algorithm if the post-quantum cryptographic&lt;br&gt;
algorithm is vulnerable to an implementation flaw or new attack."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is ANSSI's argument, in Australia's own words, in the paragraph where it&lt;br&gt;
declines to follow it. ASD is not disputing the benefit. It is pricing it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This advantage comes at the cost of increased complexity, making maintenance,&lt;br&gt;
analysis and secure implementation more difficult, as well as having greater&lt;br&gt;
computational and bandwidth overheads."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the NSA, in its CNSA 2.0 FAQ, makes the cost side explicit as an empirical&lt;br&gt;
claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Because more security products fail due to implementation or configuration&lt;br&gt;
errors than failures in their underlying cryptographic algorithms, spending&lt;br&gt;
limited resources to add cryptographic complexity can at times weaken security&lt;br&gt;
rather than improve it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the disagreement is not about cryptography. It is a bet on which failure mode&lt;br&gt;
is more likely: a new lattice scheme falling to cryptanalysis, or an engineer&lt;br&gt;
misconfiguring a construction with twice the moving parts. Both are real. The&lt;br&gt;
evidence for the first is Rainbow and SIKE. The evidence for the second is every&lt;br&gt;
CVE ever filed against a TLS stack.&lt;/p&gt;

&lt;p&gt;Reasonable people land differently on that, and they have.&lt;/p&gt;
&lt;h2&gt;
  
  
  Which makes it your problem
&lt;/h2&gt;

&lt;p&gt;None of this would matter if you shipped into one jurisdiction. The trouble is&lt;br&gt;
that the requirements are not merely different — they are, in one specific&lt;br&gt;
configuration, mutually unsatisfiable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASSET           PURPOSE        bsi-de      anssi-fr    eu-roadmap  asd-au      cnsa-2.0
───────────────────────────────────────────────────────────────────────────────────────────
ECDH            key-agreement  WARN        WARN        WARN        WARN        FAIL          ⚠ c1,c2
                └ bsi-de · disallowed 2031-12-31
                └ anssi-fr · complete 2030-12-31
                └ eu-roadmap · transition_start 2026-12-31 · complete 2035-12-31
                └ asd-au · disallowed 2030-12-31 · complete 2030-12-31
                └ cnsa-2.0 · disallowed 2030-12-31 · exclusive_use 2031-12-31
                └ critical · exposure 19.0y · harvest-now-decrypt-later
                └ src/payments/legacy.go:12
X25519MLKEM768  key-agreement  PASS        PASS        PASS        WARN        FAIL          ⚠ c3,c4
                └ asd-au · deprecated 2030-12-31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;X25519MLKEM768&lt;/code&gt; — a hybrid of X25519 and ML-KEM-768, the construction most TLS&lt;br&gt;
libraries are shipping today — passes in Europe, warns in Australia, and fails&lt;br&gt;
for the NSA. And the conflict section explains why, in the terms above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASSET           PURPOSE        bsi-de      anssi-fr    eu-roadmap  asd-au      cnsa-2.0
───────────────────────────────────────────────────────────────────────────────────────────
ECDH            key-agreement  WARN        WARN        WARN        WARN        FAIL          ⚠ c1,c2
                └ bsi-de · disallowed 2031-12-31
                └ anssi-fr · complete 2030-12-31
                └ eu-roadmap · transition_start 2026-12-31 · complete 2035-12-31
                └ asd-au · disallowed 2030-12-31 · complete 2030-12-31
                └ cnsa-2.0 · disallowed 2030-12-31 · exclusive_use 2031-12-31
                └ critical · exposure 19.0y · harvest-now-decrypt-later
                └ src/payments/legacy.go:12
X25519MLKEM768  key-agreement  PASS        PASS        PASS        WARN        FAIL          ⚠ c3,c4
                └ asd-au · deprecated 2030-12-31
                └ src/payments/tls.go:88
ML-DSA-65       signature      WARN        WARN        WARN        WARN        FAIL          ⚠ c5,c6
                └ asd-au · deprecated 2030-12-31
                └ src/payments/sign.go:7
RSA-2048        ambiguous      INDET       INDET       INDET       INDET       INDET
                └ eu-roadmap · transition_start 2026-12-31
                └ unresolved: purpose-ambiguous (primitive:pke)
                └ as key transport → critical · as signature → medium
                └ Declare the purpose in cbomctl.yaml, or regenerate the CBOM with a generator that records
                  cryptoFunctions.
                └ src/payments/keys.go:41

CONFLICTS (6)
  c1  [construction]  ECDH
      anssi-fr, bsi-de, eu-roadmap recommend a hybrid construction for key-agreement; asd-au
      recommend against it; cnsa-2.0 does not permit one outside named interoperability
      exceptions.
      cnsa-2.0 does not permit a hybrid construction outside named interoperability exceptions,
      while anssi-fr, bsi-de, eu-roadmap recommend one. **No single configuration satisfies all
      selected jurisdictions.** You will need different builds, or to drop a jurisdiction from
      scope. asd-au would permit a hybrid but recommends against it, so even dropping cnsa-2.0
      leaves a documented cost. This is a business decision, not a technical one.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two distinct collisions on one asset. The construction conflict has &lt;strong&gt;no&lt;/strong&gt;&lt;br&gt;
resolution: nothing you can build satisfies a jurisdiction that recommends&lt;br&gt;
hybrids and one that does not permit them. The parameter conflict does have&lt;br&gt;
one — ML-KEM-1024 clears everybody, because CNSA 2.0 requires that level "for&lt;br&gt;
all classification levels" while BSI and ANSSI accept 768 without objecting to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It just costs you performance nobody else asked for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That distinction matters more than it looks. "Discouraged but not prohibited" —&lt;br&gt;
ASD's actual wording — leaves a compromise available at a documented cost. "Do&lt;br&gt;
not use except for those exceptions NSA specifically recommends" does not. A&lt;br&gt;
tool that reports PASS/FAIL cannot tell you which situation you are in.&lt;/p&gt;
&lt;h2&gt;
  
  
  The gradient, not the tribe
&lt;/h2&gt;

&lt;p&gt;It is tempting to frame this as Europe versus the anglophone agencies. The&lt;br&gt;
tidier reading is a three-step gradient:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;stance&lt;/th&gt;
&lt;th&gt;who&lt;/th&gt;
&lt;th&gt;what it means for you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;recommended&lt;/td&gt;
&lt;td&gt;BSI, ANSSI, EU roadmap&lt;/td&gt;
&lt;td&gt;ship hybrid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;not recommended, not prohibited&lt;/td&gt;
&lt;td&gt;ASD&lt;/td&gt;
&lt;td&gt;hybrid is allowed, at a documented cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;not permitted outside named exceptions&lt;/td&gt;
&lt;td&gt;NSA (NSS only)&lt;/td&gt;
&lt;td&gt;no compromise exists&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the second contradiction has nothing to do with hybrids at all. BSI and&lt;br&gt;
ANSSI both &lt;strong&gt;exempt hash-based signatures&lt;/strong&gt; — SLH-DSA, XMSS, LMS — from their&lt;br&gt;
hybrid recommendations, because their security rests only on hash-function&lt;br&gt;
assumptions and there is no young lattice assumption to hedge. The NSA's answer&lt;br&gt;
on the same family: "While SLH-DSA is hash-based, it is not part of CNSA and is&lt;br&gt;
not approved for any use in NSS." Approved-standalone in two jurisdictions, not&lt;br&gt;
approved at all in a third.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I did about it
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cbomctl&lt;/code&gt; reads a CycloneDX CBOM — from CBOMkit, from a vendor, from a&lt;br&gt;
procurement process — and evaluates it against several national policies at&lt;br&gt;
once, reporting the matrix and the collisions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;cbomctl
cbomctl verdict your-cbom.json &lt;span class="nt"&gt;-j&lt;/span&gt; bsi-de,anssi-fr,asd-au,cnsa-2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every rule carries the document, the section or page, the date it was read, and&lt;br&gt;
a &lt;code&gt;binding&lt;/code&gt; classification. That last field is load-bearing: most PQC guidance&lt;br&gt;
is not a mandate, and a technical guideline that &lt;em&gt;recommends&lt;/em&gt; cannot produce a&lt;br&gt;
&lt;code&gt;FAIL&lt;/code&gt;. BSI TR-02102-1 recommends. ANSSI's "mandatory hybridation" applies only&lt;br&gt;
inside its security-visa process. The EU roadmap is a Recommendation, non-binding&lt;br&gt;
on operators under TFEU Art. 288. Flattening those into "mandates" is the most&lt;br&gt;
common error in this space, and I made it myself in an early draft — which is&lt;br&gt;
why the field exists.&lt;/p&gt;

&lt;p&gt;All seven packs are read from primary sources. Where a source is a draft, the&lt;br&gt;
tool prints "draft". And where reading it required a judgement, the tool shows&lt;br&gt;
the judgement rather than hiding it behind a verdict.&lt;/p&gt;

&lt;p&gt;That last one earns its place here. NSA's FAQ answers the hybrid question&lt;br&gt;
twice, and the answers differ in force: one says only "will not require", the&lt;br&gt;
other says "Do not use … except for those exceptions NSA specifically&lt;br&gt;
recommends" — but sits under a question framed "while waiting for a final NIST&lt;br&gt;
post-quantum standard", a premise that arguably ended when FIPS 203/204/205&lt;br&gt;
were finalised in August 2024.&lt;/p&gt;

&lt;p&gt;I encoded the stronger reading, because Ver. 2.1 is dated four months &lt;em&gt;after&lt;/em&gt;&lt;br&gt;
that finalisation and was demonstrably revised in the interval — it notes that&lt;br&gt;
"NSA clarified the CNSA 2.0 language when the FIPS documents were published"&lt;br&gt;
and discusses a FIPS 204 variant — and NSA kept the imperative through that&lt;br&gt;
revision. But the encoding is a judgement, and it is the judgement that decides&lt;br&gt;
whether the tool tells you a compromise exists. So the conflict says both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚖ This conflict depends on a contested encoding. Under the alternative reading
  (cnsa-2.0 silent), a hybrid construction would satisfy all selected
  jurisdictions, at a documented cost.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you disagree with me, you can see exactly which sentence you would argue&lt;br&gt;
with. That seems more useful than a confident answer.&lt;/p&gt;

&lt;p&gt;It refuses to guess, too. In CBOMkit's published Keycloak CBOM, 8 of 22&lt;br&gt;
algorithm components carry no usable indication of what the key is for, and for&lt;br&gt;
an ambiguous RSA key the answer spans the entire severity range. Those come back&lt;br&gt;
unresolved, with the range they would have spanned.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/lvlrSajjad/cbomctl/tree/main/policy-packs" rel="noopener noreferrer"&gt;policy packs&lt;/a&gt;&lt;br&gt;
are a separately versioned artifact with their own schema and changelog. If you&lt;br&gt;
want to build something else on them, take them — that is what the citations&lt;br&gt;
are for.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Prior art, because you will find it anyway:&lt;br&gt;
&lt;a href="https://github.com/jimbo111/open-quantum-secure" rel="noopener noreferrer"&gt;open-quantum-secure&lt;/a&gt; is a&lt;br&gt;
scanner with seven compliance frameworks that documents cross-framework&lt;br&gt;
divergence in its own README — running multiple jurisdictions is not a gap in&lt;br&gt;
the market. What it emits is one report per framework; &lt;code&gt;cbomctl&lt;/code&gt; computes the&lt;br&gt;
collision, and reads a CBOM you did not generate.&lt;br&gt;
&lt;a href="https://github.com/sbom-tool/sbom-tools" rel="noopener noreferrer"&gt;sbom-tools&lt;/a&gt; does CBOM diffing and&lt;br&gt;
validation better than I will.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://lvlrsajjad.github.io/cbomctl/writing/everyone-agrees-on-the-risk/" rel="noopener noreferrer"&gt;https://lvlrsajjad.github.io/cbomctl/writing/everyone-agrees-on-the-risk/&lt;/a&gt;, which is the copy that gets corrected — this article describes a draft standard whose dates may move.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cryptography</category>
      <category>postquantum</category>
      <category>compliance</category>
    </item>
    <item>
      <title>RSA-2048 and RSA-3072 have different futures</title>
      <dc:creator>Sadjad</dc:creator>
      <pubDate>Sun, 06 Sep 2026 09:44:51 +0000</pubDate>
      <link>https://dev.to/lvlrsajjad/rsa-2048-and-rsa-3072-have-different-futures-2ipc</link>
      <guid>https://dev.to/lvlrsajjad/rsa-2048-and-rsa-3072-have-different-futures-2ipc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Published 2026-09-06&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This describes &lt;strong&gt;NIST IR 8547 ipd&lt;/strong&gt; — the initial public draft of November&lt;br&gt;
2024 — as it stood on the date above. Its dates are proposed. If a final&lt;br&gt;
IR 8547 has published since you are reading this, check it: the numbers&lt;br&gt;
below may have moved, and the article's central caveat may no longer apply.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have read anything about post-quantum migration in the last year, you&lt;br&gt;
have read that RSA is deprecated in 2030. It is one of those facts that has&lt;br&gt;
been repeated into the shape of a rule.&lt;/p&gt;

&lt;p&gt;It is half true, and the half that is false is the half people plan around.&lt;/p&gt;

&lt;p&gt;Here is the actual table, from NIST IR 8547, &lt;em&gt;Transition to Post-Quantum&lt;br&gt;
Cryptography Standards&lt;/em&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;algorithm&lt;/th&gt;
&lt;th&gt;parameters&lt;/th&gt;
&lt;th&gt;transition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RSA, ECDSA&lt;/td&gt;
&lt;td&gt;112 bits of security strength&lt;/td&gt;
&lt;td&gt;Deprecated after 2030&lt;br&gt;Disallowed after 2035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSA, ECDSA, EdDSA&lt;/td&gt;
&lt;td&gt;≥ 128 bits of security strength&lt;/td&gt;
&lt;td&gt;Disallowed after 2035&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the second row again. At 128 bits and above there is &lt;strong&gt;no 2030 row at&lt;br&gt;
all&lt;/strong&gt;. RSA-3072 is not deprecated in 2030. Neither is P-256. The 2030 date&lt;br&gt;
applies to 112-bit strength — RSA-2048, P-224, 2048-bit finite-field&lt;br&gt;
Diffie-Hellman — and to nothing else.&lt;/p&gt;

&lt;p&gt;The key-establishment table (Table 4, covering finite-field DH/MQV, elliptic&lt;br&gt;
curve DH/MQV and RSA) has exactly the same shape. Same split, same dates.&lt;/p&gt;

&lt;p&gt;So an inventory that reports "47 uses of RSA, all deprecated in 2030" is&lt;br&gt;
reporting something the document does not say. Some of those uses are on a&lt;br&gt;
2030 clock and some are on a 2035 clock, and which is which depends on a field&lt;br&gt;
most tooling does not look at.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deprecated is not disallowed
&lt;/h2&gt;

&lt;p&gt;The second thing worth getting right is what the two words mean, because they&lt;br&gt;
are not synonyms and NIST defines both:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;deprecated&lt;/strong&gt; — "The algorithm and key length may be used, but the user must&lt;br&gt;
accept some security risk."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;disallowed&lt;/strong&gt; — "The algorithm or key length is no longer allowed for&lt;br&gt;
applying cryptographic protection."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Deprecated&lt;/em&gt; is a risk acceptance. You may continue, with your eyes open and&lt;br&gt;
presumably a note in a register somewhere. &lt;em&gt;Disallowed&lt;/em&gt; is a stop.&lt;/p&gt;

&lt;p&gt;Collapsing them into "banned by 2030" produces two failures at once. It makes&lt;br&gt;
2030 look like a wall when for most algorithms it is a signpost, and it makes&lt;br&gt;
2035 — the date that actually stops things — disappear from the conversation.&lt;br&gt;
I have seen migration plans built entirely around 2030 that had no 2035&lt;br&gt;
milestone in them at all.&lt;/p&gt;

&lt;p&gt;If you are budgeting, the practical shape is: 2030 is when your 112-bit&lt;br&gt;
material becomes a documented risk acceptance, and 2035 is when everything&lt;br&gt;
quantum-vulnerable stops being usable for new protection, at any strength.&lt;/p&gt;
&lt;h2&gt;
  
  
  The part almost nobody mentions
&lt;/h2&gt;

&lt;p&gt;NIST IR 8547 is an &lt;strong&gt;initial public draft&lt;/strong&gt;. Not a final publication. The cover&lt;br&gt;
says so, the running header on every page says so, and the comment period closed&lt;br&gt;
in January 2025.&lt;/p&gt;

&lt;p&gt;Every date in it is proposed. The 2030s and 2035s that have propagated across&lt;br&gt;
vendor roadmaps, conference slides and procurement documents are draft dates&lt;br&gt;
from a draft document that, at the time of writing, has not been finalised.&lt;/p&gt;

&lt;p&gt;That is not a reason to ignore them — they are the best available signal about&lt;br&gt;
where NIST is going, and planning against them is entirely sensible. It is a&lt;br&gt;
reason to say "draft" out loud when you cite them, and to not build a&lt;br&gt;
contractual commitment on top of a number that can still move.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why tooling gets this wrong
&lt;/h2&gt;

&lt;p&gt;The distinction between the rows is &lt;em&gt;security strength&lt;/em&gt;, which is not a field&lt;br&gt;
in a CBOM. It has to be derived: RSA-2048 gives roughly 112 bits, RSA-3072&lt;br&gt;
roughly 128, P-224 112, P-256 128.&lt;/p&gt;

&lt;p&gt;Most compliance tooling models a regulation as a list of banned algorithm names&lt;br&gt;
with a date attached. That model cannot express this table — it has one slot for&lt;br&gt;
"RSA" and one date, so it picks one, usually the earlier, because erring strict&lt;br&gt;
feels safe.&lt;/p&gt;

&lt;p&gt;Erring strict is not safe. A team that believes RSA-3072 dies in 2030 builds a&lt;br&gt;
migration schedule five years tighter than it needs, competing for budget&lt;br&gt;
against work that actually is on a 2030 clock. Crying wolf has a cost, and it is&lt;br&gt;
paid by the findings that were real.&lt;/p&gt;

&lt;p&gt;The same flattening recurs across this whole space, always in the same&lt;br&gt;
direction — toward something simpler, stricter and wrong. "BSI mandates hybrid":&lt;br&gt;
BSI &lt;em&gt;recommends&lt;/em&gt; it, in a technical guideline. "The US mandates PQC by 2030":&lt;br&gt;
Executive Order 14412 covers federal High Value Assets and high impact systems,&lt;br&gt;
explicitly excluding National Security Systems, with key establishment at 2030&lt;br&gt;
and signatures at &lt;strong&gt;2031&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cbomctl&lt;/code&gt; is a CLI that reads a CycloneDX CBOM and evaluates it against&lt;br&gt;
national post-quantum policies. The IR 8547 pack models the two states&lt;br&gt;
separately, scoped by security strength, and prints "draft" wherever it cites&lt;br&gt;
them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;cbomctl
cbomctl verdict your-cbom.json &lt;span class="nt"&gt;--jurisdictions&lt;/span&gt; nist-ir8547
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assets that differ only in strength come out differently. This block is&lt;br&gt;
generated from a fixture in the repository by a script and diff-checked in CI,&lt;br&gt;
so it cannot drift from what the tool actually does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠ DRAFT SOURCE — these rules cite a document that is still a draft; their dates are proposed and may move:
    nist-ir8547/nist-112bit-key-establishment-deprecated-2030
    nist-ir8547/nist-112bit-signatures-deprecated-2030
    nist-ir8547/nist-key-establishment-disallowed-2035
    nist-ir8547/nist-signatures-disallowed-2035

ASSET       PURPOSE        nist-ir8547
────────────────────────────────────────
ECDSA-P224  signature      WARN
            └ nist-ir8547 · deprecated 2030-12-31 · disallowed 2035-12-31
RSA-2048    key-agreement  WARN
            └ nist-ir8547 · deprecated 2030-12-31 · disallowed 2035-12-31
ECDSA-P256  signature      WARN
            └ nist-ir8547 · disallowed 2035-12-31
RSA-3072    key-agreement  WARN
            └ nist-ir8547 · disallowed 2035-12-31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note &lt;code&gt;ECDSA-P224&lt;/code&gt; and &lt;code&gt;ECDSA-P256&lt;/code&gt;. Because IR 8547 scopes by &lt;em&gt;strength&lt;/em&gt; rather&lt;br&gt;
than by algorithm name, P-256 escapes the 2030 deprecation exactly as RSA-3072&lt;br&gt;
does. The rule is not "RSA is fine and ECDSA is not", or the reverse — it is&lt;br&gt;
112 bits versus 128, whatever the algorithm.&lt;/p&gt;

&lt;p&gt;If the strength cannot be derived — no key size, no curve, no&lt;br&gt;
&lt;code&gt;classicalSecurityLevel&lt;/code&gt; in the CBOM — the finding is reported as indeterminate&lt;br&gt;
rather than falling back to the stricter rule. Erring strict would put RSA-3072&lt;br&gt;
on a 2030 clock it is not on.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the demo caught the tool lying
&lt;/h2&gt;

&lt;p&gt;Worth admitting, since this article is about people repeating claims they have&lt;br&gt;
not checked.&lt;/p&gt;

&lt;p&gt;I wrote the paragraphs above first, then wrote the demo block by hand to&lt;br&gt;
illustrate them, then — almost as an afterthought — actually ran the command.&lt;br&gt;
Both RSA keys came out identical.&lt;/p&gt;

&lt;p&gt;The bug was that the rule selector for security strength was inert. It always&lt;br&gt;
reported "not declared", because nothing computed strength from a CBOM in the&lt;br&gt;
first place. Every strength-scoped rule silently never fired. The prose was&lt;br&gt;
describing behaviour the tool did not have, and I would have shipped it.&lt;/p&gt;

&lt;p&gt;The fix derives strength from modulus size, elliptic curve, or the CBOM's own&lt;br&gt;
&lt;code&gt;classicalSecurityLevel&lt;/code&gt; field — which is the one in bits;&lt;br&gt;
&lt;code&gt;nistQuantumSecurityLevel&lt;/code&gt; is a category from 1 to 5 and reading it by mistake&lt;br&gt;
would score ML-KEM-768 as three-bit security. There is now a test for that&lt;br&gt;
specific confusion, tests pinning that RSA-2048 and P-224 get the 2030&lt;br&gt;
deprecation while RSA-3072 and P-256 do not, and a fixture holding all four.&lt;/p&gt;

&lt;p&gt;Two smaller things fell out. The report was displaying both RSA sizes as &lt;code&gt;RSA&lt;/code&gt;&lt;br&gt;
and both ECDSA curves as &lt;code&gt;ECDSA-SHA256&lt;/code&gt;, because canonicalising an algorithm for&lt;br&gt;
policy matching throws the parameter away — so the distinction existed in the&lt;br&gt;
verdict and was invisible in the output. And every code block in this article is&lt;br&gt;
now generated by a script and diff-checked in CI, the same way the tool's policy&lt;br&gt;
documentation is, because a block typed by hand is a claim nobody verified.&lt;/p&gt;

&lt;p&gt;That failure — confident prose about behaviour that does not exist — is&lt;br&gt;
precisely the one this tool is built to catch in compliance reporting. It is&lt;br&gt;
worth saying out loud that it happened here first.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;You can read the rule and its citation without installing anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cbomctl policies show nist-ir8547
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every rule carries the section it was read from, the edition, a verification&lt;br&gt;
date, and whether the source is a draft. The packs are a&lt;br&gt;
&lt;a href="https://github.com/lvlrSajjad/cbomctl/tree/main/policy-packs" rel="noopener noreferrer"&gt;separate versioned artifact&lt;/a&gt;&lt;br&gt;
with their own schema, so you can consume them without the tool if you would&lt;br&gt;
rather build your own.&lt;/p&gt;

&lt;p&gt;All seven packs are read from primary sources — every rule names the section or&lt;br&gt;
page it came from. Where a source is a draft, as IR 8547 is, the tool says&lt;br&gt;
draft. Where a source is ambiguous, the ambiguity is recorded rather than&lt;br&gt;
resolved quietly. The banner and &lt;code&gt;--require-verified-policy&lt;/code&gt; remain in place for&lt;br&gt;
the next rule that has not been checked yet, because rules assembled from blog&lt;br&gt;
posts are roughly how "RSA is deprecated in 2030" got started.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;NIST IR 8547 ipd is a US federal work in the public domain.&lt;br&gt;
&lt;a href="https://nvlpubs.nist.gov/nistpubs/ir/2024/NIST.IR.8547.ipd.pdf" rel="noopener noreferrer"&gt;Read it directly&lt;/a&gt; —&lt;br&gt;
Tables 2 and 4 are on pages 13 and 14, and the glossary definitions are in&lt;br&gt;
Appendix A. Check whether a final version has published since; if it has, this&lt;br&gt;
article's caveat is out of date and the dates may have moved.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://lvlrsajjad.github.io/cbomctl/writing/rsa-2048-and-rsa-3072/" rel="noopener noreferrer"&gt;https://lvlrsajjad.github.io/cbomctl/writing/rsa-2048-and-rsa-3072/&lt;/a&gt;, which is the copy that gets corrected — this article describes a draft standard whose dates may move.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cryptography</category>
      <category>postquantum</category>
      <category>compliance</category>
    </item>
  </channel>
</rss>
