mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-25 14:22:27 +03:00
d92b0a82cc
"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.
72 lines
2.1 KiB
C
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;
|
|
}
|
|
}
|