Skip to content

Commit be81164

Browse files
committed
gets response for encrypted MFC
1 parent 60440dd commit be81164

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

sam_api.c

+47-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
#include "sam_api.h"
33
#include <toolbox/path.h>
4+
#include <bit_lib/bit_lib.h>
45

56
#define TAG "SAMAPI"
67

@@ -749,23 +750,64 @@ void seader_mfc_transmit(
749750
BitBuffer* rx_buffer = bit_buffer_alloc(SEADER_POLLER_MAX_BUFFER_SIZE);
750751

751752
do {
752-
bit_buffer_append_bytes(tx_buffer, buffer, len);
753753
if(format[0] == 0x00 && format[1] == 0xC0 && format[2] == 0x00) {
754-
// MfClassicError error = mf_classic_poller_send_standard_frame(mfc_poller,tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC);
754+
bit_buffer_append_bytes(tx_buffer, buffer, len);
755755
MfClassicError error =
756756
mf_classic_poller_send_frame(mfc_poller, tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC);
757757
if(error != MfClassicErrorNone) {
758-
FURI_LOG_W(TAG, "mf_classic_poller_send_standard_frame error %d", error);
758+
FURI_LOG_W(TAG, "mf_classic_poller_send_frame error %d", error);
759759
seader_worker->stage = SeaderPollerEventTypeFail;
760760
break;
761761
}
762762
} else if(
763763
(format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x40) ||
764764
(format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x24) ||
765765
(format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x44)) {
766-
FURI_LOG_W(TAG, "TODO");
766+
//bit_buffer_copy_bytes_with_parity(tx_buffer, buffer, len * 8);
767+
768+
uint8_t tx_parity = 0;
769+
770+
// Don't forget to swap the bits of buffer[8]
771+
for(size_t i = 0; i < 8 + 1; i++) {
772+
bit_lib_reverse_bits(buffer + i, 0, 8);
773+
}
774+
775+
// Pull out parity bits
776+
for(size_t i = 0; i < 8; i++) {
777+
bool val = bit_lib_get_bit(buffer + i + 1, i);
778+
bit_lib_set_bit(&tx_parity, i, val);
779+
}
780+
781+
for(size_t i = 0; i < 8; i++) {
782+
buffer[i] = (buffer[i] << i) | (buffer[i + 1] >> (8 - i));
783+
}
784+
bit_buffer_append_bytes(tx_buffer, buffer, 8);
785+
786+
for(size_t i = 0; i < 8; i++) {
787+
bit_lib_reverse_bits(buffer + i, 0, 8);
788+
bit_buffer_set_byte_with_parity(
789+
tx_buffer, i, buffer[i], bit_lib_get_bit(&tx_parity, i));
790+
}
791+
792+
MfClassicError error = mf_classic_poller_send_custom_parity_frame(
793+
mfc_poller, tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC);
794+
if(error != MfClassicErrorNone) {
795+
FURI_LOG_W(TAG, "mf_classic_poller_send_encrypted_frame error %d", error);
796+
seader_worker->stage = SeaderPollerEventTypeFail;
797+
break;
798+
}
799+
800+
/*
801+
uint8_t b[SEADER_POLLER_MAX_BUFFER_SIZE];
802+
memset(b, 0, SEADER_POLLER_MAX_BUFFER_SIZE);
803+
size_t bits_written = 0;
804+
bit_buffer_write_bytes_with_parity(rx_buffer, b, SEADER_POLLER_MAX_BUFFER_SIZE, &bits_written);
805+
806+
seader_send_nfc_rx(seader_uart, b, bits_written/8);
807+
*/
808+
} else {
809+
FURI_LOG_W(TAG, "UNHANDLED FORMAT");
767810
}
768-
FURI_LOG_W(TAG, "mf_classic_poller_send_standard_frame success");
769811

770812
seader_send_nfc_rx(
771813
seader_uart,

seader_worker.c

+2
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ NfcCommand seader_worker_poller_callback_mfc(NfcGenericEvent event, void* contex
330330
seader_worker_poller_conversation(seader, &spc);
331331
} else if(seader_worker->stage == SeaderPollerEventTypeComplete) {
332332
ret = NfcCommandStop;
333+
} else if(seader_worker->stage == SeaderPollerEventTypeFail) {
334+
ret = NfcCommandStop;
333335
}
334336
} else if(mfc_event->type == MfClassicPollerEventTypeFail) {
335337
ret = NfcCommandStop;

0 commit comments

Comments
 (0)