Crypto-View

wultra/powerauth-crypto

Readiness score
34 of 100
How this is calculated · previous scan 34
Cryptographic posture
Quantum-vulnerable 84 Already broken 1 Reduced margin 3 Could not be determined 160 Quantum-safe 19
To address48
Key establishment10
Inventory only1
Total findings268
What was analysed
Branch develop
Commit a7feb60d85dc3c304d928070b7c9ff367f1062f7 Bump org.projectlombok:lombok from 1.18.46 to 1.18.48 (#977)
Committed 2026-09-07 06:54 UTC
Scanned 2026-09-10 00:01 UTC 1 day ago
Coverage 287 files, 191 java

Earlier scans of this repository

13 scans · score 31 → 7 · compare any two
13 scans · 31 → 7 (down 24). The filled point is the scan you are reading.
Scanned Commit Score To address
3 hours ago 469da6a2fb80 develop 7 77 Compare
4 hours ago 469da6a2fb80 develop 15 73 Compare
18 hours ago ef7f0b8e76b4 15 51 Compare
20 hours ago a7feb60d85dc develop 12 73 Compare
23 hours ago a7feb60d85dc develop 12 73 Compare
1 day ago a7feb60d85dc develop 12 73 Compare
1 day ago a7feb60d85dc develop 12 73 Compare
1 day ago this scan a7feb60d85dc develop 34 48
3 days ago a7feb60d85dc develop 34 48 Compare
3 days ago a7feb60d85dc develop 34 48 Compare
4 days ago ba51aefe1e13 develop 34 48 Compare
10 days ago dfb4ed9e96b0 develop 34 48 Compare
11 days ago ef7f0b8e76b4 31 41 Compare

Every repository in this history is re-scanned weekly.

List of cryptographic assets

SHA-1 Already broken 1 place See details

Classical public-key cipher through the JCA

`Cipher.getInstance()` with a transformation whose algorithm component is a public-key or legacy symmetric cipher. The transformation string is parsed into algorithm, mode and padding, so `RSA/ECB/PKCS1Padding` is separated from `RSA/ECB/OAEPWithSHA-256AndMGF1Padding`.

This is already unsafe today, with no quantum computer involved. SHAttered and subsequent work produced practical collisions; NIST withdrew SHA-1 in 2030 guidance and it is already unacceptable for signatures.

What to do. For RSA encryption, move to ML-KEM-768 and keep RSA-OAEP only as the classical half of a hybrid during transition.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/generator/KeyGenerator.java:295 SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.cipher · CWE-327
ECDSA Quantum-vulnerable 16 places See details

Elliptic-curve cryptography through BouncyCastle

A BouncyCastle elliptic-curve class. `ECDHBasicAgreement` in particular is key establishment and carries harvest-now-decrypt-later exposure.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. ML-DSA-65 for signatures, ML-KEM-768 for key establishment.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:23 import org.bouncycastle.jce.ECNamedCurveTable;
  2. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:81 final ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curve.getName());
  3. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:126 final ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curve.getName());
  4. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:177 final ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curve.getName());
  5. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:236 final ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curve.getName());
  6. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/dh/DhKem.java:32 import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
  7. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/dh/DhKem.java:33 import org.bouncycastle.crypto.params.ECPublicKeyParameters;
  8. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/dh/DhKem.java:91 final ECPrivateKeyParameters privParam = (ECPrivateKeyParameters) PrivateKeyFactory.createKey(decapsulationKey.getEncoded());
  9. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/dh/DhKem.java:92 final ECPublicKeyParameters pubParam = toPublicKey(privParam);
  10. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/dh/DhKem.java:121 private ECPublicKeyParameters toPublicKey(ECPrivateKeyParameters privParam) {
  11. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/dh/DhKem.java:124 return new ECPublicKeyParameters(q, domainParam);
  12. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/ec/InvalidPointTest.java:22 test path import org.bouncycastle.jce.ECNamedCurveTable;
  13. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/ec/InvalidPointTest.java:55 test path ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
  14. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/ec/InvalidPointTest.java:64 test path ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp384r1");
  15. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/KeyConversionUtilsTest.java:23 test path import org.bouncycastle.jce.ECNamedCurveTable;
  16. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/KeyConversionUtilsTest.java:96 test path ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
java.bouncycastle.ec · CWE-327
ECDH Quantum-vulnerable Recorded traffic 4 places See details

Classical key material handled through the JCA

`KeyFactory.getInstance()` for a classical algorithm. This indicates the code parses or produces keys of that family, which is a migration surface even where it does no cryptography itself.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. Include this code path in the inventory: it has to accept post-quantum key encodings before the keys themselves can change.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:133 return KeyFactory.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME).generatePublic(pubSpec);
  2. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:184 return KeyFactory.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME).generatePublic(pubSpec);
  3. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/KeyConvertor.java:241 return KeyFactory.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME).generatePrivate(ecPrivateKeySpec);
  4. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/KeyConversionUtilsTest.java:94 test path KeyFactory kf = KeyFactory.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.keyfactory · CWE-327
