Skip to content

Commit dd39009

Browse files
committed
WIP: Add LF PSK Indala support
1 parent b77af1e commit dd39009

File tree

16 files changed

+908
-14
lines changed

16 files changed

+908
-14
lines changed

firmware/application/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ SRC_FILES += \
3434
$(PROJ_DIR)/rfid/nfctag/lf/utils/fskdemod.c \
3535
$(PROJ_DIR)/rfid/nfctag/lf/utils/circular_buffer.c \
3636
$(PROJ_DIR)/rfid/nfctag/lf/utils/manchester.c \
37+
$(PROJ_DIR)/rfid/nfctag/lf/utils/pskdemod.c \
3738
$(PROJ_DIR)/rfid/nfctag/lf/protocols/em410x.c \
3839
$(PROJ_DIR)/rfid/nfctag/lf/protocols/hidprox.c \
40+
$(PROJ_DIR)/rfid/nfctag/lf/protocols/indala.c \
3941
$(PROJ_DIR)/rfid/nfctag/lf/protocols/ioprox.c \
4042
$(PROJ_DIR)/rfid/nfctag/lf/protocols/viking.c \
4143
$(PROJ_DIR)/rfid/nfctag/lf/protocols/wiegand.c \
@@ -350,6 +352,7 @@ ifeq (${CURRENT_DEVICE_TYPE}, ${CHAMELEON_ULTRA})
350352
$(PROJ_DIR)/rfid/reader/lf/lf_hidprox_data.c \
351353
$(PROJ_DIR)/rfid/reader/lf/lf_ioprox_data.c \
352354
$(PROJ_DIR)/rfid/reader/lf/lf_viking_data.c \
355+
$(PROJ_DIR)/rfid/reader/lf/lf_psk_reader.c \
353356

354357
INC_FOLDERS +=\
355358
${PROJ_DIR}/rfid/reader/ \

firmware/application/src/app_cmd.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "bsp_wdt.h"
1919
#include "lf_reader_generic.h"
2020
#include "lf_em4x05_data.h"
21+
#include "lf_psk_reader.h"
2122
#endif
2223
#include "nfc_14a.h"
2324

@@ -823,6 +824,35 @@ static data_frame_tx_t *cmd_processor_viking_write_to_t55xx(uint16_t cmd, uint16
823824
return data_frame_make(cmd, status, 0, NULL);
824825
}
825826

