From b75e5a6619dbad5f541081904b9191e98602d81d Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Tue, 30 Aug 2022 13:22:21 +0200 Subject: [PATCH] Not used anymore. Signed-off-by: Pol Henarejos --- src/ccid/ccid2040.c | 615 -------------------------------------------- 1 file changed, 615 deletions(-) delete mode 100644 src/ccid/ccid2040.c diff --git a/src/ccid/ccid2040.c b/src/ccid/ccid2040.c deleted file mode 100644 index 6ce5baf..0000000 --- a/src/ccid/ccid2040.c +++ /dev/null @@ -1,615 +0,0 @@ -/* - * This file is part of the Pico CCID distribution (https://github.com/polhenarejos/pico-ccid). - * Copyright (c) 2022 Pol Henarejos. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -// Pico -#include "pico/stdlib.h" - -// For memcpy -#include - -// Include descriptor struct definitions -#include "usb_common.h" -// USB register definitions from pico-sdk -#include "hardware/regs/usb.h" -// USB hardware struct definitions from pico-sdk -#include "hardware/structs/usb.h" -// For interrupt enable and numbers -#include "hardware/irq.h" -// For resetting the USB controller -#include "hardware/resets.h" - -#include "pico/multicore.h" -#include "random.h" -#include "ccid2040.h" -#include "hardware/rtc.h" -#include "bsp/board.h" -#include "tusb.h" - -extern void do_flash(); -extern void low_flash_init(); - -const uint8_t *ccid_atr = NULL; -static uint32_t timeout = 0; - -#if MAX_RES_APDU_DATA_SIZE > MAX_CMD_APDU_DATA_SIZE -#define USB_BUF_SIZE (MAX_RES_APDU_DATA_SIZE+20+9) -#else -#define USB_BUF_SIZE (MAX_CMD_APDU_DATA_SIZE+20+9) -#endif - -#define CCID_SET_PARAMS 0x61 /* non-ICCD command */ -#define CCID_POWER_ON 0x62 -#define CCID_POWER_OFF 0x63 -#define CCID_SLOT_STATUS 0x65 /* non-ICCD command */ -#define CCID_SECURE 0x69 /* non-ICCD command */ -#define CCID_GET_PARAMS 0x6C /* non-ICCD command */ -#define CCID_RESET_PARAMS 0x6D /* non-ICCD command */ -#define CCID_XFR_BLOCK 0x6F -#define CCID_DATA_BLOCK_RET 0x80 -#define CCID_SLOT_STATUS_RET 0x81 /* non-ICCD result */ -#define CCID_PARAMS_RET 0x82 /* non-ICCD result */ - -#define CCID_MSG_SEQ_OFFSET 6 -#define CCID_MSG_STATUS_OFFSET 7 -#define CCID_MSG_ERROR_OFFSET 8 -#define CCID_MSG_CHAIN_OFFSET 9 -#define CCID_MSG_DATA_OFFSET 10 /* == CCID_MSG_HEADER_SIZE */ -#define CCID_MAX_MSG_DATA_SIZE USB_BUF_SIZE - -#define CCID_STATUS_RUN 0x00 -#define CCID_STATUS_PRESENT 0x01 -#define CCID_STATUS_NOTPRESENT 0x02 -#define CCID_CMD_STATUS_OK 0x00 -#define CCID_CMD_STATUS_ERROR 0x40 -#define CCID_CMD_STATUS_TIMEEXT 0x80 - -#define CCID_ERROR_XFR_OVERRUN 0xFC - -/* - * Since command-byte is at offset 0, - * error with offset 0 means "command not supported". - */ -#define CCID_OFFSET_CMD_NOT_SUPPORTED 0 -#define CCID_OFFSET_DATA_LEN 1 -#define CCID_OFFSET_PARAM 8 - -static app_t apps[4]; -static uint8_t num_apps = 0; - -app_t *current_app = NULL; - -extern void card_thread(); - -extern void low_flash_init_core1(); - -int register_app(app_t * (*select_aid)()) { - if (num_apps < sizeof(apps)/sizeof(app_t)) { - apps[num_apps].select_aid = select_aid; - num_apps++; - return 1; - } - return 0; -} - -#define CCID_THREAD_TERMINATED 0xffff -#define CCID_ACK_TIMEOUT 0x6600 - -static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED; - -void led_set_blink(uint32_t mode) { - blink_interval_ms = mode; -} - -void execute_tasks(); - -static bool wait_button() { - uint32_t start_button = board_millis(); - bool timeout = false; - led_set_blink((1000 << 16) | 100); - - while (board_button_read() == false) { - execute_tasks(); - //sleep_ms(10); - if (start_button + 15000 < board_millis()) { /* timeout */ - timeout = true; - break; - } - } - if (!timeout) { - while (board_button_read() == true) { - execute_tasks(); - //sleep_ms(10); - if (start_button + 15000 < board_millis()) { /* timeout */ - timeout = true; - break; - } - } - } - led_set_blink(BLINK_PROCESSING); - return timeout; -} - -struct ccid_header { - uint8_t bMessageType; - uint32_t dwLength; - uint8_t bSlot; - uint8_t bSeq; - uint8_t abRFU0; - uint16_t abRFU1; - uint8_t *apdu; -} __packed; - -queue_t ccid_to_card_q; -queue_t card_to_ccid_q; - -uint8_t ccid_status = 1; - -void ccid_write_offset(uint16_t size, uint16_t offset) { - if (*usb_get_tx() != 0x81) - DEBUG_PAYLOAD(usb_get_tx()+offset,size+10); - usb_write_offset(size+10, offset); -} - -void ccid_write(uint16_t size) { - ccid_write_offset(size, 0); -} - -struct apdu apdu; -struct ccid_header *ccid_response; -struct ccid_header *ccid_header; -uint8_t *rdata_gr = NULL; -uint16_t rdata_bk = 0x0; - -static int usb_event_handle() { - uint16_t rx_read = usb_read_available(); - if (rx_read >= 10) { - //printf("%d %d %x\r\n",tccid->dwLength,rx_read-10,tccid->bMessageType); - if (ccid_header->dwLength <= rx_read-10) { - if (ccid_header->bMessageType != 0x65) - DEBUG_PAYLOAD(usb_get_rx(),usb_read_available()); - if (ccid_header->bMessageType == 0x65) { - ccid_response->bMessageType = CCID_SLOT_STATUS_RET; - ccid_response->dwLength = 0; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = ccid_status; - ccid_response->abRFU1 = 0; - ccid_write(0); - } - else if (ccid_header->bMessageType == 0x62) { - size_t size_atr = (ccid_atr ? ccid_atr[0] : 0); - ccid_response->bMessageType = 0x80; - ccid_response->dwLength = size_atr; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = 0; - ccid_response->abRFU1 = 0; - //printf("1 %x %x %x || %x %x %x\r\n",ccid_response->apdu,apdu.rdata,ccid_response,ccid_header,ccid_header->apdu,apdu.data); - memcpy(apdu.rdata, ccid_atr+1, size_atr); - multicore_reset_core1(); - multicore_launch_core1(card_thread); - led_set_blink(BLINK_MOUNTED); - ccid_status = 0; - ccid_write(size_atr); - } - else if (ccid_header->bMessageType == 0x63) { - ccid_status = 1; - ccid_response->bMessageType = CCID_SLOT_STATUS_RET; - ccid_response->dwLength = 0; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = ccid_status; - ccid_response->abRFU1 = 0; - uint32_t flag = EV_EXIT; - queue_try_add(&ccid_to_card_q, &flag); - led_set_blink(BLINK_SUSPENDED); - ccid_write(0); - } - else if (ccid_header->bMessageType == 0x6F) { - apdu.nc = apdu.ne = 0; - if (ccid_header->dwLength == 4) { - apdu.nc = apdu.ne = 0; - if (apdu.ne == 0) - apdu.ne = 256; - } - else if (ccid_header->dwLength == 5) { - apdu.nc = 0; - apdu.ne = apdu.header[4]; - if (apdu.ne == 0) - apdu.ne = 256; - } - else if (apdu.header[4] == 0x0 && ccid_header->dwLength >= 7) { - if (ccid_header->dwLength == 7) { - apdu.ne = (apdu.header[5] << 8) | apdu.header[6]; - if (apdu.ne == 0) - apdu.ne = 65536; - } - else { - apdu.ne = 0; - apdu.nc = (apdu.header[5] << 8) | apdu.header[6]; - apdu.data = apdu.header+7; - if (apdu.nc+7+2 == ccid_header->dwLength) { - apdu.ne = (apdu.header[ccid_header->dwLength-2] << 8) | apdu.header[ccid_header->dwLength-1]; - if (apdu.ne == 0) - apdu.ne = 65536; - } - } - } - else { - apdu.nc = apdu.header[4]; - apdu.data = apdu.header+5; - apdu.ne = 0; - if (apdu.nc+5+1 == ccid_header->dwLength) { - apdu.ne = apdu.header[ccid_header->dwLength-1]; - if (apdu.ne == 0) - apdu.ne = 256; - } - } - //printf("apdu.nc %ld, apdu.ne %ld\r\n",apdu.nc,apdu.ne); - if (apdu.header[1] == 0xc0) { - //printf("apdu.ne %ld, apdu.rlen %d, bk %x\r\n",apdu.ne,apdu.rlen,rdata_bk); - timeout = 0; - ccid_response = (struct ccid_header *)(rdata_gr-10); - *(uint16_t *)rdata_gr = rdata_bk; - if (apdu.rlen <= apdu.ne) { - ccid_response->bMessageType = CCID_DATA_BLOCK_RET; - ccid_response->dwLength = apdu.rlen+2; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = ccid_status; - ccid_response->abRFU1 = 0; - ccid_write_offset(apdu.rlen+2, rdata_gr-10-usb_get_tx()); - } - else { - ccid_response->bMessageType = CCID_DATA_BLOCK_RET; - ccid_response->dwLength = apdu.ne+2; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = ccid_status; - ccid_response->abRFU1 = 0; - rdata_gr += apdu.ne; - rdata_bk = *rdata_gr; - rdata_gr[0] = 0x61; - if (apdu.rlen - apdu.ne >= 256) - rdata_gr[1] = 0; - else - rdata_gr[1] = apdu.rlen - apdu.ne; - ccid_write_offset(apdu.ne+2, rdata_gr-10-apdu.ne-usb_get_tx()); - apdu.rlen -= apdu.ne; - } - //Prepare next RAPDU - apdu.sw = 0; - apdu.rlen = 0; - ccid_response = (struct ccid_header *)usb_get_tx(); - ccid_response->apdu = usb_get_tx()+10; - } - else { - apdu.sw = 0; - apdu.rlen = 0; - ccid_response = (struct ccid_header *)usb_get_tx(); - ccid_response->apdu = usb_get_tx()+10; - apdu.rdata = ccid_response->apdu; - rdata_gr = apdu.rdata; - uint32_t flag = EV_CMD_AVAILABLE; - queue_add_blocking(&ccid_to_card_q, &flag); - timeout = board_millis(); - } - } - usb_clear_rx(); - } - } - /* - if (usb_read_available() && c->epo->ready) { - if () - uint32_t count = usb_read(endp1_rx_buf, sizeof(endp1_rx_buf)); - //if (endp1_rx_buf[0] != 0x65) - DEBUG_PAYLOAD(endp1_rx_buf, count); - //DEBUG_PAYLOAD(endp1_rx_buf, count); - ccid_rx_ready(count); - } - */ - return 0; -} - -int process_apdu() { - led_set_blink(BLINK_PROCESSING); - if (!current_app) { - if (INS(apdu) == 0xA4 && P1(apdu) == 0x04 && (P2(apdu) == 0x00 || P2(apdu) == 0x4)) { //select by AID - for (int a = 0; a < num_apps; a++) { - if ((current_app = apps[a].select_aid(&apps[a]))) { - return set_res_sw(0x90,0x00); - } - } - } - return set_res_sw(0x6a, 0x82); - } - if (current_app->process_apdu) - return current_app->process_apdu(); - return set_res_sw(0x6D, 0x00); -} - -uint16_t set_res_sw(uint8_t sw1, uint8_t sw2) { - apdu.sw = (sw1 << 8) | sw2; - if (sw1 != 0x90) - res_APDU_size = 0; - return make_uint16_t(sw1, sw2); -} - -static void card_init(void) { - //gpg_data_scan (flash_do_start, flash_do_end); - low_flash_init_core1(); -} - -void card_thread() { - card_init (); - - while (1) { - uint32_t m; - queue_remove_blocking(&ccid_to_card_q, &m); - - if (m == EV_VERIFY_CMD_AVAILABLE || m == EV_MODIFY_CMD_AVAILABLE) - { - set_res_sw (0x6f, 0x00); - goto done; - } - else if (m == EV_EXIT) { - if (current_app && current_app->unload) { - current_app->unload(); - } - break; - } - - process_apdu(); - - done:; - uint32_t flag = EV_EXEC_FINISHED; - queue_add_blocking(&card_to_ccid_q, &flag); - } - //printf("EXIT !!!!!!\r\n"); - if (current_app && current_app->unload) - current_app->unload(); -} - -void ccid_task(void) { - if (tud_vendor_mounted()) { - if (usb_event_handle() != 0) { - - } - usb_write_flush(); - uint32_t m = 0x0; - bool has_m = queue_try_remove(&card_to_ccid_q, &m); - //if (m != 0) - // printf("\r\n ------ M = %lu\r\n",m); - if (has_m) { - if (m == EV_EXEC_FINISHED) { - apdu.rdata[apdu.rlen] = apdu.sw >> 8; - apdu.rdata[apdu.rlen+1] = apdu.sw & 0xff; - timeout = 0; - if ((apdu.rlen+2+10) % 64 == 0) { - apdu.ne = apdu.rlen - 2; - } - if (apdu.rlen <= apdu.ne) { - ccid_response->bMessageType = CCID_DATA_BLOCK_RET; - ccid_response->dwLength = apdu.rlen+2; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = ccid_status; - ccid_response->abRFU1 = 0; - ccid_write(apdu.rlen+2); - } - else { - ccid_response->bMessageType = CCID_DATA_BLOCK_RET; - ccid_response->dwLength = apdu.ne+2; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = ccid_status; - ccid_response->abRFU1 = 0; - rdata_gr = apdu.rdata+apdu.ne; - rdata_bk = *(uint16_t *)rdata_gr; - rdata_gr[0] = 0x61; - if (apdu.rlen - apdu.ne >= 256) - rdata_gr[1] = 0; - else - rdata_gr[1] = apdu.rlen - apdu.ne; - ccid_write(apdu.ne+2); - apdu.rlen -= apdu.ne; - } - led_set_blink(BLINK_MOUNTED); - } - else if (m == EV_PRESS_BUTTON) { - uint32_t flag = wait_button() ? EV_BUTTON_TIMEOUT : EV_BUTTON_PRESSED; - queue_try_add(&ccid_to_card_q, &flag); - } - /* - if (m == EV_RX_DATA_READY) { - c->ccid_state = ccid_handle_data(c); - timeout = 0; - c->timeout_cnt = 0; - } - else if (m == EV_EXEC_FINISHED) { - if (c->ccid_state == CCID_STATE_EXECUTE) { - exec_done: - if (c->a->sw == CCID_THREAD_TERMINATED) { - c->sw1sw2[0] = 0x90; - c->sw1sw2[1] = 0x00; - c->state = APDU_STATE_RESULT; - ccid_send_data_block(c); - c->ccid_state = CCID_STATE_EXITED; - c->application = 0; - return; - } - - c->a->cmd_apdu_data_len = 0; - c->sw1sw2[0] = c->a->sw >> 8; - c->sw1sw2[1] = c->a->sw & 0xff; - if (c->a->res_apdu_data_len <= c->a->expected_res_size) { - c->state = APDU_STATE_RESULT; - ccid_send_data_block(c); - c->ccid_state = CCID_STATE_WAIT; - } - else { - c->state = APDU_STATE_RESULT_GET_RESPONSE; - c->p = c->a->res_apdu_data; - c->len = c->a->res_apdu_data_len; - ccid_send_data_block_gr(c, c->a->expected_res_size); - c->ccid_state = CCID_STATE_WAIT; - } - } - else { - DEBUG_INFO ("ERR05\r\n"); - } - led_set_blink(BLINK_MOUNTED); - } - else if (m == EV_TX_FINISHED){ - if (c->state == APDU_STATE_RESULT) - ccid_reset(c); - else - c->tx_busy = 0; - if (c->state == APDU_STATE_WAIT_COMMAND || c->state == APDU_STATE_COMMAND_CHAINING || c->state == APDU_STATE_RESULT_GET_RESPONSE) - ccid_prepare_receive(c); - } - */ - } - else { - if (timeout > 0) { - if (timeout + 1500 < board_millis()) { - ccid_response->bMessageType = CCID_DATA_BLOCK_RET; - ccid_response->dwLength = 0; - ccid_response->bSlot = 0; - ccid_response->bSeq = ccid_header->bSeq; - ccid_response->abRFU0 = CCID_CMD_STATUS_TIMEEXT; - ccid_response->abRFU1 = 0; - ccid_write(0); - timeout = board_millis(); - } - } - } - } -} - -void led_blinking_task() { -#ifdef PICO_DEFAULT_LED_PIN - static uint32_t start_ms = 0; - static uint8_t led_state = false; - static uint8_t led_color = PICO_DEFAULT_LED_PIN; -#ifdef PICO_DEFAULT_LED_PIN_INVERTED - uint32_t interval = !led_state ? blink_interval_ms & 0xffff : blink_interval_ms >> 16; -#else - uint32_t interval = led_state ? blink_interval_ms & 0xffff : blink_interval_ms >> 16; -#endif - - - // Blink every interval ms - if (board_millis() - start_ms < interval) - return; // not enough time - start_ms += interval; - - gpio_put(led_color, led_state); - led_state ^= 1; // toggle -#endif -} - -void led_off_all() { -#ifdef PIMORONI_TINY2040 - gpio_put(TINY2040_LED_R_PIN, 1); - gpio_put(TINY2040_LED_G_PIN, 1); - gpio_put(TINY2040_LED_B_PIN, 1); -#else -#ifdef PICO_DEFAULT_LED_PIN - gpio_put(PICO_DEFAULT_LED_PIN, 0); -#endif -#endif -} - -void init_rtc() { - - rtc_init(); - datetime_t dt = { - .year = 2020, - .month = 1, - .day = 1, - .dotw = 3, // 0 is Sunday, so 5 is Friday - .hour = 00, - .min = 00, - .sec = 00 - }; - rtc_set_datetime(&dt); -} - -extern void neug_task(); - -pico_unique_board_id_t unique_id; - -void execute_tasks() { - ccid_task(); - tud_task(); // tinyusb device task - led_blinking_task(); -} - -int main(void) { - ccid_header = (struct ccid_header *)usb_get_rx(); - ccid_header->apdu = usb_get_rx()+10; - apdu.header = ccid_header->apdu; - - ccid_response = (struct ccid_header *)usb_get_tx(); - ccid_response->apdu = usb_get_tx()+10; - apdu.rdata = ccid_response->apdu; - - queue_init(&card_to_ccid_q, sizeof(uint32_t), 64); - queue_init(&ccid_to_card_q, sizeof(uint32_t), 64); - - board_init(); - stdio_init_all(); - -#ifdef PIMORONI_TINY2040 - gpio_init(TINY2040_LED_R_PIN); - gpio_set_dir(TINY2040_LED_R_PIN, GPIO_OUT); - gpio_init(TINY2040_LED_G_PIN); - gpio_set_dir(TINY2040_LED_G_PIN, GPIO_OUT); - gpio_init(TINY2040_LED_B_PIN); - gpio_set_dir(TINY2040_LED_B_PIN, GPIO_OUT); -#else -#ifdef PICO_DEFAULT_LED_PIN - gpio_init(PICO_DEFAULT_LED_PIN); - gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); -#endif -#endif - - led_off_all(); - - tusb_init(); - - //prepare_ccid(); - - random_init(); - - low_flash_init(); - - init_rtc(); - - //ccid_prepare_receive(&ccid); - - while (1) { - execute_tasks(); - neug_task(); - do_flash(); - } - - return 0; -} \ No newline at end of file