diff --git a/src/usb/hid/ctap_hid.h b/src/usb/hid/ctap_hid.h index 5c4e419..6c85b75 100644 --- a/src/usb/hid/ctap_hid.h +++ b/src/usb/hid/ctap_hid.h @@ -160,8 +160,6 @@ typedef struct { extern void add_keyboard_buffer(const uint8_t *, size_t, bool); extern void append_keyboard_buffer(const uint8_t *data, size_t data_len); -extern uint16_t calculate_crc(const uint8_t *data, size_t data_len); - extern bool is_nitrokey; #ifdef __cplusplus diff --git a/src/usb/hid/hid.c b/src/usb/hid/hid.c index 26b380b..1969a7b 100644 --- a/src/usb/hid/hid.c +++ b/src/usb/hid/hid.c @@ -69,38 +69,8 @@ int driver_init_hid() { uint16_t send_buffer_size[ITF_TOTAL] = {0}; bool last_write_result[ITF_TOTAL] = {false}; -uint8_t otp_frame_rx[70] = {0}; -uint8_t otp_frame_tx[70] = {0}; -uint8_t otp_exp_seq = 0, otp_curr_seq = 0; -uint8_t otp_header[4] = {0}; - -uint16_t calculate_crc(const uint8_t *data, size_t data_len) { - uint16_t crc = 0xFFFF; - for (size_t idx = 0; idx < data_len; idx++) { - crc ^= data[idx]; - for (uint8_t i = 0; i < 8; i++) { - uint16_t j = crc & 0x1; - crc >>= 1; - if (j == 1) { - crc ^= 0x8408; - } - } - } - return crc & 0xFFFF; -} - -int otp_send_frame(uint8_t *frame, size_t frame_len) { - uint16_t crc = calculate_crc(frame, frame_len); - frame[frame_len] = ~crc & 0xff; - frame[frame_len + 1] = ~crc >> 8; - frame_len += 2; - send_buffer_size[ITF_KEYBOARD] = frame_len; - otp_exp_seq = (frame_len / 7); - if (frame_len % 7) { - otp_exp_seq++; - } - otp_curr_seq = 0; - return 0; +uint16_t *get_send_buffer_size(uint8_t itf) { + return &send_buffer_size[itf]; } //--------------------------------------------------------------------+ @@ -108,10 +78,12 @@ int otp_send_frame(uint8_t *frame, size_t frame_len) { //--------------------------------------------------------------------+ #ifndef ENABLE_EMULATION + +uint16_t (*hid_get_report_cb)(uint8_t, uint8_t, hid_report_type_t, uint8_t *, uint16_t) = NULL; // Invoked when received GET_REPORT control request // Application must fill buffer report's content and return its length. // Return zero will cause the stack to STALL request -extern uint16_t otp_status(); + uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, @@ -125,25 +97,9 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, (void) reqlen; printf("get_report %d %d %d\n", itf, report_id, report_type); DEBUG_PAYLOAD(buffer, reqlen); - if (send_buffer_size[ITF_KEYBOARD] > 0) { - uint8_t seq = otp_curr_seq++; - memset(buffer, 0, 8); - memcpy(buffer, otp_frame_tx + 7 * seq, MIN(7, send_buffer_size[ITF_KEYBOARD])); - buffer[7] = 0x40 | seq; - DEBUG_DATA(buffer, 8); - send_buffer_size[ITF_KEYBOARD] -= MIN(7, send_buffer_size[ITF_KEYBOARD]); + if (hid_get_report_cb) { + hid_get_report_cb(itf, report_id, report_type, buffer, reqlen); } - else if (otp_curr_seq == otp_exp_seq && otp_exp_seq > 0) { - memset(buffer, 0, 7); - buffer[7] = 0x40; - DEBUG_DATA(buffer,8); - otp_curr_seq = otp_exp_seq = 0; - } - else { - otp_status(); - memcpy(buffer, res_APDU, 7); - } - return reqlen; } #endif @@ -278,10 +234,11 @@ size_t driver_read_hid(uint8_t *buffer, size_t buffer_size) { } #ifndef ENABLE_EMULATION + +int (*hid_set_report_cb)(uint8_t, uint8_t, hid_report_type_t, uint8_t const *, uint16_t) = NULL; // Invoked when received SET_REPORT control request or // received data on OUT endpoint ( Report ID = 0, Type = 0 ) -extern int otp_process_apdu(); void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, @@ -293,46 +250,9 @@ void tud_hid_set_report_cb(uint8_t itf, (void) report_id; (void) report_type; printf("set_report %d %d %d\n", itf, report_id, report_type); - if (report_type == 3) { - DEBUG_PAYLOAD(buffer, bufsize); - if (itf == ITF_KEYBOARD && buffer[7] == 0xFF) { // reset - send_buffer_size[ITF_KEYBOARD] = 0; - otp_curr_seq = otp_exp_seq = 0; - memset(otp_frame_tx, 0, sizeof(otp_frame_tx)); - } - else if (buffer[7] & 0x80) { // a frame - uint8_t rseq = buffer[7] & 0x1F; - if (rseq < 10) { - if (rseq == 0) { - memset(otp_frame_rx, 0, sizeof(otp_frame_rx)); - } - memcpy(otp_frame_rx + rseq * 7, buffer, 7); - if (rseq == 9) { - DEBUG_DATA(otp_frame_rx, sizeof(otp_frame_rx)); - uint16_t residual_crc = calculate_crc(otp_frame_rx, 64), rcrc = (otp_frame_rx[66] << 8 | otp_frame_rx[65]); - uint8_t slot_id = otp_frame_rx[64]; - if (residual_crc == rcrc) { - apdu.data = otp_frame_rx; - apdu.nc = 64; - apdu.rdata = otp_frame_tx; - apdu.header[0] = 0; - apdu.header[1] = 0x01; - apdu.header[2] = slot_id; - apdu.header[3] = 0; - int ret = otp_process_apdu(); - if (ret == 0x9000 && res_APDU_size > 0) { - otp_send_frame(apdu.rdata, apdu.rlen); - } - } - else { - printf("[OTP] Bad CRC!\n"); - } - } - } - } - } - else + if (!hid_set_report_cb || hid_set_report_cb(itf, report_id, report_type, buffer, bufsize) == 0) { usb_rx(itf, buffer, bufsize); + } } #endif