Crypto-View

documenso/documenso

Readiness score
92 of 100
How this is calculated · previous scan 92
Cryptographic posture
Quantum-vulnerable 1 Reduced margin 12 Could not be determined 11 Quantum-safe 22
To address1
Key establishment1
Inventory only1
Total findings47
What was analysed
Branch main
Commit 2cac63a000e22422bdea449f68b8025e709aa73a fix: block SSRF via IPv4-mapped IPv6 webhook URLs (#2901) (#3166)
Committed 2026-09-04 05:42 UTC
Scanned 2026-09-07 18:36 UTC 3 days ago
Coverage 2231 files, 2097 javascript

Earlier scans of this repository

15 scans · score 92 → 92 · compare any two
15 scans · 92 → 92 (unchanged). The filled point is the scan you are reading.
Scanned Commit Score To address
4 hours ago e1ad4a2c55b4 main 92 1 Compare
5 hours ago e1ad4a2c55b4 main 92 1 Compare
18 hours ago b97c22a6074d main 92 1 Compare
19 hours ago f0ab7c112e3c 92 1 Compare
19 hours ago f0ab7c112e3c 92 1 Compare
21 hours ago b97c22a6074d main 92 1 Compare
1 day ago 389390c88494 main 92 1 Compare
1 day ago 389390c88494 main 92 1 Compare
1 day ago 389390c88494 main 92 1 Compare
1 day ago 389390c88494 main 92 1 Compare
3 days ago 2cac63a000e2 main 92 1 Compare
3 days ago this scan 2cac63a000e2 main 92 1
4 days ago 2cac63a000e2 main 92 1 Compare
10 days ago 5082b475a0b7 main 92 1 Compare
11 days ago f0ab7c112e3c 92 1 Compare

Every repository in this history is re-scanned weekly.

List of cryptographic assets

RSA Quantum-vulnerable Recorded traffic 1 place See details

Classical key pair generated with Node crypto

`crypto.generateKeyPair()` or its synchronous form. The detector resolves the algorithm through a `promisify()` wrapper and through an import alias, both of which are common enough that missing them would leave real key generation unreported.

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 for encryption, ML-DSA-65 for signatures. Node exposes neither yet, so this usually means an addon or a service boundary.

  1. packages/ee/server-only/lib/create-email-domain.ts:89 const { publicKey, privateKey } = await generateKeyPairAsync('rsa', {
js.generatekeypair · 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. packages/lib/package.json:52 "jose": "^6.1.2",
dep.crypto-library
CSPRNG Quantum-safe 8 places See details

Random number generation

`crypto.randomBytes()`, `randomUUID()` or `getRandomValues()`. A platform CSPRNG is not a quantum exposure; it is recorded because an inventory that omits the randomness source is incomplete. `Math.random()` is a separate, present-day defect.

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

What to do. No action.

  1. apps/remix/server/security-headers.ts:59 crypto.getRandomValues(buf);
  2. packages/auth/server/lib/session/session.ts:31 crypto.getRandomValues(bytes);
  3. packages/ee/server-only/lib/send-organisation-account-link-confirmation-email.ts:61 const token = crypto.randomBytes(20).toString('hex');
  4. packages/lib/jobs/definitions/emails/send-admin-user-created-email.handler.ts:33 token: crypto.randomBytes(18).toString('hex'),
  5. packages/lib/server-only/2fa/setup-2fa.ts:23 const secret = crypto.randomBytes(10);
  6. packages/lib/server-only/analytics/capture-server-event.ts:73 distinctId: userId ? String(userId) : `anon_${crypto.randomUUID()}`,
  7. packages/lib/server-only/user/forgot-password.ts:21 const token = crypto.randomBytes(18).toString('hex');
  8. packages/lib/server-only/user/send-confirmation-token.ts:13 const token = crypto.randomBytes(20).toString('hex');
js.rng
bcrypt Quantum-safe Renamed import 3 places See details

Password hashing or key derivation

A password hashing or key derivation function. Not a quantum exposure, and part of the inventory: a cryptographic bill of materials that omits how passwords are stored is not complete.

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

What to do. Argon2id for new work. PBKDF2 needs a high iteration count to stay defensible.

  1. packages/lib/server-only/auth/hash.ts:10 return bcryptHashSync(password, SALT_ROUNDS);
  2. packages/prisma/seed/organisations.ts:48 password: hashSync('password'),
  3. packages/prisma/seed/users.ts:44 password: hashSync(password),
js.kdf
HMAC Quantum-safe 1 place See details

JWT signed with a classical algorithm

A JOSE `alg` value. RS*, PS*, ES* and EdDSA sign with a quantum-vulnerable key; HS* is an HMAC and is not affected. `alg: 'none'` is reported as a critical defect today.

No known quantum attack changes how strong this is. A keyed MAC is not affected by Shor and only marginally by Grover.

What to do. No standardised post-quantum JOSE algorithm exists yet. Keep token lifetimes short.

js.jwt.algorithm · CWE-327
SHA-512 Quantum-safe 1 place See details

Hash function in use

`createHash()` or `subtle.digest()`. The digest is read from the argument, so one rule covers the family: MD5 and SHA-1 are reported as broken, SHA-256 as a reduced margin, SHA-384 and above as inventory.

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

What to do. SHA-256 as the floor, SHA-384 where the digest protects something long-lived.

  1. packages/lib/server-only/auth/hash.ts:18 return crypto.createHash('sha512').update(input).digest('hex');
js.hash · CWE-328

Cryptographic assets

Algorithm Assessment What it means Occurrences
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. 12
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. 11
bcrypt Quantum-safe A password hashing function. Grover offers only a marginal speed-up against a deliberately slow function, so quantum computing is not the concern here. 9
CSPRNG Quantum-safe A cryptographically secure random number generator provided by the platform. Not weakened by a quantum computer. 8
ChaCha20-Poly1305 Quantum-safe No known quantum algorithm changes the security margin. 3
RSA Quantum-vulnerable Broken by Shor's algorithm on a cryptographically relevant quantum computer. 1
HMAC Quantum-safe A keyed MAC is not affected by Shor and only marginally by Grover. 1
SHA-512 Quantum-safe No known quantum algorithm changes the security margin. 1

Imported cryptographic libraries

Library Files
@oslojs/crypto — hash functions and constant-time helpers 11
crypto — the Node crypto module 11
@node-rs/bcrypt — password hashing 6
@noble/ciphers — symmetric encryption 3