1
0
mirror of https://github.com/whowechina/chu_pico.git synced 2025-02-17 18:49:18 +01:00

AIME reader (80%, felica card works)

This commit is contained in:
whowechina 2023-10-25 23:00:39 +08:00
parent 87eb1a81e1
commit 87cfc39bee
3 changed files with 32 additions and 67 deletions

View File

@ -322,19 +322,12 @@ static int cmd_felica_encap_read()
}
printf("\n");
uint8_t *service = req_data + 8;
uint8_t svc_num = service[0];
uint16_t svc_codes[svc_num];
for (int i = 0; i < svc_num; i++) {
svc_codes[i] = service[i + 1] | (service[i + 2] << 8);
if (req_data[8] != 1) {
printf("Felica Encap READ Error: service_num != 1\n");
return -1;
}
uint8_t *block = req_data + 9 + svc_num * 2;
uint8_t block_num = block[0];
uint16_t block_list[block_num];
for (int i = 0; i < block_num; i++) {
block_list[i] = (block[i + 1] << 8) | block[i + 2];
}
uint16_t svc_code = req_data[9] | (req_data[10] << 8);
typedef struct __attribute__((packed)) {
uint8_t rw_status[2];
@ -345,10 +338,14 @@ static int cmd_felica_encap_read()
felica_encap_resp_t *encap_resp = (felica_encap_resp_t *) response.payload;
encap_read_resp_t *read_resp = (encap_read_resp_t *) encap_resp->data;
if (!pn532_felica_read_wo_encrypt(svc_num, svc_codes, block_num, block_list,
read_resp->block_data)) {
printf("Felica READ failed\n");
return -1;
uint8_t *block = req_data + 11;
uint8_t block_num = block[0];
memset(read_resp->block_data, 0, sizeof(read_resp->block_data));
for (int i = 0; i < block_num; i++) {
uint16_t block_id = (block[i * 2 + 1] << 8) | block[i * 2 + 2];
pn532_felica_read_wo_encrypt(svc_code, block_id, read_resp->block_data[i]);
}
read_resp->rw_status[0] = 0x00;
@ -358,21 +355,22 @@ static int cmd_felica_encap_read()
return sizeof(*read_resp);
}
#if 0
static int cmd_felica_encap_write()
{
printf("\tWRITE\n");
felica_encap_resp_t *encap_resp = (felica_encap_resp_t *) response.payload;
encap_resp->data[0] = 0;
encap_resp->data[1] = 0;
return 2;
}
break;
#if 0
case CMD_FELICA_THROUGH_NDA_A4:
printf("\tNDA_A4\n");
build_response(11);
resp->payload[0] = 0x00;
break;
case CMD_FELICA_THROUGH_WRITE:
printf("\tWRITE\n");
build_response(12);
resp->other.rw_status[0] = 0;
resp->other.rw_status[1] = 0;
break;
default:
printf("\tUnknown through: %02x\n", code);
build_response(0);
@ -406,6 +404,9 @@ static void cmd_felica_encap()
case CMD_FELICA_THROUGH_READ:
datalen = cmd_felica_encap_read();
break;
case CMD_FELICA_THROUGH_WRITE:
datalen = cmd_felica_encap_write();
break;
default:
printf("Unknown code %d\n", encap_req->code);
break;

View File

@ -348,12 +348,6 @@ int pn532_felica_command(uint8_t cmd, const uint8_t *param, uint8_t param_len, u
memcpy(cmd_buf + 3, felica_poll_cache.idm, 8);
memcpy(cmd_buf + 11, param, param_len);
printf("IndataEx [%d]: ", cmd_len);
for (int i = 0; i < cmd_len; i++) {
printf(" %02x", cmd_buf[i]);
}
printf("\n");
int ret = pn532_write_command(0x40, cmd_buf, sizeof(cmd_buf));
if (ret < 0) {
printf("Failed send felica command\n");
@ -361,11 +355,6 @@ int pn532_felica_command(uint8_t cmd, const uint8_t *param, uint8_t param_len, u
}
int result = pn532_read_response(0x40, readbuf, sizeof(readbuf));
printf("Result: %d - ", result);
for (int i = 0; i < result; i++) {
printf(" %02x", readbuf[i]);
}
printf("\n");
int outlen = readbuf[1] - 1;
if (readbuf[0] & 0x3f != 0 || result - 2 != outlen) {
@ -378,36 +367,14 @@ int pn532_felica_command(uint8_t cmd, const uint8_t *param, uint8_t param_len, u
}
bool pn532_felica_read_wo_encrypt(uint8_t svc_num, const uint16_t *svc_codes,
uint8_t block_num, const uint16_t *block_list,
uint8_t block_data[][16])
bool pn532_felica_read_wo_encrypt(uint16_t svc_code, uint16_t block_id, uint8_t block_data[16])
{
uint8_t param_len = 1 + 2 * svc_num + 1 + 2 * block_num;
uint8_t param[param_len];
uint8_t param[] = { 1, svc_code & 0xff, svc_code >> 8,
1, block_id >> 8, block_id & 0xff };
uint8_t *service = param;
service[0] = svc_num;
for (int i = 0; i < svc_num; i++) {
service[1 + 2 * i] = svc_codes[i] & 0xff;
service[2 + 2 * i] = svc_codes[i] >> 8;
}
int result = pn532_felica_command(0x06, param, sizeof(param), readbuf);
uint8_t *block = param + 1 + 2 * svc_num;
block[0] = block_num;
for (int i = 0; i < block_num; i++) {
block[1 + 2 * i] = block_list[i] >> 8;
block[2 + 2 * i] = block_list[i] & 0xff;
}
printf("PN532 Felica READ [%d]: ", param_len);
for (int i = 0; i < param_len; i++) {
printf("%02x ", param[i]);
}
printf("\n");
int result = pn532_felica_command(0x06, param, param_len, readbuf);
if (result != 12 + 16 * block_num || readbuf[9] != 0 || readbuf[10] != 0) {
if (result != 12 + 16 || readbuf[9] != 0 || readbuf[10] != 0) {
printf("PN532 Felica READ read response failed %d %02x %02x\n",
result, readbuf[9], readbuf[10]);
for (int i = 0; i < result; i++) {
@ -418,9 +385,7 @@ bool pn532_felica_read_wo_encrypt(uint8_t svc_num, const uint16_t *svc_codes,
}
const uint8_t *result_data = readbuf + 12;
for (int i = 0; i < block_num; i++) {
memcpy(block_data[i], result_data + 16 * i, 16);
}
memcpy(block_data, result_data, 16);
return true;
}

View File

@ -18,7 +18,6 @@ bool pn532_set_rf_field(uint8_t auto_rf, uint8_t on_off);
bool pn532_poll_mifare(uint8_t *uid, int *len);
bool pn532_poll_felica(uint8_t uid[8], uint8_t pmm[8], uint8_t syscode[2]);
bool pn532_felica_read_wo_encrypt(uint8_t svc_num, const uint16_t *svc_codes,
uint8_t block_num, const uint16_t *block_list,
uint8_t block_data[][16]);
bool pn532_felica_read_wo_encrypt(uint16_t svc_code, uint16_t block_id, uint8_t block_data[16]);
#endif