if no carrier clear former authentication

This commit is contained in:
tharexde 2021-01-20 00:58:48 +01:00
commit 6b6f104d9a

View file

@ -78,6 +78,7 @@ static void wait_timer(uint32_t period) {
while (AT91C_BASE_TC0->TC_CV < period); while (AT91C_BASE_TC0->TC_CV < period);
} }
// extract and check parities // extract and check parities
// return result of parity check and extracted plain data // return result of parity check and extracted plain data
static bool extract_parities(uint64_t word, uint32_t *data) { static bool extract_parities(uint64_t word, uint32_t *data) {
@ -177,17 +178,9 @@ static void em4x50_setup_read(void) {
} }
static void em4x50_setup_sim(void) { static void em4x50_setup_sim(void) {
StopTicks();
FpgaDownloadAndGo(FPGA_BITSTREAM_LF); FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
sample_config *sc = getSamplingConfig();
sc->decimation = 1;
sc->averaging = 0;
sc->divisor = LF_DIVISOR_125;
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc->divisor);
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT);
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, LF_DIVISOR_125);
AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT | GPIO_SSC_CLK; AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT | GPIO_SSC_CLK;
AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT; AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT;
@ -463,6 +456,7 @@ static int find_double_listen_window(bool bcommand) {
// send RM for request mode // send RM for request mode
em4x50_reader_send_bit(0); em4x50_reader_send_bit(0);
em4x50_reader_send_bit(0); em4x50_reader_send_bit(0);
LED_B_OFF(); LED_B_OFF();
return PM3_SUCCESS; return PM3_SUCCESS;
@ -661,12 +655,11 @@ static bool login(uint32_t password) {
// send password // send password
em4x50_reader_send_word(password); em4x50_reader_send_word(password);
wait_timer(T0 * (EM4X50_T_TAG_TPP)); wait_timer(T0 * EM4X50_T_TAG_TPP);
// check if ACK is returned // check if ACK is returned
if (check_ack(false)) { if (check_ack(false))
return PM3_SUCCESS; return PM3_SUCCESS;
}
} else { } else {
if (DBGLEVEL >= DBG_DEBUG) if (DBGLEVEL >= DBG_DEBUG)
@ -941,7 +934,6 @@ void em4x50_reader(void) {
LOW(GPIO_SSC_DOUT); LOW(GPIO_SSC_DOUT);
lf_finalize(); lf_finalize();
reply_ng(CMD_LF_EM4X50_READER, now, (uint8_t *)words, 4 * now); reply_ng(CMD_LF_EM4X50_READER, now, (uint8_t *)words, 4 * now);
} }
@ -970,15 +962,14 @@ static int write(uint32_t word, uint32_t addresses) {
// look for ACK sequence // look for ACK sequence
if (check_ack(false)) { if (check_ack(false)) {
// now EM4x50 needs T0 * EM4X50_T_TAG_TWEE (EEPROM write time) // now EM4x50 needs T0 * EM4X50_T_TAG_TWEE (EEPROM write time = 3.2ms = 50 * 64 periods)
// for saving data and should return with ACK // for saving data and should return with ACK
for (int i = 0; i < 50; i++) { for (int i = 0; i < 50; i++) {
wait_timer(T0 * EM4X50_T_TAG_FULL_PERIOD); wait_timer(T0 * EM4X50_T_TAG_FULL_PERIOD);
} }
if (check_ack(false)) { if (check_ack(false))
return PM3_SUCCESS; return PM3_SUCCESS;
}
} }
} }
} else { } else {
@ -1019,15 +1010,14 @@ static int write_password(uint32_t password, uint32_t new_password) {
if (check_ack(false)) { if (check_ack(false)) {
// now EM4x50 needs T0 * EM4X50_T_TAG_TWEE (EEPROM write time) // now EM4x50 needs T0 * EM4X50_T_TAG_TWEE (EEPROM write time = 3.2ms = 50 * 64 periods)
// for saving data and should return with ACK // for saving data and should return with ACK
for (int i = 0; i < 50; i++) { for (int i = 0; i < 50; i++) {
wait_timer(T0 * EM4X50_T_TAG_FULL_PERIOD); wait_timer(T0 * EM4X50_T_TAG_FULL_PERIOD);
} }
if (check_ack(false)) { if (check_ack(false))
return PM3_SUCCESS; return PM3_SUCCESS;
}
} }
} }
} }
@ -1425,8 +1415,6 @@ static void em4x50_sim_send_nak(void) {
SHORT_COIL(); SHORT_COIL();
wait_cycles(EM4X50_T_TAG_HALF_PERIOD); wait_cycles(EM4X50_T_TAG_HALF_PERIOD);
OPEN_COIL();
} }
// standard read mode process (simulation mode) // standard read mode process (simulation mode)
@ -1821,9 +1809,12 @@ void em4x50_sim(uint32_t *password) {
break; break;
} }
// if timeout (e.g. no reader field) continue with standard read mode // if timeout (e.g. no reader field) continue with standard read
// mode and reset former authentication
if (command == PM3_ETIMEOUT) { if (command == PM3_ETIMEOUT) {
command = EM4X50_COMMAND_STANDARD_READ; command = EM4X50_COMMAND_STANDARD_READ;
gLogin = false;
LED_A_OFF();
} }
} }
} }