- Added
backgroundOnlyparameter toreissueDocumentmethod. When set totrue, reissuance only proceeds if stored authorization data is available; otherwise it throws an error. This enables automatic credential refresh without user interaction. - DPoP key ID is now propagated through the issuance flow and persisted in document metadata, enabling DPoP-protected refresh and reissuance flows.
let reissued = try await wallet.reissueDocument(
documentId: existingDocument.id,
backgroundOnly: true, // only reissue if stored auth exists
credentialOptions: credentialOptions, // optional, defaults to original
keyOptions: keyOptions, // optional, defaults to original
)
// Background reissuance - only succeeds if stored authorization exists
let reissued = try await wallet.reissueDocument(
documentId: existingDocument.id,
backgroundOnly: true,
)- Fixed issue where KB-JWT
audclaim used a stripped DID instead of the fullclient_idfor thedecentralized_identifierscheme. The session transcript and KB-JWT now correctly include the resolved client identifier. Fixes #308.
eudi-lib-sdjwt-swiftupdated to 0.14.1eudi-lib-ios-siop-openid4vp-swiftupdated to 0.30.1eudi-lib-ios-iso18013-data-transferupdated to 0.11.2eudi-lib-ios-statium-swiftupdated to 0.4.0
- Added
reissueDocument(documentId:credentialOptions:keyOptions:promptMessage:)method toEudiWalletfor reissuing an existing document using previously stored issuance metadata and authorization data.- Retrieves the document's metadata from storage and resolves the appropriate OpenID4VCI service via the credential issuer identifier.
- If persisted authorization data is available, it is forwarded to the service to avoid re-authentication.
- Falls back to the original issuance metadata for
credentialOptionsandkeyOptionswhen not explicitly provided.
let reissued = try await wallet.reissueDocument(
documentId: existingDocument.id,
credentialOptions: credentialOptions, // optional, defaults to original
keyOptions: keyOptions, // optional, defaults to original
)StorageManager.recreateSdJwtClaimsnow recursively resolves nested_sddigest arrays in SD-JWT claims. Previously, only top-level disclosures were resolved; nested objects inside arrays (e.g.,address[0]) retained raw_sdhashes instead of the actual claim values.- SD-JWT presentations via OpenID4VP now selectively disclose only the claims requested in the DCQL query
docModelsis a@Publishedproperty holding an array of concreteDocClaimsModelobjects representing all issued documents currently loaded in the wallet.
- Update
eudi-lib-ios-openid4vci-swiftdependency to version 0.30.0 - Fix for issue #296
- Supports zero-knowledge proof generation by using a provided
ZkSystemRepository - Extracts ZKP specs from DCQL request.
- Tracks ZKP document IDs through presentation flow. Skip deleting credentials used as ZKP documents
- Add optional
zkSystemRepository: ZkSystemRepository?parameter toEudiWalletinitializer. When provided, it is used during the presentation flow to enable zero-knowledge proof operations. - Add
waitForDisconnectmethod toPresentationSessionto prevent the session from being disposed while the remote device is still connected. This method should be called aftersendResponse. In BLE presentations, it awaits until the remote verifier disconnects; in OpenID4VP presentations, it returns immediately. - BLE peripheral manager now uses
CBPeripheralManagerOptionShowPowerAlertKeyto automatically prompt the user to enable Bluetooth if it is turned off when starting a BLE presentation. getIssuerMetadata,issueDocuments,getDefaultCredentialOptions,requestDeferredIssuance, andresumePendingIssuancenow fall back to resolving the VCI service by issuer URL when the name-based lookup fails, improving service discovery for dynamically registered issuers. Also, offer resolution was modified to register credential issuer url directly instead of host name.
EudiWalletConfiguration.trustedReaderCertificatesrenamed and retyped: The propertytrustedReaderCertificates: [Data]?has been replaced bytrustedReaderRootCertificates: [x5chain]?. A x5chain is usually a rootSecCertificatebut may include intermediate certificates.
- Updated "eudi-lib-ios-iso18013-data-transfer" and "eudi-lib-ios-wallet-storage" package dependencies to version 0.10.0
- Refactored document handling in OpenId4VP and related services to use
Document.IDfor improved type safety and clarity - Introduce
zkpDocumentIdsproperty onPresentationServiceand concrete services (BlePresentationService,FaultPresentationService,OpenId4VpService)generateCborVpTokennow returns ZKP document IDs;OpenId4VpServiceaggregates themPresentationSession.updateKeyBatchInfoAndDeleteCredentialIfNeedednow acceptsDocument.IDs and an optionalzkpDocumentIdslist
-
Fixed bug in #291 when more than one identical attestation is successfully presented to the verifier. Previously, only a single entry per "type" appears in the Transactions tab. For example, the screenshots show 2 mDL and 3 PID attestations, all successfully presented, but only 1 of each is listed in the Transactions.
-
Fallback to sha-256 hashing algorithm if sd-alg does not exist by @dtsiflit in #293
Fixed bug when more than one identical attestation is successfully presented to the verifier. Previously, only a single entry per "type" appears in the Transactions tab. For example, the screenshots show 2 mDL and 3 PID attestations, all successfully presented, but only 1 of each is listed in the Transactions.
- Enhance OpenID4VCI service registration with fallback to the first available configuration by @phisakel in #288
When the issuer doesn't match any pre-configured service, fall back to the first available service's configuration (inheriting client auth, attestation config, etc.) with the issuer URL overridden. This mirrors the Android wallet behavior where the fallback manager strategy carries over to unknown issuers.
- Wallet storage document deletion bug fix
authFlowRedirectionURI parameter added to resolveOfferUrlDocTypes method of EudiWallet
public func resolveOfferUrlDocTypes(offerUri: String, authFlowRedirectionURI: URL?) - Updated
eudi-lib-sdjwt-swiftto version 0.13.0 - Updated
eudi-lib-ios-openid4vci-swiftto version 0.20.0 - Updated
eudi-lib-openid4vp-swiftto version 0.20.0 - Updated
eudi-lib-statium-swiftto version 0.3.0
-
Swift Version Requirement: Updated minimum Swift version to 6.2
- Updated
Package.swiftswift-tools-version from 6.0 to 6.2
- Updated
-
EudiWallet Initialization Refactoring: Introduced
EudiWalletConfigurationstruct for consolidated wallet configuration-
New struct:
EudiWalletConfigurationconsolidates all wallet-level configuration parameters:serviceName: String- The service name for the keychain (default: "eudiw")accessGroup: String?- The access group for keychain sharinguserAuthenticationRequired: Bool- Whether user authentication is required (default: false)trustedReaderCertificates: [Data]?- Trusted reader certificatesdeviceAuthMethod: DeviceAuthMethod- Device authentication method (default: .deviceSignature)uiCulture: String?- UI culture for localizationlogFileName: String?- Log file name for logging
-
Updated initializer:
EudiWalletnow takeseudiWalletConfig: EudiWalletConfigurationparameter instead of individual configuration parameters
let config = EudiWalletConfiguration( serviceName: "my_wallet_app", userAuthenticationRequired: true, trustedReaderCertificates: certs ) let wallet = try! EudiWallet(eudiWalletConfig: config)
-
-
Document Issuance API Changes:
- Removed single document issuance method signature that accepted individual parameters
- Use
issueDocuments(issuerName:docTypeIdentifiers:credentialOptions:keyOptions:promptMessage:)instead for issuing one or more documents
let docs = try await wallet.issueDocuments( issuerName: "eudi_pid_issuer", docTypeIdentifiers: [.msoMdoc(docType: EuPidModel.euPidDocType)], credentialOptions: credentialOptions, keyOptions: keyOptions ) let pidDoc = docs.first!
-
OpenId4VciConfiguration Changes:
- Removed
cacheIssuerMetadata: Boolparameter (issuer metadata is now always cached)
- Removed
-
Multiple Document Issuance: Added
issueDocumentsmethod for issuing multiple documents in a single operation- Method signature:
issueDocuments(issuerName:docTypeIdentifiers:credentialOptions:keyOptions:promptMessage:) async throws -> [WalletStorage.Document] - Efficiently issues multiple documents from the same issuer by creating a single credential offer
- Supports mixed document types (mso_mdoc and sd-jwt-vc)
let documents = try await wallet.issueDocuments( issuerName: "eudi_pid_issuer", docTypeIdentifiers: [ .identifier("eu.europa.ec.eudi.pid_mdoc"), .identifier("eu.europa.ec.eudi.pid_vc_sd_jwt") ], credentialOptions: credentialOptions, keyOptions: keyOptions )
- Method signature:
- Fixed keys attestation (WUA)
-
Dependency Updates:
-
Document Status Service Enhancements:
- Added
clockSkewparameter toDocumentStatusServiceinitializer (default: 60 seconds) to handle time differences when validating status list tokens - Updated status verification to use
clockSkewparameter for improved reliability
- Added
-
Client Attestation Refactoring:
- Refactored PoP (Proof-of-Possession) constructor method in
OpenId4VciConfiguration - Renamed
makeDPoPConstructortomakePoPConstructorand added aPopUsageparameter. Use attestation key options instead of DPoP-specific key options for the.clientAttestationcase.
- Refactored PoP (Proof-of-Possession) constructor method in
- Fixed device authentication for OpenID4VP. Session transcript calculation was fixed.
- Removed SIOPv2 support.
- Fixed OpenID4VP bug for direct post response mode.
- DCQL query handling improvements (supports claim_sets and credentials_sets).
- SD-JWT data model: Include index in path for array child elements
-
Client Attestation Support: Added support for Wallet Instance Attestation and Wallet Unit Attestation
-
New struct:
KeyAttestationConfigfor configuring client attestation- Property
walletAttestationsProvider: WalletAttestationsProvider- Provider for wallet and key attestations - Property
popKeyOptions: KeyOptions?- Optional key options for PoP key generation - Property
popKeyDuration: TimeInterval?- Optional duration for PoP JWT validity (default: 300 seconds)
- Property
-
New protocol:
WalletAttestationsProviderwith two required methods:func getWalletAttestation(key: any JWK) async throws -> String- Obtain wallet instance attestation JWT for a given public keyfunc getKeysAttestation(keys: [any JWK], nonce: String?) async throws -> String- Obtain unit attestation JWT for multiple keys
-
-
OpenId4VciConfiguration changes:
- Removed
client: Clientparameter - Added
clientId: String?parameter (defaults to "wallet-dev") - Added
keyAttestationsConfig: KeyAttestationConfig?parameter for client attestation configuration
- Removed
let config = OpenId4VciConfiguration(
credentialIssuerURL: "https://issuer.example.com",
clientId: "my-wallet-client",
keyAttestationsConfig: KeyAttestationConfig(
walletAttestationsProvider: MyAttestationProvider(),
popKeyDuration: 300
)
)- VP Handover and SessionTranscript by @craigaps
- eudi-lib-sdjwt-swift dependency updated to version 0.10.1
-
Client Attestation Support: Added support for OAuth 2.0 Attestation-Based Client Authentication
-
New struct:
KeyAttestationConfigfor configuring client attestation- Property
walletAttestationsProvider: WalletAttestationsProvider- Provider for wallet and key attestations - Property
popKeyOptions: KeyOptions?- Optional key options for PoP key generation - Property
popKeyDuration: TimeInterval?- Optional duration for PoP JWT validity (default: 300 seconds)
- Property
-
New protocol:
WalletAttestationsProviderwith two required methods:func getWalletAttestation(key: any JWK) async throws -> String- Obtain wallet attestation JWT for a given public keyfunc getKeysAttestation(keys: [any JWK], nonce: String?) async throws -> String- Obtain key attestation JWT for multiple keys with optional nonce
-
-
OpenId4VciConfiguration changes:
- Removed
client: Clientparameter - Added
clientId: String?parameter (defaults to "wallet-dev") - Added
keyAttestationsConfig: KeyAttestationConfig?parameter for client attestation configuration
- Removed
let config = OpenId4VciConfiguration(
credentialIssuerURL: "https://issuer.example.com",
clientId: "my-wallet-client",
keyAttestationsConfig: KeyAttestationConfig(
walletAttestationsProvider: MyAttestationProvider(),
popKeyDuration: 300
)
)- Updated
eudi-lib-ios-openid4vci-swiftto version 0.18.0 - Updated
eudi-lib-sdjwt-swiftto version 0.10.0
- Enhanced DPoP constructor to support RSA keys in addition to EC keys
- Improved key management for client attestation with deterministic key ID generation
- Update eudi-lib-ios-siop-openid4vp-swift to version 0.18.0
- Adds
redirectUrias part of supportedclientIdSchemes - Adds support for
.directPost.
- update eudi-lib-ios-openid4vci-swift dependency to version 0.16.2
- update siop-openid4vp dependency to version 0.17.7
-
Multi-issuer support: All OpenID4VCI methods now require an
issuerNameparameter to support multiple issuer configurations:issueDocument(issuerName:docTypeIdentifier:credentialOptions:keyOptions:promptMessage:)- AddedissuerNameparametergetDefaultCredentialOptions(issuerName:docTypeIdentifier:)- AddedissuerNameparameterrequestDeferredIssuance(issuerName:deferredDoc:credentialOptions:keyOptions:)- AddedissuerNameparameterresumePendingIssuance(issuerName:pendingDoc:webUrl:credentialOptions:keyOptions:)- AddedissuerNameparametergetIssuerMetadata(issuerName:)- AddedissuerNameparameter
-
Initializer changes:
- Replaced
openID4VciIssuerUrlandopenID4VciConfigparameters withopenID4VciConfigurations: [String: OpenId4VciConfiguration]? - Enables configuration of multiple OpenID4VCI issuers with different settings
- Replaced
-
Offer URL resolution:
issueDocumentsByOfferUrl(offerUri:docTypes:txCodeValue:promptMessage:configuration:)- Added optionalconfigurationparameter
-
OpenId4VCI Service registration: New
func registerOpenId4VciServices(_ configurations: [String: OpenId4VciConfiguration])method for dynamic issuer service registration -
Refactoring: Major refactoring of OpenID4VCI service architecture for improved modularity
- VCI Methods refactoring: Moved credential issuance logic from
EudiWalletintoOpenId4VciServicefor better separation of concerns (commit: bfec6e5) - Code organization: Better separation between wallet-level operations and service-level OpenID4VCI protocol handling
- Improved maintainability: Consolidated related functionality and reduced code duplication across components
- Improved thread safety: OpenID4VCI service is now an actor
- VCI Methods refactoring: Moved credential issuance logic from
- do not fail SdJwt presentation when query is empty
- fix credential identifier issue
- Add
claimsproperty toOfferedDocModelstruct
- update eudi-lib-ios-openid4vci-swift to version 0.16.1
- enhance sd-jwt parsing to support Jws Json format
- Do not send expired documents with BLE or OpenID4VP
- Fix BLE sharing issue
- Fix to show all mandatory elements of sd-jwt document during sharing
- The wallet can be configured with OpenID4VCI options including DPoP (Demonstrating Proof-of-Possession) support and key options for DPoP key generation:
// Configure OpenID4VCI with DPoP support
let openID4VciConfig = OpenId4VCIConfiguration(
useDpopIfSupported: true, // Enable DPoP if supported by issuer (default: true)
dpopKeyOptions: KeyOptions(
secureAreaName: "SecureEnclave", curve: .P256, accessControl: .requireUserPresence
)
)- Breaking change: Batch size and credential policy are passed with a
CredentialOptionsparameter:issueDocument(docTypeIdentifier:credentialOptions:keyOptions:promptMessage:)getDefaultCredentialOptions(_:)requestDeferredIssuance(deferredDoc:credentialOptions:keyOptions:)resumePendingIssuance(pendingDoc:webUrl:credentialOptions:keyOptions:)beginIssueDocument(id:credentialOptions:keyOptions:bDeferred:)
- Update eudi-lib-ios-siop-openid4vp-swift dependency to 0.17.6
- Feature: Added DPoP configuration support
- Added
useDpopIfSupportedproperty toOpenId4VCIConfigurationto enable/disable DPoP usage (default:true) - Conditionally use DPoP constructor based on the
useDpopIfSupportedconfiguration setting - DPoP is now only used when both supported by the issuer and enabled in the configuration
- Added
- Fix deferred issuance bug
- Breaking change: Updated OpenID4VCI to version 0.16.0 with support for OpenID4VCI v1.0 specification
- Updated
eudi-lib-ios-openid4vci-swiftfrom version 0.7.6 to 0.16.0 - Implemented changes for OpenID4VCI v1.0 specification compatibility:
- Updated deferred credential issuance handling to support new API with separate
transactionIdandintervalparameters - Enhanced credential metadata access through new
ConfigurationCredentialMetadatastructure - Added support for new
issuanceStillPendingcase in deferred credential flows - Improved error handling and logging for deferred credential scenarios
- Updated deferred credential issuance handling to support new API with separate
- Updated
- Updated
eudi-lib-sdjwt-swiftfrom version 0.8.0 to 0.9.1
- Update dependency versions
- Updated
eudi-lib-ios-iso18013-data-transferfrom version 0.8.0 to 0.8.1 - Updated
eudi-lib-ios-siop-openid4vp-swiftfrom version 0.17.3 to 0.17.5
- Updated
- Enhanced CBOR document validation
- Perform CBOR document validation logic in
EudiWallet,validateIssuedDocumentsmethod:- CBOR element digest values are compared against the digest values provided in the issuer-signed Mobile Security Object (MSO) section of the document to ensure integrity and authenticity.
- MSO Signature is validated.
- MSO Validity info dates are validated.
- Doc type in MSO is the same as the doc type of the issued document.
- Perform CBOR document validation logic in
- feat: introduce OpenID4VP configuration and refactor related classes
- Added new
OpenId4VpConfigurationmodel with support for different client identifier schemes - Introduced
ClientIdSchemeenum supporting preregistered clients, X.509 certificate validation (SAN DNS and hash), and redirect URI validation - Breaking change: Refactored
EudiWalletinitialization and property to use aOpenId4VpConfigurationparameter instead of separateverifierApiUriandverifierLegalNameparameters, for example:wallet.openID4VpConfig = OpenId4VpConfiguration(clientIdSchemes: [.x509SanDns]) - Added convenience initializer for
PreregisteredClientfrom SiopOpenID4VP library - Updated related services to work with the new configuration structure
- Added new
- Fix: Throw error if one of the requested doc types is not present and credentialSets is nil
- Error reason provided when OpenID4VP response is rejected
- Fix CBOR log document claim decoding logic
- Fix transaction logs decoding
- Update eudi-lib-ios-siop-openid4vp-swift dependency to version 0.17.2
- Update eudi-lib-ios-siop-openid4vp-swift to 0.17.0 and enhance certificate verification
- Fixes bug for sd-jwt documents array values not transfered with online presentation e.g. nationalities for PID
- Updated OpenID4VP library to version v0.16.0 and adjusted wallet kit accordingly.
- Update eudi-lib-ios-openid4vci-swift to 0.15.4
- Added property
var credentialPocily: CredentialPolicytoDocClaimsDecodable - fix for removing port from URL (issue #215)
- Update the eudi-lib-ios-siop-openid4vp-swift dependency to version 0.15.1 (JARM fix)
-
Updated eudi-lib-ios-siop-openid4vp-swift library to version v0.15.0
-
Updated eudi-lib-ios-openid4vci-swift library to version v0.15.2
-
Breaking change: Removed
EudiWalletpropertyverifierRedirectUri
- Improved WalletError structure: Refactored
WalletErrorfrom enum to struct with property to support localization:public let localizationKey: String?. - Enhanced error logging: Added
logger.errorstatements before allthrowstatements across the wallet codebase to improve debugging capabilities.
- Fix for presentations based on DCQL query
- Fixed failure to issue documents with credential offer when the authorization server defined in the offer uses DPoP.
- Fixed credential offer issuance to use batch size passed to
issueDocumentsByOfferUrl.
- Updated eudi-lib-sdjwt-swift library to version v0.7.2
- Updated dPoP constructor logic and added RS256 algorithm
DocClaimsDecodablehas a new propertyvar credentialsUsageCounts: CredentialsUsageCounts?This property provides information about the number of remaining presentations available for a document, based on its credential policy. It is useful for documents issued with a one-time use policy, where it returns the number of remaining presentations available. For documents with a rotate-use policy, it returns nil as there's no usage limit.- Deprecated
getCredentialsUsageCountmethod inEudiWallet. Use the newcredentialsUsageCountsproperty instead.
- Configurable metadata caching: Added
cacheIssuerMetadata: Boolparameter toOpenId4VCIConfiguration(defaults totrue). This flag controls whether issuer metadata should be cached in memory during the session.
DocClaimsDecodablemodels are backed by classes instead of structs to ensure proper reference semantics. This allows thecredentialsUsageCountsproperty to be updated correctly without requiring a full reload of the document claims.- Fixed issue with getting issuer metadata from wrong server when a url offer is used with different server than the default one.
- Library
eudi-lib-ios-openid4vci-swifthas been updated to version 0.15.1 - DPoP constructor is always passed.
- Issuer metadata caching: Added caching to
OpenId4VCIService.getIssuerMetadatato improve performance by storing successful issuer metadata results in memory and avoiding redundant network requests during the same session. The cache is automatically cleared after changing issuerUrl.
- When the
getCredentialsUsageCountmethod is called, if the remaining count is 0, thevalidUntilproperty of the credential is now correctly set tonil.
The getDefaultKeyOptions and issueDocument method signatures have been updated to accept a single DocTypeIdentifier parameter instead of separate docType, scope, and identifier parameters for improved type safety and API consistency.
The getDefaultKeyOptions method queries the issuer to retrieve the recommended key configuration for a specific document type identifier.
The returned KeyOptions can be used when issuing documents with issueDocument.
let keyOptions = try await wallet.getDefaultKeyOptions(docType, scope: scope, identifier: identifier)
let document = try await wallet.issueDocument(docType: docType, scope: scope, identifier: identifier, keyOptions: keyOptions)let keyOptions = try await wallet.getDefaultKeyOptions(.msoMdoc("org.iso.18013.5.1.mDL"))
let document = try await wallet.issueDocument(.msoMdoc("org.iso.18013.5.1.mDL"), keyOptions: keyOptions)
// or
let keyOptions = try await wallet.getDefaultKeyOptions(.sdJwt(vct: "urn:eudi:pid:1"))
let document = try await wallet.issueDocument(.sdJwt(vct: "urn:eudi:pid:1"), keyOptions: keyOptions)
// or
let keyOptions = try await wallet.getDefaultKeyOptions(.configurationIdentifier("eu.europa.ec.eudi.cor_mdoc"))
let document = try await wallet.issueDocument(.configurationIdentifier("eu.europa.ec.eudi.cor_mdoc"), keyOptions: keyOptions)- EudiWallet initialization parameter change: The
urlSessionparameter has been replaced withnetworkingparameter- Old:
urlSession: URLSession? = nil - New:
networking: (any NetworkingProtocol)? = nil - This allows for custom networking implementations while maintaining URLSession compatibility
- Old:
- Added
NetworkingProtocolthat abstracts network operations- Provides
data(from url: URL)anddata(for request: URLRequest)methods URLSessionconforms toNetworkingProtocolby default for backward compatibility
- Provides
- Split networking into separate VCI and VP clients:
networkingVci: OpenID4VCINetworking- For OpenID4VCI operationsnetworkingVp: OpenID4VPNetworking- For OpenID4VP operations
- Both networking clients wrap the provided
NetworkingProtocolimplementation
- Added property
static var supportedEcCurves: [CoseEcCurve]
- Fix for issue #187
- Fix for issue #190
- Fix for issue #195
- Fix for issue: Attestation with 0 instances still triggers share flow
- Fix for issue: Expiration date shown despite no available attestations
- Fix for issue: When there is no matching attestation for BLE transfer, the QR code is still displayed.
-- Fixed redirect_uri clientId scheme handling
- Added
verifierRedirectUri: String?property toEudiWallet.- This property stores the OpenID4VP verifier redirect URI, used for redirectUri clients in OpenID4VP flows.
- Updated the logic to ensure that only one-time credentials for documents that have been presented are deleted.
- When multiple documents were issued many times the 'Fatal error: Unexpectedly found nil while unwrapping an Optional value' occurred.
- Use exact versions for dependencies
/// Issue documents by offer URI.
/// - Parameters:
/// - offerUri: url with offer
/// - docTypes: offered doc models available to be issued. Contains key options (secure are name and other options)
/// - txCodeValue: Transaction code given to user (if available)
/// - promptMessage: prompt message for biometric authentication (optional)
/// - Returns: Array of issued and stored documents
public func issueDocumentsByOfferUrl(offerUri: String, docTypes: [OfferedDocModel], txCodeValue: String? = nil, promptMessage: String? = nil) async throws -> [WalletStorage.Document] {Example usage:
// When resolving an offer, key options are now included
let offer = try await wallet.resolveOfferUrlDocTypes(uriOffer: offerUrl)
for docModel in offer.docModels {
// use recommended key options or modify them
let docTypes = offer.docModels.map { $0.copy(keyOptions: KeyOptions(credentialPolicy: .oneTimeUse, batchSize: 2))
// Issue with optimal settings
let newDocs = try await wallet.issueDocumentsByOfferUrl(offerUri: offerUrl, docTypes: docTypes, txCodeValue: txCode)
}identifier: String?- Issuer configuration identifier for the credentialkeyOptions: KeyOptions- Default key options (batch size and credential policy) recommended by the issuer
docTypeOrVctOrScoperenamed todocTypeOrVctOrScope- Now returns docType, vct, or scope in priority order
EudiWallet added method: public func getCredentialsUsageCount(id: String) async throws -> CredentialsUsageCounts?
Gets a document's remaining credentials, available for presentation count This method retrieves usage count information for a specific document based on its credential policy. For documents issued with a one-time use policy, it returns the number of remaining presentations available. For documents with a rotate-use policy, it returns nil as there's no usage limit.
if let usageCounts = try await wallet.getCredentialsUsageCount(id: documentId) {
print("Remaining presentations: \(usageCounts.remaining) out of \(usageCounts.total)")
} else {
print("Document has unlimited presentations (rotate-use policy)")
}EudiWallet added method: public func getDefaultKeyOptions(_ docType: String?, scope: String?, identifier: String?) async throws -> KeyOptions
Get default key options (batch-size and credential policy) for a document type from the issuer. This method queries the issuer to retrieve the recommended key configuration for a specific document type, scope, or identifier. The returned KeyOptions can be used when issuing documents.
let keyOptions = try await wallet.getDefaultKeyOptions(docType, scope: scope, identifier: identifier)
let document = try await wallet.issueDocument(docType: docType, scope: scope, identifier: identifier, keyOptions: keyOptions)To issue multiple credentials for a document, specify the keyOptions parameter in the issueDocument method. This allows to set the credentialPolicy and batchSize options.
Example usage:
try await wallet.issueDocument(docType: nil, scope: nil, identifier: identifier, keyOptions: KeyOptions(credentialPolicy: .oneTimeUse, batchSize: 10))/// Get the remaining presentations count for a document.
/// Returns: Remaining presentations count (if one-time use policy was used to issue the document, otherwise nil)
public func getRemainingCredentialsCount(id: String) async throws -> Int?The SecureArea protocol was refactored to support batch-oriented key management and cryptographic operations. This change introduces methods for handling multiple keys at once. This affects implementors of the SecureArea protocol.
-
Key Creation:
createKeyBatch(id: String, keyOptions: KeyOptions?) async throws -> [CoseKey]- Creates a batch of keys and returns their public keys.
-
Key Deletion:
deleteKeyBatch(id: String, startIndex: Int, batchSize: Int) async throws- Deletes a batch of keys starting from a specific index.
deleteKeyInfo(id: String) async throws- Deletes key metadata for a given batch.
-
Signature and Key Agreement:
signature(id: String, index: Int, algorithm: SigningAlgorithm, dataToSign: Data, unlockData: Data?) async throws -> Data- Computes a signature using a specific key in the batch.
keyAgreement(id: String, index: Int, publicKey: CoseKey, unlockData: Data?) async throws -> SharedSecret- Performs key agreement with a specific key in the batch.
-
Key Info:
getKeyBatchInfo(id: String) async throws -> KeyBatchInfo- Returns information about a batch of keys.
-
Default Algorithm:
defaultSigningAlgorithm(ecCurve: CoseEcCurve) -> SigningAlgorithm- Returns the default signing algorithm for a given curve.
- Single-key methods
createKey,deleteKey, andgetKeyInfowere removed.
- Display "Unidentified Relying Party" when reader authentication is disabled.
- Fix transactions log for verifications with DCQL queries
- Update eudi-lib-ios-siop-openid4vp-swift package dependency to version 0.11.0
- DCQL query language support
- Package updates
- Bug fixes
- Updated eudi-lib-ios-siop-openid4vp-swift library to (v0.10.1)[https://github.com/eu-digital-identity-wallet/eudi-lib-ios-siop-openid4vp-swift/releases/tag/v0.10.1]
- Updated eudi-lib-ios-statium-swift library to (v0.2.0)[https://github.com/eu-digital-identity-wallet/eudi-lib-ios-statium-swift/releases/tag/v0.2.0]
- Add Sendable conformance to TransactionLogData and PresentationLogData structs.
- Modified BLE data transfer initialisation to ensure BLE powered on before advertising UUID service and presenting QR code
- Integration with
eudi-lib-ios-statium-swiftlibrary for document status checks (Token Status List Specification draft 10) - Added
public func getDocumentStatus(for statusIdentifier: StatusIdentifier) async throws -> CredentialStatusmethod toEudiWalletclass.
for m in wallet.storage.docModels {
guard let st = m.statusIdentifier else { continue }
let status = try? await wallet.getDocumentStatus(for: st)
// mark document according to its status as active or revoked, etc...
}
## v0.10.6
### OpenID4VCI - Draft 15
- Updated OpenID4VCI library to version [0.13.0](https://github.com/eu-digital-identity-wallet/eudi-lib-ios-openid4vci-swift/releases/tag/v0.13.0)
- Issuing functions updated to work with OpenID4VCI - Draft 15
### Transaction logging
- To log the transaction data, provide an implementation of the `TransactionLogger` protocol:
```swift
public actor DbTransactionLogger: TransactionLogger {
public func log(transaction: TransactionLog) async throws {
// Implement your logging logic here
}
}- Set the
transactionLoggerproperty of theEudiWalletinstance to aTransactionLoggerimplementation instance:
wallet.transactionLogger = DbTransactionLogger()- To display presented documents for a transaction, use the
parseTransactionLogfunction of theEudiWalletinstance:
let presentationData = await wallet.parseTransactionLog(transaction)- Support transaction data for OpenID4VP
- Fix issue #162
- Fix issue #163
- Removed
vctfromdocClaimscollection.
- Simplified OpenID4VCI configuration
wallet = try! EudiWallet(serviceName: Self.serviceName, trustedReaderCertificates: certs,
openID4VciConfig: OpenId4VCIConfiguration(useDPoP: true), logFileName: "temp.txt", secureAreas: [mySecureArea])- OpenID4VP Draft 23 support
- Fix nil DocClaim issue for request-items
DocPresentInfostruct members publicDocClaim: added propertypath: [String]to store the path of the claim in the document
- sdJwt nested elements presentation
DocElementsViewModelreplaced withenum DocElements
- OfferedIssuanceModel: Change the issuerName property to represent a friendly name instead of a URL and add a new issuerLogoUrl property
- Updated
eudi-lib-ios-openid4vci-swiftlibrary to version v0.12.0 openID4VciConfignow accepts aDPoPConstructorType.- Updated
eudi-lib-ios-siop-openid4vp-swiftlibrary to version v0.7.0
ElementViewModel: removedelementIdentifieranddisplayNameproperties and addedelementPathanddisplayNamesproperties:
/// path to locate the element
public let elementPath: [String]
// display names of the component paths
public let displayNames: [String?]
- Added properties to
DocClaimsDecodableprotocol:validFrom,validUntil
- Fixed bug for OpenID4VP presentation for more than 2 documents
- Fixed bugs for OpenID4VP presentation
- Added properties to
DocClaimsDecodableprotocol:issuerDisplay,credentialIssuerIdentifier,configurationIdentifier
EudiWallet: addeduiCulturestring property for UI localization. It must be a 2-letter language code (optional)EudiWallet: addedgetIssuerMetadata()function to retrieve selected issuer's metadataEudiWallet: Issue document using either doc-type, scope or configuration identifier:func issueDocument(docType: String?, scope: String?, identifier: String?, promptMessage: String? = nil)WalletStorage.Document: addeddisplayNameproperty with localized string valueElementViewModel: addeddisplayNameproperty with localized string valueDocMetadata: stores all localized metadata indisplaypropertyDocClaimMetadata: stores all localized metadata indisplayproperty- Fix bug with VP presentation
DocClaimDecodableprotocol is supported for both mso-mdoc (cbor) and sd-jwt-vc formats
DocClaimstruct hasdocDataValueproperty to store the typed value (enum with associated values) of the claim andstringValueproperty to store the string value of the claimDocClaimstruct hasdisplayName,isOptionalandvalueTypeproperties provided by the issuer
- Feature/dpop nonce
StorageManagerpropertymdocModelsrenamed todocModelsMdocDecodableprotocol renamed toDocClaimDecodableNameValuestruct renamed toDocClaimNameImagestruct removed
- Update for OpenID4VCI Draft14 (eudi-lib-ios-openid4vci-swift updated to tag 0.9.0)
- Use @MainActor for issuing methods due to authentication UI
SecureAreaprotocol static factory method added:nonisolated public static func create(storage: any SecureKeyStorage) -> Self- Removed
SecureAreaprotocol initializer:init(storage: any SecureKeyStorage)(use the static factory method instead) - Removed property
storagefromSecureAreaprotocol
initaddedsecureAreas:[SecureArea]optional parameter (default is["SecureEnclave", "Software"])issueDocument: addedkeyOptionsoptional parameter to specify the secure area name and other key options for the key creationissueDocumentsByOfferUrl: addeddocTypeKeyOptionsoptional parameter to specify the secure area name and other key options for each doc type
RequestItemsconforms toEquatableprotocol
- Fix issue #118
RequestItemsis now a dictionary with a key of typeString(doc-type) and a value of type[String: [RequestItem]](namespace to request items)RequestItemis a struct with the following properties:elementIdentifier,intentToRetainandisOptional
public typealias RequestItems = [String: [String: [RequestItem]]]- ElementViewModel:
public var isMandatory: Boolis removed - ElementViewModel:
public var isOptional: Boolis added (opposite ofisMandatory)
- Update Package.resolved and Package.swift with new versions for openid4vci, openid4vp
- Bug fix
- Removed
@MainActorannotation from class definitions
- Swift 6 migration
- Updated OpenID4VCI to version 0.6.0
- Fill document display name in DocElementsViewModel
- Updated OpenID4VCI to version 0.5.0
- Updated OpenID4VP to version 0.4.0
public func loadDocument(id:status:) async throws -> WalletStorage.Document?public func deleteDocument(id:status:) async throws
- Updated README.md with new methods and explanations
- Added documentation using Swift-DocC (deployed here)
- Support dynamic issuance in scoped mode
- Remove pending document after finalizing
resumePendingIssuance
- New wallet methods:
public func loadAllDocuments() async throws -> [WalletStorage.Document]?
public func deleteAllDocuments() async throws
public func resumePendingIssuance(pendingDoc: WalletStorage.Document, webUrl: URL?) async throws -> WalletStorage.Document
- Dynamic issuance handling: After calling issueDocumentsByOfferUrl the wallet application need to check if the issuance is pending:
if let urlString = newDocs.first?.authorizePresentationUrl {
// perform openid4vp presentation using the urlString
// on success call resumePendingIssuance using the url provided by the server
- Fixed issuing error when wallet
userAuthenticationRequiredproperty is true
- Wrong text on success message after issuing a document:
OfferedIssuanceModel,issuerNamenow has only the domain
-
EudiWalletsupports logging and retrieval of log contents` // If not-nil, logging to the specified log file name will be configured public var logFileName: String? { didSet { try? initializeLogging() } }
// Helper method to return a file URL from a file name. public static func getLogFileURL(_ fileName: String) throws -> URL?
// Reset a log file stored in the caches directory e.g. wallet.serviceName = "wallet_dev"
- Update eudi-lib-ios-openid4vci-swift to version 0.4.2 public func resetLogFile(_ fileName: String) throws openID4VciConfig: OpenId4VCIConfig?` to pass OpenID4VCI issuer parameters
- Removed
EudiWalletpropertiesvar openID4VciClientIdandvar openID4VciRedirectUri// Get the contents of a log file stored in the caches directory public func getLogFileContents(_ fileName: String) throws -> String `
v0.6.1- loadDocuments takes an optional status parameter of type WalletStorage.DocumentStatus (default is issued)
- Set WalletStorage.Document displayName property when saving a document-
deleteDocumentstakes an optionalstatusparameter of typeWalletStorage.DocumentStatus(default isissued) iable@Published public private(set) var deferredDocuments: [WalletStorage.Document] = [](documents that are not yet issued)
- Update eudi-lib-ios-openid4vci-swift to version 0.4.3h the issued document. pdated.
EudiWalletnew propertypublic var serviceName: String
Use a different serviceName than the default one if you want to store documents in a different location.4vci-swift/releases/tag/v0.4.1)
e.g. wallet.serviceName = "wallet_dev"
dded property public var accessGroup: String? (used for sharing keychain items between apps with the same access group)
- Update eudi-lib-ios-openid4vci-swift to version 0.4.2
- New
EudiWalletpropertypublic var openID4VciConfig: OpenId4VCIConfig?to pass OpenID4VCI issuer parameters0.3.2 - Removed
EudiWalletpropertiesvar openID4VciClientIdandvar openID4VciRedirectUri
eudi-lib-ios-openid4vci-swift to version 0.3.1
loadDocumentstakes an optionalstatusparameter of typeWalletStorage.DocumentStatus(default isissued)m URLSession variabledeleteDocumentstakes an optionalstatusparameter of typeWalletStorage.DocumentStatus(default isissued)EudiWalletclass. This variable can be used to set a custom URLSession for network requests. Allows for custom configuration of the URLSession, such as setting a custom timeout interval or Self-Signed certificates.- new variable
@Published public private(set) var deferredDocuments: [WalletStorage.Document] = [](documents that are not yet issued)
- Request a deferred issuance based on a stored deferred document. On success, the deferred document is updated with the issued document.
The caller does not need to reload documents, storage manager
deferredDocumentsanddocModelsproperties are updated. - New function to request deferred issuance:
@discardableResult public func requestDeferredIssuance(deferredDoc: WalletStorage.Document) async throws -> WalletStorage.Document## v0.5.2
- Removed
otherModels,docTypes,documentIdsproperties - Updated eudi-lib-ios-openid4vci-swift to version 0.4.1The flow is supported by existing methods:
- Rename
OfferedIssueModeltoOfferedIssuanceModel EudiWallet: added propertypublic var accessGroup: String?(used for sharing keychain items between apps with the same access group)he following method is called:public func resolveOfferUrlDocTypes(uriOffer: String) async throws -> OfferedIssueModel
- Update eudi-lib-ios-siop-openid4vp to version 0.3.22 - If
OfferedIssueModel.isTxCodeRequiredis true, the call to `` must include the transaction code (parametertxCodeValue).
- Update eudi-lib-ios-openid4vci-swift to version 0.3.1
- Added
public var urlSession: URLSessionvariable toEudiWalletclass. This variable can be used to set a custom URLSession for network requests. Allows for custom configuration of the URLSession, such as setting a custom timeout interval or Self-Signed certificates.- Update eudi-lib-ios-openid4vci-swift dependency to version 0.1.5 OS16 offer url parsing issue
- Library updates## v0.5.0
d4VP fixes and updates The flow is supported by existing methods:
- Update eudi-lib-ios-siop-openid4vp to version 0.1.1
1 - An issue offer url is scanned. The following method is called:
public func resolveOfferUrlDocTypes(uriOffer: String) async throws -> OfferedIssueModelnid4vp certificate chain verification (PresentationSession'sreaderCertIssuerValidandreaderCertIssuerproperties)
(Breaking change, the return value type is OfferedIssueModel instead of [OfferedDocModel])y to PresentationSession
2 - If OfferedIssueModel.isTxCodeRequired is true, the call to `` must include the transaction code (parameter txCodeValue).
- Note: for the clientId value the
EudiWallet/openID4VciClientIdis used.fierLegalName: String?` (used for Openid4VP preregistered clients)
- Update eudi-lib-ios-openid4vci-swift dependency to version 0.1.5## v0.4.6
- Fixes iOS16 offer url parsing issuee openid4vci to version 0.1.2
EuPidModelupdated with new PID docTypee eudi-lib-ios-openid4vci-swift to version 0.0.9
Openid4VP fixes and updatesking change - docModels contains not-nil items (SwiftUI breaks with nil items)
- Update eudi-lib-ios-siop-openid4vp to version 0.1.1
- Fix openid4vp certificate chain verification (PresentationSession's
readerCertIssuerValidandreaderCertIssuerproperties) - Add
readerLegalNameproperty to PresentationSession
v0.4.8- PresentationSession / func sendResponse: itemsToSend dictionary is keyed by docId (and not docType)
- Update eudi-lib-ios-siop-openid4vp to version 0.1.0
- Added wallet configuration parameter
public var verifierLegalName: String?(used for Openid4VP preregistered clients) data
###Update eudi-lib-ios-siop-openid4vp to version 0.1.0
##v0.4.5
Breaking change - docModels contains not-nil items (SwiftUI breaks with nil items)I: Allow partial issuing when some documents fail to issue
@Published public var docModels: [any MdocDecodable] = []
v0.4.3I: Fixed issuing with https://dev.issuer.eudiw.dev
Openid4vp, BLE: Support sending multiple documents with same doc-type
- DocElementsViewModel: added
public var docId: String## v0.3.7 - PresentationSession / func sendResponse: itemsToSend dictionary is keyed by docId (and not docType) functions: ffer metadata are cached
Refactoring for issuing documents with IssuerSigned cbor datafunc resolveOfferUrlDocTypes(uriOffer: String) async throws -> [OfferedDocModel] `
OpenID4VCI: fix for filtering resolved identifierseKeyOptions: [String: KeyOptions]? = nil, promptMessage: String? = nil, claimSet: ClaimSet? = nil) async throws -> [WalletStorage.Document] ` Support mdoc Authentication for OpenId4Vp #46
OpenID4VCI fix use the following code to convert to QR code image:
OpenID4VCI: Allow partial issuing when some documents fail to issuengagement.getQrCodeImage(qrCode: d)`
OpenID4VCI: Fixed issuing with https://dev.issuer.eudiw.devUpdated eudi-lib-ios-siop-openid4vp-swift to v0.0.74
/// Resolve OpenID4VCI offer URL document types. Resolved offer metadata are cached
public func resolveOfferUrlDocTypes(uriOffer: String) async throws -> [OfferedDocModel]
/// Issue documents by offer URI. createdAt),
public func issueDocumentsByOfferUrl(offerUri: String, docTypes: [OfferedDocModel], docTypeKeyOptions: [String: KeyOptions]? = nil, promptMessage: String? = nil, claimSet: ClaimSet? = nil) async throws -> [WalletStorage.Document] ## v0.3.3
VP draft 13 support
// PresentationSession## v0.3.2 @Published public var deviceEngagement: String?l updates for security checks
use the following code to convert to QR code image:
let qrImage = DeviceEngagement.getQrCodeImage(qrCode: d) presentation definition parsing
Updated eudi-lib-ios-siop-openid4vp-swift to v0.0.74 eudi-lib-ios-siop-openid4vp-swift to 0.0.72
Updated eudi-lib-ios-openid4vci-swift to v0.0.7
Updated eudi-lib-ios-siop-openid4vp-swift to v0.0.73
Updated eudi-lib-ios-openid4vci-swift to v0.0.6## v0.1.7
elete documents func
- Refactor MdocDecodable (DocType, DocumentIdentifier, createdAt),### MdocDataModel18013 DisplayStrings is recursive (cbor elements can be dictionaries)
- OpenID4VP draft 13 supportage]' property
- Internal updates for security checks
- Updated presentation definition parsingtationSession
: changereaderCertIssuer`` (has verifier certificate common name) () -> [String: Any]`
v0.2.9ital-identity-wallet/eudi-lib-ios-wallet-kit/pull/74)) via @phisakel
- Fixed mDOC authentication MAC validation error for mDL document type- Update documentation links in README.md (#82) via @phisakel ocumentation in README.md (#81) via @phisakel
- Added delete documents func
- Storage manager functions are now
async throws.com/phisakel)
- extractDisplayStrings is recursive (cbor elements can be dictionaries)
- NameValue: added
var children: [NameValue]property (tree-like structure)akel](https://github.com/phisakel) - MdocDecodable: added 'var displayImages: [NameImage]' property
v0.1.6allet-kit/pull/68)) via @phisakel
- Add isMandatory property to DocElementsViewModel structure via @phisakel
PresentationSessionmethods do not run on main actor) via @phisakelPresentationSession: add `readerCertIssuerValid`` (is verifier certificate trusted)com/phisakel)PresentationSession: change `readerCertIssuer`` (has verifier certificate common name)MdocDecodable: add extension method:public func toJson() -> [String: Any]
- Update eudi-lib-ios-openid4vci-swift to version 0.4.2 and add new properties to EudiWallet (#86) via @phisakel
- Refactor to support Deferred document issuing (#74) via @phisakel56)) via @phisakel
- Update documentation links in README.md (#82) via @phisakelb.com/phisakel)
- Docs: update documentation in README.md (#81) via @phisakel
- VP version 0.3.2, docs with Swift-DocC Plugin (#80) via @phisakelgithub.com/phisakel)
- Update PGP Key link (#79) via @mgiakkou
- Update eudi-lib-ios-openid4vci-swift to version 0.3.1 (#78) via @phisakelom/phisakel)
- Allow Self-Signed SSL for OpenId4VCI and OpenId4VP (#76) via @phisakel/github.com/phisakel)
- [fix] pre-auth fixes in libs (#75) via @dtsiflitl/44)) via @phisakel
- Support Pre-Authorized Code Flow - Wallet-kit (iOS) (#72) via @phisakelttps://github.com/phisakel)
- Fix swift.yml (#71) via @phisakelbashov)
- Credential offer URL parsing issue for iOS16 (#69) via @phisakelservosNCIN)
- Update eudi-lib-ios-iso18013-data-model and eudi-lib-ios-iso18013-data-transfer dependencies (#68) via @phisakel
- Update eudi-lib-ios-siop-openid4vp-swift to version 0.1.1, fix verifier display name, valid status (#67) via @phisakel
- Update eudi-lib-ios-siop-openid4vp-swift to version 0.1.0 (#64) via @phisakel
- Update eudi-lib-ios-siop-openid4vp-swift to version 0.1.0 (#64) via @phisakel
- Update openid4vci library to version 0.1.2 (#62) via @phisakeli-lib-ios-wallet-kit/pull/34)) via @phisakel
- Update eudi-lib-ios-openid4vci-swift to version 0.0.9 (#61) via @phisakel
- Issuing - Support for credential offer (#45) via @phisakelkel)
- OpenID4VCI draft13 support (#31) via @phisakel)
- Simplify Storage Manager API (#59) via @phisakel
- Openid4vp and BLE should support sending response with multiple documents of the same doc-type (iOS) (#56) via @phisakel@phisakel](https://github.com/phisakel)
- Refactor to support IssuerSigned CBOR structure [iOS] (#53) via @phisakel
- Changelog.md update (#51) via @phisakel
- Vci offer fix for filtering resolved identifiers (#50) via @phisakel
- Support mdoc Authentication for OpenId4Vp (#46) via @phisakel
- OpenID4VCI: Allow partial issuing when some documents fail to issue (#48) via @phisakel
- Issuing - Support for credential offer (#45) via @phisakel.com/phisakel)
- Support OpenID4VCI credential offer (resolution of credential offer, issuing of specific doc types) (#44) via @phisakelithub.com/phisakel)
- Chore: Update dependencies for udi-lib-ios-iso18013-data-transfer to … (#43) via @phisakel
- Return the QR code to the device engagement in string representation (#42) via @akarabashov](https://github.com/phisakel)
- Centralization of sec workflows (#21) via @christosservosNCIN
- [fix] sdjwt case fix (#36) via @dtsiflit
- Update openid4vci library to v0.0.7 (#39) via @phisakel
- Update OpenID4VP to v0.0.74 (#37) via @phisakel
- Update dependencies to latest versions (#35) via @phisakelsakel](https://github.com/phisakel)
- Update dependencies and refactor StorageManager to support multiple documents with same docType (#34) via @phisakel
- Update changelog.md (#32) via @phisakel
- Update dependencies and changelog (#30) via @phisakel/phisakel)
- Updates due to security helpers changes (#29) via @phisakelithub.com/phisakel)
- Updated Presentation Definition Parsing (#28) via @phisakelithub.com/phisakel)
- Update eudi-lib-ios-siop-openid4vp-swift to version 0.0.72 (#27) via @phisakel
- Check if iaca variable is nil, refactor to use multiple device private keys (#23) via @phisakel
- Update README.md (#25) via @vkanellopoulos- Update SECURITY.md (#22) via @vkanellopoulos- Use subjectDistinguishedName for openID4vp verifier, update packages (#20) via @phisakel- Fix for verifier name (#19) via @phisakel- Reader auth for openid4vp, readme overview (#18) via @phisakel
- SendResponse takes an onSuccess callback function (#17) via @phisakel
- Add BlueECC dependency and update eudi-lib-ios-siop-openid4vp version (#16) via @phisakel
- OpenID4VciRedirectUri public property in wallet kit (#15) via @phisakel
- Changes for Secure Enclave use (#14) via @phisakel
- Fixes after updating OpenID4VCI library (#13) via @phisakel
- Issue documents using OpenID4VCI protocol (#12) via @phisakel
- Bug fixes for storage manager (#11) via @phisakel
- Method to begin presentation using any custom PresentationService (#10) via @phisakel
- Update README and SECURITY.md files (#9) via @phisakel
- Added delete documents func to wallet kit (#8) via @phisakel
- Make storage manager methods async throws (#7) via @phisakel
- Update Package.resolved and add isMandatory property to DocElementsViewModel structure (#6) via @phisakel
- Develop: limit main actor usage, reader cert variables (#5) via @phisakel
- Update License and Copyright (#4) via @phisakel
- Develop (#3) via @phisakel