Skip to content

release: OxyJWT 0.5.0 - #89

Merged
ZhuchkaTriplesix merged 35 commits into
mainfrom
dev
May 22, 2026
Merged

release: OxyJWT 0.5.0#89
ZhuchkaTriplesix merged 35 commits into
mainfrom
dev

Conversation

@ZhuchkaTriplesix

Copy link
Copy Markdown
Member

Summary

Merge dev into main for OxyJWT 0.5.0 — performance and hardening after 0.4.0.

  • Performance: faster verified/unverified decode, native encode path, Rust RFC 7797 claims, deduped Python claim checks, lazy JWKS key materialization
  • Security: 256 KiB detached_payload cap, strict compact JWT segments, thread-safe PyJWKClient, expanded security regression suite
  • Fix: issuer=InvalidIssuerError when iss is missing (PyJWT parity)
  • CI/docs: full CI on dev pushes, release workflow gated on CI, stabilized HS256 bench smoke (median, 3 rounds), benchmark methodology docs
  • Release prep: version bump to 0.5.0, changelog, RELEASE_NOTES_v0.5.0.md, SECURITY.md / README / versioning updates

Closes #57, #58, #59, #60, #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72

After merge

  1. Tag on main: git tag -a v0.5.0 -m "Release 0.5.0" && git push origin v0.5.0
  2. Confirm Release workflow publishes to PyPI
  3. Create GitHub Release from tag (body from .github/RELEASE_NOTES_v0.5.0.md)
  4. Close milestone 0.5.0

Test plan

  • cargo test --manifest-path rust/Cargo.toml
  • pytest (139 passed, 1 skipped)
  • CI green on this PR
  • Post-merge: pip install oxyjwt==0.5.0 smoke on clean venv

ZhuchkaTriplesix and others added 30 commits May 22, 2026 15:17
Avoid parsing the protected header on every verified decode; only inspect
when the compact JWT payload segment is empty (detached JWS form).
Use one jws_parse_compact call for verify_signature=False instead of
get_unverified_header, jws_parse_compact, and decode_unverified.
Reject oversized RFC 7797 external payloads before copy/JSON parse,
matching the compact JWT size limit.
perf(decode): gate RFC 7797 header peek on empty payload (#57)
perf(decode): single-parse unverified decode path (#58)
…ytes

security(api): cap detached_payload size (RFC 7797) (#59)
Preflight decode and decode_unverified with split_compact_segments;
align extract_signature_bytes with the same strict parser.
Extend workflow push branches to include dev; document in GITFLOW.md.
Call reusable CI workflow before wheel builds; document in RELEASING.md.
security(rust): unify compact JWT segment validation (#60)
ci: gate PyPI release workflow on tests (#61)
Avoid orjson.dumps plus encode_json re-parse on the default encode path;
keep encode_json for sort_headers or json_encoder.
perf(encode): avoid encode_json round-trip (#63)
Run jwt_decode and signature extraction in one GIL-free block;
dedupe DecodingKey algorithm validation in keys.rs.
When whole-second leeway and standard compact JWT, defer aud/iss/sub to
Rust if call-time audience/issuer/subject were set; keep strict_aud in Python.
perf(rust): combine detach in decode_verified_complete (#64)
perf(api): skip redundant Python aud/iss/sub checks (#65)
Apply jsonwebtoken-style claim checks after detached signature verify;
skip redundant Python exp/nbf when leeway is whole seconds.
Align issuer validation with expected API parity; add tests for
missing iss and bytes issuer rejection.
Rust claim validation does not cover a missing iss claim when issuer
is provided; keep Python issuer validation on that path.
Guard JWKS fetch and kid LRU with an RLock; add concurrent access test.
Store raw JWK dicts until kid lookup or .keys access; keep _by_kid compat.
perf(rust): RFC 7797 verified path — claims in Rust (#66)
fix(api): align missing iss error with PyJWT (#69)
Add strict segments, issuer bytes, and require_https cases; refresh module docstring.
Use 3 rounds and median ops/s for PyJWT ratio gates; drop absolute 500 ops/s floor.
Document optional extended benchmark in RELEASING.md.
ZhuchkaTriplesix and others added 5 commits May 22, 2026 15:57
Clarify benchmark fairness in README and script help; upload cached-mode
weekly benchmark artifact alongside default pem run.
…pand

test: expand security regression contract (#72)
ci(bench): stabilize HS256 smoke benchmark (#71)
docs(bench): document fair asymmetric key comparison (#70)
Bump Python/Rust package version to 0.5.0, add changelog and release notes,
and update security/support docs for the 0.5.x line.
@ZhuchkaTriplesix ZhuchkaTriplesix added this to the 0.5.0 milestone May 22, 2026
@ZhuchkaTriplesix ZhuchkaTriplesix self-assigned this May 22, 2026

@ZhuchkaTriplesix ZhuchkaTriplesix left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

31

@ZhuchkaTriplesix
ZhuchkaTriplesix merged commit 8bb2381 into main May 22, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

perf(decode): avoid unconditional header parse before verified decode

1 participant