v3.0.0
Breaking changes
- Invalid signatures now exit nonzero. When a key is provided via
--key/-korJWTD_KEY, an invalid JWS signature still printsSignature: INVALIDwith the reason, but jwtd now exits with status 1. Scripts that gate on jwtd's exit status must expect failure for tokens that do not verify. - Malformed structured keys are rejected. Key input that looks like PEM, DER, an X.509 certificate, or a JWK/JWK Set but fails to parse is now an error. Previously such data silently fell back to being used as a raw symmetric key, which could turn a public certificate or a typo'd key file into an attacker-known HMAC secret. Opaque text and binary key files continue to work as symmetric keys.
- Error output format changed. Runtime errors print a single
Error: ...line to stderr; Cobra's usage text is no longer appended.
New
- X.509 certificates as verification keys. PEM and DER certificates are accepted anywhere a key is; the public key is extracted for signature verification. SEC 1 EC keys are also supported.
- Complete JWE protected header display. Every field of the compact protected header is shown, not just
alg/kid/jwk. - Exact number display. JSON numbers in headers, claims, and decrypted payloads are printed with full precision (no float64 rounding of large values), and
iat/exp/nbfformatting handles fractional timestamps. - Terminal-safe output. Control characters, DEL, C1 controls, invalid UTF-8, and bidirectional override characters in token content are escaped instead of being written raw to the terminal.
- Malformed or trailing JSON data in any displayed segment is rejected instead of partially rendered.
Release integrity
Releases are now built by a hardened pipeline: SHA-pinned actions, dispatch restricted to main, semver validation, the release tag cryptographically bound to the built commit, reproducible archives, and byte-for-byte verification of published assets against the build artifacts before the release is published.
Full changelog: v2.1.1...v3.0.0