827+
static data_frame_tx_t *cmd_processor_indala_scan(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) {
828+
uint8_t card_buffer[LF_INDALA_TAG_ID_SIZE] = {0x00};
829+
status = scan_indala(card_buffer);
830+
if (status != STATUS_LF_TAG_OK) {
831+
return data_frame_make(cmd, status, 0, NULL);
832+
}
833+
return data_frame_make(cmd, STATUS_LF_TAG_OK, sizeof(card_buffer), card_buffer);
834+
}
835+
836+
static data_frame_tx_t *cmd_processor_indala_write_to_t55xx(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) {
837+
typedef struct {
838+
uint8_t id[LF_INDALA_TAG_ID_SIZE];
839+
uint8_t new_key[4];
840+
uint8_t old_keys[4];
841+
} PACKED payload_t;
842+
payload_t *payload = (payload_t *)data;
843+
if (length < sizeof(payload_t)) {
844+
return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL);
845+
}
846+
uint16_t tail = length - offsetof(payload_t, old_keys);
847+
bool fc8 = (tail % 4 == 1) ? data[length - 1] : 0;
848+
uint8_t key_count = (tail - (tail % 4 == 1 ? 1 : 0)) / 4;
849+
if (key_count == 0) {
850+
return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL);
851+
}
852+
status = write_indala_to_t55xx(payload->id, payload->new_key, payload->old_keys, key_count, fc8);
853+
return data_frame_make(cmd, status, 0, NULL);
854+
}
855+
826856
#define GENERIC_READ_LEN 800
827857
#define GENERIC_READ_TIMEOUT_MS 500
828858
static data_frame_tx_t *cmd_processor_generic_read(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) {
@@ -1072,6 +1102,26 @@ static data_frame_tx_t *cmd_processor_viking_get_emu_id(uint16_t cmd, uint16_t s
10721102
return data_frame_make(cmd, STATUS_SUCCESS, LF_VIKING_TAG_ID_SIZE, buffer->buffer);
10731103
}
10741104

1105+
static data_frame_tx_t *cmd_processor_indala_set_emu_id(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) {
1106+
if (length != LF_INDALA_TAG_ID_SIZE) {
1107+
return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL);
1108+
}
1109+
tag_data_buffer_t *buffer = get_buffer_by_tag_type(TAG_TYPE_INDALA);
1110+
memcpy(buffer->buffer, data, LF_INDALA_TAG_ID_SIZE);
1111+
tag_emulation_load_by_buffer(TAG_TYPE_INDALA, false);
1112+
return data_frame_make(cmd, STATUS_SUCCESS, 0, NULL);
1113+
}
1114+
1115+
static data_frame_tx_t *cmd_processor_indala_get_emu_id(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) {
1116+
tag_slot_specific_type_t tag_types;
1117+
tag_emulation_get_specific_types_by_slot(tag_emulation_get_slot(), &tag_types);
1118+
if (tag_types.tag_lf != TAG_TYPE_INDALA) {
1119+
return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL);
1120+
}
1121+
tag_data_buffer_t *buffer = get_buffer_by_tag_type(TAG_TYPE_INDALA);
1122+
return data_frame_make(cmd, STATUS_SUCCESS, LF_INDALA_TAG_ID_SIZE, buffer->buffer);
1123+
}
1124+
10751125
static nfc_tag_14a_coll_res_reference_t *get_coll_res_data(bool write) {
10761126
nfc_tag_14a_coll_res_reference_t *info;
10771127
tag_slot_specific_type_t tag_types;
@@ -1915,6 +1965,8 @@ static cmd_data_map_t m_data_cmd_map[] = {
19151965
{ DATA_CMD_VIKING_WRITE_TO_T55XX, before_reader_run, cmd_processor_viking_write_to_t55xx, NULL },
19161966
{ DATA_CMD_IOPROX_SCAN, before_reader_run, cmd_processor_ioprox_scan, NULL },
19171967
{ DATA_CMD_IOPROX_WRITE_TO_T55XX, before_reader_run, cmd_processor_ioprox_write_to_t55xx, NULL },
1968+
{ DATA_CMD_INDALA_SCAN, before_reader_run, cmd_processor_indala_scan, NULL },
1969+
{ DATA_CMD_INDALA_WRITE_TO_T55XX, before_reader_run, cmd_processor_indala_write_to_t55xx, NULL },
19181970
{ DATA_CMD_ADC_GENERIC_READ, before_reader_run, cmd_processor_generic_read, NULL },
19191971

19201972
{ DATA_CMD_HF14A_SET_FIELD_ON, before_reader_run, cmd_processor_hf14a_set_field_on, NULL },
@@ -1980,6 +2032,8 @@ static cmd_data_map_t m_data_cmd_map[] = {
19802032
{ DATA_CMD_IOPROX_GET_EMU_ID, NULL, cmd_processor_ioprox_get_emu_id, NULL },
19812033
{ DATA_CMD_VIKING_SET_EMU_ID, NULL, cmd_processor_viking_set_emu_id, NULL },
19822034
{ DATA_CMD_VIKING_GET_EMU_ID, NULL, cmd_processor_viking_get_emu_id, NULL },
2035+
{ DATA_CMD_INDALA_SET_EMU_ID, NULL, cmd_processor_indala_set_emu_id, NULL },
2036+
{ DATA_CMD_INDALA_GET_EMU_ID, NULL, cmd_processor_indala_get_emu_id, NULL },
19832037
};
19842038

19852039
data_frame_tx_t *cmd_processor_get_device_capabilities(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) {

firmware/application/src/data_cmd.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@
103103
#define DATA_CMD_IOPROX_WRITE_TO_T55XX (3011)
104104
#define DATA_CMD_IOPROX_DECODE_RAW (3012)
105105
#define DATA_CMD_IOPROX_COMPOSE_ID (3013)
106+
#define DATA_CMD_INDALA_SCAN (3035)
107+
#define DATA_CMD_INDALA_WRITE_TO_T55XX (3036)
106108

107109
//
108110
// ******************************************************************
@@ -173,6 +175,8 @@
173175
#define DATA_CMD_VIKING_GET_EMU_ID (5005)
174176
#define DATA_CMD_IOPROX_SET_EMU_ID (5008)
175177
#define DATA_CMD_IOPROX_GET_EMU_ID (5009)
178+
#define DATA_CMD_INDALA_SET_EMU_ID (5026)
179+
#define DATA_CMD_INDALA_GET_EMU_ID (5027)
176180

177181
#define DATA_CMD_EM4X05_SCAN (3030)
178182
#define DATA_CMD_EM4X05_READSNIFF (3032)

0 commit comments

Comments
 (0)