diff --git a/apps/easypid/src/app/authenticate.tsx b/apps/easypid/src/app/authenticate.tsx index abb1ce95..336e97f1 100644 --- a/apps/easypid/src/app/authenticate.tsx +++ b/apps/easypid/src/app/authenticate.tsx @@ -1,4 +1,4 @@ -import { Redirect, useLocalSearchParams, useNavigation } from 'expo-router' +import { Redirect, useLocalSearchParams } from 'expo-router' import { TypedArrayEncoder, WalletInvalidKeyError } from '@credo-ts/core' import { initializeAppAgent, useSecureUnlock } from '@easypid/agent' @@ -25,7 +25,6 @@ export default function Authenticate() { const pinInputRef = useRef(null) const [isInitializingAgent, setIsInitializingAgent] = useState(false) const [isAllowedToUnlockWithFaceId, setIsAllowedToUnlockWithFaceId] = useState(false) - const navigation = useNavigation() const isLoading = secureUnlock.state === 'acquired-wallet-key' || (secureUnlock.state === 'locked' && secureUnlock.isUnlocking) diff --git a/apps/easypid/src/crypto/WalletServiceProviderClient.ts b/apps/easypid/src/crypto/WalletServiceProviderClient.ts index b1933352..78fd435d 100644 --- a/apps/easypid/src/crypto/WalletServiceProviderClient.ts +++ b/apps/easypid/src/crypto/WalletServiceProviderClient.ts @@ -1,18 +1,51 @@ import type { SecureEnvironment } from '@animo-id/expo-secure-environment' +import { AskarModule } from '@credo-ts/askar' import { + Agent, CredoWebCrypto, type JwsProtectedHeaderOptions, JwsService, JwtPayload, + KeyDerivationMethod, TypedArrayEncoder, + WalletInvalidKeyError, getJwkFromKey, } from '@credo-ts/core' -import type { EasyPIDAppAgent } from 'packages/agent/src' +import { agentDependencies } from '@credo-ts/react-native' +import { ariesAskar } from '@hyperledger/aries-askar-react-native' +import type { EasyPIDAppAgent } from '@package/agent' +import { secureWalletKey } from 'packages/secure-store/secureUnlock' +import { InvalidPinError } from './error' import { deriveKeypairFromPin } from './pin' // TODO: should auto reset after X seconds let __pin: Array | undefined -export const setWalletServiceProviderPin = (pin?: Array) => { +export const setWalletServiceProviderPin = async (pin: Array) => { + const pinString = pin.join('') + const walletKeyVersion = secureWalletKey.getWalletKeyVersion() + const walletKey = await secureWalletKey.getWalletKeyUsingPin(pinString, walletKeyVersion) + const walletId = `easypid-wallet-${walletKeyVersion}` + const agent = new Agent({ + config: { + label: 'pin_test_agent', + walletConfig: { id: walletId, key: walletKey, keyDerivationMethod: KeyDerivationMethod.Raw }, + }, + modules: { + askar: new AskarModule({ ariesAskar }), + }, + dependencies: agentDependencies, + }) + + try { + await agent.initialize() + } catch (e) { + if (e instanceof WalletInvalidKeyError) { + throw new InvalidPinError() + } + throw e + } + + await agent.shutdown() __pin = pin } @@ -30,10 +63,6 @@ export class WalletServiceProviderClient implements SecureEnvironment { private agent: EasyPIDAppAgent ) {} - public async register() { - await this.post('register-wallet', {}) - } - private async post(path: string, claims: Record): Promise { const pin = getWalletServiceProviderPin() if (!pin) @@ -73,6 +102,22 @@ export class WalletServiceProviderClient implements SecureEnvironment { return parsedData } + public async register() { + await this.post('register-wallet', {}) + } + + public async batchGenerateKeyPair(keyIds: string[]): Promise> { + const { publicKeys } = await this.post<{ publicKeys: Record> }>('batch-create-key', { + keyIds, + keyType: 'P256', + }) + + return Object.entries(publicKeys).reduce( + (prev, [keyId, publicKey]) => ({ ...prev, [keyId]: new Uint8Array(publicKey) }), + {} + ) + } + public async sign(keyId: string, message: Uint8Array): Promise { const { signature } = await this.post<{ signature: Array }>('sign', { data: new Array(...message), @@ -86,8 +131,9 @@ export class WalletServiceProviderClient implements SecureEnvironment { return new Uint8Array(signature) } - public async generateKeypair(id: string): Promise { - await this.post('create-key', { keyType: 'P256', keyId: id }) + public async generateKeypair(id: string): Promise { + const { publicKey } = await this.post<{ publicKey: Array }>('create-key', { keyType: 'P256', keyId: id }) + return new Uint8Array(publicKey) } public async getPublicBytesForKeyId(keyId: string): Promise { diff --git a/apps/easypid/src/crypto/error.ts b/apps/easypid/src/crypto/error.ts new file mode 100644 index 00000000..29cc980c --- /dev/null +++ b/apps/easypid/src/crypto/error.ts @@ -0,0 +1,3 @@ +export class InvalidPinError extends Error { + public message = 'Invalid PIN entered' +} diff --git a/apps/easypid/src/features/onboarding/screens/data-protection.tsx b/apps/easypid/src/features/onboarding/screens/data-protection.tsx index 9fa8598c..caee4fae 100644 --- a/apps/easypid/src/features/onboarding/screens/data-protection.tsx +++ b/apps/easypid/src/features/onboarding/screens/data-protection.tsx @@ -1,5 +1,5 @@ -import { useCanUseSecureEnclave } from '@easypid/hooks/useCanUseSecureEnclave' -import { Button, HeroIcons, Paragraph, Spinner, XStack, YStack, useToastController } from '@package/ui' +import { isLocalSecureEnvironmentSupported } from '@animo-id/expo-secure-environment' +import { Button, HeroIcons, Spinner, XStack, YStack, useToastController } from '@package/ui' import { useImageScaler } from 'packages/app/src/hooks' import React, { useState } from 'react' import { Linking, Platform } from 'react-native' @@ -11,7 +11,6 @@ interface OnboardingDataProtectionProps { export function OnboardingDataProtection({ goToNextStep }: OnboardingDataProtectionProps) { const toast = useToastController() - const canUseSecureEnclave = useCanUseSecureEnclave() const [shouldUseCloudHsm, setShouldUseCloudHsm] = useState(true) const { height, onLayout } = useImageScaler() @@ -27,7 +26,7 @@ export function OnboardingDataProtection({ goToNextStep }: OnboardingDataProtect const onToggleCloudHsm = () => { const newShouldUseCloudHsm = !shouldUseCloudHsm - if (newShouldUseCloudHsm === false && !canUseSecureEnclave) { + if (newShouldUseCloudHsm === false && !isLocalSecureEnvironmentSupported()) { toast.show(`You device does not support on-device ${Platform.OS === 'ios' ? 'Secure Enclave' : 'Strongbox'}.`, { message: 'Only Cloud HSM supported for PID cryptogrpahic keys.', customData: { diff --git a/apps/easypid/src/features/pid/FunkePidSetupScreen.tsx b/apps/easypid/src/features/pid/FunkePidSetupScreen.tsx index 5e4fab51..d604f2a7 100644 --- a/apps/easypid/src/features/pid/FunkePidSetupScreen.tsx +++ b/apps/easypid/src/features/pid/FunkePidSetupScreen.tsx @@ -1,6 +1,7 @@ import { sendCommand } from '@animo-id/expo-ausweis-sdk' import { type SdJwtVcHeader, SdJwtVcRecord } from '@credo-ts/core' import { useSecureUnlock } from '@easypid/agent' +import { InvalidPinError } from '@easypid/crypto/error' import type { PidSdJwtVcAttributes } from '@easypid/hooks' import { ReceivePidUseCaseCFlow } from '@easypid/use-cases/ReceivePidUseCaseCFlow' import type { @@ -190,7 +191,20 @@ export function FunkePidSetupScreen() { throw new Error('Retry') } - if (shouldUseCloudHsm) setWalletServiceProviderPin(pin.split('').map(Number)) + if (shouldUseCloudHsm) { + try { + await setWalletServiceProviderPin(pin.split('').map(Number)) + } catch (e) { + if (e instanceof InvalidPinError) { + toast.show(e.message, { + customData: { + preset: 'danger', + }, + }) + } + throw e + } + } await onIdCardStart({ walletPin: pin, allowSimulatorCard: allowSimulatorCard }) } diff --git a/apps/easypid/src/features/pid/PidWalletPinSlide.tsx b/apps/easypid/src/features/pid/PidWalletPinSlide.tsx index 95f1dfde..04c57135 100644 --- a/apps/easypid/src/features/pid/PidWalletPinSlide.tsx +++ b/apps/easypid/src/features/pid/PidWalletPinSlide.tsx @@ -1,7 +1,6 @@ import { Heading, Paragraph, YStack } from '@package/ui' import { PinDotsInput, type PinDotsInputRef, useWizard } from 'packages/app/src' import { useRef, useState } from 'react' -import { useSafeAreaInsets } from 'react-native-safe-area-context' interface PidWalletPinSlideProps { title: string diff --git a/apps/easypid/src/features/receive/FunkeCredentialNotificationScreen.tsx b/apps/easypid/src/features/receive/FunkeCredentialNotificationScreen.tsx index 4302189d..7c2f8e6b 100644 --- a/apps/easypid/src/features/receive/FunkeCredentialNotificationScreen.tsx +++ b/apps/easypid/src/features/receive/FunkeCredentialNotificationScreen.tsx @@ -25,6 +25,7 @@ import { import { useAppAgent } from '@easypid/agent' +import { InvalidPinError } from '@easypid/crypto/error' import { SlideWizard, usePushToWallet } from '@package/app' import { useToastController } from '@package/ui' import { useCallback, useEffect, useState } from 'react' @@ -32,6 +33,7 @@ import { createParam } from 'solito' import { setWalletServiceProviderPin } from '../../crypto/WalletServiceProviderClient' import { useShouldUsePinForSubmission } from '../../hooks/useShouldUsePinForPresentation' import { addReceivedActivity, useActivities } from '../activity/activityRecord' +import type { PresentationRequestResult } from '../share/components/utils' import { PinSlide } from '../share/slides/PinSlide' import { ShareCredentialsSlide } from '../share/slides/ShareCredentialsSlide' import { AuthCodeFlowSlide } from './slides/AuthCodeFlowSlide' @@ -252,7 +254,7 @@ export function FunkeCredentialNotificationScreen() { [acquireCredentialsPreAuth] ) - const onPresentationAccept = useCallback( + const onPresentationAccept: (pin?: string) => Promise = useCallback( async (pin?: string) => { if ( !credentialsForRequest || @@ -273,7 +275,18 @@ export function FunkeCredentialNotificationScreen() { return } // TODO: maybe provide to shareProof method? - setWalletServiceProviderPin(pin.split('').map(Number)) + try { + await setWalletServiceProviderPin(pin.split('').map(Number)) + } catch (e) { + if (e instanceof InvalidPinError) { + toast.show(e.message, { customData: { preset: 'danger' } }) + setIsSharingPresentation(false) + return { status: 'error', result: { title: e.message }, redirectToWallet: false } + } + + setErrorReason('Presentation information could not be extracted.') + return + } } try { @@ -313,6 +326,7 @@ export function FunkeCredentialNotificationScreen() { resolvedAuthorizationRequest, resolvedCredentialOffer, shouldUsePinForPresentation, + toast.show, ] ) diff --git a/apps/easypid/src/features/scan/FunkeQrScannerScreen.tsx b/apps/easypid/src/features/scan/FunkeQrScannerScreen.tsx index bb80caa1..3c309904 100644 --- a/apps/easypid/src/features/scan/FunkeQrScannerScreen.tsx +++ b/apps/easypid/src/features/scan/FunkeQrScannerScreen.tsx @@ -22,7 +22,13 @@ import { FadeIn, FadeOut, LinearTransition, useAnimatedStyle, withTiming } from import { useSafeAreaInsets } from 'react-native-safe-area-context' import easypidLogo from '../../../assets/icon-rounded.png' -import { checkMdocPermissions, getMdocQrCode, requestMdocPermissions, waitForDeviceRequest } from '../proximity' +import { + checkMdocPermissions, + getMdocQrCode, + requestMdocPermissions, + shutdownDataTransfer, + waitForDeviceRequest, +} from '../proximity' const unsupportedUrlPrefixes = ['_oob='] @@ -58,7 +64,10 @@ export function FunkeQrScannerScreen({ credentialDataHandlerOptions }: QrScanner } }, [showMyQrCode]) - const onCancel = () => back() + const onCancel = () => { + back() + shutdownDataTransfer() + } const onScan = async (scannedData: string) => { if (isProcessing || !isFocused) return diff --git a/apps/easypid/src/features/share/FunkeOpenIdPresentationNotificationScreen.tsx b/apps/easypid/src/features/share/FunkeOpenIdPresentationNotificationScreen.tsx index a0b02017..e48c4c08 100644 --- a/apps/easypid/src/features/share/FunkeOpenIdPresentationNotificationScreen.tsx +++ b/apps/easypid/src/features/share/FunkeOpenIdPresentationNotificationScreen.tsx @@ -11,6 +11,7 @@ import { useLocalSearchParams } from 'expo-router' import React, { useEffect, useState, useCallback } from 'react' import { useAppAgent } from '@easypid/agent' +import { InvalidPinError } from '@easypid/crypto/error' import { analyzeVerification } from '@easypid/use-cases/ValidateVerification' import type { VerificationAnalysisResponse } from '@easypid/use-cases/ValidateVerification' import { usePushToWallet } from '@package/app/src/hooks/usePushToWallet' @@ -114,7 +115,25 @@ export function FunkeOpenIdPresentationNotificationScreen() { } } // TODO: maybe provide to shareProof method? - setWalletServiceProviderPin(pin.split('').map(Number)) + try { + await setWalletServiceProviderPin(pin.split('').map(Number)) + } catch (e) { + if (e instanceof InvalidPinError) { + return { + status: 'error', + result: { + title: 'Authentication Failed', + }, + } + } + + return { + status: 'error', + result: { + title: 'Authentication failed', + }, + } + } } try { diff --git a/apps/easypid/src/features/share/slides/PinSlide.tsx b/apps/easypid/src/features/share/slides/PinSlide.tsx index de64cb06..8be78ee2 100644 --- a/apps/easypid/src/features/share/slides/PinSlide.tsx +++ b/apps/easypid/src/features/share/slides/PinSlide.tsx @@ -4,7 +4,7 @@ import { useRef, useState } from 'react' import type { PresentationRequestResult } from '../components/utils' interface PinSlideProps { - onPinComplete: (pin: string) => Promise | Promise + onPinComplete: (pin: string) => Promise isLoading: boolean } diff --git a/apps/easypid/src/features/share/slides/ShareCredentialsSlide.tsx b/apps/easypid/src/features/share/slides/ShareCredentialsSlide.tsx index 4fb48581..4278469c 100644 --- a/apps/easypid/src/features/share/slides/ShareCredentialsSlide.tsx +++ b/apps/easypid/src/features/share/slides/ShareCredentialsSlide.tsx @@ -11,7 +11,7 @@ import type { PresentationRequestResult } from '../components/utils' interface ShareCredentialsSlideProps { logo?: DisplayImage - onAccept?: () => Promise | Promise + onAccept?: () => Promise onDecline?: () => void submission: FormattedSubmission isAccepting: boolean diff --git a/apps/easypid/src/hooks/useCanUseSecureEnclave.ts b/apps/easypid/src/hooks/useCanUseSecureEnclave.ts index edb971b6..a16c623a 100644 --- a/apps/easypid/src/hooks/useCanUseSecureEnclave.ts +++ b/apps/easypid/src/hooks/useCanUseSecureEnclave.ts @@ -1,17 +1,5 @@ -import { generateKeypair } from '@animo-id/expo-secure-environment' -import { useEffect, useState } from 'react' -import { Platform } from 'react-native' +import { isLocalSecureEnvironmentSupported } from '@animo-id/expo-secure-environment' export function useCanUseSecureEnclave() { - if (Platform.OS === 'ios') return true - - const [canUseSecureEnclave, setCanUseSecureEnclave] = useState() - - useEffect(() => { - generateKeypair('123', false) - .then(() => setCanUseSecureEnclave(true)) - .catch(() => setCanUseSecureEnclave(false)) - }, []) - - return canUseSecureEnclave + return isLocalSecureEnvironmentSupported() } diff --git a/packages/agent/src/agent.ts b/packages/agent/src/agent.ts index a7fb6f60..deadccc2 100644 --- a/packages/agent/src/agent.ts +++ b/packages/agent/src/agent.ts @@ -46,7 +46,6 @@ import { agentDependencies } from '@credo-ts/react-native' import { anoncreds } from '@hyperledger/anoncreds-react-native' import { ariesAskar } from '@hyperledger/aries-askar-react-native' import { indyVdr } from '@hyperledger/indy-vdr-react-native' -import { DidWebAnonCredsRegistry } from 'credo-ts-didweb-anoncreds' import { bdrPidIssuerCertificate, pidSchemes } from '../../../apps/easypid/src/constants' import { indyNetworks } from './indyNetworks' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f7a5802..053b832e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,8 +13,8 @@ catalogs: specifier: 0.0.3-alpha.8 version: 0.0.3-alpha.8 '@animo-id/expo-secure-environment': - specifier: 0.1.0-alpha.11 - version: 0.1.0-alpha.11 + specifier: 0.1.0-alpha.12 + version: 0.1.0-alpha.12 '@animo-id/mdoc': specifier: 0.2.39 version: 0.2.39 @@ -101,7 +101,7 @@ importers: version: 0.0.3-alpha.8(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react@18.3.1) '@animo-id/expo-secure-environment': specifier: 'catalog:' - version: 0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) + version: 0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) '@animo-id/mdoc': specifier: 'catalog:' version: 0.2.39 @@ -279,7 +279,7 @@ importers: dependencies: '@animo-id/expo-secure-environment': specifier: 'catalog:' - version: 0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) + version: 0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) '@hyperledger/anoncreds-react-native': specifier: 'catalog:' version: 0.2.4(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) @@ -590,7 +590,7 @@ importers: version: https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/anoncreds?funke(@hyperledger/anoncreds-shared@0.2.4)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) '@credo-ts/askar': specifier: https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/askar?funke - version: https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/askar?funke(patch_hash=zbu2rcss5evxukkhh5w5venkba)(@animo-id/expo-secure-environment@0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1))(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) + version: https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/askar?funke(patch_hash=zbu2rcss5evxukkhh5w5venkba)(@animo-id/expo-secure-environment@0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1))(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) '@credo-ts/cheqd': specifier: https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/cheqd?funke version: https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/cheqd?funke(@hyperledger/anoncreds-shared@0.2.4)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) @@ -823,8 +823,8 @@ packages: expo: '>= 51' react: '*' - '@animo-id/expo-secure-environment@0.1.0-alpha.11': - resolution: {integrity: sha512-cAwsK8QWZc4ywxH6r0sqrH5yGdp5bKkw3fUr41CSs/TDZ42FIMeIK+tEdc78Bp+szykEywnnZpaAKdoTAd3ebw==} + '@animo-id/expo-secure-environment@0.1.0-alpha.12': + resolution: {integrity: sha512-7bvLSwRWHWs7m4Y7J/ptvmPW9FqmwPkmwaJcOcOwqrM5HPwCU6ZiS7CSQ+b3fRXpvAHhYiMq88SCHNt2DycK1A==} peerDependencies: expo: '*' react: '*' @@ -9919,7 +9919,7 @@ snapshots: - supports-color - utf-8-validate - '@animo-id/expo-secure-environment@0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1)': + '@animo-id/expo-secure-environment@0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1))(react@18.3.1)': dependencies: '@peculiar/asn1-ecc': 2.3.14 '@peculiar/asn1-schema': 2.3.13 @@ -9928,7 +9928,7 @@ snapshots: react: 18.3.1 react-native: 0.74.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.2.79)(react@18.3.1) - '@animo-id/expo-secure-environment@0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1)': + '@animo-id/expo-secure-environment@0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1)': dependencies: '@peculiar/asn1-ecc': 2.3.14 '@peculiar/asn1-schema': 2.3.13 @@ -11152,7 +11152,7 @@ snapshots: - typescript - web-streams-polyfill - '@credo-ts/askar@https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/askar?funke(patch_hash=zbu2rcss5evxukkhh5w5venkba)(@animo-id/expo-secure-environment@0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1))(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3)': + '@credo-ts/askar@https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/askar?funke(patch_hash=zbu2rcss5evxukkhh5w5venkba)(@animo-id/expo-secure-environment@0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1))(@hyperledger/aries-askar-shared@0.2.3)(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3)': dependencies: '@credo-ts/core': https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/core?funke(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(typescript@5.3.3)(web-streams-polyfill@3.3.3) '@hyperledger/aries-askar-shared': 0.2.3 @@ -11162,7 +11162,7 @@ snapshots: rxjs: 7.8.1 tsyringe: 4.8.0 optionalDependencies: - '@animo-id/expo-secure-environment': 0.1.0-alpha.11(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) + '@animo-id/expo-secure-environment': 0.1.0-alpha.12(expo@51.0.39(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9)(@types/react@18.2.79)(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - domexception - encoding diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6fd53585..a210ec87 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -30,7 +30,7 @@ catalog: "@animo-id/oid4vci": 0.1.4 "@animo-id/oauth2": 0.1.4 "@animo-id/oauth2-utils": 0.1.4 - "@animo-id/expo-secure-environment": 0.1.0-alpha.11 + "@animo-id/expo-secure-environment": 0.1.0-alpha.12 "@animo-id/expo-mdoc-data-transfer": 0.0.3-alpha.8 "@animo-id/mdoc": 0.2.39 "@unimodules/react-native-adapter": "./noop"