unleashed-firmware/lib/nfc/protocols/iso14443_4a/iso14443_4a_i.c
gornekich d92b0a82cc
NFC refactoring (#3050)
"A long time ago in a galaxy far, far away...." we started NFC subsystem refactoring.

Starring:

- @gornekich - NFC refactoring project lead, architect, senior developer
- @gsurkov - architect, senior developer
- @RebornedBrain - senior developer

Supporting roles:

- @skotopes, @DrZlo13, @hedger - general architecture advisors, code review
- @Astrrra, @doomwastaken, @Hellitron, @ImagineVagon333 - quality assurance

Special thanks:

@bettse, @pcunning, @nxv, @noproto, @AloneLiberty and everyone else who has been helping us all this time and contributing valuable knowledges, ideas and source code.
2023-10-24 12:08:09 +09:00

72 lines
2.1 KiB
C

#include "iso14443_4a_i.h"
bool iso14443_4a_ats_parse(Iso14443_4aAtsData* data, const BitBuffer* buf) {
bool can_parse = false;
do {
const size_t buf_size = bit_buffer_get_size_bytes(buf);
if(buf_size == 0) break;
size_t current_index = 0;
const uint8_t tl = bit_buffer_get_byte(buf, current_index++);
if(tl != buf_size) break;
data->tl = tl;
if(tl > 1) {
const uint8_t t0 = bit_buffer_get_byte(buf, current_index++);
const bool has_ta_1 = t0 & ISO14443_4A_ATS_T0_TA1;
const bool has_tb_1 = t0 & ISO14443_4A_ATS_T0_TB1;
const bool has_tc_1 = t0 & ISO14443_4A_ATS_T0_TC1;
const uint8_t buf_size_min =
2 + (has_ta_1 ? 1 : 0) + (has_tb_1 ? 1 : 0) + (has_tc_1 ? 1 : 0);
if(buf_size < buf_size_min) break;
data->t0 = t0;
if(has_ta_1) {
data->ta_1 = bit_buffer_get_byte(buf, current_index++);
}
if(has_tb_1) {
data->tb_1 = bit_buffer_get_byte(buf, current_index++);
}
if(has_tc_1) {
data->tc_1 = bit_buffer_get_byte(buf, current_index++);
}
const uint8_t t1_tk_size = buf_size - buf_size_min;
if(t1_tk_size > 0) {
simple_array_init(data->t1_tk, t1_tk_size);
bit_buffer_write_bytes_mid(
buf, simple_array_get_data(data->t1_tk), current_index, t1_tk_size);
}
}
can_parse = true;
} while(false);
return can_parse;
}
Iso14443_4aError iso14443_4a_process_error(Iso14443_3aError error) {
switch(error) {
case Iso14443_3aErrorNone:
return Iso14443_4aErrorNone;
case Iso14443_3aErrorNotPresent:
return Iso14443_4aErrorNotPresent;
case Iso14443_3aErrorColResFailed:
case Iso14443_3aErrorCommunication:
case Iso14443_3aErrorWrongCrc:
return Iso14443_4aErrorProtocol;
case Iso14443_3aErrorTimeout:
return Iso14443_4aErrorTimeout;
default:
return Iso14443_4aErrorProtocol;
}
}