PR creation is currently restricted to collaborators, so filing this as an issue. The fix is complete and tested on a branch ready to pull: EfeDurmaz16:fix/challenge-id-real-sdk (2 commits, +41/-55). Happy to open it as a PR if you enable that or pull it directly.
Two coupled fixes so a conformance run certifies a shipping SDK instead of harness glue.
with_opaque used opaque: "trace-123", which is not decodable base64url (invalid length). Per the core spec, wire opaque is base64url of a JCS flat string map, and HMAC slot 6 binds that wire value, so no compliant server can emit "trace-123". Replaced with eyJ0cmFjZSI6IjEyMyJ9 and the expected id regenerated:
HMAC-SHA256("test-vector-secret-minimum-32-byte-secret",
"api.example.com|tempo|charge|eyJhbW91bnQiOiIxMDAwMDAwIn0|||eyJ0cmFjZSI6IjEyMyJ9")
= base64url: 5kAjSWiLlrX5yinRSJ9gZPiGWd_AC3WG_jAOcBnH6iY
- With the fixture valid, the Go adapter now calls the real
mpp.GenerateChallengeID (mpp-go v0.2.0, already a direct dependency) and drops its local reimplementation, as its own TODO comment suggested. The minimum-secret-length guard stays adapter-side because the library does not enforce one and error_weak_secret_key expects generation_error.
Verified locally with vector_runner: go 119/119, typescript 125/125, rust 120/120, python 126/126. ruby/java put opaque into the same pipe-join as a raw string, so the regenerated id is adapter-independent; CI will confirm. opaque_route_scope_binding is byte-for-byte unchanged.
Follow-up offer: the same swap for the python and rust adapters.
PR creation is currently restricted to collaborators, so filing this as an issue. The fix is complete and tested on a branch ready to pull:
EfeDurmaz16:fix/challenge-id-real-sdk(2 commits, +41/-55). Happy to open it as a PR if you enable that or pull it directly.Two coupled fixes so a conformance run certifies a shipping SDK instead of harness glue.
with_opaqueusedopaque: "trace-123", which is not decodable base64url (invalid length). Per the core spec, wire opaque is base64url of a JCS flat string map, and HMAC slot 6 binds that wire value, so no compliant server can emit"trace-123". Replaced witheyJ0cmFjZSI6IjEyMyJ9and the expected id regenerated:mpp.GenerateChallengeID(mpp-go v0.2.0, already a direct dependency) and drops its local reimplementation, as its own TODO comment suggested. The minimum-secret-length guard stays adapter-side because the library does not enforce one anderror_weak_secret_keyexpectsgeneration_error.Verified locally with vector_runner: go 119/119, typescript 125/125, rust 120/120, python 126/126. ruby/java put opaque into the same pipe-join as a raw string, so the regenerated id is adapter-independent; CI will confirm.
opaque_route_scope_bindingis byte-for-byte unchanged.Follow-up offer: the same swap for the python and rust adapters.