# Pin validation
Pin validation is comprised of two steps, first of the [local](#local-pin-validation) pin validation (when configuring the wallet) to prevent users from selecting a trivial pin. Secondly the [remote](#remote-pin-validation) pin validation, where the user provided pin is compared with the previously registerd pin by the `wallet_provider`.
## Local pin validation
This diagram illustrates the local validation that happens when the user configures a new pin, to make sure the user does not select a trivial pin like `000000`.
```{mermaid}
sequenceDiagram
%% Force ordering by explicitly setting up participants
actor user
participant platform
participant wallet_app
participant wallet_core
participant wallet_provider
title Local Pin Validation [3.1]
user->>wallet_app: enter new pin
activate user
wallet_app->>wallet_core: validate pin
alt pin invalid
wallet_core-->>wallet_app: pin error
Note over wallet_core,wallet_app: TooFewUniqueDigits,
SequentialDigits, Other
wallet_app->>user: render error & request new pin
else pin valid
wallet_core-->>wallet_app: pin success
wallet_app->>user: render success
end
deactivate user
```
## Remote pin validation
This diagram illustrates the remote validation, this occurs when the user has already configured her wallet and is e.g. trying to log in to the app.
```{mermaid}
sequenceDiagram
%% Force ordering by explicitly setting up participants
actor user
participant platform
participant wallet_app
participant wallet_core
participant wallet_provider
title Remote Pin Validation [3.2]
user->>wallet_app: enter existing pin
activate user
wallet_app->>wallet_core: unlock(pin)
wallet_core->>wallet_core: getRegistration()
alt no registration
wallet_core-->>wallet_app: NotRegistered
wallet_app->>user: show not registered
end
par sign challenge request
wallet_core->>wallet_core: createChallenge(incrementAndStore(sequenceNumber))
wallet_core->>platform: sign(challengeRequest)
platform->>platform: signWithHwKey(challengeRequest)
platform-->>wallet_core: signedChallengeRequest
end
wallet_core->>wallet_provider: requestChallenge(signedChallengeRequest)
opt server error
wallet_provider-->>wallet_core: server error
wallet_core-->>wallet_app: error
wallet_app->>user: show server error
end
wallet_provider-->>wallet_core: challenge
par sign instruction
wallet_core->>wallet_core: signWithPinKey(pin, challenge, incrementAndStore(sequenceNumber))
wallet_core->>platform: sign(pinSignedInstruction)
platform->>platform: signWithHwKey(pinSignedInstruction)
platform-->>wallet_core: doubleSignedInstruction
end
wallet_core->>wallet_provider: instruction(doubleSignedInstruction)
opt server error
Note over wallet_provider,user: same as server error above
end
wallet_provider-->>wallet_core: result
alt error
wallet_core-->>wallet_app: pin error
Note over wallet_core,wallet_app: IncorrectPin,
Timeout, Blocked
wallet_app->>user: render error & request new pin
else success
wallet_core-->>wallet_app: success
wallet_app->>user: render unlocked
end
deactivate user
```