[FL-3717] MFC emulation fix (#3291)

* mf classic listener: reset state before sleep and after nack
* Fix PVS warnings
* Fix PVS and compiler disagree on builtins

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
gornekich
2023-12-15 17:51:20 +00:00
committed by GitHub
co-authored by あく
parent 36aecfbec9
commit 09540929c3
3 changed files with 11 additions and 11 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ uint64_t nfc_util_bytes2num_little_endian(const uint8_t* src, uint8_t len) {
uint64_t res = 0;
uint8_t shift = 0;
while(len--) {
res |= *src << (8 * shift++);
res |= ((uint64_t)*src) << (8 * shift++);
src++;
}
return res;
@@ -40,10 +40,11 @@ static void mf_classic_listener_reset_state(MfClassicListener* instance) {
static MfClassicListenerCommand
mf_classic_listener_halt_handler(MfClassicListener* instance, BitBuffer* buff) {
UNUSED(instance);
MfClassicListenerCommand command = MfClassicListenerCommandNack;
if(bit_buffer_get_byte(buff, 1) == MF_CLASSIC_CMD_HALT_LSB) {
mf_classic_listener_reset_state(instance);
command = MfClassicListenerCommandSleep;
}
@@ -59,10 +60,7 @@ static MfClassicListenerCommand mf_classic_listener_auth_first_part_handler(
do {
instance->state = MfClassicListenerStateIdle;
if(block_num >= instance->total_block_num) {
mf_classic_listener_reset_state(instance);
break;
}
if(block_num >= instance->total_block_num) break;
uint8_t sector_num = mf_classic_get_sector_by_block(block_num);
@@ -135,7 +133,7 @@ static MfClassicListenerCommand
instance->cmd_in_progress = false;
if(bit_buffer_get_size_bytes(buff) != (sizeof(MfClassicNr) + sizeof(MfClassicAr))) {
mf_classic_listener_reset_state(instance);
command = MfClassicListenerCommandSleep;
break;
}
bit_buffer_write_bytes_mid(buff, instance->auth_context.nr.data, 0, sizeof(MfClassicNr));
@@ -157,7 +155,7 @@ static MfClassicListenerCommand
if(secret_poller != prng_successor(nt_num, 64)) {
FURI_LOG_T(
TAG, "Wrong reader key: %08lX != %08lX", secret_poller, prng_successor(nt_num, 64));
mf_classic_listener_reset_state(instance);
command = MfClassicListenerCommandSleep;
break;
}
@@ -610,9 +608,11 @@ NfcCommand mf_classic_listener_run(NfcGenericEvent event, void* context) {
}
mf_classic_listener_send_short_frame(instance, nack);
mf_classic_listener_reset_state(instance);
} else if(mfc_command == MfClassicListenerCommandSilent) {
command = NfcCommandReset;
} else if(mfc_command == MfClassicListenerCommandSleep) {
mf_classic_listener_reset_state(instance);
command = NfcCommandSleep;
}
} else if(iso3_event->type == Iso14443_3aListenerEventTypeHalted) {