Fix: Change OKP JWK thumbprint to use crv/kty/x, not RSA's kty/n/x - #26
Open
nomadium wants to merge 1 commit into
Open
Fix: Change OKP JWK thumbprint to use crv/kty/x, not RSA's kty/n/x#26nomadium wants to merge 1 commit into
nomadium wants to merge 1 commit into
Conversation
OKP_PUBLIC_KEY_ELEMENTS was copy-pasted from an RSA-shaped element
list (kty, n, x). "n" is the RSA modulus and never applies to OKP
(Ed25519) keys, so it always serialized as null; "crv" is required by
RFC 8037 but was missing entirely.
This list feeds JWK::OKP#members, which JWT::JWK::Thumbprint (RFC
7638) uses directly to compute the SHA-256 thumbprint, and jwt's
default kid_generator (:key_digest) uses that thumbprint as the
auto-generated "kid" for every key this gem creates. As a result,
every kid produced by this gem is computed over the wrong JSON
({"kty":"OKP","n":null,"x":"..."}) instead of the RFC 7638-correct
{"crv":"Ed25519","kty":"OKP","x":"..."}, so it never matches the
thumbprint a spec-compliant verifier computes for the same key.
Add a regression test pinned to the published RFC 8037 Appendix A.3
thumbprint test vector.
nomadium
added a commit
to nomadium/linzer
that referenced
this pull request
Aug 10, 2026
…sa's kid
jwt-eddsa (<= 0.9.0) computes JWK::OKP's thumbprint over the wrong
members ({kty, n, x} instead of the RFC 8037-correct {crv, kty, x}),
so the Web Bot Auth `keyid` derived from it never matched what a
spec-compliant verifier expects.
Add Linzer::JWS::Key#jwk_thumbprint and use it instead, so Linzer
is correct independent of jwt/ruby-jwt-eddsa#26.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Fix OKP JWK thumbprint: use crv/kty/x, not RSA's kty/n/x
OKP_PUBLIC_KEY_ELEMENTS was copy-pasted from an RSA-shaped element list (kty, n, x). "n" is the RSA modulus and never applies to OKP (Ed25519) keys, so it always serialized as null; "crv" is required by RFC 8037 but was missing entirely.
This list feeds
JWK::OKP#members, whichJWT::JWK::Thumbprint(RFC 7638) uses directly to compute the SHA-256 thumbprint, and jwt's default kid_generator (:key_digest) uses that thumbprint as the auto-generated "kid" for every key this gem creates. As a result, every kid produced by this gem is computed over the wrong JSON ({"kty":"OKP","n":null,"x":"..."}) instead of the RFC 7638-correct{"crv":"Ed25519","kty":"OKP","x":"..."}, so it never matches the thumbprint a spec-compliant verifier computes for the same key.Add a regression test pinned to the published RFC 8037 Appendix A.3 thumbprint test vector.
Checklist
Before the PR can be merged be sure the following are checked:
Notes
I stumbled upon this issue after investigating why JWK keys generated by Linzer gem (which depends on jwt-eddsa) and associated HTTP message signatures were failing verification at a CloudFlare debug utility website.