|
@@ -14,7 +14,6 @@ const uint8_t picopass_iclass_key[] = {0xaf, 0xa7, 0x85, 0xa7, 0xda, 0xb3, 0x33,
|
|
|
|
|
|
|
|
static char display[SEADER_UART_RX_BUF_SIZE * 2 + 1] = {0};
|
|
static char display[SEADER_UART_RX_BUF_SIZE * 2 + 1] = {0};
|
|
|
char asn1_log[SEADER_UART_RX_BUF_SIZE] = {0};
|
|
char asn1_log[SEADER_UART_RX_BUF_SIZE] = {0};
|
|
|
-bool requestPacs = true;
|
|
|
|
|
|
|
|
|
|
uint8_t read4Block6[] = {RFAL_PICOPASS_CMD_READ4, 0x06, 0x45, 0x56};
|
|
uint8_t read4Block6[] = {RFAL_PICOPASS_CMD_READ4, 0x06, 0x45, 0x56};
|
|
|
uint8_t read4Block9[] = {RFAL_PICOPASS_CMD_READ4, 0x09, 0xB2, 0xAE};
|
|
uint8_t read4Block9[] = {RFAL_PICOPASS_CMD_READ4, 0x09, 0xB2, 0xAE};
|
|
@@ -195,7 +194,7 @@ void seader_send_payload(
|
|
|
|
|
|
|
|
#ifdef ASN1_DEBUG
|
|
#ifdef ASN1_DEBUG
|
|
|
if(er.encoded > -1) {
|
|
if(er.encoded > -1) {
|
|
|
- char payloadDebug[384] = {0};
|
|
|
|
|
|
|
+ char payloadDebug[1024] = {0};
|
|
|
memset(payloadDebug, 0, sizeof(payloadDebug));
|
|
memset(payloadDebug, 0, sizeof(payloadDebug));
|
|
|
(&asn_DEF_Payload)
|
|
(&asn_DEF_Payload)
|
|
|
->op->print_struct(
|
|
->op->print_struct(
|
|
@@ -203,6 +202,8 @@ void seader_send_payload(
|
|
|
if(strlen(payloadDebug) > 0) {
|
|
if(strlen(payloadDebug) > 0) {
|
|
|
FURI_LOG_D(TAG, "Sending payload[%d %d %d]: %s", to, from, replyTo, payloadDebug);
|
|
FURI_LOG_D(TAG, "Sending payload[%d %d %d]: %s", to, from, replyTo, payloadDebug);
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ FURI_LOG_W(TAG, "Failed to print_struct payload");
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
//0xa0, 0xda, 0x02, 0x63, 0x00, 0x00, 0x0a,
|
|
//0xa0, 0xda, 0x02, 0x63, 0x00, 0x00, 0x0a,
|
|
@@ -232,7 +233,10 @@ void seader_send_response(
|
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void sendRequestPacs(SeaderUartBridge* seader_uart) {
|
|
|
|
|
|
|
+void seader_send_request_pacs(Seader* seader) {
|
|
|
|
|
+ SeaderWorker* seader_worker = seader->worker;
|
|
|
|
|
+ SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
|
|
|
+
|
|
|
RequestPacs_t* requestPacs = 0;
|
|
RequestPacs_t* requestPacs = 0;
|
|
|
requestPacs = calloc(1, sizeof *requestPacs);
|
|
requestPacs = calloc(1, sizeof *requestPacs);
|
|
|
assert(requestPacs);
|
|
assert(requestPacs);
|
|
@@ -244,6 +248,8 @@ void sendRequestPacs(SeaderUartBridge* seader_uart) {
|
|
|
assert(samCommand);
|
|
assert(samCommand);
|
|
|
|
|
|
|
|
samCommand->present = SamCommand_PR_requestPacs;
|
|
samCommand->present = SamCommand_PR_requestPacs;
|
|
|
|
|
+ seader->samCommand = samCommand->present;
|
|
|
|
|
+
|
|
|
samCommand->choice.requestPacs = *requestPacs;
|
|
samCommand->choice.requestPacs = *requestPacs;
|
|
|
|
|
|
|
|
Payload_t* payload = 0;
|
|
Payload_t* payload = 0;
|
|
@@ -260,13 +266,16 @@ void sendRequestPacs(SeaderUartBridge* seader_uart) {
|
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void seader_worker_send_serial_number(SeaderWorker* seader_worker) {
|
|
|
|
|
|
|
+void seader_worker_send_serial_number(Seader* seader) {
|
|
|
|
|
+ SeaderWorker* seader_worker = seader->worker;
|
|
|
SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
|
|
|
+
|
|
|
SamCommand_t* samCommand = 0;
|
|
SamCommand_t* samCommand = 0;
|
|
|
samCommand = calloc(1, sizeof *samCommand);
|
|
samCommand = calloc(1, sizeof *samCommand);
|
|
|
assert(samCommand);
|
|
assert(samCommand);
|
|
|
|
|
|
|
|
samCommand->present = SamCommand_PR_serialNumber;
|
|
samCommand->present = SamCommand_PR_serialNumber;
|
|
|
|
|
+ seader->samCommand = samCommand->present;
|
|
|
|
|
|
|
|
Payload_t* payload = 0;
|
|
Payload_t* payload = 0;
|
|
|
payload = calloc(1, sizeof *payload);
|
|
payload = calloc(1, sizeof *payload);
|
|
@@ -281,13 +290,16 @@ void seader_worker_send_serial_number(SeaderWorker* seader_worker) {
|
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void seader_worker_send_version(SeaderWorker* seader_worker) {
|
|
|
|
|
|
|
+void seader_worker_send_version(Seader* seader) {
|
|
|
|
|
+ SeaderWorker* seader_worker = seader->worker;
|
|
|
|
|
+
|
|
|
SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
|
SamCommand_t* samCommand = 0;
|
|
SamCommand_t* samCommand = 0;
|
|
|
samCommand = calloc(1, sizeof *samCommand);
|
|
samCommand = calloc(1, sizeof *samCommand);
|
|
|
assert(samCommand);
|
|
assert(samCommand);
|
|
|
|
|
|
|
|
samCommand->present = SamCommand_PR_version;
|
|
samCommand->present = SamCommand_PR_version;
|
|
|
|
|
+ seader->samCommand = samCommand->present;
|
|
|
|
|
|
|
|
Payload_t* payload = 0;
|
|
Payload_t* payload = 0;
|
|
|
payload = calloc(1, sizeof *payload);
|
|
payload = calloc(1, sizeof *payload);
|
|
@@ -302,7 +314,9 @@ void seader_worker_send_version(SeaderWorker* seader_worker) {
|
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
ASN_STRUCT_FREE(asn_DEF_Payload, payload);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void seader_send_card_detected(SeaderUartBridge* seader_uart, CardDetails_t* cardDetails) {
|
|
|
|
|
|
|
+void seader_send_card_detected(Seader* seader, CardDetails_t* cardDetails) {
|
|
|
|
|
+ SeaderWorker* seader_worker = seader->worker;
|
|
|
|
|
+ SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
|
CardDetected_t* cardDetected = 0;
|
|
CardDetected_t* cardDetected = 0;
|
|
|
cardDetected = calloc(1, sizeof *cardDetected);
|
|
cardDetected = calloc(1, sizeof *cardDetected);
|
|
|
assert(cardDetected);
|
|
assert(cardDetected);
|
|
@@ -314,6 +328,7 @@ void seader_send_card_detected(SeaderUartBridge* seader_uart, CardDetails_t* car
|
|
|
assert(samCommand);
|
|
assert(samCommand);
|
|
|
|
|
|
|
|
samCommand->present = SamCommand_PR_cardDetected;
|
|
samCommand->present = SamCommand_PR_cardDetected;
|
|
|
|
|
+ seader->samCommand = samCommand->present;
|
|
|
samCommand->choice.cardDetected = *cardDetected;
|
|
samCommand->choice.cardDetected = *cardDetected;
|
|
|
|
|
|
|
|
Payload_t* payload = 0;
|
|
Payload_t* payload = 0;
|
|
@@ -505,31 +520,37 @@ bool seader_parse_serial_number(Seader* seader, uint8_t* buf, size_t size) {
|
|
|
|
|
|
|
|
bool seader_parse_sam_response(Seader* seader, SamResponse_t* samResponse) {
|
|
bool seader_parse_sam_response(Seader* seader, SamResponse_t* samResponse) {
|
|
|
SeaderWorker* seader_worker = seader->worker;
|
|
SeaderWorker* seader_worker = seader->worker;
|
|
|
- SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
|
|
|
|
|
|
|
|
- if(samResponse->size == 0) {
|
|
|
|
|
- if(requestPacs) {
|
|
|
|
|
- FURI_LOG_D(TAG, "samResponse %d => requesting PACS", samResponse->size);
|
|
|
|
|
- sendRequestPacs(seader_uart);
|
|
|
|
|
- requestPacs = false;
|
|
|
|
|
- } else {
|
|
|
|
|
- FURI_LOG_D(
|
|
|
|
|
- TAG, "samResponse %d, PACS already requested, pushing view", samResponse->size);
|
|
|
|
|
- view_dispatcher_send_custom_event(
|
|
|
|
|
- seader->view_dispatcher, SeaderCustomEventWorkerExit);
|
|
|
|
|
- }
|
|
|
|
|
- } else if(seader_parse_version(seader_worker, samResponse->buf, samResponse->size)) {
|
|
|
|
|
- seader_worker_send_serial_number(seader_worker);
|
|
|
|
|
- } else if(seader_parse_serial_number(seader, samResponse->buf, samResponse->size)) {
|
|
|
|
|
- // no-op
|
|
|
|
|
- } else if(seader_unpack_pacs(seader, samResponse->buf, samResponse->size)) {
|
|
|
|
|
|
|
+ switch(seader->samCommand) {
|
|
|
|
|
+ case SamCommand_PR_requestPacs:
|
|
|
|
|
+ FURI_LOG_I(TAG, "samResponse SamCommand_PR_requestPacs");
|
|
|
|
|
+ seader_unpack_pacs(seader, samResponse->buf, samResponse->size);
|
|
|
view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventPollerSuccess);
|
|
view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventPollerSuccess);
|
|
|
- } else {
|
|
|
|
|
|
|
+ seader->samCommand = SamCommand_PR_NOTHING;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case SamCommand_PR_version:
|
|
|
|
|
+ FURI_LOG_I(TAG, "samResponse SamCommand_PR_version");
|
|
|
|
|
+ seader_parse_version(seader_worker, samResponse->buf, samResponse->size);
|
|
|
|
|
+ seader_worker_send_serial_number(seader);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case SamCommand_PR_serialNumber:
|
|
|
|
|
+ FURI_LOG_I(TAG, "samResponse SamCommand_PR_serialNumber");
|
|
|
|
|
+ seader_parse_serial_number(seader, samResponse->buf, samResponse->size);
|
|
|
|
|
+ seader->samCommand = SamCommand_PR_NOTHING;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case SamCommand_PR_cardDetected:
|
|
|
|
|
+ FURI_LOG_I(TAG, "samResponse SamCommand_PR_cardDetected");
|
|
|
|
|
+ seader_send_request_pacs(seader);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case SamCommand_PR_NOTHING:
|
|
|
|
|
+ FURI_LOG_I(TAG, "samResponse SamCommand_PR_NOTHING");
|
|
|
memset(display, 0, sizeof(display));
|
|
memset(display, 0, sizeof(display));
|
|
|
for(uint8_t i = 0; i < samResponse->size; i++) {
|
|
for(uint8_t i = 0; i < samResponse->size; i++) {
|
|
|
snprintf(display + (i * 2), sizeof(display), "%02x", samResponse->buf[i]);
|
|
snprintf(display + (i * 2), sizeof(display), "%02x", samResponse->buf[i]);
|
|
|
}
|
|
}
|
|
|
- FURI_LOG_D(TAG, "Unknown samResponse %d: %s", samResponse->size, display);
|
|
|
|
|
|
|
+ FURI_LOG_I(TAG, "Unknown samResponse %d: %s", samResponse->size, display);
|
|
|
|
|
+ view_dispatcher_send_custom_event(seader->view_dispatcher, SeaderCustomEventWorkerExit);
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
return false;
|
|
@@ -873,11 +894,6 @@ NfcCommand seader_worker_card_detect(
|
|
|
UNUSED(ats);
|
|
UNUSED(ats);
|
|
|
UNUSED(ats_len);
|
|
UNUSED(ats_len);
|
|
|
|
|
|
|
|
- // We're telling the SAM we've seen a new card, so reset out requestPacs check
|
|
|
|
|
- requestPacs = true;
|
|
|
|
|
-
|
|
|
|
|
- SeaderWorker* seader_worker = seader->worker;
|
|
|
|
|
- SeaderUartBridge* seader_uart = seader_worker->uart;
|
|
|
|
|
SeaderCredential* credential = seader->credential;
|
|
SeaderCredential* credential = seader->credential;
|
|
|
|
|
|
|
|
CardDetails_t* cardDetails = 0;
|
|
CardDetails_t* cardDetails = 0;
|
|
@@ -910,7 +926,7 @@ NfcCommand seader_worker_card_detect(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- seader_send_card_detected(seader_uart, cardDetails);
|
|
|
|
|
|
|
+ seader_send_card_detected(seader, cardDetails);
|
|
|
|
|
|
|
|
ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails);
|
|
ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails);
|
|
|
return NfcCommandContinue;
|
|
return NfcCommandContinue;
|