Matrix CR Studio

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

Sample deliverable · quantum threat assessment

Migration evidence file.

What a completed assessment looks like, prepared for an invented mid-size Spanish bank so the format can be shown without a client’s data in it.

The bank, the 12 assets and every number are invented. The scoring rule, the regulatory references and the checker at the end are real.

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

Executive brief

What the board is told.

5 of 12 inventoried assets are critical on a 10-year horizon. The cause is how long things must be trusted, not a fault in today’s setup: customer records must stay confidential, and mortgage and settlement records must stay verifiable, for longer than the cryptography protecting them is expected to hold.

The internal certificate authority sets the pace: everything chains to it, so its migration starts first. Nothing here calls for an emergency. It calls for a dated programme, begun this quarter.

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

Inventory, ranked by exposure

X is how long the asset must stay protected, Y how long migrating it takes, Z = 10 years. The rule’s tier is computed by the same code as the exposure scorer. The analyst’s tier adds what the rule cannot see; at Z = 10 they differ on 7 rows, and the note says why.

The rule’s tier moves with Z. The analyst’s tier was set at Z = 10 and does not; at this horizon they differ on 7 of 12 rows. Open a row to see why.

Bar: solid is X, faint is Y, the gold line is Z. Past the line, X + Y exceeds the horizon.

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

Regulatory cross-reference

Which rule reaches which asset.

DORA technical standard, Regulation (EU) 2024/1774, Article 6(4)

The encryption policy must provide for updating or changing the cryptographic technology on the basis of developments in cryptanalysis.

Reaches: A-01, A-02, A-03, A-04, A-05, A-06, A-07, A-08, A-09, A-10, A-11
DORA technical standard, Regulation (EU) 2024/1774, Article 7(4)

A register of all certificates and certificate-storing devices, kept up to date, at least for ICT assets supporting critical or important functions.

Reaches: A-02, A-08, A-10
EU Coordinated Implementation Roadmap

High-risk use cases transitioned by 31 December 2030. A recommendation to EU Member States, not a law that binds a firm directly. It cites DORA and NIS2 as rules that already require state-of-the-art cryptography.

Reaches: A-01, A-02, A-03, A-04, A-05
NIST IR 8547, draft

Classical key establishment deprecated after 2030; classical public-key algorithms disallowed after 2035. US guidance, cited for its dated schedule.

Reaches: A-01, A-02, A-03, A-04, A-05, A-06, A-07, A-08, A-09, A-10, A-11

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

Roadmap

Sequenced by dependency, not by severity.

Phase 1 · Year 1, quarter 1

Root and signing first

Migrate the internal PKI root (A-02) to ML-DSA and run dual signing on the code signing chain (A-08). These have the longest reach and the fewest outside dependencies, so they set the pace for everything else.

Phase 2 · Year 1, quarters 2 to 3

Long-lived data and signatures

Re-encrypt the personal data archive (A-01) and due diligence files (A-05) under hybrid ML-KEM envelopes, oldest records first, and protect the signed mortgage (A-03) and settlement (A-04) records with archival timestamps renewed under ML-DSA (evidence records, RFC 4998), so the originals stay verifiable without being signed again.

Phase 3 · Year 1, quarters 3 to 4

Counterparty surfaces

Open hybrid key exchange talks with the payment gateway counterparties (A-06) and book the card HSM refresh (A-07) into the hardware cycle. Both depend on someone else agreeing a date, so they start early.

Phase 4 · Continuous

Short-lived surfaces

Move the online banking front end (A-09), mobile pins (A-10) and service mesh (A-11) as their normal release cycles come round.

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

The evidence file

The part you can check without us.

In a real engagement, the inventory, the exposure ranking and the migration plan are delivered as sealed, linked receipts in one evidence file, with the ranking’s X, Y and Z assumptions sealed as its input. Any later edit fails verification and names the check that broke. Checking needs no account with us and no network call; the checker is one published file.

A real evidence file, from a different project

The findings above are invented, so no receipt is issued for them. Below is a real one: the evidence file of our assessment of paramiko 5.0.0, an open-source SSH library, not a client. Open each part, check the file in your browser, then hide one finding and watch the check fail.

Findings111in 41 files
Must move77by the published rule
Weak classically43DES and MD5 and SHA1; depends on the use
Plan steps13in a safe order

Every use of cryptography our scanner found in the source (41files read), including algorithms the code offers by name, each with its file and line. A scan of source has gaps: it can miss dependencies, compiled code and choices made at runtime. Each finding is ranked by one published rule (Mosca's): if what it protects must stay secret for X = 12 years, and moving off it takes Y = 3 years, then X + Y = 15 years is longer than the Z = 10-year horizon we plan against, so it has to move now. Change those numbers and the ranking changes; they are sealed in the record.

AlgorithmWhereRankingWhy
3DEStransport.py:263Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
3DEStransport.py:182Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
MD5pkey.py:390Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
SHA1config.py:449Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
DHtransport.py:324Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group16.py:35Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group16.py:30Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group14.py:45Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:325Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:219Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:218Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:220Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_gex.py:51Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:326Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECecdsakey.py:167Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:113Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:254Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:224Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:268Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:305Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:151Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:67Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:242Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:71Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:145Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:117Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:23Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:59Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECDHkex_ecdh_nist.py:143Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:327Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHkex_ecdh_nist.py:21Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:329Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:216Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:215Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:328Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHkex_ecdh_nist.py:149Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:217Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDSAtransport.py:201Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:208Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:313Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:199Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:210Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:315Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:317Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:200Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:209Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:198Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:207Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519ed25519key.py:42Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:319Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:43Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:211Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAagent.py:53Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:210Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:791Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:203Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:431Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:41Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:1317Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAagent.py:54Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:1318Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:78Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:211Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:790Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:432Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:433Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:311Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:212Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:45Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:309Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:434Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:202Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:430Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:184Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:89Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
X25519transport.py:223Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:109Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:45Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:30Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519transport.py:332Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:71Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
AEStransport.py:177Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:251Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:178Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:179Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:227Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:257Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:727Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:691Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:233Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:176Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:239Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:693Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:181Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:245Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:180Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:188Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:192Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:287Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACpacket.py:47Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:292Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:194Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:191Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:288Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:290Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:293Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:286Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:193Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMAChostkeys.py:300Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:187Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
SHA256pkey.py:401Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
The checkerThe evidence fileVerify it yourself

SYNTHETIC SAMPLE. Banco Ejemplo is not a real institution and was never a client.

Yours

That was the invented bank.

The same method with your inventory in place of this one. Our target is 72 hours from access; scope and terms are agreed before anything is shared.

About the assessmentContact us