Loading report…
← nittim
[](https://nittim.com)Safe to ship. No blocking issues found.Safe to make live. No blocking problems found.Safe to ship. No blockers.
jwt/algorithms.pyget_default_algorithms() includes '"none": NoneAlgorithm()'; NoneAlgorithm.verify() returns False.jwt/jwks_client.pyPyJWKClient.__init__ validates scheme via urlparse and rejects non-http(s); fetch_data() calls urllib.request.urlopen(self.uri). get_signing_key_from_jwt reads 'kid' from the unverified header for lookup only.tests/test_advisory.py:9(priv_key_bytes PEM block), :17 (ssh_priv_key_bytes EC PEM), and example tokens at :48/:52/:100/:104; tests/test_jwks_client.py:214,:317 (example tokens); tests/keys/*.json contain private JWK material (e.g. jwk_rsa_key.json 'd','p','q').65 of 92 files were audited. The denominator counts every file in the repository — images, generated output, vendored and build directories included. nittim reads source and configuration only, highest-value files first. Nothing here was cut short by a size or file-count limit — the gap is almost entirely non-code content, not skipped source.
Dependency manifests: 2 Python manifests read.
PyJWT is a mature, widely-deployed open-source library implementing JSON Web Tokens/JWS/JWK per the relevant RFCs. The audited snapshot shows a security-conscious, well-architected, thoroughly tested codebase with strong CI/CD (multi-version test matrix, trusted PyPI publishing, coverage gates, pre-commit linting, strict mypy). The code demonstrates deliberate defenses against the classic JWT attack classes — algorithm-confusion (HMAC key-shape rejection, PyJWK algorithm binding), the 'none' algorithm, RFC 7797 b64/crit handling, JWKS URI scheme restriction, and unauthenticated work-amplification on detached payloads. The deterministic scanner's 8 secret hits are all test fixtures (RFC 7520 test vectors and example tokens in tests/), not live credentials. No known-vulnerable dependencies. As a library it legitimately does not implement runtime observability, infrastructure, or data-persistence concerns, and those dimensions are scored accordingly. This is a standard, prior-art-heavy RFC implementation with no novel defensible IP to protect. Overall this is production-grade software; the findings below are minor and largely informational.
pyproject.tomlspecifies loose ranges (e.g. 'cryptography>=3.4.0', 'typing_extensions >= 4.0'); no lockfile present in the audited snapshot.jwt/algorithms.pyjwt/api_jws.py, jwt/api_jwt.py implement JWS/JWT/JWK/JWKS per RFC 7515/7517/7518/7519/7797 and RFC 8725 mitigations; README/docstrings describe capabilities and cite RFCs.Weighted blend of 4 dimensions → ~94/100. Dimensions are weighted by importance (Security and Privacy weigh heaviest). Published figures are approximate; nittim's exact weighting and precise scoring are proprietary, while the verdict is computed on exact internal values.4 categories combine into ~94/100. Some categories count for more than others (Security and Privacy count the most). The published numbers are approximate; nittim's exact math is kept private, while the verdict itself is worked out from the exact internal numbers.Weighted blend of 4 dimensions → ~94/100 (Security and Privacy weigh heaviest). Published figures are approximate; nittim's exact weighting is proprietary. The verdict runs on exact internal values.
IP Protection is an independent IP-defensibility lens and is excluded from this blend.IP Protection (checking whether your ideas are exposed) is judged separately and isn’t
part of this combined number.IP Protection is judged separately, excluded from this blend.
Scores are a judgement, not a measurement: a re-audit of the same commit can land a few
points either side of this figure. The evidence underneath it is deterministic — the same
commit always yields the same committed-secret and vulnerable-dependency findings.Scores are a judgment call, not an exact measurement: checking the same saved snapshot of
your code twice can land a few points either side of this number. The evidence underneath
it is not — the same snapshot always turns up the same passwords-in-code and known-security-bug
findings.Scores are a judgment, not a measurement — a re-audit can land a few points either side. The evidence underneath is deterministic: the same commit always yields the same secret and vulnerable-dependency findings.
Each score is the model's overall assessment of the dimensions it covers, across everything it reviewed — not a tally of the findings in this report. Findings are the subset worth acting on, so a score can sit above or below what the listed findings alone would suggest.Each score is the AI's overall judgment of everything it reviewed in that category — not a
count of the problems listed in this report. The listed problems are the ones worth acting
on, so a score can sit above or below what they alone would suggest.Each score is the model's overall assessment across everything it reviewed — not a tally of this report's findings. A score can sit above or below what the findings alone suggest.
Verdict rationale — Why this verdict — Verdict rationale — This is a mature, security-hardened, heavily-tested cryptographic library (PyJWT) with robust CI/CD across nine Python runtimes, trusted PyPI publishing, strict typing, and demonstrable defenses against the well-known JWT attack classes. The only scanner hits are non-production test vectors, no vulnerable dependencies were found, and the code shows evidence of active security maintenance (GHSA regression tests, RFC 8725 mitigations, algorithm-confusion and cache-wipe fixes). Remaining findings are informational or low and scope-appropriate for a library. It is safe for production use as intended. The IP and AI-authorship lenses are independent and did not affect this verdict: there is no novel IP to protect (standard RFC implementation), and stylometric/historical signals (multi-year issue references, backward-compat notes, idiosyncratic commentary) indicate long-lived human authorship.