@bifold/core 2.4.6 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/contexts/reducers/store.js +3 -2
- package/lib/commonjs/contexts/reducers/store.js.map +1 -1
- package/lib/commonjs/index.js +119 -104
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/screens/AttemptLockout.js +27 -35
- package/lib/commonjs/screens/AttemptLockout.js.map +1 -1
- package/lib/commonjs/screens/MobileVerifierLoading.js +4 -3
- package/lib/commonjs/screens/MobileVerifierLoading.js.map +1 -1
- package/lib/commonjs/screens/PINCreate.js +3 -10
- package/lib/commonjs/screens/PINCreate.js.map +1 -1
- package/lib/commonjs/screens/WhatAreContacts.js +3 -2
- package/lib/commonjs/screens/WhatAreContacts.js.map +1 -1
- package/lib/module/contexts/reducers/store.js +3 -2
- package/lib/module/contexts/reducers/store.js.map +1 -1
- package/lib/module/index.js +42 -45
- package/lib/module/index.js.map +1 -1
- package/lib/module/screens/AttemptLockout.js +28 -36
- package/lib/module/screens/AttemptLockout.js.map +1 -1
- package/lib/module/screens/MobileVerifierLoading.js +4 -3
- package/lib/module/screens/MobileVerifierLoading.js.map +1 -1
- package/lib/module/screens/PINCreate.js +3 -10
- package/lib/module/screens/PINCreate.js.map +1 -1
- package/lib/module/screens/WhatAreContacts.js +3 -2
- package/lib/module/screens/WhatAreContacts.js.map +1 -1
- package/lib/typescript/src/contexts/reducers/store.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +57 -61
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/screens/AttemptLockout.d.ts.map +1 -1
- package/lib/typescript/src/screens/MobileVerifierLoading.d.ts.map +1 -1
- package/lib/typescript/src/screens/PINCreate.d.ts.map +1 -1
- package/lib/typescript/src/screens/WhatAreContacts.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/App.tsx +0 -79
- package/src/animated-components.ts +0 -30
- package/src/assets/fonts/MaterialIcons.ttf +0 -0
- package/src/assets/icons/code.svg +0 -4
- package/src/assets/icons/large-arrow.svg +0 -5
- package/src/assets/icons/pencil.svg +0 -15
- package/src/assets/icons/trash.svg +0 -31
- package/src/assets/img/Artwork_1024x1024.png +0 -0
- package/src/assets/img/HistoryCardAcceptedIcon.svg +0 -4
- package/src/assets/img/HistoryCardExpiredIcon.svg +0 -4
- package/src/assets/img/HistoryCardRevokedIcon.svg +0 -4
- package/src/assets/img/HistoryInformationSentIcon.svg +0 -4
- package/src/assets/img/HistoryPinUpdatedIcon.svg +0 -4
- package/src/assets/img/IconChevronRight.svg +0 -5
- package/src/assets/img/activity-indicator-circle.svg +0 -90
- package/src/assets/img/app-lockout.svg +0 -1
- package/src/assets/img/biometrics.svg +0 -74
- package/src/assets/img/chat-loading.svg +0 -1
- package/src/assets/img/check-in-circle.svg +0 -18
- package/src/assets/img/connection-pending.svg +0 -112
- package/src/assets/img/contact-book.svg +0 -21
- package/src/assets/img/credential-card.svg +0 -18
- package/src/assets/img/credential-declined.svg +0 -28
- package/src/assets/img/credential-in-hand.svg +0 -48
- package/src/assets/img/credential-list.svg +0 -60
- package/src/assets/img/credential-pending.svg +0 -96
- package/src/assets/img/credential-success.svg +0 -48
- package/src/assets/img/delete-notification.svg +0 -1
- package/src/assets/img/empty-wallet.svg +0 -23
- package/src/assets/img/error-filled.svg +0 -12
- package/src/assets/img/exclamation-mark.svg +0 -17
- package/src/assets/img/home-center-img.svg +0 -71
- package/src/assets/img/icon-credential-offer-dark.svg +0 -7
- package/src/assets/img/icon-credential-offer-light.svg +0 -7
- package/src/assets/img/icon-info-recieved-dark.svg +0 -8
- package/src/assets/img/icon-info-recieved-light.svg +0 -8
- package/src/assets/img/icon-info-sent-dark.svg +0 -8
- package/src/assets/img/icon-info-sent-light.svg +0 -8
- package/src/assets/img/icon-proof-request-dark.svg +0 -11
- package/src/assets/img/icon-proof-request-light.svg +0 -11
- package/src/assets/img/information-received.svg +0 -1
- package/src/assets/img/logo-large.png +0 -0
- package/src/assets/img/logo-large@2x.png +0 -0
- package/src/assets/img/logo-large@3x.png +0 -0
- package/src/assets/img/logo.svg +0 -15
- package/src/assets/img/message-text-icon-outline.svg +0 -1
- package/src/assets/img/message-text-icon.svg +0 -1
- package/src/assets/img/no_information_shared.svg +0 -36
- package/src/assets/img/preface.svg +0 -15
- package/src/assets/img/proof-declined.svg +0 -66
- package/src/assets/img/proof-pending.svg +0 -61
- package/src/assets/img/proof-success.svg +0 -72
- package/src/assets/img/push-notifications.svg +0 -1
- package/src/assets/img/qrcode-scan-icon.svg +0 -1
- package/src/assets/img/scan-share.svg +0 -102
- package/src/assets/img/secure-check.svg +0 -4
- package/src/assets/img/secure-image.svg +0 -64
- package/src/assets/img/update-available.svg +0 -26
- package/src/assets/img/verifier-request-declined.svg +0 -34
- package/src/assets/img/wallet-back.svg +0 -20
- package/src/assets/img/wallet-front.svg +0 -32
- package/src/assets/img/wallet-icon-outline.svg +0 -1
- package/src/assets/img/wallet-icon.svg +0 -1
- package/src/assets/img/wallet.svg +0 -43
- package/src/assets/oca-bundles.json +0 -174
- package/src/components/animated/ButtonLoading.tsx +0 -32
- package/src/components/animated/ConnectionLoading.tsx +0 -53
- package/src/components/animated/CredentialAdded.tsx +0 -72
- package/src/components/animated/CredentialPending.tsx +0 -63
- package/src/components/animated/LoadingIndicator.tsx +0 -49
- package/src/components/animated/PresentationLoading.tsx +0 -52
- package/src/components/animated/RecordLoading.tsx +0 -75
- package/src/components/animated/SendingProof.tsx +0 -53
- package/src/components/animated/SentProof.tsx +0 -72
- package/src/components/buttons/Button-api.tsx +0 -46
- package/src/components/buttons/Button.tsx +0 -125
- package/src/components/buttons/HeaderHome.tsx +0 -25
- package/src/components/buttons/IconButton.tsx +0 -93
- package/src/components/buttons/InfoIcon.tsx +0 -35
- package/src/components/buttons/SettingsMenu.tsx +0 -26
- package/src/components/buttons/ToggleButton.tsx +0 -93
- package/src/components/buttons/index.ts +0 -4
- package/src/components/chat/ActionSlider.tsx +0 -104
- package/src/components/chat/ChatActions.tsx +0 -33
- package/src/components/chat/ChatBubble.tsx +0 -20
- package/src/components/chat/ChatEvent.tsx +0 -31
- package/src/components/chat/ChatMessage.tsx +0 -142
- package/src/components/chat/MessageInput.tsx +0 -46
- package/src/components/chat/index.ts +0 -4
- package/src/components/forms/WalletNameForm.tsx +0 -148
- package/src/components/index.ts +0 -4
- package/src/components/inputs/BiometryControl.tsx +0 -190
- package/src/components/inputs/BulletPoint.tsx +0 -32
- package/src/components/inputs/CheckBoxRow.tsx +0 -67
- package/src/components/inputs/InlineErrorText.tsx +0 -60
- package/src/components/inputs/LimitedTextInput.tsx +0 -71
- package/src/components/inputs/PINInput.tsx +0 -175
- package/src/components/inputs/SingleSelectBlock.tsx +0 -53
- package/src/components/listItems/ContactCredentialListItem.tsx +0 -79
- package/src/components/listItems/ContactListItem.tsx +0 -121
- package/src/components/listItems/NotificationListItem.tsx +0 -514
- package/src/components/misc/AvatarView.tsx +0 -33
- package/src/components/misc/CardWatermark.tsx +0 -52
- package/src/components/misc/ConnectionAlert.tsx +0 -123
- package/src/components/misc/ConnectionImage.tsx +0 -45
- package/src/components/misc/ContentGradient.tsx +0 -40
- package/src/components/misc/CredentialCard.tsx +0 -161
- package/src/components/misc/CredentialCard10.tsx +0 -329
- package/src/components/misc/CredentialCard11.tsx +0 -701
- package/src/components/misc/CredentialCard11ActionFooter.tsx +0 -55
- package/src/components/misc/CredentialCard11Issuer.tsx +0 -74
- package/src/components/misc/CredentialCard11Logo.tsx +0 -61
- package/src/components/misc/EmptyList.tsx +0 -27
- package/src/components/misc/EmptyListContacts.tsx +0 -55
- package/src/components/misc/ErrorBoundary.tsx +0 -200
- package/src/components/misc/FauxHeader.tsx +0 -75
- package/src/components/misc/InfoBox.tsx +0 -283
- package/src/components/misc/NoNewUpdates.tsx +0 -38
- package/src/components/misc/PINHeader.tsx +0 -25
- package/src/components/misc/PINValidationHelper.tsx +0 -48
- package/src/components/misc/Pagination.tsx +0 -114
- package/src/components/misc/QRRenderer.tsx +0 -53
- package/src/components/misc/QRScanner.tsx +0 -395
- package/src/components/misc/QRScannerTorch.tsx +0 -74
- package/src/components/misc/ScanCamera.tsx +0 -86
- package/src/components/misc/ScanTab.tsx +0 -45
- package/src/components/misc/SharedProofData.tsx +0 -98
- package/src/components/misc/UnorderedList.tsx +0 -28
- package/src/components/misc/VerifierCredentialCard.tsx +0 -378
- package/src/components/misc/index.ts +0 -2
- package/src/components/modals/AlertModal.tsx +0 -42
- package/src/components/modals/AppGuideModal.tsx +0 -142
- package/src/components/modals/CameraDisclosureModal.tsx +0 -126
- package/src/components/modals/CommonRemoveModal.tsx +0 -337
- package/src/components/modals/DeveloperModal.tsx +0 -32
- package/src/components/modals/DismissiblePopupModal.tsx +0 -169
- package/src/components/modals/ErrorModal.tsx +0 -107
- package/src/components/modals/ImageModal.tsx +0 -80
- package/src/components/modals/NetInfoModal.tsx +0 -35
- package/src/components/modals/PopupModal.tsx +0 -56
- package/src/components/modals/ProofCancelModal.tsx +0 -79
- package/src/components/modals/SafeAreaModal.tsx +0 -17
- package/src/components/record/Record.tsx +0 -100
- package/src/components/record/RecordBinaryField.tsx +0 -55
- package/src/components/record/RecordDateIntField.tsx +0 -63
- package/src/components/record/RecordField.tsx +0 -154
- package/src/components/record/RecordFooter.tsx +0 -17
- package/src/components/record/RecordHeader.tsx +0 -17
- package/src/components/record/RecordRemove.tsx +0 -66
- package/src/components/texts/HeaderTitle.tsx +0 -25
- package/src/components/texts/HighlightTextBox.tsx +0 -41
- package/src/components/texts/InfoTextBox.tsx +0 -129
- package/src/components/texts/Link.tsx +0 -41
- package/src/components/texts/Text.tsx +0 -21
- package/src/components/texts/ThemedText.tsx +0 -24
- package/src/components/toast/BaseToast.tsx +0 -128
- package/src/components/toast/ToastConfig.tsx +0 -21
- package/src/components/tour/AttachTourStep.tsx +0 -73
- package/src/components/tour/CredentialOfferTourSteps.tsx +0 -41
- package/src/components/tour/CredentialsTourSteps.tsx +0 -41
- package/src/components/tour/HomeTourSteps.tsx +0 -104
- package/src/components/tour/ProofRequestTourSteps.tsx +0 -41
- package/src/components/tour/SpotCutout.tsx +0 -65
- package/src/components/tour/TourBox.tsx +0 -255
- package/src/components/tour/TourOverlay.tsx +0 -134
- package/src/components/views/Banner.tsx +0 -181
- package/src/components/views/CredentialCardLogo.tsx +0 -77
- package/src/components/views/CredentialDetailPrimaryHeader.tsx +0 -107
- package/src/components/views/CredentialDetailSecondaryHeader.tsx +0 -60
- package/src/components/views/HeaderWithBanner.tsx +0 -17
- package/src/components/views/HomeFooterView.tsx +0 -110
- package/src/components/views/HomeHeaderView.tsx +0 -12
- package/src/components/views/KeyboardView.tsx +0 -41
- package/src/components/views/LoadingPlaceholder.tsx +0 -168
- package/src/components/views/LoadingView.tsx +0 -29
- package/src/components/views/ProgressBar.tsx +0 -53
- package/src/components/views/PushNotificationsContent.tsx +0 -51
- package/src/components/views/PushNotificationsDisabledContent.tsx +0 -47
- package/src/configs/ledgers/indy/index.ts +0 -8
- package/src/configs/ledgers/indy/ledgers.json +0 -51
- package/src/constants.ts +0 -107
- package/src/container-api.ts +0 -247
- package/src/container-impl.ts +0 -243
- package/src/contexts/activity.tsx +0 -145
- package/src/contexts/animated-components.ts +0 -9
- package/src/contexts/auth.tsx +0 -240
- package/src/contexts/index.ts +0 -3
- package/src/contexts/navigation.tsx +0 -19
- package/src/contexts/network.tsx +0 -125
- package/src/contexts/reducers/index.ts +0 -3
- package/src/contexts/reducers/store.ts +0 -754
- package/src/contexts/store.tsx +0 -103
- package/src/contexts/theme.tsx +0 -51
- package/src/contexts/tour/tour-context.tsx +0 -160
- package/src/contexts/tour/tour-provider.tsx +0 -160
- package/src/hooks/bundle-resolver.ts +0 -95
- package/src/hooks/chat-messages.tsx +0 -263
- package/src/hooks/connections.ts +0 -37
- package/src/hooks/credential-card-styles.ts +0 -144
- package/src/hooks/credentials.ts +0 -11
- package/src/hooks/deep-links.ts +0 -49
- package/src/hooks/developer-mode.ts +0 -25
- package/src/hooks/lockout.ts +0 -77
- package/src/hooks/notifications.ts +0 -108
- package/src/hooks/oob.ts +0 -17
- package/src/hooks/proof-request-templates.ts +0 -40
- package/src/hooks/proofs.ts +0 -32
- package/src/hooks/screen-capture.ts +0 -52
- package/src/hooks/useBifoldAgentSetup.ts +0 -169
- package/src/hooks/useOnboardingState.ts +0 -53
- package/src/hooks/usePINValidation.ts +0 -98
- package/src/index.ts +0 -239
- package/src/layout/ScreenLayout.tsx +0 -53
- package/src/localization/en/en.json +0 -951
- package/src/localization/en/index.ts +0 -3
- package/src/localization/fr/fr.json +0 -933
- package/src/localization/fr/index.ts +0 -3
- package/src/localization/index.ts +0 -66
- package/src/localization/pt-br/index.ts +0 -3
- package/src/localization/pt-br/pt-br.json +0 -911
- package/src/modules/history/context/historyManager.tsx +0 -247
- package/src/modules/history/index.ts +0 -2
- package/src/modules/history/navigation/HistoryStack.tsx +0 -29
- package/src/modules/history/services/queue.service.tsx +0 -31
- package/src/modules/history/types/index.ts +0 -92
- package/src/modules/history/ui/HistoryPage.tsx +0 -133
- package/src/modules/history/ui/HistorySettings.tsx +0 -183
- package/src/modules/history/ui/assets/img/HistoryCardAcceptedIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryCardExpiredIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryCardRevokedIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryInformationSentIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/HistoryPinUpdatedIcon.svg +0 -4
- package/src/modules/history/ui/assets/img/IconChevronRight.svg +0 -3
- package/src/modules/history/ui/components/BulletPoint.tsx +0 -49
- package/src/modules/history/ui/components/HistoryListItem.tsx +0 -251
- package/src/modules/history/ui/components/HistoryMenu.tsx +0 -25
- package/src/modules/history/ui/components/SingleSelectBlock.tsx +0 -72
- package/src/modules/openid/components/CredentialRowCard.tsx +0 -64
- package/src/modules/openid/components/OpenIDCredentialCard.tsx +0 -276
- package/src/modules/openid/context/OpenIDCredentialRecordProvider.tsx +0 -296
- package/src/modules/openid/display.tsx +0 -467
- package/src/modules/openid/displayProof.tsx +0 -86
- package/src/modules/openid/hooks/openid.tsx +0 -111
- package/src/modules/openid/metadata.tsx +0 -59
- package/src/modules/openid/offerResolve.tsx +0 -281
- package/src/modules/openid/resolverProof.tsx +0 -286
- package/src/modules/openid/screens/OpenIDCredentialDetails.tsx +0 -214
- package/src/modules/openid/screens/OpenIDCredentialOffer.tsx +0 -192
- package/src/modules/openid/screens/OpenIDProofChangeCredential.tsx +0 -133
- package/src/modules/openid/screens/OpenIDProofPresentation.tsx +0 -423
- package/src/modules/openid/types.tsx +0 -111
- package/src/modules/openid/utils/utils.tsx +0 -119
- package/src/navigators/ConnectStack.tsx +0 -68
- package/src/navigators/ContactStack.tsx +0 -91
- package/src/navigators/CredentialStack.tsx +0 -48
- package/src/navigators/DeliveryStack.tsx +0 -76
- package/src/navigators/HomeStack.tsx +0 -37
- package/src/navigators/MainStack.tsx +0 -146
- package/src/navigators/NotificationStack.tsx +0 -56
- package/src/navigators/OnboardingScreens.ts +0 -142
- package/src/navigators/OnboardingStack.tsx +0 -205
- package/src/navigators/ProofRequestStack.tsx +0 -113
- package/src/navigators/RootStack.tsx +0 -71
- package/src/navigators/SettingStack.tsx +0 -174
- package/src/navigators/TabStack.tsx +0 -304
- package/src/navigators/defaultLayoutOptions.tsx +0 -17
- package/src/navigators/defaultStackOptions.tsx +0 -102
- package/src/navigators/index.ts +0 -27
- package/src/onboarding.ts +0 -90
- package/src/screens/AttemptLockout.tsx +0 -153
- package/src/screens/AutoLock.tsx +0 -140
- package/src/screens/Biometry.tsx +0 -54
- package/src/screens/Chat.tsx +0 -141
- package/src/screens/ConfigureMediator.tsx +0 -160
- package/src/screens/Connection.tsx +0 -394
- package/src/screens/ContactDetails.tsx +0 -350
- package/src/screens/CredentialDetails.tsx +0 -473
- package/src/screens/CredentialOffer.tsx +0 -334
- package/src/screens/CredentialOfferAccept.tsx +0 -189
- package/src/screens/DataRetention.tsx +0 -91
- package/src/screens/Developer.tsx +0 -289
- package/src/screens/Home.tsx +0 -173
- package/src/screens/JSONDetails.tsx +0 -104
- package/src/screens/Language.tsx +0 -97
- package/src/screens/ListContacts.tsx +0 -112
- package/src/screens/ListCredentials.tsx +0 -135
- package/src/screens/ListProofRequests.tsx +0 -148
- package/src/screens/MobileVerifierLoading.tsx +0 -106
- package/src/screens/NameWallet.tsx +0 -9
- package/src/screens/Onboarding.tsx +0 -162
- package/src/screens/OnboardingPages.tsx +0 -160
- package/src/screens/PINChange.tsx +0 -249
- package/src/screens/PINCreate.tsx +0 -185
- package/src/screens/PINEnter.tsx +0 -432
- package/src/screens/PINExplainer.tsx +0 -85
- package/src/screens/PINVerify.tsx +0 -195
- package/src/screens/PasteUrl.tsx +0 -140
- package/src/screens/Preface.tsx +0 -78
- package/src/screens/ProofChangeCredential.tsx +0 -179
- package/src/screens/ProofDetails.tsx +0 -348
- package/src/screens/ProofRequest.tsx +0 -999
- package/src/screens/ProofRequestAccept.tsx +0 -133
- package/src/screens/ProofRequestDetails.tsx +0 -270
- package/src/screens/ProofRequestUsageHistory.tsx +0 -152
- package/src/screens/ProofRequesting.tsx +0 -245
- package/src/screens/PushNotifications.tsx +0 -59
- package/src/screens/RenameContact.tsx +0 -155
- package/src/screens/RenameWallet.tsx +0 -26
- package/src/screens/Scan.tsx +0 -145
- package/src/screens/ScanHelp.tsx +0 -48
- package/src/screens/Settings.tsx +0 -415
- package/src/screens/Splash.tsx +0 -80
- package/src/screens/Terms.tsx +0 -127
- package/src/screens/ToggleBiometry.tsx +0 -153
- package/src/screens/TogglePushNotifications.tsx +0 -118
- package/src/screens/Tours.tsx +0 -93
- package/src/screens/UpdateAvailable.tsx +0 -119
- package/src/screens/WhatAreContacts.tsx +0 -71
- package/src/services/bifoldLogger.ts +0 -3
- package/src/services/keychain.ts +0 -184
- package/src/services/logger.ts +0 -89
- package/src/services/storage.ts +0 -136
- package/src/theme-builder.ts +0 -157
- package/src/theme.interface.ts +0 -580
- package/src/theme.ts +0 -1346
- package/src/types/attempt-lockout-config.ts +0 -8
- package/src/types/attestation.ts +0 -17
- package/src/types/chat.ts +0 -4
- package/src/types/config.ts +0 -64
- package/src/types/contact-details.ts +0 -5
- package/src/types/credential-list-footer.ts +0 -3
- package/src/types/credential-status.ts +0 -3
- package/src/types/credentials.ts +0 -7
- package/src/types/decline.ts +0 -5
- package/src/types/error.ts +0 -40
- package/src/types/fn.ts +0 -2
- package/src/types/genesis.ts +0 -35
- package/src/types/index.ts +0 -2
- package/src/types/metadata.ts +0 -16
- package/src/types/navigators.ts +0 -239
- package/src/types/notification.ts +0 -24
- package/src/types/permissions.ts +0 -2
- package/src/types/proof-items.ts +0 -32
- package/src/types/react-i18next.d.ts +0 -10
- package/src/types/remove.ts +0 -8
- package/src/types/security.ts +0 -32
- package/src/types/settings.ts +0 -28
- package/src/types/state.ts +0 -97
- package/src/types/tour.ts +0 -20
- package/src/types/version-check.ts +0 -18
- package/src/utils/PINValidation.ts +0 -98
- package/src/utils/agent.ts +0 -128
- package/src/utils/anonCredsProofRequestMapper.ts +0 -205
- package/src/utils/contacts.ts +0 -59
- package/src/utils/cred-def.ts +0 -33
- package/src/utils/credential.ts +0 -37
- package/src/utils/crypto.ts +0 -12
- package/src/utils/fileCache.ts +0 -152
- package/src/utils/helpers.ts +0 -1292
- package/src/utils/ledger.ts +0 -212
- package/src/utils/luminance.ts +0 -40
- package/src/utils/mediatorhelpers.ts +0 -71
- package/src/utils/migration.ts +0 -40
- package/src/utils/network.tsx +0 -55
- package/src/utils/oca.ts +0 -173
- package/src/utils/parsers.tsx +0 -111
- package/src/utils/proofBundle.ts +0 -220
- package/src/utils/schema.ts +0 -28
- package/src/utils/testable.ts +0 -17
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type { W3cCredentialRecord, SdJwtVcRecord, MdocRecord } from '@credo-ts/core'
|
|
2
|
-
import type { OpenId4VciCredentialSupported, OpenId4VciIssuerMetadataDisplay } from '@credo-ts/openid4vc'
|
|
3
|
-
import type { MetadataDisplay } from '@sphereon/oid4vci-common'
|
|
4
|
-
import { CredentialSubjectRecord } from './types'
|
|
5
|
-
|
|
6
|
-
export interface OpenId4VcCredentialMetadata {
|
|
7
|
-
credential: {
|
|
8
|
-
display?: OpenId4VciCredentialSupported['display']
|
|
9
|
-
order?: OpenId4VciCredentialSupported['order']
|
|
10
|
-
credential_subject?: CredentialSubjectRecord
|
|
11
|
-
}
|
|
12
|
-
issuer: {
|
|
13
|
-
display?: OpenId4VciIssuerMetadataDisplay[]
|
|
14
|
-
id: string
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type OpenId4VcCredentialMetadataExtended = Partial<
|
|
19
|
-
OpenId4VciCredentialSupported & { credential_subject: CredentialSubjectRecord }
|
|
20
|
-
>
|
|
21
|
-
const openId4VcCredentialMetadataKey = '_bifold/openId4VcCredentialMetadata'
|
|
22
|
-
|
|
23
|
-
export function extractOpenId4VcCredentialMetadata(
|
|
24
|
-
credentialMetadata: Partial<OpenId4VciCredentialSupported & { credential_subject: CredentialSubjectRecord }>,
|
|
25
|
-
serverMetadata: { display?: MetadataDisplay[]; id: string }
|
|
26
|
-
): OpenId4VcCredentialMetadata {
|
|
27
|
-
return {
|
|
28
|
-
credential: {
|
|
29
|
-
display: credentialMetadata.display,
|
|
30
|
-
order: credentialMetadata.order,
|
|
31
|
-
credential_subject: credentialMetadata.credential_subject,
|
|
32
|
-
},
|
|
33
|
-
issuer: {
|
|
34
|
-
display: serverMetadata.display,
|
|
35
|
-
id: serverMetadata.id,
|
|
36
|
-
},
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Gets the OpenId4Vc credential metadata from the given W3C credential record.
|
|
42
|
-
*/
|
|
43
|
-
export function getOpenId4VcCredentialMetadata(
|
|
44
|
-
credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord
|
|
45
|
-
): OpenId4VcCredentialMetadata | null {
|
|
46
|
-
return credentialRecord.metadata.get(openId4VcCredentialMetadataKey)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Sets the OpenId4Vc credential metadata on the given W3cCredentialRecord or SdJwtVcRecord.
|
|
51
|
-
*
|
|
52
|
-
* NOTE: this does not save the record.
|
|
53
|
-
*/
|
|
54
|
-
export function setOpenId4VcCredentialMetadata(
|
|
55
|
-
credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,
|
|
56
|
-
metadata: OpenId4VcCredentialMetadata
|
|
57
|
-
) {
|
|
58
|
-
credentialRecord.metadata.set(openId4VcCredentialMetadataKey, metadata)
|
|
59
|
-
}
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
OpenId4VcCredentialHolderBinding,
|
|
3
|
-
OpenId4VciCredentialBindingOptions,
|
|
4
|
-
OpenId4VciCredentialFormatProfile,
|
|
5
|
-
OpenId4VciCredentialSupportedWithId,
|
|
6
|
-
OpenId4VciRequestTokenResponse,
|
|
7
|
-
OpenId4VciResolvedCredentialOffer,
|
|
8
|
-
} from '@credo-ts/openid4vc'
|
|
9
|
-
import {
|
|
10
|
-
Agent,
|
|
11
|
-
DidJwk,
|
|
12
|
-
DidKey,
|
|
13
|
-
getJwkFromKey,
|
|
14
|
-
JwaSignatureAlgorithm,
|
|
15
|
-
JwkDidCreateOptions,
|
|
16
|
-
KeyBackend,
|
|
17
|
-
KeyDidCreateOptions,
|
|
18
|
-
Mdoc,
|
|
19
|
-
MdocRecord,
|
|
20
|
-
SdJwtVcRecord,
|
|
21
|
-
W3cCredentialRecord,
|
|
22
|
-
W3cJsonLdVerifiableCredential,
|
|
23
|
-
W3cJwtVerifiableCredential,
|
|
24
|
-
} from '@credo-ts/core'
|
|
25
|
-
import { extractOpenId4VcCredentialMetadata, setOpenId4VcCredentialMetadata } from './metadata'
|
|
26
|
-
|
|
27
|
-
export const resolveOpenId4VciOffer = async ({
|
|
28
|
-
agent,
|
|
29
|
-
data,
|
|
30
|
-
uri,
|
|
31
|
-
authorization,
|
|
32
|
-
}: {
|
|
33
|
-
agent: Agent
|
|
34
|
-
// Either data itself (the offer) or uri can be passed
|
|
35
|
-
data?: string
|
|
36
|
-
uri?: string
|
|
37
|
-
fetchAuthorization?: boolean
|
|
38
|
-
authorization?: { clientId: string; redirectUri: string }
|
|
39
|
-
}): Promise<OpenId4VciResolvedCredentialOffer> => {
|
|
40
|
-
let offerUri = uri
|
|
41
|
-
|
|
42
|
-
if (!offerUri && data) {
|
|
43
|
-
// FIXME: Credo only support credential offer string, but we already parsed it before. So we construct an offer here
|
|
44
|
-
// but in the future we need to support the parsed offer in Credo directly
|
|
45
|
-
offerUri = `openid-credential-offer://credential_offer=${encodeURIComponent(JSON.stringify(data))}`
|
|
46
|
-
} else if (!offerUri) {
|
|
47
|
-
throw new Error('either data or uri must be provided')
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
agent.config.logger.info(`Receiving openid uri ${offerUri}`, {
|
|
51
|
-
offerUri,
|
|
52
|
-
data: data,
|
|
53
|
-
uri: offerUri,
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
const resolvedCredentialOffer = await agent.modules.openId4VcHolder.resolveCredentialOffer(offerUri)
|
|
57
|
-
|
|
58
|
-
if (authorization) {
|
|
59
|
-
throw new Error('Authorization flow is not supported yet as of Credo 0.5.13')
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return resolvedCredentialOffer
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export async function acquirePreAuthorizedAccessToken({
|
|
66
|
-
agent,
|
|
67
|
-
resolvedCredentialOffer,
|
|
68
|
-
txCode,
|
|
69
|
-
}: {
|
|
70
|
-
agent: Agent
|
|
71
|
-
resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer
|
|
72
|
-
txCode?: string
|
|
73
|
-
}) {
|
|
74
|
-
return await agent.modules.openId4VcHolder.requestToken({
|
|
75
|
-
resolvedCredentialOffer,
|
|
76
|
-
txCode,
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export const customCredentialBindingResolver = async ({
|
|
81
|
-
agent,
|
|
82
|
-
supportedDidMethods,
|
|
83
|
-
keyType,
|
|
84
|
-
supportsAllDidMethods,
|
|
85
|
-
supportsJwk,
|
|
86
|
-
credentialFormat,
|
|
87
|
-
supportedCredentialId,
|
|
88
|
-
resolvedCredentialOffer,
|
|
89
|
-
pidSchemes,
|
|
90
|
-
}: Partial<OpenId4VciCredentialBindingOptions> & {
|
|
91
|
-
agent: Agent
|
|
92
|
-
resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer
|
|
93
|
-
pidSchemes?: { sdJwtVcVcts: Array<string>; msoMdocDoctypes: Array<string> }
|
|
94
|
-
}): Promise<OpenId4VcCredentialHolderBinding> => {
|
|
95
|
-
// First, we try to pick a did method
|
|
96
|
-
// Prefer did:jwk, otherwise use did:key, otherwise use undefined
|
|
97
|
-
let didMethod: 'key' | 'jwk' | undefined =
|
|
98
|
-
supportsAllDidMethods || supportedDidMethods?.includes('did:jwk')
|
|
99
|
-
? 'jwk'
|
|
100
|
-
: supportedDidMethods?.includes('did:key')
|
|
101
|
-
? 'key'
|
|
102
|
-
: undefined
|
|
103
|
-
|
|
104
|
-
// If supportedDidMethods is undefined, and supportsJwk is false, we will default to did:key
|
|
105
|
-
// this is important as part of MATTR launchpad support which MUST use did:key but doesn't
|
|
106
|
-
// define which did methods they support
|
|
107
|
-
if (!supportedDidMethods && !supportsJwk) {
|
|
108
|
-
didMethod = 'key'
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const offeredCredentialConfiguration = supportedCredentialId
|
|
112
|
-
? resolvedCredentialOffer.offeredCredentialConfigurations[supportedCredentialId]
|
|
113
|
-
: undefined
|
|
114
|
-
|
|
115
|
-
const shouldKeyBeHardwareBackedForMsoMdoc =
|
|
116
|
-
offeredCredentialConfiguration?.format === OpenId4VciCredentialFormatProfile.MsoMdoc &&
|
|
117
|
-
pidSchemes?.msoMdocDoctypes.includes(offeredCredentialConfiguration.doctype)
|
|
118
|
-
|
|
119
|
-
const shouldKeyBeHardwareBackedForSdJwtVc =
|
|
120
|
-
offeredCredentialConfiguration?.format === 'vc+sd-jwt' &&
|
|
121
|
-
pidSchemes?.sdJwtVcVcts.includes(offeredCredentialConfiguration.vct)
|
|
122
|
-
|
|
123
|
-
const shouldKeyBeHardwareBacked = shouldKeyBeHardwareBackedForSdJwtVc || shouldKeyBeHardwareBackedForMsoMdoc
|
|
124
|
-
|
|
125
|
-
if (!keyType) {
|
|
126
|
-
throw new Error('keyType is required!')
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const key = await agent.wallet.createKey({
|
|
130
|
-
keyType,
|
|
131
|
-
keyBackend: shouldKeyBeHardwareBacked ? KeyBackend.SecureElement : KeyBackend.Software,
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
if (didMethod) {
|
|
135
|
-
const didResult = await agent.dids.create<JwkDidCreateOptions | KeyDidCreateOptions>({
|
|
136
|
-
method: didMethod,
|
|
137
|
-
options: {
|
|
138
|
-
key,
|
|
139
|
-
},
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
if (didResult.didState.state !== 'finished') {
|
|
143
|
-
throw new Error('DID creation failed.')
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
let verificationMethodId: string
|
|
147
|
-
if (didMethod === 'jwk') {
|
|
148
|
-
const didJwk = DidJwk.fromDid(didResult.didState.did)
|
|
149
|
-
verificationMethodId = didJwk.verificationMethodId
|
|
150
|
-
} else {
|
|
151
|
-
const didKey = DidKey.fromDid(didResult.didState.did)
|
|
152
|
-
verificationMethodId = `${didKey.did}#${didKey.key.fingerprint}`
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
didUrl: verificationMethodId,
|
|
157
|
-
method: 'did',
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Otherwise we also support plain jwk for sd-jwt only
|
|
162
|
-
if (
|
|
163
|
-
supportsJwk &&
|
|
164
|
-
(credentialFormat === OpenId4VciCredentialFormatProfile.SdJwtVc ||
|
|
165
|
-
credentialFormat === OpenId4VciCredentialFormatProfile.MsoMdoc)
|
|
166
|
-
) {
|
|
167
|
-
return {
|
|
168
|
-
method: 'jwk',
|
|
169
|
-
jwk: getJwkFromKey(key),
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
throw new Error(
|
|
174
|
-
`No supported binding method could be found. Supported methods are did:key and did:jwk, or plain jwk for sd-jwt/mdoc. Issuer supports ${
|
|
175
|
-
supportsJwk ? 'jwk, ' : ''
|
|
176
|
-
}${supportedDidMethods?.join(', ') ?? 'Unknown'}`
|
|
177
|
-
)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export const receiveCredentialFromOpenId4VciOffer = async ({
|
|
181
|
-
agent,
|
|
182
|
-
resolvedCredentialOffer,
|
|
183
|
-
accessToken,
|
|
184
|
-
credentialConfigurationIdsToRequest,
|
|
185
|
-
clientId,
|
|
186
|
-
pidSchemes,
|
|
187
|
-
}: {
|
|
188
|
-
agent: Agent
|
|
189
|
-
resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer
|
|
190
|
-
accessToken: OpenId4VciRequestTokenResponse
|
|
191
|
-
credentialConfigurationIdsToRequest?: string[]
|
|
192
|
-
clientId?: string
|
|
193
|
-
pidSchemes?: { sdJwtVcVcts: Array<string>; msoMdocDoctypes: Array<string> }
|
|
194
|
-
}) => {
|
|
195
|
-
const offeredCredentialsToRequest = credentialConfigurationIdsToRequest
|
|
196
|
-
? resolvedCredentialOffer.offeredCredentials.filter((offered) =>
|
|
197
|
-
credentialConfigurationIdsToRequest.includes(offered.id)
|
|
198
|
-
)
|
|
199
|
-
: [resolvedCredentialOffer.offeredCredentials[0]]
|
|
200
|
-
|
|
201
|
-
if (offeredCredentialsToRequest.length === 0) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
`Parameter 'credentialConfigurationIdsToRequest' with values ${credentialConfigurationIdsToRequest} is not a credential_configuration_id in the credential offer.`
|
|
204
|
-
)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const credentials = await agent.modules.openId4VcHolder.requestCredentials({
|
|
208
|
-
resolvedCredentialOffer,
|
|
209
|
-
...accessToken,
|
|
210
|
-
clientId,
|
|
211
|
-
credentialsToRequest: credentialConfigurationIdsToRequest,
|
|
212
|
-
verifyCredentialStatus: false,
|
|
213
|
-
allowedProofOfPossessionSignatureAlgorithms: [
|
|
214
|
-
// NOTE: MATTR launchpad for JFF MUST use EdDSA. So it is important that the default (first allowed one)
|
|
215
|
-
// is EdDSA. The list is ordered by preference, so if no suites are defined by the issuer, the first one
|
|
216
|
-
// will be used
|
|
217
|
-
JwaSignatureAlgorithm.EdDSA,
|
|
218
|
-
JwaSignatureAlgorithm.ES256,
|
|
219
|
-
],
|
|
220
|
-
credentialBindingResolver: async ({
|
|
221
|
-
supportedDidMethods,
|
|
222
|
-
keyType,
|
|
223
|
-
supportsAllDidMethods,
|
|
224
|
-
supportsJwk,
|
|
225
|
-
credentialFormat,
|
|
226
|
-
supportedCredentialId,
|
|
227
|
-
}: OpenId4VciCredentialBindingOptions) => {
|
|
228
|
-
return customCredentialBindingResolver({
|
|
229
|
-
agent,
|
|
230
|
-
supportedDidMethods,
|
|
231
|
-
keyType,
|
|
232
|
-
supportsAllDidMethods,
|
|
233
|
-
supportsJwk,
|
|
234
|
-
credentialFormat,
|
|
235
|
-
supportedCredentialId,
|
|
236
|
-
resolvedCredentialOffer,
|
|
237
|
-
pidSchemes,
|
|
238
|
-
})
|
|
239
|
-
},
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
// We only support one credential for now
|
|
243
|
-
const [firstCredential] = credentials
|
|
244
|
-
if (!firstCredential)
|
|
245
|
-
throw new Error('Error retrieving credential using pre authorized flow: firstCredential undefined!.')
|
|
246
|
-
|
|
247
|
-
let record: SdJwtVcRecord | W3cCredentialRecord | MdocRecord
|
|
248
|
-
|
|
249
|
-
if (typeof firstCredential === 'string') {
|
|
250
|
-
throw new Error('Error retrieving credential using pre authorized flow: firstCredential is string.')
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
if ('compact' in firstCredential.credential) {
|
|
254
|
-
// TODO: add claimFormat to SdJwtVc
|
|
255
|
-
record = new SdJwtVcRecord({
|
|
256
|
-
compactSdJwtVc: firstCredential.credential.compact,
|
|
257
|
-
})
|
|
258
|
-
} else if (firstCredential.credential instanceof Mdoc) {
|
|
259
|
-
record = new MdocRecord({
|
|
260
|
-
mdoc: firstCredential.credential,
|
|
261
|
-
})
|
|
262
|
-
} else {
|
|
263
|
-
record = new W3cCredentialRecord({
|
|
264
|
-
credential: firstCredential.credential as W3cJwtVerifiableCredential | W3cJsonLdVerifiableCredential,
|
|
265
|
-
// We don't support expanded types right now, but would become problem when we support JSON-LD
|
|
266
|
-
tags: {},
|
|
267
|
-
})
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const openId4VcMetadata = extractOpenId4VcCredentialMetadata(
|
|
271
|
-
resolvedCredentialOffer.offeredCredentials[0] as OpenId4VciCredentialSupportedWithId,
|
|
272
|
-
{
|
|
273
|
-
id: resolvedCredentialOffer.metadata.issuer,
|
|
274
|
-
display: resolvedCredentialOffer.metadata.credentialIssuerMetadata.display,
|
|
275
|
-
}
|
|
276
|
-
)
|
|
277
|
-
|
|
278
|
-
setOpenId4VcCredentialMetadata(record, openId4VcMetadata)
|
|
279
|
-
|
|
280
|
-
return record
|
|
281
|
-
}
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
import { Agent, DifPexCredentialsForRequest, Jwt, X509ModuleConfig } from '@credo-ts/core'
|
|
2
|
-
import { ParseInvitationResult } from '../../utils/parsers'
|
|
3
|
-
import q from 'query-string'
|
|
4
|
-
import { OpenId4VPRequestRecord } from './types'
|
|
5
|
-
import { getHostNameFromUrl } from './utils/utils'
|
|
6
|
-
import { OpenId4VcSiopVerifiedAuthorizationRequest } from '@credo-ts/openid4vc'
|
|
7
|
-
import { Linking } from 'react-native'
|
|
8
|
-
|
|
9
|
-
function handleTextResponse(text: string): ParseInvitationResult {
|
|
10
|
-
// If the text starts with 'ey' we assume it's a JWT and thus an OpenID authorization request
|
|
11
|
-
if (text.startsWith('ey')) {
|
|
12
|
-
return {
|
|
13
|
-
success: true,
|
|
14
|
-
result: {
|
|
15
|
-
format: 'parsed',
|
|
16
|
-
type: 'openid-authorization-request',
|
|
17
|
-
data: text,
|
|
18
|
-
},
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Otherwise we still try to parse it as JSON
|
|
23
|
-
try {
|
|
24
|
-
const json: unknown = JSON.parse(text)
|
|
25
|
-
return handleJsonResponse(json)
|
|
26
|
-
|
|
27
|
-
// handel like above
|
|
28
|
-
} catch (error) {
|
|
29
|
-
throw new Error(`[handleTextResponse] Error:${error}`)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function handleJsonResponse(json: unknown): ParseInvitationResult {
|
|
34
|
-
// We expect a JSON object
|
|
35
|
-
if (!json || typeof json !== 'object' || Array.isArray(json)) {
|
|
36
|
-
throw new Error('[handleJsonResponse] Invitation not recognized.')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if ('@type' in json) {
|
|
40
|
-
return {
|
|
41
|
-
success: true,
|
|
42
|
-
result: {
|
|
43
|
-
format: 'parsed',
|
|
44
|
-
type: 'didcomm',
|
|
45
|
-
data: json,
|
|
46
|
-
},
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if ('credential_issuer' in json) {
|
|
51
|
-
return {
|
|
52
|
-
success: true,
|
|
53
|
-
result: {
|
|
54
|
-
format: 'parsed',
|
|
55
|
-
type: 'openid-credential-offer',
|
|
56
|
-
data: json,
|
|
57
|
-
},
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
throw new Error('[handleJsonResponse] Invitation not recognized.')
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export async function fetchInvitationDataUrl(dataUrl: string): Promise<ParseInvitationResult> {
|
|
65
|
-
// If we haven't had a response after 10 seconds, we will handle as if the invitation is not valid.
|
|
66
|
-
const abortController = new AbortController()
|
|
67
|
-
const timeout = setTimeout(() => abortController.abort(), 10000)
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
// If we still don't know what type of invitation it is, we assume it is a URL that we need to fetch to retrieve the invitation.
|
|
71
|
-
const response = await fetch(dataUrl, {
|
|
72
|
-
headers: {
|
|
73
|
-
// for DIDComm out of band invitations we should include application/json
|
|
74
|
-
// but we are flexible and also want to support other types of invitations
|
|
75
|
-
// as e.g. the OpenID SIOP request is a signed encoded JWT string
|
|
76
|
-
Accept: 'application/json, text/plain, */*',
|
|
77
|
-
},
|
|
78
|
-
})
|
|
79
|
-
clearTimeout(timeout)
|
|
80
|
-
if (!response.ok) {
|
|
81
|
-
throw new Error('[retrieve_invitation_error] Unable to retrieve invitation.')
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const contentType = response.headers.get('content-type')
|
|
85
|
-
if (contentType?.includes('application/json')) {
|
|
86
|
-
const json: unknown = await response.json()
|
|
87
|
-
return handleJsonResponse(json)
|
|
88
|
-
}
|
|
89
|
-
const text = await response.text()
|
|
90
|
-
return handleTextResponse(text)
|
|
91
|
-
} catch (error) {
|
|
92
|
-
clearTimeout(timeout)
|
|
93
|
-
throw new Error(`[retrieve_invitation_error] Unable to retrieve invitation: ${error}`)
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const extractCertificateFromJwt = (jwt: string) => {
|
|
98
|
-
const jwtHeader = Jwt.fromSerializedJwt(jwt).header
|
|
99
|
-
return Array.isArray(jwtHeader.x5c) && typeof jwtHeader.x5c[0] === 'string' ? jwtHeader.x5c[0] : null
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* This is a temp method to allow for untrusted certificates to still work with the wallet.
|
|
104
|
-
*/
|
|
105
|
-
export const extractCertificateFromAuthorizationRequest = async ({
|
|
106
|
-
data,
|
|
107
|
-
uri,
|
|
108
|
-
}: {
|
|
109
|
-
data?: string
|
|
110
|
-
uri?: string
|
|
111
|
-
}): Promise<{ data: string | null; certificate: string | null }> => {
|
|
112
|
-
try {
|
|
113
|
-
if (data) {
|
|
114
|
-
return {
|
|
115
|
-
data,
|
|
116
|
-
certificate: extractCertificateFromJwt(data),
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (uri) {
|
|
121
|
-
const query = q.parseUrl(uri).query
|
|
122
|
-
if (query.request_uri && typeof query.request_uri === 'string') {
|
|
123
|
-
const result = await fetchInvitationDataUrl(query.request_uri)
|
|
124
|
-
if (
|
|
125
|
-
result.success &&
|
|
126
|
-
result.result.type === 'openid-authorization-request' &&
|
|
127
|
-
typeof result.result.data === 'string'
|
|
128
|
-
) {
|
|
129
|
-
return {
|
|
130
|
-
data: result.result.data,
|
|
131
|
-
certificate: extractCertificateFromJwt(result.result.data),
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
} else if (query.request && typeof query.request === 'string') {
|
|
135
|
-
const _res = {
|
|
136
|
-
data: query.request,
|
|
137
|
-
certificate: extractCertificateFromJwt(query.request),
|
|
138
|
-
}
|
|
139
|
-
return _res
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return { data: null, certificate: null }
|
|
143
|
-
} catch (error) {
|
|
144
|
-
return { data: null, certificate: null }
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export async function withTrustedCertificate<T>(
|
|
149
|
-
agent: Agent,
|
|
150
|
-
certificate: string | null,
|
|
151
|
-
method: () => Promise<T> | T
|
|
152
|
-
): Promise<T> {
|
|
153
|
-
const x509ModuleConfig = agent.dependencyManager.resolve(X509ModuleConfig)
|
|
154
|
-
const currentTrustedCertificates = x509ModuleConfig.trustedCertificates
|
|
155
|
-
? [...x509ModuleConfig.trustedCertificates]
|
|
156
|
-
: []
|
|
157
|
-
|
|
158
|
-
try {
|
|
159
|
-
if (certificate) agent.x509.addTrustedCertificate(certificate)
|
|
160
|
-
return await method()
|
|
161
|
-
} finally {
|
|
162
|
-
if (certificate) x509ModuleConfig.setTrustedCertificates(currentTrustedCertificates as [string])
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
//This settings should be moved to an injectable config
|
|
167
|
-
const allowUntrustedCertificates = false
|
|
168
|
-
|
|
169
|
-
export const getCredentialsForProofRequest = async ({
|
|
170
|
-
agent,
|
|
171
|
-
data,
|
|
172
|
-
uri,
|
|
173
|
-
}: {
|
|
174
|
-
agent: Agent
|
|
175
|
-
// Either data itself (the offer) or uri can be passed
|
|
176
|
-
data?: string
|
|
177
|
-
uri?: string
|
|
178
|
-
fetchAuthorization?: boolean
|
|
179
|
-
authorization?: { clientId: string; redirectUri: string }
|
|
180
|
-
}): Promise<OpenId4VPRequestRecord | undefined> => {
|
|
181
|
-
let requestUri = uri
|
|
182
|
-
|
|
183
|
-
try {
|
|
184
|
-
const { certificate = null, data: newData = null } = allowUntrustedCertificates
|
|
185
|
-
? await extractCertificateFromAuthorizationRequest({ data, uri })
|
|
186
|
-
: {}
|
|
187
|
-
|
|
188
|
-
if (newData) {
|
|
189
|
-
// FIXME: Credo only support request string, but we already parsed it before. So we construct an request here
|
|
190
|
-
// but in the future we need to support the parsed request in Credo directly
|
|
191
|
-
requestUri = `openid://?request=${encodeURIComponent(newData)}`
|
|
192
|
-
} else if (uri) {
|
|
193
|
-
requestUri = uri
|
|
194
|
-
} else {
|
|
195
|
-
throw new Error('Either data or uri must be provided')
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
agent.config.logger.info(`$$Receiving openid uri ${requestUri}`)
|
|
199
|
-
|
|
200
|
-
// Temp solution to add and remove the trusted certificate
|
|
201
|
-
const resolved = await withTrustedCertificate(agent, certificate, () => {
|
|
202
|
-
return agent.modules.openId4VcHolder.resolveSiopAuthorizationRequest(requestUri)
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
if (!resolved.presentationExchange) {
|
|
206
|
-
throw new Error('No presentation exchange found in authorization request.')
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
...resolved.presentationExchange,
|
|
211
|
-
authorizationRequest: resolved.authorizationRequest,
|
|
212
|
-
verifierHostName: resolved.authorizationRequest.responseURI
|
|
213
|
-
? getHostNameFromUrl(resolved.authorizationRequest.responseURI)
|
|
214
|
-
: undefined,
|
|
215
|
-
createdAt: new Date(),
|
|
216
|
-
type: 'OpenId4VPRequestRecord',
|
|
217
|
-
}
|
|
218
|
-
} catch (err) {
|
|
219
|
-
agent.config.logger.error(`Parsing presentation request: ${(err as Error)?.message ?? err}`)
|
|
220
|
-
throw err
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
export const shareProof = async ({
|
|
225
|
-
agent,
|
|
226
|
-
authorizationRequest,
|
|
227
|
-
credentialsForRequest,
|
|
228
|
-
selectedCredentials,
|
|
229
|
-
allowUntrustedCertificate = false,
|
|
230
|
-
}: {
|
|
231
|
-
agent: Agent
|
|
232
|
-
authorizationRequest: OpenId4VcSiopVerifiedAuthorizationRequest
|
|
233
|
-
credentialsForRequest: DifPexCredentialsForRequest
|
|
234
|
-
selectedCredentials: { [inputDescriptorId: string]: { id: string; claimFormat: string } }
|
|
235
|
-
allowUntrustedCertificate?: boolean
|
|
236
|
-
}) => {
|
|
237
|
-
if (!credentialsForRequest.areRequirementsSatisfied) {
|
|
238
|
-
throw new Error('Requirements from proof request are not satisfied')
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Map all requirements and entries to a credential record. If a credential record for an
|
|
242
|
-
// input descriptor has been provided in `selectedCredentials` we will use that. Otherwise
|
|
243
|
-
// it will pick the first available credential.
|
|
244
|
-
const credentials = Object.fromEntries(
|
|
245
|
-
credentialsForRequest.requirements.flatMap((requirement) =>
|
|
246
|
-
requirement.submissionEntry.map((entry) => {
|
|
247
|
-
const credentialId = selectedCredentials[entry.inputDescriptorId].id
|
|
248
|
-
const credential =
|
|
249
|
-
entry.verifiableCredentials.find((vc) => vc.credentialRecord.id === credentialId) ??
|
|
250
|
-
entry.verifiableCredentials[0]
|
|
251
|
-
|
|
252
|
-
return [entry.inputDescriptorId, [credential.credentialRecord]]
|
|
253
|
-
})
|
|
254
|
-
)
|
|
255
|
-
)
|
|
256
|
-
|
|
257
|
-
try {
|
|
258
|
-
// Temp solution to add and remove the trusted certicaite
|
|
259
|
-
const certificate =
|
|
260
|
-
authorizationRequest.jwt && allowUntrustedCertificate ? extractCertificateFromJwt(authorizationRequest.jwt) : null
|
|
261
|
-
|
|
262
|
-
const result = await withTrustedCertificate(agent, certificate, () =>
|
|
263
|
-
agent.modules.openId4VcHolder.acceptSiopAuthorizationRequest({
|
|
264
|
-
authorizationRequest,
|
|
265
|
-
presentationExchange: {
|
|
266
|
-
credentials,
|
|
267
|
-
},
|
|
268
|
-
})
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
// if redirect_uri is provided, open it in the browser
|
|
272
|
-
// Even if the response returned an error, we must open this uri
|
|
273
|
-
if (typeof result.serverResponse.body === 'object' && typeof result.serverResponse.body.redirect_uri === 'string') {
|
|
274
|
-
await Linking.openURL(result.serverResponse.body.redirect_uri)
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
if (result.serverResponse.status < 200 || result.serverResponse.status > 299) {
|
|
278
|
-
throw new Error(`Error while accepting authorization request. ${result.serverResponse.body as string}`)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
return result
|
|
282
|
-
} catch (error) {
|
|
283
|
-
// Handle biometric authentication errors
|
|
284
|
-
throw new Error(`Error accepting proof request. ${(error as Error)?.message ?? error}`)
|
|
285
|
-
}
|
|
286
|
-
}
|