Package-level declarations
The wallet (Wallet, WalletConfiguration), its sessions (Issuance, Presentation, MdocPresentation, ProximityPresentation), the reader (ProximityReader), the platform interfaces and their standard implementations, and the results they return.
Types
The wallet's keys, in Android Keystore: P-256 keys whose private halves never leave its secure hardware — StrongBox where the device has it (Options.strongBox), else the TEE. Each key's ID is its Keystore alias after Options.aliasPrefix. Keys are usable only while the device is unlocked, and holder keys, if Options.holderUserAuthentication, each time they sign only after authenticator has authenticated the holder: the store refuses to be made without one then.
The system's biometric prompt over the app's current activity (activity's, null when none is showing), allowing a strong biometric or the screen lock, as Face ID or the passcode on iOS.
A credential with its claims, for display.
How to show a credential, from the issuer's metadata (OpenID4VCI 1.0 §12.2.4) in the holder's language: each part only when the issuer gives it. Colours are CSS colours, such as "#12107c".
A credential's revocation status in the issuer's status list, as last checked (Wallet.checkStatus).
The wallet's credentials, as opaque records kept by ID under the platform's data protection. An exception it throws reaches Go and comes back as a WalletException.Code.platform error.
A credential the wallet holds, as the app shows it.
A credential an issuer will issue later (OpenID4VCI 1.0 §9). It's kept in the credential store until it's issued, denied or abandoned, so it survives the app quitting.
A deferred credential's state, from Wallet.pollDeferred.
Credential Manager's side of the Digital Credentials API: what an app needs so Chrome, or another app, can ask the wallet for a credential.
A credential store of files: one per credential record, in a directory of the app's (noBackupFilesDir/credentials, by default, which no backup or device transfer copies). Each record is encrypted (AES-256-GCM, its ID as associated data) under an Android Keystore key that, by default, works only while the device is unlocked — iOS's complete file protection. A credential is useless without its holder key, which is in this device's Keystore and can't be restored elsewhere; so is a record without the store's key.
Authenticates the holder for one signature by a holder key: a key that needs the holder's biometrics or screen lock for each use. The key store calls it on Go's thread, which waits. BiometricPromptAuthenticator is the standard one.
A credential store in memory, for tests and development.
Receives one offer's credentials: show offer; then beginAuthorization, open the URL in an Auth Tab or Custom Tab and completeAuthorization, or redeemPreAuthorizedCode; then requestCredentials; close when done. An issuance dropped without close leaves its keys until Wallet.sweepOrphanedKeys.
ECDH with the wallet's holder keys inside the key store, for deviceMac in person (ISO/IEC 18013-5 §9.1.3.5). A KeyStore that is also one is used for it when WalletConfiguration.proximityDeviceAuth is WalletConfiguration.ProximityDeviceAuth.MAC_PREFERRED.
A key that can't agree keys: the wallet signs instead of using a MAC.
What a key is for.
The wallet's keys: P-256 keys whose private halves never leave the store (Android Keystore). An exception it throws reaches Go and comes back as a WalletException.Code.platform error. Go calls it on its own thread, never the main one.
What a Credential Offer offers.
One claim path element: a key, an array index, or every element.
Answers one OpenID4VP request: show verifier, queries and credentialSets, choose a selection (or start from defaultSelection), preview it, then respond or decline. The wallet presents exactly the selection, after checking it answers the request (WalletException.Code.invalidSelection otherwise).
The BLE roles a holder offers in its QR code (ISO/IEC 18013-5 §8.3.3.1.1); the reader picks one, central client mode when offered both.
An in-person session failed over Bluetooth, rather than in the protocol (WalletException).
The runtime permissions an in-person session needs, for the app to request.
The holder's side of an ISO/IEC 18013-5 in-person presentation over BLE: show qrCode, and the reader that scans it connects, or advertises for the holder to connect, in one of the ProximityBLEModes the session offers. Follow state: on State.RequestReceived, ask the holder, then respond or decline. cancel ends it at any point. One request per session.
An ISO/IEC 18013-5 mdoc reader: a verifier asking for an mdoc in person over BLE. It needs no Wallet. keyStore holds the reader's key, ProximityReaderConfiguration.readerKeyID; null for a reader that doesn't sign.
A ProximityReader's configuration.
Who sent a request, as the holder sees it.
One reader session: follow state to State.Verified or another final state.
How long an in-person session waits (ISO/IEC 18013-5 recommends at least 30 seconds from engagement to the request, §8.2.3, and 300 seconds of inactivity before ending a session, §9.1.1.4).
An OpenID4VP request link's parts.
A store's or provider's own failure.
A verified mdoc, as a ProximityReaderSession received it.
A holder's wallet: OID4VCgo's walletflow over the app's key store, credential store and Wallet Provider. Creating it makes no network calls; provider is needed to receive credentials, not to present them.
NewWallet's configuration.
An error from OID4VCgo: a stable code, the issuer's, Authorization Server's or Verifier's own error code when it gave one (protocolError), and a message for logs: it never carries personal data, a remote party's own description, a URL's path or query, or control characters. description is a sentence fit to show the holder; isRetryable says whether trying the same step again may succeed.
The Wallet Provider's backend, which attests the wallet and its keys (HAIP 1.0 §4.4.1, §4.5.1). Keys are public JWKs, as JSON; the results are compact JWTs. A real one attests only after checking platform evidence (Key Attestation) that it's talking to the genuine app.