ECDH Quantum-vulnerable Recorded traffic 3 places See details

Classical key pair generated through the JCA

`KeyPairGenerator.getInstance()` with a classical algorithm. The concrete family and, where an `initialize()` call is close enough to read, the key size are resolved from the source and reported on the finding.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. Generate the classical key alongside an ML-KEM or ML-DSA key and carry both until relying parties accept the post-quantum one.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/generator/KeyGenerator.java:81 final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  2. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/SignatureUtilsTest.java:52 test path KeyPairGenerator keyPairGeneratorP256 = KeyPairGenerator.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  3. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/SignatureUtilsTest.java:56 test path KeyPairGenerator keyPairGeneratorP384 = KeyPairGenerator.getInstance("EC", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.keypairgenerator · CWE-327
ECDH Quantum-vulnerable Recorded traffic 1 place See details

Classical key agreement through the JCA

`KeyAgreement.getInstance()` with ECDH, DH or XDH. Key agreement is the highest-priority class of finding: traffic recorded today is decrypted once the key exchange is broken.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. ML-KEM-768 (FIPS 203), or a hybrid X25519+ML-KEM-768 construction that keeps the classical guarantee while adding the quantum one.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/generator/KeyGenerator.java:103 KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.keyagreement · CWE-327
ECDH256-bitsecg/secp256r1 Quantum-vulnerable Recorded traffic 1 place See details

Named elliptic curve requested

`ECGenParameterSpec` names a curve explicitly. Every standardised prime curve is broken by Shor regardless of its size, so a larger curve is not a mitigation.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. ML-DSA-65 for signatures, ML-KEM-768 for key establishment.

  1. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/SignatureUtilsTest.java:53 test path keyPairGeneratorP256.initialize(new ECGenParameterSpec("secp256r1"));
java.eccurve · CWE-327
ECDH384-bitsecg/secp384r1 Quantum-vulnerable Recorded traffic 1 place See details

Named elliptic curve requested

`ECGenParameterSpec` names a curve explicitly. Every standardised prime curve is broken by Shor regardless of its size, so a larger curve is not a mitigation.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. ML-DSA-65 for signatures, ML-KEM-768 for key establishment.

  1. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/SignatureUtilsTest.java:57 test path keyPairGeneratorP384.initialize(new ECGenParameterSpec("secp384r1"));
java.eccurve · CWE-327
SHA-256 Reduced margin 2 places See details

Hash algorithm through the JCA

`MessageDigest.getInstance()`. MD5 and SHA-1 are reported as already broken; SHA-256 is reported as a reduced margin rather than a defect.

A quantum computer weakens this but does not break it. Increasing the key or digest size restores the margin. Pre-image resistance falls to about 128 bits of quantum work. Adequate for most uses; SHA-384 restores the full margin where a signature must last decades.

What to do. SHA-256 as the floor, SHA-384 where the digest protects something that must remain verifiable for decades.

java.messagedigest · CWE-328
PBKDF2 Reduced margin 1 place See details

Password hashing or key derivation

A `SecretKeyFactory` for PBKDF2, or a BouncyCastle password KDF. Not a quantum exposure, and part of a complete inventory.

This is how passwords are stored. Quantum computers do not meaningfully weaken it.

What to do. PBKDF2 needs a high iteration count. Argon2 through BouncyCastle is stronger.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/generator/KeyGenerator.java:295 SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.kdf
unknown Could not be determined 13 places See details

Non-cryptographic randomness near key material

`new Random()` or `Math.random()` in a file that also imports `java.security`, `javax.crypto` or BouncyCastle. `java.util.Random` is a linear congruential generator and its output is predictable from a handful of samples. The import check is what keeps this from firing on every retry jitter and test fixture in the tree.

Part of this code uses a predictable source of random numbers. If any key comes from it, that key can be guessed today, with no quantum computer needed.

What to do. `java.security.SecureRandom`. This is a classical defect, not a quantum one, and it is worth fixing first.

  1. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:121 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  2. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:160 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  3. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:257 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  4. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:296 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  5. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:392 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  6. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:431 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  7. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/authentication/PowerAuthAuthenticationCodeTest.java:475 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * 1000));
  8. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:303 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * dataMax));
  9. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:325 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * dataMax));
  10. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:400 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * dataMax));
  11. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:422 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * dataMax));
  12. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:486 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * dataMax));
  13. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:509 test path byte[] data = keyGenerator.generateRandomBytes((int) (Math.random() * dataMax));
java.random.insecure · CWE-338
unknown Could not be determined 6 places See details

Key pair algorithm chosen at runtime

`KeyPairGenerator.getInstance(x)` where the argument is an identifier. The algorithm cannot be resolved without running the program, so this is reported as an unknown rather than assumed to be classical.

This code picks its encryption method while it runs, so a scan cannot tell which one it ends up using. Somebody has to check the configuration.

What to do. Trace the value to its configuration source and record the concrete algorithm in the cryptographic inventory by hand.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/AESEncryptionUtils.java:57 Cipher cipherForCryptoResponse = Cipher.getInstance(transformation, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  2. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/util/AESEncryptionUtils.java:100 Cipher cipherForCryptoResponse = Cipher.getInstance(transformation, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  3. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlDsaKeyConvertor.java:75 final KeyFactory keyFactory = KeyFactory.getInstance(algorithmName, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  4. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlDsaKeyConvertor.java:101 final KeyFactory keyFactoryMlDsa = KeyFactory.getInstance(algorithmName, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  5. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlKemKeyConvertor.java:88 final KeyFactory keyFactory = KeyFactory.getInstance(algorithmName, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  6. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlKemKeyConvertor.java:102 final KeyFactory keyFactory = KeyFactory.getInstance(algorithmName, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.keypairgenerator.variable · CWE-327
unknown Could not be determined 1 place See details

Cryptographic library in the dependency manifest

A dependency known to implement classical asymmetric cryptography. Its presence is inventory, not a finding about this codebase: the library may never be called with a quantum-vulnerable algorithm.

The project depends on a cryptography library. Listed so the inventory is complete; it is not by itself a problem.

What to do. Check the version. Several of these libraries have shipped ML-KEM and ML-DSA support since 2024, so the migration may need an upgrade rather than a replacement.

  1. powerauth-java-crypto/pom.xml:60 <artifactId>nimbus-jose-jwt</artifactId>
dep.crypto-library
ML-DSA-65 Quantum-safe 6 places See details

Post-quantum algorithm through BouncyCastle

A `org.bouncycastle.pqc` class. This is migration work already in progress and is recorded so the inventory shows what has been done, not only what is outstanding.

This is already a quantum-safe algorithm. It is listed so the report shows the work that has been completed.

What to do. None. Confirm the parameter set matches the required NIST category.

java.bouncycastle.pqc
CSPRNG Quantum-safe 4 places See details

Random number generation

`SecureRandom`. A platform CSPRNG is not a quantum exposure; it is recorded because an inventory that omits the randomness source is incomplete. `SHA1PRNG` is named explicitly where it appears, since it is a legacy algorithm even though its output is adequate.

This is where the software gets its random numbers. Quantum computers do not weaken it.

What to do. No action. Prefer the platform default over naming an algorithm.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/generator/KeyGenerator.java:166 random = SecureRandom.getInstance(SECURE_RANDOM_ALGORITHM_NAME, PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  2. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/util/GenerateVectorDataTest.java:62 test path private static final Random RANDOM = new SecureRandom();
  3. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/v4/sharedsecret/MlKemPrivateKeyTest.java:63 test path SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
  4. powerauth-java-crypto/src/test/java/com/wultra/security/powerauth/crypto/lib/v4/util/GenerateVectorDataTest.java:64 test path private static final Random RANDOM = new SecureRandom();
java.rng
ML-KEM-768 Quantum-safe 4 places See details

Post-quantum algorithm through BouncyCastle

A `org.bouncycastle.pqc` class. This is migration work already in progress and is recorded so the inventory shows what has been done, not only what is outstanding.

This is already a quantum-safe algorithm. It is listed so the report shows the work that has been completed.

What to do. None. Confirm the parameter set matches the required NIST category.

java.bouncycastle.pqc
Argon2 Quantum-safe 2 places See details

Password hashing or key derivation

A `SecretKeyFactory` for PBKDF2, or a BouncyCastle password KDF. Not a quantum exposure, and part of a complete inventory.

This is how passwords are stored. Quantum computers do not meaningfully weaken it.

What to do. PBKDF2 needs a high iteration count. Argon2 through BouncyCastle is stronger.

java.kdf
ML-KEM-768 Quantum-safe 2 places See details

Classical public-key cipher through the JCA

`Cipher.getInstance()` with a transformation whose algorithm component is a public-key or legacy symmetric cipher. The transformation string is parsed into algorithm, mode and padding, so `RSA/ECB/PKCS1Padding` is separated from `RSA/ECB/OAEPWithSHA-256AndMGF1Padding`.

No known quantum attack changes how strong this is. No known quantum algorithm changes the security margin.

What to do. For RSA encryption, move to ML-KEM-768 and keep RSA-OAEP only as the classical half of a hybrid during transition.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlKem.java:82 final KeyGenerator keyGenerator = KeyGenerator.getInstance("ML-KEM", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
  2. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlKem.java:100 final KeyGenerator keyGenerator = KeyGenerator.getInstance("ML-KEM", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.cipher · CWE-327
ML-KEM-768 Quantum-safe 1 place See details

Classical key pair generated through the JCA

`KeyPairGenerator.getInstance()` with a classical algorithm. The concrete family and, where an `initialize()` call is close enough to read, the key size are resolved from the source and reported on the finding.

No known quantum attack changes how strong this is. No known quantum algorithm changes the security margin.

What to do. Generate the classical key alongside an ML-KEM or ML-DSA key and carry both until relying parties accept the post-quantum one.

  1. powerauth-java-crypto/src/main/java/com/wultra/security/powerauth/crypto/lib/v4/ml/MlKem.java:67 final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ML-KEM", PowerAuthConfiguration.CRYPTO_PROVIDER_NAME);
java.keypairgenerator · CWE-327

Cryptographic assets

Algorithm Assessment What it means Occurrences
unknown Could not be determined The algorithm could not be established from the source - chosen at runtime, or decided somewhere this scan does not reach. 160
RSA Quantum-vulnerable Broken by Shor's algorithm on a cryptographically relevant quantum computer. 58
ECDSA Quantum-vulnerable Broken by Shor's algorithm on a cryptographically relevant quantum computer. 16
ECDH Quantum-vulnerable Broken by Shor's algorithm on a cryptographically relevant quantum computer. 10
ML-KEM-768 Quantum-safe No known quantum algorithm changes the security margin. 7
ML-DSA-65 Quantum-safe No known quantum algorithm changes the security margin. 6
CSPRNG Quantum-safe A cryptographically secure random number generator provided by the platform. Not weakened by a quantum computer. 4
Argon2 Quantum-safe The current recommended password hashing function. Not affected by Shor, and memory-hard against Grover. 2
SHA-256 Reduced margin Pre-image resistance falls to about 128 bits of quantum work. Adequate for most uses; SHA-384 restores the full margin where a signature must last decades. 2
SHA-1 Already broken SHAttered and subsequent work produced practical collisions; NIST withdrew SHA-1 in 2030 guidance and it is already unacceptable for signatures. 1
PBKDF2 Reduced margin Not broken by a quantum computer, but weak against modern GPU cracking at low iteration counts, which is a present-day concern. 1

Imported cryptographic libraries

Library Files
org.bouncycastle — BouncyCastle, whose low-level API bypasses the JCA algorithm strings. It has shipped ML-KEM and ML-DSA since 1.79 58
javax.crypto — the JCE — ciphers, key agreement and MACs 90