diff --git a/src/commands.rs b/src/commands.rs index 0705e5c..cb81b1c 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -228,8 +228,8 @@ impl TryFrom<&[u8]> for ResetRetryCounter { return Err(Status::IncorrectDataParameter); } Ok(Self { - pin: data[..8].try_into().unwrap(), - puk: data[8..].try_into().unwrap(), + puk: data[..8].try_into().unwrap(), + pin: data[8..].try_into().unwrap(), }) } } diff --git a/src/constants.rs b/src/constants.rs index 657e4d7..5d0748d 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -47,7 +47,7 @@ pub const DISCOVERY_OBJECT: [u8; 18] = hex!( 4f 0b // PIV AID a000000308000010000100 5f2f 02 // PIN usage Policy - 4000" + 4010" ); pub const CARD_CAP: [u8; 27] = hex!( diff --git a/src/lib.rs b/src/lib.rs index a8e43fe..3d50f01 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -302,7 +302,11 @@ impl<'a, T: Client> LoadedAuthenticator<'a, T> { // should we logout here? self.state.volatile.app_security_status.pin_verified = false; let remaining = self.state.persistent.remaining_pin_retries(self.trussed); - Err(Status::RemainingRetries(remaining)) + if remaining == 0 { + Err(Status::OperationBlocked) + } else { + Err(Status::RemainingRetries(remaining)) + } } } else { Err(Status::FunctionNotSupported) diff --git a/tests/command_response.ron b/tests/command_response.ron index 0ff97e9..aa80cc8 100644 --- a/tests/command_response.ron +++ b/tests/command_response.ron @@ -89,7 +89,7 @@ cmd_resp: [ GetData( input: "5C 01 7E", - output: Data("7e 12 4f 0b a000000308000010000100 5f2f 02 4000") + output: Data("7e 12 4f 0b a000000308000010000100 5f2f 02 4010") ), GetData( input: "5C 03 5FC102", @@ -133,7 +133,7 @@ ), VerifyApplicationPin(pin: "FFEEDDCCBBAA9988", expected_status: RemainingRetries(2)), VerifyApplicationPin(pin: "FFEEDDCCBBAA9988", expected_status: RemainingRetries(1)), - VerifyApplicationPin(pin: "FFEEDDCCBBAA9988", expected_status: RemainingRetries(0)), + VerifyApplicationPin(pin: "FFEEDDCCBBAA9988", expected_status: OperationBlocked), Reset(), ] ),