Work on CRCs

This commit is contained in:
Edith Boles
2026-03-04 18:56:33 -08:00
parent 260c9c7a94
commit cce87178ca
2 changed files with 253 additions and 1 deletions

View File

@@ -12,7 +12,7 @@ else
CFLAGS := $(CFLAGS) -lX11
endif
TARGETS := pm3-lvgl
TARGETS := pm3-lvgl cvend
EXES := $(patsubst %,bin/%,$(TARGETS))
SRCS := $(shell find src inc -type f -iname '*.c')
OBJS := $(patsubst src/%.c,obj/%.o,$(patsubst inc/%.c,obj/lib/%.o,$(SRCS)))

252
src/cvend.c Normal file
View File

@@ -0,0 +1,252 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int last_seq = 0;
enum message_type {
MTYPE_VERSION = 0x02,
MTYPE_VERSION_REPLY = 0x03,
MTYPE_STATUS = 0x04,
MTYPE_STATUS_REPLY = 0x05,
MTYPE_HEARTBEAT = 0x07,
MTYPE_STARTUP = 0x0f,
MTYPE_RESET = 0x10,
MTYPE_RESET_REPLY = 0x11,
MTYPE_LEDS = 0x20,
MTYPE_BUZZER = 0x22,
MTYPE_CARD_RELEASE = 0x32,
MTYPE_ABORT_CARD_HANDLING = 0x46,
MTYPE_PUT_FILE = 0x96,
MTYPE_PUT_FILE_REPLY = 0x97,
MTYPE_GET_FILE = 0x98,
MTYPE_GET_FILE_REPLY = 0x99,
MTYPE_DELETE_FILE = 0x9a,
MTYPE_DELETE_FILE_REPLY = 0x9b,
MTYPE_FILE_INFO = 0x9c,
MTYPE_FILE_INFO_REPLY = 0x9d,
MTYPE_FILE_LIST = 0xa4,
MTYPE_FILE_LIST_REPLY = 0xa5,
MTYPE_SET_TIME = 0xaa,
MTYPE_SET_TIME_REPLY = 0xab,
MTYPE_ITSO_DATA = 0xac,
MTYPE_ITSO_DATA_REPLY = 0xad,
MTYPE_ITSO_CTRL = 0xae,
MTYPE_ITSO_CTRL_REPLY = 0xaf,
MTYPE_ITSO_READ = 0xb1,
MTYPE_APDU_PROX = 0xb4,
MTYPE_APDU_PROX_REPLY = 0xb5,
MTYPE_SAM_CTRL = 0xb6,
MTYPE_SAM_CTRL_REPLY = 0xb7,
MTYPE_DESFIRE_READ = 0xb9,
MTYPE_UNHANDLED_CARD = 0xbe,
MTYPE_EMV = 0xd0,
MTYPE_EMV_STATUS = 0xd1,
MTYPE_PROX_CARD_FUNCTION = 0xe4,
MTYPE_PROX_CARD_FUNCTION_REPLY = 0xe5,
MTYPE_SECURITY_SERVICES = 0xe8,
MTYPE_SECURITY_SERVICES_REPLY = 0xe9,
MTYPE_LOG = 0xed
};
const char *stringify_msg_type(uint8_t msg_type)
{
switch (msg_type) {
case MTYPE_VERSION:
return "MTYPE_VERSION";
case MTYPE_VERSION_REPLY:
return "MTYPE_VERSION_REPLY";
case MTYPE_STATUS:
return "MTYPE_STATUS";
case MTYPE_STATUS_REPLY:
return "MTYPE_STATUS_REPLY";
case MTYPE_HEARTBEAT:
return "MTYPE_HEARTBEAT";
case MTYPE_STARTUP:
return "MTYPE_STARTUP";
case MTYPE_RESET:
return "MTYPE_RESET";
case MTYPE_RESET_REPLY:
return "MTYPE_RESET_REPLY";
case MTYPE_LEDS:
return "MTYPE_LEDS";
case MTYPE_BUZZER:
return "MTYPE_BUZZER";
case MTYPE_CARD_RELEASE:
return "MTYPE_CARD_RELEASE";
case MTYPE_ABORT_CARD_HANDLING:
return "MTYPE_ABORT_CARD_HANDLING";
case MTYPE_PUT_FILE:
return "MTYPE_PUT_FILE";
case MTYPE_PUT_FILE_REPLY:
return "MTYPE_PUT_FILE_REPLY";
case MTYPE_GET_FILE:
return "MTYPE_GET_FILE";
case MTYPE_GET_FILE_REPLY:
return "MTYPE_GET_FILE_REPLY";
case MTYPE_DELETE_FILE:
return "MTYPE_DELETE_FILE";
case MTYPE_DELETE_FILE_REPLY:
return "MTYPE_DELETE_FILE_REPLY";
case MTYPE_FILE_INFO:
return "MTYPE_FILE_INFO";
case MTYPE_FILE_INFO_REPLY:
return "MTYPE_FILE_INFO_REPLY";
case MTYPE_FILE_LIST:
return "MTYPE_FILE_LIST";
case MTYPE_FILE_LIST_REPLY:
return "MTYPE_FILE_LIST_REPLY";
case MTYPE_SET_TIME:
return "MTYPE_SET_TIME";
case MTYPE_SET_TIME_REPLY:
return "MTYPE_SET_TIME_REPLY";
case MTYPE_ITSO_DATA:
return "MTYPE_ITSO_DATA";
case MTYPE_ITSO_DATA_REPLY:
return "MTYPE_ITSO_DATA_REPLY";
case MTYPE_ITSO_CTRL:
return "MTYPE_ITSO_CTRL";
case MTYPE_ITSO_CTRL_REPLY:
return "MTYPE_ITSO_CTRL_REPLY";
case MTYPE_ITSO_READ:
return "MTYPE_ITSO_READ";
case MTYPE_APDU_PROX:
return "MTYPE_APDU_PROX";
case MTYPE_APDU_PROX_REPLY:
return "MTYPE_APDU_PROX_REPLY";
case MTYPE_SAM_CTRL:
return "MTYPE_SAM_CTRL";
case MTYPE_SAM_CTRL_REPLY:
return "MTYPE_SAM_CTRL_REPLY";
case MTYPE_DESFIRE_READ:
return "MTYPE_DESFIRE_READ";
case MTYPE_UNHANDLED_CARD:
return "MTYPE_UNHANDLED_CARD";
case MTYPE_EMV:
return "MTYPE_EMV";
case MTYPE_EMV_STATUS:
return "MTYPE_EMV_STATUS";
case MTYPE_PROX_CARD_FUNCTION:
return "MTYPE_PROX_CARD_FUNCTION";
case MTYPE_PROX_CARD_FUNCTION_REPLY:
return "MTYPE_PROX_CARD_FUNCTION_REPLY";
case MTYPE_SECURITY_SERVICES:
return "MTYPE_SECURITY_SERVICES";
case MTYPE_SECURITY_SERVICES_REPLY:
return "MTYPE_SECURITY_SERVICES_REPLY";
case MTYPE_LOG:
return "MTYPE_LOG";
default:
return "UNKNOWN";
}
}
typedef struct cvend_packet {
uint8_t magic;
uint8_t seq;
uint8_t flags;
uint8_t msg_type;
uint16_t msg_len;
uint8_t hdr_crc;
uint8_t *msg_data;
uint32_t msg_crc;
} cvend_packet;
cvend_packet *cvend_read(FILE *file)
{
uint8_t buf;
fread(&buf, 1, 1, file);
if (buf != 0xbc) {
printf("failed: %x\n", buf);
return NULL;
}
cvend_packet *packet = malloc(sizeof(cvend_packet));
fread(&packet->seq, 1, 1, file);
fread(&packet->flags, 1, 1, file);
fread(&packet->msg_type, 1, 1, file);
fread(&packet->msg_len + 1, 1, 1, file);
fread(&packet->msg_len, 1, 1, file);
fread(&packet->hdr_crc, 1, 1, file);
packet->msg_data = malloc(packet->msg_len + 1);
fread(packet->msg_data, 1, packet->msg_len, file);
packet->msg_data[packet->msg_len] = '\0';
if (packet->msg_type & 0x80)
fread(&packet->msg_crc, 1, 4, file);
else
packet->msg_crc = 0;
return packet;
}
void cvend_send(uint8_t msg_type, uint8_t *msg_data, uint16_t msg_size)
{
}
void cvend_free(cvend_packet *packet)
{
free(packet->msg_data);
free(packet);
}
unsigned char dallas_crc8(const unsigned char * data, const unsigned int size)
{
unsigned char crc = 0;
for ( unsigned int i = 0; i < size; ++i )
{
unsigned char inbyte = data[i];
for ( unsigned char j = 0; j < 8; ++j )
{
unsigned char mix = (crc ^ inbyte) & 0x01;
crc >>= 1;
if ( mix ) crc ^= 0x8C;
inbyte >>= 1;
}
}
return crc;
}
void calc_hdr_crc(cvend_packet *packet)
{
packet->magic = 0xbc;
packet->msg_len = (packet->msg_len << 8) + (packet->msg_len >> 8);
packet->hdr_crc = dallas_crc8((uint8_t *) packet, 6);
packet->msg_len = (packet->msg_len << 8) + (packet->msg_len >> 8);
}
int main(int argc, char *argv[])
{
cvend_packet crc_packet;
crc_packet.seq = 131;
crc_packet.flags = 0;
crc_packet.msg_type = MTYPE_UNHANDLED_CARD;
crc_packet.msg_len = 41;
printf("new_crc = %d\n", crc_packet.hdr_crc);
FILE *file = fopen(argc > 1 ? argv[1] : "/dev/ttymxc3", "r");
while (1) {
cvend_packet *packet;
do {
packet = cvend_read(file);
} while (!packet);
printf("\n");
printf("seq = %u\n", packet->seq);
printf("flags = %x\n", packet->flags);
printf("msg_type = %s\n", stringify_msg_type(packet->msg_type));
printf("msg_len = %u\n", packet->msg_len);
printf("hdr_crc = %u\n", packet->hdr_crc);
printf("msg_data = ");
for (uint16_t i = 0; i < packet->msg_len; i++)
printf("%02x ", packet->msg_data[i]);
printf("\n");
printf("msg_crc = %u\n\n", packet->msg_crc);
cvend_free(packet);
}
fclose(file);
return 0;
}