Skip to content

Commit 6e4dc2e

Browse files
authored
Merge pull request #84610 from software-mansion-labs/dariusz-biela/feat/3ds/passkeys-mfa
[ECUK In-App 3DS] Add Passkeys/WebAuthn support for multifactor biometric authentication
2 parents e0280e6 + a2742eb commit 6e4dc2e

81 files changed

Lines changed: 1310 additions & 931 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@
205205
"ecash",
206206
"ecconnrefused",
207207
"econn",
208+
"EDDSA",
208209
"EDIFACT",
209210
"Egencia",
210211
"Electromedical",

jest/setup.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import mockStorage from 'react-native-onyx/dist/storage/__mocks__';
1212
import type Animated from 'react-native-reanimated';
1313
import 'setimmediate';
1414
import {TextDecoder, TextEncoder} from 'util';
15-
import * as MockedSecureStore from '@src/libs/MultifactorAuthentication/Biometrics/SecureStore/index.web';
15+
import * as MockedSecureStore from '@src/libs/MultifactorAuthentication/NativeBiometrics/SecureStore/index.web';
1616
import '@src/polyfills/PromiseWithResolvers';
1717
import mockFSLibrary from './setupMockFullstoryLib';
1818
import setupMockImages from './setupMockImages';
@@ -126,7 +126,7 @@ jest.mock('react-native-share', () => ({
126126
}));
127127

128128
// Jest has no access to the native secure store module, so we mock it with the web implementation.
129-
jest.mock('@src/libs/MultifactorAuthentication/Biometrics/SecureStore', () => MockedSecureStore);
129+
jest.mock('@src/libs/MultifactorAuthentication/NativeBiometrics/SecureStore', () => MockedSecureStore);
130130

131131
jest.mock('react-native-reanimated', () => ({
132132
...jest.requireActual<typeof Animated>('react-native-reanimated/mock'),

src/CONST/index.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type {ValueOf} from 'type-fest';
77
import type {SearchFilterKey} from '@components/Search/types';
88
import type ResponsiveLayoutResult from '@hooks/useResponsiveLayout/types';
99
import type {MileageRate} from '@libs/DistanceRequestUtils';
10-
import MULTIFACTOR_AUTHENTICATION_VALUES from '@libs/MultifactorAuthentication/Biometrics/VALUES';
10+
import MULTIFACTOR_AUTHENTICATION_VALUES from '@libs/MultifactorAuthentication/VALUES';
1111
import addTrailingForwardSlash from '@libs/UrlUtils';
1212
import variables from '@styles/variables';
1313
import ONYXKEYS from '@src/ONYXKEYS';
@@ -439,6 +439,19 @@ const CONST = {
439439

440440
MULTIFACTOR_AUTHENTICATION: MULTIFACTOR_AUTHENTICATION_VALUES,
441441

442+
/**
443+
* COSE algorithm identifiers used in WebAuthn credential registration.
444+
* @see https://www.iana.org/assignments/cose/cose.xhtml#algorithms
445+
*/
446+
COSE_ALGORITHM: {
447+
/** EdDSA (ED25519) */
448+
EDDSA: -8,
449+
/** ES256 (ECDSA w/ SHA-256, P-256 curve) */
450+
ES256: -7,
451+
/** RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256) */
452+
RS256: -257,
453+
},
454+
442455
/** WebAuthn/Passkey credential type */
443456
PASSKEY_CREDENTIAL_TYPE: 'public-key',
444457

src/components/Icon/Illustrations.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import CreditCardEyes from '@assets/images/simple-illustrations/simple-illustrat
2828
import CreditCardsNewGreen from '@assets/images/simple-illustrations/simple-illustration__creditcards--green.svg';
2929
import EmailAddress from '@assets/images/simple-illustrations/simple-illustration__email-address.svg';
3030
import EmptyShelves from '@assets/images/simple-illustrations/simple-illustration__empty-shelves.svg';
31+
import EncryptionPasskeys from '@assets/images/simple-illustrations/simple-illustration__encryption-passkeys.svg';
3132
import Encryption from '@assets/images/simple-illustrations/simple-illustration__encryption.svg';
3233
import EnvelopeReceipt from '@assets/images/simple-illustrations/simple-illustration__envelopereceipt.svg';
3334
import FastMoney from '@assets/images/simple-illustrations/simple-illustration__fastmoney.svg';
@@ -74,6 +75,7 @@ export {
7475
ExpensifyCardCoins,
7576
EmptyStateTravel,
7677
Encryption,
78+
EncryptionPasskeys,
7779
EnvelopeReceipt,
7880
ExpensifyApprovedLogo,
7981
ExpensifyCardImage,

src/components/Icon/chunks/illustrations.chunk.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import DeniedTransactionHand from '@assets/images/multifactorAuthentication/deni
5050
import EncryptionMan from '@assets/images/multifactorAuthentication/encryption-man.svg';
5151
import HumptyDumpty from '@assets/images/multifactorAuthentication/humpty-dumpty.svg';
5252
import MagnifyingGlassSpyMouthClosed from '@assets/images/multifactorAuthentication/magnifying-glass-spy-mouth-closed-cropped.svg';
53+
import OpenPadlockGreen from '@assets/images/multifactorAuthentication/open-padlock-green.svg';
5354
import OpenPadlock from '@assets/images/multifactorAuthentication/open-padlock.svg';
5455
import RunOutOfTime from '@assets/images/multifactorAuthentication/running-out-of-time.svg';
5556
import PendingTravel from '@assets/images/pending-travel.svg';
@@ -393,6 +394,7 @@ const Illustrations = {
393394
// Multifactor Authentication Illustrations
394395
MagnifyingGlassSpyMouthClosed,
395396
OpenPadlock,
397+
OpenPadlockGreen,
396398
ApprovedTransactionHand,
397399
DeniedTransactionHand,
398400
RunOutOfTime,

0 commit comments

Comments
 (0)