Skip to content

Introduce Multipaz Pass file format.#1658

Merged
davidz25 merged 1 commit intomainfrom
mpzpass
Mar 26, 2026
Merged

Introduce Multipaz Pass file format.#1658
davidz25 merged 1 commit intomainfrom
mpzpass

Conversation

@davidz25
Copy link
Copy Markdown
Contributor

The Multipaz .mpzpass file format provides a standardized, lightweight mechanism for the exchange of low-assurance verifiable credentials.

In scenarios where strict cryptographic device-binding introduces unnecessary friction — such as when a user expects their digital assets to seamlessly synchronize across their entire ecosystem of devices — this format offers a pragmatic, portable solution. It is engineered specifically for use cases where the risk of credential sharing is negligible, such as event and movie ticketing, transit passes, or generic membership cards.

This format explicitly trades anti-cloning guarantees for portability. Because the credential data and any associated keys are stored in a highly portable container, the credential can be trivially copied.

For high-value credentials where cloning or replay attacks are active threat vectors (e.g., mobile driving licenses or financial instruments), this file format is inherently unsuitable. In those high-assurance scenarios, issuers must leverage a robust provisioning protocol like OpenID4VCI to ensure secure delivery and hardware-backed device-binding at the time of issuance.

This PR has three main components

  • Defintion of the format with example files, in the mpzpass directory
  • Support routines and import/export in the core Multipaz library
  • Support in TestApp for generating and importing .mpzpass files

This PR also fixes problems with the compose TestApp on iOS and it also makes Credential.replacementForDeleted() internal which it should have been from the start.

Test: Unit test and manually tested on both Android and iOS.

@davidz25 davidz25 requested a review from sorotokin March 25, 2026 15:35
@davidz25 davidz25 force-pushed the mpzpass branch 3 times, most recently from 1bac522 to 45dae96 Compare March 25, 2026 22:14
@davidz25 davidz25 marked this pull request as draft March 25, 2026 22:31
@davidz25 davidz25 marked this pull request as ready for review March 25, 2026 22:31
@davidz25 davidz25 marked this pull request as draft March 25, 2026 22:31
The Multipaz `.mpzpass` file format provides a standardized, lightweight
mechanism for the exchange of low-assurance verifiable credentials.

In scenarios where strict cryptographic device-binding introduces unnecessary
friction — such as when a user expects their digital assets to seamlessly
synchronize across their entire ecosystem of devices — this format offers
a pragmatic, portable solution. It is engineered specifically for use cases
where the risk of credential sharing is negligible, such as event and movie
ticketing, transit passes, or generic membership cards.

This format explicitly trades anti-cloning guarantees for portability. Because
the credential data and any associated keys are stored in a highly portable
container, the credential can be trivially copied.

For high-value credentials where cloning or replay attacks are active threat
vectors (e.g., mobile driving licenses or financial instruments), this file
format is inherently unsuitable. In those high-assurance scenarios, issuers
must leverage a robust provisioning protocol like
[OpenID4VCI](https://github.com/openid/OpenID4VCI) to ensure secure delivery
and hardware-backed device-binding at the time of issuance.

This PR has three main components

- Defintion of the format with example files, in the `mpzpass` directory
- Support routines and import/export in the core Multipaz library
- Support in TestApp for generating and importing `.mpzpass` files

Additionally, extend `SimplePresentmentSource` to support more than
one domain for a given credential type. This is needed because if
using this to import a credential with a software-backed key and the
app already has a domain for with and without user authentication (and
the domain is picked according to a setting of whether user
authentication should be used), the software-backed credential (which
never has any user authentication) need to be consulted in both cases.

This PR also fixes problems with the compose TestApp on iOS and it
also makes Credential.replacementForDeleted() internal which it should
have been from the start.

Test: Unit test and manually tested on both Android and iOS.
Signed-off-by: David Zeuthen <zeuthen@google.com>
@davidz25 davidz25 marked this pull request as ready for review March 26, 2026 12:18
@davidz25 davidz25 merged commit 3fb63a8 into main Mar 26, 2026
3 checks passed
@davidz25 davidz25 deleted the mpzpass branch March 26, 2026 13:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants