Quantum threat assessment
What breaks, and what to fix first.
We find the cryptography that quantum computers will break, rank it by how long your data must stay secret, and give you a migration plan, with a signed record of how the inventory and the plan were produced.
Every assessment runs only against systems you authorize in writing. We scope to systems, never to individuals, and nothing is scanned before the engagement is signed.
A financial entity in the EU? How each part maps to DORA’s technical standard · Also: healthcare in Latin America, software sold to banks in Brazil
What you receive
Four parts, each one sealed.
An inventory of your cryptography
An automated scan of the code and dependency manifests you give us access to. Every finding records the file and line where it was seen. Systems we cannot scan are listed from what you tell us, and marked as such.
An exposure ranking
Every asset tested with one inequality, X plus Y against Z: how long its data must stay secret, plus how long its migration takes, against the horizon you plan for. You supply X and Y where you know them; where we assumed, the assumption is sealed with the ranking.
A migration plan
The replacement for each asset: a NIST post-quantum standard for public-key cryptography, a stronger classical algorithm where that is the fix, and a question back to you where the scan cannot tell how a key is used. Ordered phases, with a way back at each one. Nothing is marked done until it is.
The evidence file
The inventory, the ranking and the plan as linked, signed receipts in one file, together with each of them and the inputs they were built from. Your auditor checks it with our free checker, offline, without asking us.
Sealed means the step is written into a signed receipt linked to the one before it, so any later edit to that step shows, and each step must have been built from the same inventory. How the receipts work · The free checker
The parts, on a real project
Our assessment of paramiko 5.0.0, an open-source SSH library, not a client. Click through the inventory and the plan, check the evidence file in your browser, then hide a finding and watch the check fail.
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.
| Algorithm | Where | Ranking | Why |
|---|---|---|---|
| 3DES | transport.py:263 | Weak classically | Weak 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. |
| 3DES | transport.py:182 | Weak classically | Weak 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. |
| MD5 | pkey.py:390 | Weak classically | Weak 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. |
| SHA1 | config.py:449 | Weak classically | Weak 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. |
| DH | transport.py:324 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | kex_group16.py:35 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | kex_group16.py:30 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | kex_group14.py:45 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | transport.py:325 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | transport.py:219 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | transport.py:218 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | transport.py:220 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | kex_gex.py:51 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| DH | transport.py:326 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| EC | ecdsakey.py:167 | Act now | X 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. |
| EC | kex_ecdh_nist.py:113 | Act now | X 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. |
| EC | ecdsakey.py:254 | Act now | X 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. |
| EC | ecdsakey.py:224 | Act now | X 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. |
| EC | ecdsakey.py:268 | Act now | X 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. |
| EC | ecdsakey.py:305 | Act now | X 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. |
| EC | kex_ecdh_nist.py:151 | Act now | X 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. |
| EC | kex_ecdh_nist.py:67 | Act now | X 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. |
| EC | ecdsakey.py:242 | Act now | X 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. |
| EC | kex_ecdh_nist.py:71 | Act now | X 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. |
| EC | kex_ecdh_nist.py:145 | Act now | X 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. |
| EC | kex_ecdh_nist.py:117 | Act now | X 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. |
| EC | kex_ecdh_nist.py:23 | Act now | X 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. |
| EC | kex_ecdh_nist.py:59 | Act now | X 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. |
| ECDH | kex_ecdh_nist.py:143 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | transport.py:327 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | kex_ecdh_nist.py:21 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | transport.py:329 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | transport.py:216 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | transport.py:215 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | transport.py:328 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | kex_ecdh_nist.py:149 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDH | transport.py:217 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| ECDSA | transport.py:201 | Act now | X 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. |
| ECDSA | transport.py:208 | Act now | X 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. |
| ECDSA | transport.py:313 | Act now | X 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. |
| ECDSA | transport.py:199 | Act now | X 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. |
| ECDSA | transport.py:210 | Act now | X 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. |
| ECDSA | transport.py:315 | Act now | X 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. |
| ECDSA | transport.py:317 | Act now | X 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. |
| ECDSA | transport.py:200 | Act now | X 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. |
| ECDSA | transport.py:209 | Act now | X 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. |
| ED25519 | transport.py:198 | Act now | X 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. |
| ED25519 | transport.py:207 | Act now | X 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. |
| ED25519 | ed25519key.py:42 | Act now | X 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. |
| ED25519 | transport.py:319 | Act now | X 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. |
| RSA | rsakey.py:43 | Act now | X 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. |
| RSA | rsakey.py:211 | Act now | X 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. |
| RSA | agent.py:53 | Act now | X 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. |
| RSA | rsakey.py:210 | Act now | X 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. |
| RSA | transport.py:791 | Act now | X 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. |
| RSA | transport.py:203 | Act now | X 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. |
| RSA | client.py:431 | Act now | X 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. |
| RSA | rsakey.py:41 | Act now | X 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. |
| RSA | transport.py:1317 | Act now | X 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. |
| RSA | agent.py:54 | Act now | X 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. |
| RSA | transport.py:1318 | Act now | X 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. |
| RSA | rsakey.py:78 | Act now | X 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. |
| RSA | transport.py:211 | Act now | X 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. |
| RSA | transport.py:790 | Act now | X 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. |
| RSA | client.py:432 | Act now | X 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. |
| RSA | client.py:433 | Act now | X 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. |
| RSA | transport.py:311 | Act now | X 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. |
| RSA | transport.py:212 | Act now | X 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. |
| RSA | rsakey.py:45 | Act now | X 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. |
| RSA | transport.py:309 | Act now | X 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. |
| RSA | client.py:434 | Act now | X 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. |
| RSA | transport.py:202 | Act now | X 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. |
| RSA | client.py:430 | Act now | X 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. |
| RSA | rsakey.py:184 | Act now | X 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. |
| RSA | rsakey.py:89 | Act now | X 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. |
| X25519 | transport.py:223 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| X25519 | kex_curve25519.py:109 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| X25519 | kex_curve25519.py:45 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| X25519 | kex_curve25519.py:30 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| X25519 | transport.py:332 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| X25519 | kex_curve25519.py:71 | Act now | X plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. |
| AES | transport.py:177 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:251 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:178 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:179 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:227 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:257 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | pkey.py:727 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | pkey.py:691 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:233 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:176 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:239 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | pkey.py:693 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:181 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:245 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| AES | transport.py:180 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:188 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:192 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:287 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | packet.py:47 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:292 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:194 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:191 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:288 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:290 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:293 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:286 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:193 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | hostkeys.py:300 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| HMAC | transport.py:187 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
| SHA256 | pkey.py:401 | Safe for this horizon | Symmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target. |
The one test
X plus Y against Z.
Michele Mosca’s inequality, as NIST IR 8547 presents it: if the years your data must stay secret (X) plus the years your migration takes (Y) add up to more than the years until a quantum computer can break the cryptography (Z), that data is already exposed.
X · SHELF LIFE
How long the data must stay secret. Your retention policy decides it.
Y · MIGRATION TIME
How long replacing the cryptography on that system takes. Your engineers estimate it; we check it against the inventory.
Z · HORIZON
Nobody knows it. An expert survey puts the chance at 28 to 49% within ten years, so we plan against ten by default and you can choose another.
Probability bands from the Global Risk Institute Quantum Threat Timeline Report 2025 (Mosca and Piani, published March 2026, 26 experts surveyed). Deadlines from US Executive Order 14412, the EU Coordinated Implementation Roadmap, and NIST IR 8547, which is still a draft. Each binds different organizations.
X plus Y exceeds Z by 3 years, with little slack. Anything copied today can be read once the capability exists.
Bar: solid is X, faint is Y, the gold line is Z. Nothing you enter leaves this page.
Exposure tiers
Every exposed asset gets one of four answers.
The same rules as the free exposure tool, so you can recompute any tier we give you. An asset already on a NIST post-quantum standard is marked MIGRATED instead.
X plus Y exceeds Z by five years or more
Data copied today is still valuable when the capability is expected to exist. Migrate first.
X plus Y exceeds Z by less than five years
Exposed, with little slack.
X plus Y within three years of Z, or a 128-bit symmetric key
Not exposed on these values, but a longer retention or a slower migration would flip it.
Comfortably inside Z, or strong symmetric cryptography
Not a migration target on the values given.
Our starting assumptions
If you have no retention policy, we start here.
These shelf lives are our planning assumptions, not legal requirements. Your own retention policy replaces them, and the report says which values were yours and which were ours.
Defense
35 yrsClassified programs, communications security
Insurance
30 yrsLong-tail claims and reserves
Healthcare
30 yrsMedical records over a patient lifetime
Banking
25 yrsCustomer and transaction records
Pharma
25 yrsCompound IP and clinical data
Government
25 yrsRecords under classification holds
Energy
20 yrsGrid topology and safety systems
Legal
20 yrsPrivileged communications and litigation
Telecom
15 yrsSubscriber data and signaling
Manufacturing
15 yrsTrade secrets and designs
Technology
10 yrsProduct roadmaps and source code
Frameworks we map to
The documents your auditor will cite.
The plan references the framework each recommendation answers to. Each link goes to the issuing authority’s own page.
Timing
Our target is 72 hours from access.
From receiving access to the code in scope to delivering the four parts above. The first engagements will show whether that target holds, and we will say so either way. Scope and terms are agreed in conversation before anything starts.