Verify Module
Abstract
This document defines how an Authorizing Party receives, verifies, and authorizes a PaSO transaction. It specifies the proof package structure forwarded by the Relying Party, the verification procedure, and a standard endpoint for ingesting transactions.
1 Introduction
1.1 Overview
After the Wallet produces a presentation response, the Relying Party forwards the proof package to the Authorizing Party. This module defines what the proof package contains, how the Authorizing Party verifies it, and a standard HTTP endpoint for receiving it.
How the Relying Party obtains the Authorizing Party's public key and endpoint URI is out of scope of this document.
1.2 Requirements Notation
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] and [RFC8174] when, and only when, they are written in all capital letters.
2 Proof Package
The Relying Party SHALL forward the following to the Authorizing Party:
- The signed [OID4VP] Authorization Request ([JAR] Request Object) as sent to the Wallet, in its compact-serialised JWT form.
- The full
vp_tokenas received from the Wallet.
The Relying Party SHALL NOT modify either artefact. Section 4 defines a standard endpoint for forwarding; the applicable Transaction Data Type Rulebook MAY define alternative forwarding mechanisms.
3 Verification Procedure
Upon receiving the proof package, the Authorizing Party SHALL perform the following checks:
-
Request verification: Verify the signed Authorization Request JWT signature. Verify the Relying Party's identity from the request.
-
Credential verification: Verify the PaSO Credential in the
vp_token: - Validate the credential signature.
- Verify the credential has not expired.
-
Verify the credential has not been revoked.
-
Holder binding proof verification: Verify the holder binding proof (KB-JWT for [SD-JWT-VC], DeviceAuthentication for [mdoc]).
-
SCA response claims verification per [PaSO Core] Section 6.1:
transaction_data_hash: recompute the hash from thetransaction_dataentry in the Authorization Request and verify it matches.transaction_data_hash_alg: verify the algorithm is acceptable.request_integrity: recompute the [W3C.SRI] integrity value of the signed Authorization Request JWT and verify it matches.metadata_integrity: if present, verify it matches the [W3C.SRI] integrity value of the Attestation Provider's current signed credential metadata JWT for this credential.display_locale: verify that the locale matches a locale for which the credential metadata provides completedisplayentries.-
jti: verify uniqueness (the Authorizing Party SHOULD maintain a replay cache). -
Payload verification: Verify that the
transaction_dataentry'spayloadconforms to the applicable Transaction Data Type Rulebook. The specific checks are defined by the rulebook. -
Risk-signals verification per [PaSO Risk Signals] Section 6:
- Resolve the effective signal set for the matched transaction data type per [PaSO Risk Signals] Section 4.1: the union of every referenced risk signal profile, then tightened by any metadata or rulebook enumeration. Signal types are defined by [PaSO Risk Signal Registry].
- Verify that every signal resolved as required is present in the
risk_signalsclaim, with anystatus. The absence of a signal that did not resolve as required SHALL NOT be treated as a failure. - Verify each envelope is well-formed and that its
collected_atis no older than themax_ageresolved for that signal, measured from the time the proof package was received and allowing for reasonable clock skew and forwarding delay. Where nomax_agewas resolved, the acceptable window is a matter of Transaction Data Type Rulebook or Authorizing Party policy. - When
urn:paso:risk:global:amr:1is present, verify that the authentication methods it reports meet the requirements of the applicable Transaction Data Type Rulebook. - When
urn:paso:risk:global:response_mode:1is present, verify that its value matches theresponse_modeof the received Authorization Request. - Interpreting signal values to reach a risk decision is out of scope and left to Authorizing Party policy.
- When encryption is required for the transaction data type, verify that the
risk_signalsvalue is an encrypted structure and reject a plaintext value; the presence, well-formedness, freshness, and signal-specific checks above are performed by the holder of the issuer decryption key after decryption, as defined in [PaSO Risk Signals] Section 6.1. An Authorizing Party that is not the issuer therefore cannot perform theamrcheck — see [PaSO Risk Signals] Section 7.8.
If any check fails, the Authorizing Party SHALL reject the transaction.
4 Transaction Ingestion Endpoint
The Authorizing Party MAY expose an HTTP endpoint for receiving proof packages.
4.1 Request
The Relying Party SHALL send an HTTP POST request to the endpoint with:
- Content-Type:
application/josewhen encrypted per Section 4.3, orapplication/jsonotherwise. - Body: The proof package as defined below.
When the body is application/json, it SHALL have the following structure:
{
"signed_request": "<compact-serialised Authorization Request JWT>",
"vp_token": "<vp_token as received from the Wallet>"
}
signed_request: REQUIRED. The signed [OID4VP] Authorization Request in compact JWT serialisation.vp_token: REQUIRED. Thevp_tokenas received from the Wallet.
4.2 Response
The endpoint SHALL respond with:
200 OK— the transaction was accepted.400 Bad Request— the proof package is malformed or a verification check failed. The response body SHOULD be a JSON object with anerrorfield describing the failure.401 Unauthorized— the Relying Party could not be authenticated.409 Conflict— thejtihas already been processed (replay).
4.3 Encryption
The Relying Party SHOULD encrypt the proof package as a [JWE] compact serialisation. The JWE SHALL be:
- signed by the Relying Party using its trust chain,
- encrypted to the Authorizing Party's public key, so that only the Authorizing Party can decrypt it.
The JWE payload is the JSON proof package defined in Section 4.1. The JOSE header SHALL include the Relying Party's certificate chain in the x5c parameter.
How the Relying Party obtains the Authorizing Party's public key is out of scope of this document.
5 References
| Reference | Description |
|---|---|
| [PaSO Core] | PaSO Core |
| [PaSO Proof Metadata] | PaSO Proof: Metadata Module |
| [PaSO Risk Signals] | PaSO Proof: Risk Signals Module |
| [PaSO Risk Signal Registry] | PaSO Proof: Risk Signal Registry |
| [OID4VP] | OpenID for Verifiable Presentations 1.0 |
| [JAR] | RFC 9101 — JWT-Secured Authorization Request |
| [JWE] | RFC 7516 — JSON Web Encryption |
| [SD-JWT-VC] | SD-JWT-based Verifiable Credentials |
| [mdoc] | ISO/IEC 18013-5:2021 — Mobile driving licence application |
| [RFC2119] | RFC 2119 — Key words for use in RFCs |
| [RFC8174] | RFC 8174 — Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words |
| [W3C.SRI] | Subresource Integrity |