Skip to content

Commit a8c2fc1

Browse files
committed
Make answers to commands on errors similar to real cards.
NAKs returned by both Ultralight and NTAG cards were 0 in my tests and Ultralights didn't respond to invalid commands at all.
1 parent 3fe0a5f commit a8c2fc1

1 file changed

Lines changed: 19 additions & 22 deletions

File tree

firmware/application/src/rfid/nfctag/hf/nfc_mf0_ntag.c

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ static void handle_get_version_command() {
331331
} else {
332332
NRF_LOG_WARNING("current card type does not support GET_VERSION");
333333
// MF0ICU1 and MF0ICU2 do not support GET_VERSION
334-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
334+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
335335
}
336336
}
337337

@@ -344,7 +344,7 @@ static void handle_read_sig_command() {
344344
} else {
345345
NRF_LOG_WARNING("current card type does not support READ_SIG");
346346
// MF0ICU1 and MF0ICU2 do not support READ_SIG
347-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
347+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
348348
}
349349
}
350350

@@ -570,7 +570,7 @@ static void handle_read_command(uint8_t block_num) {
570570
if (block_num >= block_max) {
571571
NRF_LOG_WARNING("too large block num %02x >= %02x", block_num, block_max);
572572

573-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
573+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
574574
return;
575575
}
576576

@@ -588,14 +588,14 @@ static void handle_fast_read_command(uint8_t block_num, uint8_t end_block_num) {
588588
// command is supported
589589
break;
590590
default:
591-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
591+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
592592
return;
593593
}
594594

595595
int block_max = get_block_max_by_tag_type(m_tag_type, true);
596596

597597
if (block_num >= end_block_num || end_block_num >= block_max) {
598-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
598+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
599599
return;
600600
}
601601

@@ -705,7 +705,7 @@ static int handle_write_command(uint8_t block_num, uint8_t *p_data) {
705705
if (block_num >= block_max) {
706706
NRF_LOG_ERROR("Write failed: block_num %08x >= block_max %08x", block_num, block_max);
707707

708-
return NAK_INVALID_OPERATION_TBIV;
708+
return NAK_INVALID_OPERATION_TBV;
709709
}
710710

711711
if (m_tag_information->config.mode_uid_magic) {
@@ -717,10 +717,7 @@ static int handle_write_command(uint8_t block_num, uint8_t *p_data) {
717717
switch (block_num) {
718718
case 0:
719719
case 1:
720-
if (!memcmp(p_data, m_tag_information->memory[block_num], NFC_TAG_MF0_NTAG_DATA_SIZE))
721-
return ACK_VALUE;
722-
else
723-
return NAK_INVALID_OPERATION_TBIV;
720+
return NAK_INVALID_OPERATION_TBV;
724721
case 2:
725722
// Page 2 contains lock bytes for pages 3-15. These are OR'ed when not in the UID
726723
// magic mode. First two bytes are ignored.
@@ -735,12 +732,12 @@ static int handle_write_command(uint8_t block_num, uint8_t *p_data) {
735732
for (int i = 0; i < NFC_TAG_MF0_NTAG_DATA_SIZE; i++) {
736733
m_tag_information->memory[3][i] |= p_data[i];
737734
}
738-
} else return NAK_INVALID_OPERATION_TBIV;
735+
} else return NAK_INVALID_OPERATION_TBV;
739736
break;
740737
default:
741738
if (!check_ro_lock_on_page(block_num)) {
742739
memcpy(m_tag_information->memory[block_num], p_data, NFC_TAG_MF0_NTAG_DATA_SIZE);
743-
} else return NAK_INVALID_OPERATION_TBIV;
740+
} else return NAK_INVALID_OPERATION_TBV;
744741
break;
745742
}
746743

@@ -754,14 +751,14 @@ static void handle_read_cnt_command(uint8_t index) {
754751
int access = m_tag_information->memory[first_cfg_page + CONF_ACCESS_PAGE_OFFSET][CONF_ACCESS_BYTE];
755752

756753
if ((access & CONF_ACCESS_NFC_CNT_PWD_PROT) != 0 && !m_tag_authenticated) {
757-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
754+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
758755
return;
759756
}
760757
}
761758

762759
uint8_t *cnt_data = get_counter_data_by_index(index, true);
763760
if (cnt_data == NULL) {
764-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
761+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
765762
return;
766763
}
767764

@@ -782,13 +779,13 @@ static void handle_incr_cnt_command(uint8_t block_num, uint8_t *p_data) {
782779
ctr_page_end = ctr_page_off + MF0ULx1_NUM_CTRS;
783780
break;
784781
default:
785-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
782+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
786783
return;
787784
}
788785

789786
// check that counter index is in bounds
790787
if (block_num >= (ctr_page_end - ctr_page_off)) {
791-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
788+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
792789
return;
793790
}
794791

@@ -816,7 +813,7 @@ static void handle_pwd_auth_command(uint8_t *p_data) {
816813
int first_cfg_page = get_first_cfg_page_by_tag_type(m_tag_type);
817814
uint8_t *cnt_data = get_counter_data_by_index(0, false);
818815
if (first_cfg_page == 0 || cnt_data == NULL) {
819-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
816+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
820817
return;
821818
}
822819

@@ -854,13 +851,13 @@ static void handle_check_tearing_event(int index) {
854851
m_tag_tx_buffer.tx_buffer[0] = (ctr_data[MF0_NTAG_AUTHLIM_OFF_IN_CTR] & MF0_NTAG_TEARING_MASK_IN_AUTHLIM) == 0 ? 0xBD : 0x00;
855852
nfc_tag_14a_tx_bytes(m_tag_tx_buffer.tx_buffer, 1, true);
856853
} else {
857-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
854+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
858855
}
859856

860857
break;
861858
}
862859
default:
863-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
860+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
864861
break;
865862
}
866863
}
@@ -870,12 +867,12 @@ static void handle_vcsl_command(uint16_t szDataBits) {
870867
case TAG_TYPE_MF0UL11:
871868
case TAG_TYPE_MF0UL21:
872869
if (szDataBits < 168) {
873-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
870+
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
874871
break;
875872
}
876873
break;
877874
default:
878-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
875+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
879876
break;
880877
}
881878

@@ -934,7 +931,7 @@ static void nfc_tag_mf0_ntag_state_handler(uint8_t *p_data, uint16_t szDataBits)
934931
break;
935932
}
936933
default:
937-
nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4);
934+
if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4);
938935
break;
939936
}
940937
return;

0 commit comments

Comments
 (0)