BIP Conformance Test Suite
Companion to: yona:ruleset:v1.0
Document: BIP Conformance Test Suite
Scope of this document: normative conformance-verification material for implementations claiming BIP conformance to yona:ruleset:v1.0
Conformance status: Requirements in this document are normative only when stated using capitalized keywords (MUST, MUST NOT, REQUIRED, SHOULD, MAY) as defined by BCP 14 (RFC 2119 / RFC 8174). All other text is non-normative.
License
Copyright © 2026 YONA LLC.
Text and explanatory content in this document are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).
Machine-readable artifacts published with this document, including JSON, .jws samples, test vectors, fixtures, and expected.json assertions, are licensed under the Apache License 2.0 (Apache-2.0), unless a specific bundle states otherwise.
Names and marks: CC BY 4.0 and Apache-2.0 do not grant trademark rights. Nothing in this document grants rights to use any names, logos, or other marks beyond what is permitted under applicable law.
Disclaimer: This document and all included artifacts are provided “AS IS”, without warranties or conditions of any kind, and without liability for damages arising from their use.
Patent policy: See YONA Patent Policy published on YONA's website for its royalty-free implementation commitment for any Essential Claims it owns or controls.
License texts: CC BY 4.0 and Apache-2.0
1. Scope and Interpretation
1.1 Purpose
This document defines the BIP Conformance Test Suite for implementations claiming BIP conformance under yona:ruleset:v1.0.
This document provides:
- a normative conformance matrix
- parameterized invalid-case families
- byte-exact hashing fixtures for
request_jws_sha256 - deterministic
REJECTversusNO_RESPONSEdecision tables - transport, discovery, parsing, signature, replay, and binding test requirements
This document adds no new protocol requirements beyond the ruleset and the companion BIP. It exists only to verify conformance to those documents.
1.2 Relationship to companion documents
| Companion material | Role |
|---|---|
| Base Interoperability Profile (BIP) | defines the reusable interoperability baseline |
| BIP Conformance Test Suite | defines how BIP conformance is verified |
| Reference Messages and DID Examples | provides non-normative examples and implementation guidance |
| BIP Conformance Report Template | optional non-normative reporting format |
If this test suite appears to conflict with the ruleset or the companion BIP, the ruleset controls first, then the companion BIP, and this test suite MUST be interpreted accordingly.
1.3 What this suite verifies
This suite verifies the technical conditions needed for BIP conformance under yona:ruleset:v1.0, including:
did:webresolution for VASP DID documents- required DID service discovery
- HTTPS
POST Content-Type: application/joseandAccept: application/jose- JWS Compact request and response bodies
- deterministic validation-gating behavior
- byte-exact request/response binding via
request_jws_sha256 - endpoint-specific success, failure, and no-response handling
1.4 Pilot mapping
A push-payment-only pilot is a restricted subset of this suite.
Such a pilot:
- MAY validate useful interoperability behavior for pilot deployments
- MAY validate useful interoperability behavior for early interoperability experiments
- MAY validate useful interoperability behavior for restricted environments
- MUST NOT claim full BIP conformance
For a push-payment-only pilot, the applicable cases are limited to push-payment authorization and general authorization-endpoint BIP behavior.
The following are out of scope for that pilot:
- retrieval cases
YonaPaymentIntentServiceyona.retrieve_intentyona.payment_intent- pull-specific
embedded_payment_intentbinding cases
2. Conformance Claim Semantics
2.1 What a BIP conformance claim requires
This subsection defines the minimum basis for making a BIP conformance claim under yona:ruleset:v1.0.
A BIP conformance claim for yona:ruleset:v1.0 MUST NOT be made unless the implementation:
- satisfies all applicable normative requirements in YONA Ruleset 1.0;
- satisfies all applicable normative requirements in the companion Base Interoperability Profile (BIP); and
- passes all applicable normative test cases in this BIP Conformance Test Suite.
A conformant implementation MUST produce deterministic outcomes for repeated executions of the same test vectors under the same configuration.
If a conformance report is produced, it SHOULD state:
- which role or roles were tested;
- the tested interaction scope (
pull,push, or both); - the tested
ruleset_id; and - any configuration inputs that materially affect validation, timeout handling, replay handling, caching, or repeated-request behavior.
2.2 Issuance and publication of conformance claims
This test suite defines only the technical verification conditions for making a BIP conformance claim under yona:ruleset:v1.0.
This suite does not define or require:
- a specific issuer
- a publication venue
- a display method
- a registry
- a trust framework
- a credential format
Passing this suite does not require review, approval, issuance, publication, registration, contract, or purchase of services from YONA LLC, from any future YONA successor body, or from any other specific party.
A self-asserted statement or third-party attestation MAY be accompanied by or expressed through a report, certificate, registry entry, or Verifiable Credential (VC), but those mechanisms are outside the scope of this test suite.
Any claim of technical conformance MUST be based on the applicable normative requirements of the ruleset and the companion BIP and on passing the applicable BIP Conformance Test Suite.
The presence, absence, or format of a conformance claim, attestation, report, certificate, registry entry, or credential does not alter the underlying technical pass/fail result for the implementation under test.
3. Test Harness Conventions
3.1 Roles under test
| Role under test | Covered behavior |
|---|---|
| Beneficiary VASP server | YonaPaymentIntentService; YonaAuthorizationService |
| Originator VASP client | retrieval client behavior (yona.retrieve_intent / yona.payment_intent); authorization client behavior (yona.authorization_request / yona.authorization_response) |
A conformance report MUST state which role or roles were tested.
3.2 Clock control and timeout testing
The harness MUST be able to control or simulate time sufficiently to test:
Time-dependent behavior
- valid
exp - expired
exp - the 60-second authorization no-response cutoff
- late terminal authorization response handling
The test harness MUST simulate the case where the client sends an authorization request and gets no usable response at all until the timeout is reached.
3.3 Replay and repeated-request window
Because replay-protection windows and repeated-request retention periods are implementation-defined, this suite verifies the following within the active test session:
- immediate signed-message replay handling
- repeated-request handling for
yona.authorization_requestwithin the same (iss,intent_id) scope
This suite does not assert behavior after the implementation's retention window expires.
3.4 Fixture bytes are authoritative
For tests involving request_jws_sha256, the fixture's exact JWS Compact Serialization is authoritative.
The following are not equivalent for hashing or comparison:
- reconstructed JSON
- reserialized JSON
- trimmed strings
- normalized strings
- re-encoded JOSE parts
3.5 Endpoint-specific interpretation
The harness MUST preserve the distinction between:
| Endpoint category | Interpretation |
|---|---|
YonaPaymentIntentService | retrieval failure |
YonaAuthorizationService | authorization outcomes and no-response behavior |
A retrieval failure MUST NOT be treated as ACCEPT, REJECT, or authorization NO_RESPONSE.
4. BIP Transport and Message-Handling Requirements Under Test
4.1 HTTP request requirements (client-side)
For BIP requests, the originator client MUST:
Client requirement
- send HTTPS
POSTto theserviceEndpointresolved viadid:web - send a signed YONA request message in JWS Compact Serialization form
- send
Content-Type: application/jose - send
Accept: application/jose
For request bodies:
Request body requirement
- the HTTP request body MUST consist solely of the JWS Compact Serialization of the YONA request
- the decoded JWS payload MUST contain all required members for the declared
message_typeandruleset_id - any required objects or fields, such as
intent_locator,payment_terms, orintended_asset_type, MUST be carried inside the JWS payload JSON and MUST NOT be sent as standalone HTTP bodies
4.2 HTTP response requirements (server-side, authorization endpoint)
When a bound terminal authorization response can be formed, the beneficiary server MUST return:
Server-side authorization response requirement
HTTP 200Content-Type: application/jose- an HTTP response body that is the byte-exact JWS Compact Serialization of a
yona.authorization_response
If a bound terminal response cannot be formed, the server MUST NOT return a YONA response message.
Examples of outcomes that are not YONA response messages include:
Not a YONA response message
- non-200 status
- non-JOSE body
- malformed JOSE body
- connection close
- timeout
- no response
4.3 Authorization no-response mapping (client-side)
For authorization requests:
| Condition | Required client interpretation |
|---|---|
absence of a valid, verified terminal yona.authorization_response by the cutoff | NO_RESPONSE |
NO_RESPONSE | MUST be treated as REJECT |
terminal response received after the client has concluded NO_RESPONSE | MUST be ignored for outcome purposes |
In all cases, the implementation MUST NOT proceed to post-ACCEPT steps without a valid, verified terminal ACCEPT.
4.4 Retrieval failure behavior (client-side)
For payment-intent retrieval:
| Condition | Required client behavior |
|---|---|
no valid, verified yona.payment_intent obtained | MUST NOT proceed to authorization using locator-only data |
| retrieval transport errors or malformed responses | do not carry YONA authorization semantics |
5. BIP Conformance Test Matrix
5.1 Matrix structure
Each applicable test case in this matrix MUST be executed for a BIP conformance claim unless this suite expressly marks the case not applicable to the implementation, endpoint, role, or interaction scope under test.
The matrix contains:
- explicit named test cases
- parameterized case families that MUST be instantiated for each required field, binding rule, parsing rule, or protected-header rule
Each test case defines:
Test case elements
- input
- expected role behavior
- pass/fail criteria
For each applicable case, the implementation under test MUST produce the expected result shown.
5.2 Core valid-path cases
| ID | Test Role | Endpoint / Flow | Case | Expected Result |
|---|---|---|---|---|
| BIP-VAL-001 | Beneficiary server | YonaPaymentIntentService | Valid yona.retrieve_intent (pull-payment) | Returns valid signed yona.payment_intent (HTTP 200 + application/jose) |
| BIP-VAL-002 | Originator client | Pull retrieval | Valid yona.payment_intent response | Verifies and treats it as the authoritative payment intent |
| BIP-VAL-003 | Beneficiary server | YonaAuthorizationService (pull) | Valid pull-payment yona.authorization_request | Returns signed terminal yona.authorization_response (ACCEPT or REJECT) |
| BIP-VAL-004 | Beneficiary server | YonaAuthorizationService (push) | Valid push-payment yona.authorization_request | Returns signed terminal yona.authorization_response (ACCEPT or REJECT) |
| BIP-VAL-005 | Originator client | Authorization response | Valid yona.authorization_response with correct request_jws_sha256 | Accepts the response and applies terminal semantics |
| BIP-VAL-006 | Beneficiary server | YonaAuthorizationService repeated-request handling | Repeat same (iss, intent_id) with materially equivalent inputs; the harness MUST vary only non-material fields such as jti, iat, exp, kid, or signature bytes | Returns the same terminal decision and re-binds to the repeated request bytes |
| BIP-VAL-007 | Beneficiary server | YonaAuthorizationService repeated-request handling | Repeat same (iss, intent_id) with one or more material authorization inputs changed | Deterministically returns terminal REJECT if bindable; otherwise MUST NOT return a YONA response message |
6. Parameterized Required-Field Invalid-Case Families
6.1 Family rule
For each required defined field listed in the message-specific subsections below, the harness MUST instantiate the following cases unless marked not applicable:
| Invalid-case family | Meaning |
|---|---|
MISSING | field omitted |
WRONG_TYPE | JSON type differs from the required type |
BAD_VALUE | field present with an invalid semantic value |
Expected result:
| Endpoint type | Expected result |
|---|---|
| any receiver | MUST fail validation gating and MUST NOT proceed to authorization evaluation |
| authorization endpoint | server MUST return a bound terminal REJECT if bindable; otherwise it MUST NOT return a YONA response message |
| retrieval endpoint | request MUST fail, meaning no successful yona.payment_intent is returned; this suite does not require a retrieval-REJECT message |
This family rule applies only to defined required fields.
A non-duplicate unknown additional field is not invalid by itself and MUST NOT change validation, binding, timeouts, or outcomes. The harness SHOULD include at least one non-failing tolerance case for this rule in request and response directions relevant to the tested role.
6.2 yona.retrieve_intent request (beneficiary server receives)
| Category | Fields |
|---|---|
| Common claims | iss, aud, iat, exp, jti, message_type, ruleset_id |
| Message-specific fields | intent_locator, intent_locator.type, intent_locator.beneficiary_vasp_did, intent_locator.beneficiary_intent_id |
BAD_VALUE examples that MUST be covered:
message_type != yona.retrieve_intentruleset_id != yona:ruleset:v1.0aud != intent_locator.beneficiary_vasp_didintent_locator.typeinvalidintent_locator.beneficiary_intent_idviolates ASCII-restricted identifier rules- non-integer
iatorexp - expired
exp - replayed
jti
6.3 yona.payment_intent response (originator client receives)
| Category | Fields |
|---|---|
| Common claims | iss, aud, iat, exp, jti, message_type, ruleset_id |
| Message-specific fields | intent_locator, intent_locator.type, intent_locator.beneficiary_vasp_did, intent_locator.beneficiary_intent_id, payment_terms, payment_terms.amount, payment_terms.amount_units, payment_terms.currency, acceptable_asset_types |
BAD_VALUE examples that MUST be covered:
message_type != yona.payment_intentruleset_id != yona:ruleset:v1.0iss != retrieve_intent.audaud != retrieve_intent.iss- returned
intent_locatordoes not match the requested locator payment_terms.amountnon-canonicalpayment_terms.amount_units != minorpayment_terms.currencynon-canonicalacceptable_asset_typesempty where the ruleset requires at least one acceptable asset typeacceptable_asset_types[*]invalid under CAIP-19- expired
exp - replayed
jti
6.4 yona.authorization_request (beneficiary server receives)
6.4.1 Common fields for both request forms
| Category | Fields |
|---|---|
| Common claims | iss, aud, iat, exp, jti, message_type, ruleset_id |
| Message-specific common field | intent_id |
BAD_VALUE examples that MUST be covered:
message_type != yona.authorization_requestruleset_id != yona:ruleset:v1.0intent_idviolates ASCII-restricted identifier rules- non-integer
iatorexp - expired
exp
6.4.2 Pull-payment form
| Category | Fields |
|---|---|
| Pull-payment form | embedded_payment_intent |
BAD_VALUE examples that MUST be covered:
embedded_payment_intentis not a JWS Compact Serialization string- embedded payment intent signature invalid
- embedded payment intent
expexpired - embedded payment intent
jtireplayed under receiver policy authorization_request.iss != decoded_payment_intent.audauthorization_request.aud != decoded_payment_intent.iss
6.4.3 Push-payment form
| Category | Fields |
|---|---|
| Push-payment form | beneficiary_handle, payment_terms, payment_terms.amount, payment_terms.amount_units, payment_terms.currency, intended_asset_type |
BAD_VALUE examples that MUST be covered:
beneficiary_handleviolates required form or constraintsaud !=DID encoded inbeneficiary_handlepayment_terms.amountnon-canonicalpayment_terms.amount_units != minorpayment_terms.currencynon-canonicalintended_asset_typeinvalid under CAIP-19
6.4.4 Request-form classification and mixed-field cases
The harness MUST instantiate cases showing that the receiver deterministically rejects:
Mixed-field / classification case
- a request with
embedded_payment_intentpresent and any ofbeneficiary_handle,payment_terms, orintended_asset_typealso present - a request with
beneficiary_handle,payment_terms, andintended_asset_typepresent butembedded_payment_intentalso present - a request with neither valid pull form nor valid push form
- a push-form request missing required
intended_asset_type - a push-form request that includes
embedded_payment_intent - a pull-form request that includes any disallowed push-form fields
6.5 yona.authorization_response (originator client receives)
| Category | Fields |
|---|---|
| Common claims | iss, aud, iat, exp, jti, message_type, ruleset_id |
| Message-specific fields | intent_id, decision, request_jws_sha256 |
BAD_VALUE examples that MUST be covered:
message_type != yona.authorization_responseruleset_id != yona:ruleset:v1.0decisionnot equal toACCEPTorREJECTiss != authorization_request.audaud != authorization_request.issintent_id != authorization_request.intent_idrequest_jws_sha256mismatch- expired
exp - replayed
jti
7. Duplicate JSON Member Tests
A separate duplicate-member case MUST be instantiated for each message type:
| ID | Case |
|---|---|
| BIP-DUP-001 | duplicate JSON member in yona.retrieve_intent |
| BIP-DUP-002 | duplicate JSON member in yona.payment_intent |
| BIP-DUP-003 | duplicate JSON member in yona.authorization_request |
| BIP-DUP-004 | duplicate JSON member in yona.authorization_response |
Expected result:
- message is invalid
- receiver MUST reject
- for authorization, the receiver MUST return terminal
REJECTif bindable; otherwise it MUST NOT return a YONA response message - for retrieval, the endpoint MUST NOT produce a successful
yona.payment_intent
8. DID / JOSE / Signature Profile Matrix
| ID | Case | Expected Receiver Behavior |
|---|---|---|
| BIP-SIG-001 | JWS missing signature segment or malformed compact form | Reject |
| BIP-SIG-002 | Protected header alg missing or not EdDSA | Reject |
| BIP-SIG-003 | Protected header typ missing or not JWT | Reject |
| BIP-SIG-004 | kid missing from protected header | Reject |
| BIP-SIG-005 | kid present but not a DID URL | Reject |
| BIP-SIG-006 | Sender DID (iss) cannot be resolved via did:web | Reject |
| BIP-SIG-007 | kid does not resolve in the sender DID document | Reject |
| BIP-SIG-008 | kid resolves but key is not authorized or usable for verification | Reject |
| BIP-SIG-009 | Signature verification fails with the resolved key | Reject |
| BIP-SIG-010 | kid points to a key under a DID different from iss | Reject |
| BIP-SIG-011 | DID resolves but required service entry is missing | Client MUST NOT send the request and MUST NOT proceed as if ACCEPT occurred |
| BIP-SIG-012 | DID resolves but serviceEndpoint is unusable or an invalid URL | Client MUST NOT send the request and MUST NOT proceed as if ACCEPT occurred |
9. request_jws_sha256 Tests
| ID | Role Under Test | Case | Expected Result |
|---|---|---|---|
| BIP-HASH-001 | Originator client | Correct request_jws_sha256 for exact request bytes | Accept response, subject to other checks |
| BIP-HASH-002 | Originator client | Hash computed over semantically equivalent but differently serialized request bytes | Reject response |
| BIP-HASH-003 | Originator client | request_jws_sha256 character value mutated by one character | Reject response |
| BIP-HASH-004 | Beneficiary server | Response generated with hash over exact received bytes | Pass |
| BIP-HASH-005 | Beneficiary server | Response generated over reconstructed, normalized, trimmed, or reserialized bytes | Fail conformance |
10. Malformed JOSE Body Tests
| ID | Direction | Case | Expected Behavior |
|---|---|---|---|
| BIP-JOSE-001 | Request to server | Body contains bytes outside US-ASCII | Not valid JWS Compact Serialization; server MUST NOT return a YONA response message |
| BIP-JOSE-002 | Request to server | Not JWS Compact Serialization (. count != 2) | Unbindable; server MUST NOT return a YONA response message |
| BIP-JOSE-003 | Request to server | Invalid base64url segment | Unbindable; server MUST NOT return a YONA response message |
| BIP-JOSE-004 | Request to server | Payload bytes are not valid UTF-8 JSON text | Unbindable; server MUST NOT return a YONA response message |
| BIP-JOSE-005 | Request to server | Payload decodes to non-JSON | Unbindable; server MUST NOT return a YONA response message |
| BIP-JOSE-006 | Response to client (authorization) | Non-200 status | No valid terminal response obtained; treat as NO_RESPONSE (MUST be treated as REJECT) |
| BIP-JOSE-007 | Response to client (authorization) | HTTP 200 but non-application/jose body | No valid terminal response obtained; treat as NO_RESPONSE (MUST be treated as REJECT) |
| BIP-JOSE-008 | Response to client (authorization) | HTTP 200 with application/jose but malformed JWS | No valid terminal response obtained; treat as NO_RESPONSE (MUST be treated as REJECT) |
| BIP-JOSE-009 | Response to client (authorization) | Terminal response arrives after client has concluded NO_RESPONSE | Ignore for outcome purposes |
| BIP-JOSE-010 | Response to client (retrieval) | Retrieval response malformed, non-200, or timed out | No verified yona.payment_intent; client MUST NOT proceed to authorization using locator-only data |
11. Wrong-Binding Cases
| ID | Message | Wrong Binding | Expected Result |
|---|---|---|---|
| BIP-BIND-001 | yona.retrieve_intent | aud != intent_locator.beneficiary_vasp_did | Beneficiary rejects request; no successful retrieval |
| BIP-BIND-002 | yona.payment_intent | iss != retrieve_intent.aud | Originator rejects |
| BIP-BIND-003 | yona.payment_intent | aud != retrieve_intent.iss | Originator rejects |
| BIP-BIND-004 | yona.payment_intent | returned intent_locator does not equal the requested locator | Originator rejects |
| BIP-BIND-005 | Pull yona.authorization_request | outer iss != embedded_payment_intent.aud | Beneficiary rejects |
| BIP-BIND-006 | Pull yona.authorization_request | outer aud != embedded_payment_intent.iss | Beneficiary rejects |
| BIP-BIND-007 | Push yona.authorization_request | aud != DID encoded in beneficiary_handle | Beneficiary rejects |
| BIP-BIND-008 | yona.authorization_response | iss != authorization_request.aud | Originator rejects |
| BIP-BIND-009 | yona.authorization_response | aud != authorization_request.iss | Originator rejects |
| BIP-BIND-010 | yona.authorization_response | intent_id != authorization_request.intent_id | Originator rejects |
| BIP-BIND-011 | yona.authorization_response | request_jws_sha256 mismatch | Originator rejects |
12. Replay and Freshness Tests
12.1 Signed-message replay tests
For each message type other than yona.authorization_request, the harness MUST replay the exact same valid JWS within the active test session.
Replay rule:
- the implementation under test MUST apply its local replay policy to (
iss,jti) - a replayed message MUST NOT be treated as a new valid message
Repeated yona.authorization_request messages are tested under Section 12.2, not here.
12.2 Repeated yona.authorization_request tests
For yona.authorization_request, the harness MUST test repeated requests within the same (iss, intent_id) scope.
The harness MUST cover:
- a materially equivalent repeat whose non-material differences include one or more of:
jti,iat,exp,kid, or signature bytes - a materially changed repeat with one or more material authorization inputs changed
- a repeated request that receives a newly generated response bound to the repeated request bytes
Expected behavior:
- a materially equivalent repeat MUST NOT be treated as a replay solely because it is a new signed message with a different
jti - a materially equivalent repeat MUST receive the same terminal decision, newly bound to the repeated request bytes
- a materially changed repeat MUST be handled according to the ruleset's repeated-request outcome rules
12.3 Freshness tests
For each message type, the harness MUST instantiate:
- valid
exp - expired
exp - boundary case where
expequals the current test time according to receiver policy
The expected boundary-case outcome MUST be documented by the implementation and MUST be consistent across runs.
13. Prohibited Content Tests
Where the ruleset requires rejection if prohibited PII, Travel Rule payload data, destination addresses, settlement instructions, or other prohibited content appears in defined YONA semantic fields, the suite MUST include explicit tests placing clearly prohibited content into:
- defined fields of push-form
yona.authorization_request - defined fields of pull-form
yona.authorization_request, includingembedded_payment_intent - defined fields of
yona.authorization_response
These tests MUST NOT assume any global PII detector for unknown fields.
If the suite includes unknown-field cases, it MUST enumerate those unknown field names explicitly as suite fixtures and treat them as suite-specific checks rather than protocol semantics.
14. Byte-Exact Hashing Fixtures for request_jws_sha256
This section provides exact-byte fixtures for validating request_jws_sha256 handling under yona:ruleset:v1.0.
The canonical fixture bytes for this section are the raw downloadable .jws artifacts published with this suite release. The exact JWS Compact Serialization shown below are derived from those raw artifacts and are included for inspection and cross-checking.
For hashing and comparison, implementations MUST use the exact JWS Compact Serialization of the published raw artifact. Reserialized JSON, reconstructed JOSE objects, normalized strings, trimmed strings, or reformatted document renderings are not equivalent.
14.1 Fixture publication rule
For this release, the following raw artifacts are published as companion fixtures:
fixture-a-push-authorization-request.jwsfixture-b-pull-authorization-request.jwsfixture-c-authorization-response.jwsexpected.json
expected.json records the expected derived outputs for these fixtures. If a rendered HTML or PDF representation wraps lines or otherwise alters presentation, the raw artifact bytes remain authoritative.
14.2 Fixture A — Push-payment authorization request
Raw artifact: fixture-a-push-authorization-request.jws
Exact JWS Compact Serialization:
eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6by5leGFtcGxlI2sxIn0.eyJpc3MiOiJkaWQ6d2ViOm8uZXhhbXBsZSIsImF1ZCI6ImRpZDp3ZWI6Yi5leGFtcGxlIiwiaWF0IjoxNzYwMDAwMDAwLCJleHAiOjE3NjAwMDAwNjAsImp0aSI6Imp0aV8wMDAxIiwibWVzc2FnZV90eXBlIjoieW9uYS5hdXRob3JpemF0aW9uX3JlcXVlc3QiLCJydWxlc2V0X2lkIjoieW9uYTpydWxlc2V0OnYxLjAiLCJpbnRlbnRfaWQiOiJpbnRlbnQwMDEiLCJiZW5lZmljaWFyeV9oYW5kbGUiOiJkaWQ9ZGlkOndlYjpiLmV4YW1wbGU7YWxpYXM9YWxpYXMwMDEiLCJwYXltZW50X3Rlcm1zIjp7ImFtb3VudCI6IjEyNTAiLCJhbW91bnRfdW5pdHMiOiJtaW5vciIsImN1cnJlbmN5IjoiVVNEIn19.AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0-PwExpected output
| Value | Expected value |
|---|---|
| SHA-256 digest (hex) | 2bacaef571f381fca24ede5ee94171495991b04a0183e2067636ec3790c1e0a3 |
SHA-256 digest (base64url) / expected request_jws_sha256 | K6yu9XHzgfyiTt5e6UFxSVmRsEoBg-IGdjbsN5DB4KM |
14.3 Fixture B — Pull-payment authorization request
Raw artifact: fixture-b-pull-authorization-request.jws
Exact JWS Compact Serialization:
eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6by5leGFtcGxlI2sxIn0.eyJpc3MiOiJkaWQ6d2ViOm8uZXhhbXBsZSIsImF1ZCI6ImRpZDp3ZWI6Yi5leGFtcGxlIiwiaWF0IjoxNzYwMDAwMTAwLCJleHAiOjE3NjAwMDAxNjAsImp0aSI6Imp0aV8wMDAyIiwibWVzc2FnZV90eXBlIjoieW9uYS5hdXRob3JpemF0aW9uX3JlcXVlc3QiLCJydWxlc2V0X2lkIjoieW9uYTpydWxlc2V0OnYxLjAiLCJpbnRlbnRfaWQiOiJpbnRlbnQwMDIiLCJlbWJlZGRlZF9wYXltZW50X2ludGVudCI6eyJwYXltZW50X2ludGVudF9qd3MiOiJleUpoYkdjaU9pSkZaRVJUUVNKOS5leUpwYzNNaU9pSmthV1E2ZDJWaU9tSXVaWGhoYlhCc1pTSXNJbUYxWkNJNkltUnBaRHAzWldJNmJ5NWxlR0Z0Y0d4bElpd2liV1Z6YzJGblpWOTBlWEJsSWpvaWVXOXVZUzl3WVhsdFpXNTBYMmx1ZEdWdWRDSXNJbkpzWlhObGRGOXBaQ0k2SW5sdmJtRTZjbVZzWlhObGREcDJNUzR3SW4wLkFRSUQifX0.__79_Pv6-fj39vX08_Lx8O_u7ezr6uno5-bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwAExpected output
| Value | Expected value |
|---|---|
| SHA-256 digest (hex) | 1e743931eca57e09b9d627fa1633e3d74cfff7492553b8dfe677eba7bb287009 |
SHA-256 digest (base64url) / expected request_jws_sha256 | HnQ5Meylfgm51if6FjPj10z_90klU7jf5nfrp7socAk |
14.4 Fixture C — Authorization response referencing Fixture A
Raw artifact: fixture-c-authorization-response.jws
This fixture is a terminal yona.authorization_response whose request_jws_sha256 value equals the expected request_jws_sha256 derived from Fixture A.
Exact request_jws_sha256 value embedded in response:
K6yu9XHzgfyiTt5e6UFxSVmRsEoBg-IGdjbsN5DB4KMExact response JWS Compact Serialization:
eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6Yi5leGFtcGxlI2sxIn0.eyJpc3MiOiJkaWQ6d2ViOmIuZXhhbXBsZSIsImF1ZCI6ImRpZDp3ZWI6by5leGFtcGxlIiwiaWF0IjoxNzYwMDAwMDAxLCJleHAiOjE3NjAwMDAwNjEsImp0aSI6Imp0aV9yMDAxIiwibWVzc2FnZV90eXBlIjoieW9uYS5hdXRob3JpemF0aW9uX3Jlc3BvbnNlIiwicnVsZXNldF9pZCI6InlvbmE6cnVsZXNldDp2MS4wIiwiaW50ZW50X2lkIjoiaW50ZW50MDAxIiwiZGVjaXNpb24iOiJBQ0NFUFQiLCJyZXF1ZXN0X2p3c19zaGEyNTYiOiJLNnl1OVhIemdmeWlUdDVlNlVGeFNWbVJzRW9CZy1JR2RqYnNONURCNEtNIn0.CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQExpected output
| Value | Expected value |
|---|---|
| SHA-256 digest (hex) of the response JWS (optional cross-check) | e75bfbe77d5d6098aa201c494286000f2dd705daf9b103e219918b3b5cfdfe46 |
15. Deterministic REJECT vs NO_RESPONSE Decision Tables
15.1 Authorization endpoint (YonaAuthorizationService)
A beneficiary server receiving yona.authorization_request MUST apply the following logic:
| Condition | Can server preserve exact request bytes? | Can server extract iss, aud, and intent_id as strings from payload bytes? | Can server sign response? | Expected Behavior |
|---|---|---|---|---|
| Valid request; policy decision reached | Yes | Yes | Yes | Return HTTP 200 with signed bound terminal yona.authorization_response (ACCEPT or REJECT) |
| Invalid request (bad signature, expired, replayed signed message, wrong binding, invalid form, and so on), but bindable | Yes | Yes | Yes | Return HTTP 200 with signed bound terminal REJECT |
| Malformed JOSE body (not compact, bad base64url, not ASCII compact form) | No, or not meaningfully as valid compact JWS | No | N/A | Server MUST NOT return a YONA response message |
| Payload invalid UTF-8, non-JSON, or duplicate members prevent claim extraction | Yes | No | N/A | Server MUST NOT return a YONA response message |
Missing or invalid iss, aud, or intent_id prevents a structurally valid response | Yes | No | N/A | Server MUST NOT return a YONA response message |
| Server signing key unavailable or internal signing failure | Yes | Yes | No | Server MUST NOT return a YONA response message |
| Transport failure before response sent | Unknown | Unknown | Unknown | Server MUST NOT return a YONA response message |
Client interpretation (authorization flow):
- if no valid, verified terminal response is obtained by the cutoff, the outcome is
NO_RESPONSE NO_RESPONSEMUST be treated asREJECT
15.2 Payment-intent retrieval endpoint (YonaPaymentIntentService)
Because yona:ruleset:v1.0 does not define a retrieval-REJECT message type, this suite does not require any signed retrieval-REJECT message.
For each applicable condition below, client and server behavior MUST match the expected outcomes shown.
| Condition | Expected Server/Test Outcome | Expected Client Outcome |
|---|---|---|
Valid yona.retrieve_intent | Return valid yona.payment_intent | Verify and use it as the authoritative payment intent |
| Invalid retrieval request | No successful yona.payment_intent | MUST NOT proceed to authorization using locator-only data |
| Non-200, malformed response, or timeout | Retrieval failure | MUST NOT proceed to authorization using locator-only data |