diff --git a/packages/suite/src/selectors/suite/suiteAuthenticityChecksSelectors.ts b/packages/suite/src/selectors/suite/suiteAuthenticityChecksSelectors.ts index c053d9eb7b..a760f17dde 100644 --- a/packages/suite/src/selectors/suite/suiteAuthenticityChecksSelectors.ts +++ b/packages/suite/src/selectors/suite/suiteAuthenticityChecksSelectors.ts @@ -6,13 +6,12 @@ import { } from '@suite-common/firmware-authenticity'; import { Feature, selectIsFeatureDisabled } from '@suite-common/message-system'; import { - getIsDeviceIdValid, selectFirmwareHashCheckError, selectFirmwareRevisionCheckError, + selectIsDeviceIdCheckSuccess, selectIsDeviceInvariabilityCheckSuccess, selectIsEntropyCheckFailed, selectIsFirmwareAuthenticityCheckDismissed, - selectSelectedDevice, } from '@suite-common/wallet-core'; import { AppState } from 'src/types/suite'; @@ -96,9 +95,23 @@ export const selectIsEntropyCheckEnabledAndFailed = (state: AppState) => { return isEntropyCheckEnabled && !isEntropyCheckDisabledByMessageSystem && isEntropyCheckFailed; }; +export const selectIsDeviceIdCheckEnabledAndFailed = (state: AppState) => { + const isDisabledByMessageSystem = selectIsFeatureDisabled(state, Feature.idCheck); + const isDeviceIdValid = selectIsDeviceIdCheckSuccess(state); + + return !isDisabledByMessageSystem && !isDeviceIdValid; +}; + +export const selectIsDeviceInvariabilityEnabledAndFailed = (state: AppState) => { + const isDisabledByMessageSystem = selectIsFeatureDisabled(state, Feature.invariabilityCheck); + const isDeviceInvariabilityCheckSuccess = selectIsDeviceInvariabilityCheckSuccess(state); + + return !isDisabledByMessageSystem && !isDeviceInvariabilityCheckSuccess; +}; + export const selectShouldDisplayDeviceCompromised = (state: AppState): boolean => { - const isDeviceIdValid = getIsDeviceIdValid(selectSelectedDevice(state)); - const deviceInvariabilitySuccess = selectIsDeviceInvariabilityCheckSuccess(state); + const isDeviceIdCheckFailed = selectIsDeviceIdCheckEnabledAndFailed(state); + const isDeviceInvariabilityCheckFailed = selectIsDeviceInvariabilityEnabledAndFailed(state); const isFirmwareCheckEnabledAndFailed = selectIsFirmwareAuthenticityCheckEnabledAndHardFailed(state); @@ -108,8 +121,8 @@ export const selectShouldDisplayDeviceCompromised = (state: AppState): boolean = const isEntropyCheckEnabledAndFailed = selectIsEntropyCheckEnabledAndFailed(state); return ( - !isDeviceIdValid || - !deviceInvariabilitySuccess || + isDeviceIdCheckFailed || + isDeviceInvariabilityCheckFailed || (!isFirmwareAuthenticityCheckDismissed && isFirmwareCheckEnabledAndFailed) || isEntropyCheckEnabledAndFailed ); diff --git a/suite-common/message-system/src/messageSystemTypes.ts b/suite-common/message-system/src/messageSystemTypes.ts index 3f7c71ca2b..a033296182 100644 --- a/suite-common/message-system/src/messageSystemTypes.ts +++ b/suite-common/message-system/src/messageSystemTypes.ts @@ -74,6 +74,9 @@ export const Feature = { deviceAuthenticityCheckOptiga: 'security.deviceAuthenticityCheck.optiga', deviceAuthenticityCheckTropic: 'security.deviceAuthenticityCheck.tropic', + idCheck: 'security.deviceMetaChecks.id', + invariabilityCheck: 'security.deviceMetaChecks.invariability', + trading: { buy: 'trading.buy', sell: 'trading.sell', diff --git a/suite-common/wallet-core/src/device/deviceSelectors.ts b/suite-common/wallet-core/src/device/deviceSelectors.ts index eaad7baf04..0af6a222ac 100644 --- a/suite-common/wallet-core/src/device/deviceSelectors.ts +++ b/suite-common/wallet-core/src/device/deviceSelectors.ts @@ -39,6 +39,7 @@ import { } from './deviceConstants'; import { DeviceRootState } from './deviceReducer'; import { deviceInvariabilityCheck } from './services/deviceInvariabilityCheck'; +import { getIsDeviceIdValid } from './services/getIsDeviceIdValid'; const createMemoizedSelector = createWeakMapSelector.withTypes(); @@ -401,9 +402,23 @@ export const selectWasFwHashCheckOtherErrorLastTime = createMemoizedSelector( }, ); +export const selectIsDeviceIdCheckSuccess = createMemoizedSelector( + [selectSelectedDevice], + device => getIsDeviceIdValid(device) === true, +); + export const selectIsDeviceInvariabilityCheckSuccess = createMemoizedSelector( [selectSelectedDevice, selectSelectedPersistentDeviceData], - (device, previousData) => deviceInvariabilityCheck({ device, previousData }).success, + (device, previousData) => { + // just a failsafe in case memoization returned wrong results + if (device && previousData && device.id !== previousData.device_id) { + console.error('Device invariability check ID mismatch'); + + return true; + } + + return deviceInvariabilityCheck({ device, previousData }).success; + }, ); export const selectIsPortfolioTrackerDevice = createMemoizedSelector(