Skip to content

Commit

Permalink
implement the keepalive in webusb
Browse files Browse the repository at this point in the history
  • Loading branch information
dangfan committed Feb 29, 2024
1 parent 2ccd945 commit 8cb70fd
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 7 deletions.
31 changes: 24 additions & 7 deletions interfaces/USB/class/ccid/ccid.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ static volatile uint32_t send_data_spinlock;
static CAPDU apdu_cmd;
static RAPDU apdu_resp;
uint8_t *global_buffer;
static uint8_t card_status;

void init_apdu_buffer(void) {
global_buffer = bulkin_data.abData;
Expand All @@ -38,6 +39,7 @@ uint8_t CCID_Init(void) {
bulkout_data.abData = bulkin_data.abData;
apdu_cmd.data = bulkin_data.abData;
apdu_resp.data = bulkin_data.abData;
card_status = BM_ICC_PRESENT_ACTIVE;
return 0;
}

Expand Down Expand Up @@ -96,11 +98,6 @@ static uint8_t PC_to_RDR_IccPowerOn(void) {
return SLOTERROR_BAD_POWERSELECT;
}

if (acquire_apdu_buffer(BUFFER_OWNER_CCID) != 0) {
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE);
return SLOTERROR_BAD_GUARDTIME;
}

applets_poweroff();
memcpy(bulkin_data.abData, atr_ccid, sizeof(atr_ccid));
bulkin_data.dwLength = sizeof(atr_ccid);
Expand All @@ -119,7 +116,6 @@ static uint8_t PC_to_RDR_IccPowerOff(void) {
if (error != 0) return error;

applets_poweroff();
release_apdu_buffer(BUFFER_OWNER_CCID);
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_INACTIVE);
return SLOT_NO_ERROR;
}
Expand All @@ -133,7 +129,7 @@ static uint8_t PC_to_RDR_IccPowerOff(void) {
static uint8_t PC_to_RDR_GetSlotStatus(void) {
uint8_t error = CCID_CheckCommandParams(CHK_PARAM_SLOT | CHK_PARAM_DWLENGTH | CHK_PARAM_abRFU3);
if (error != 0) return error;
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE);
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, card_status);
return SLOT_NO_ERROR;
}

Expand All @@ -148,6 +144,16 @@ uint8_t PC_to_RDR_XfrBlock(void) {
uint8_t error = CCID_CheckCommandParams(CHK_PARAM_SLOT);
if (error != 0) return error;

if (card_status == BM_ICC_NO_ICC_PRESENT) {
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_NO_ICC_PRESENT);
return SLOTERROR_ICC_MUTE;
}

if (acquire_apdu_buffer(BUFFER_OWNER_CCID) != 0) {
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE);
return SLOTERROR_BAD_GUARDTIME;
}

DBG_MSG("O: ");
PRINT_HEX(bulkout_data.abData, bulkout_data.dwLength);

Expand All @@ -169,7 +175,10 @@ uint8_t PC_to_RDR_XfrBlock(void) {
bulkin_data.abData[LL + 1] = LO(SW);
DBG_MSG("I: ");
PRINT_HEX(bulkin_data.abData, bulkin_data.dwLength);

release_apdu_buffer(BUFFER_OWNER_CCID);
CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE);

return SLOT_NO_ERROR;
}

Expand Down Expand Up @@ -373,3 +382,11 @@ void CCID_TimeExtensionLoop(void) {

device_set_timeout(CCID_TimeExtensionLoop, TIME_EXTENSION_PERIOD);
}

void CCID_eject(void) {
card_status = BM_ICC_NO_ICC_PRESENT;
}

void CCID_insert(void) {
card_status = BM_ICC_PRESENT_ACTIVE;
}
2 changes: 2 additions & 0 deletions interfaces/USB/class/ccid/ccid.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,5 +132,7 @@ uint8_t CCID_OutEvent(uint8_t *data, uint8_t len);
void CCID_Loop(void);
void CCID_TimeExtensionLoop(void);
uint8_t PC_to_RDR_XfrBlock(void); // Exported for test purposes
void CCID_eject(void);
void CCID_insert(void);

#endif //_CCID_H_
6 changes: 6 additions & 0 deletions interfaces/USB/class/webusb/webusb.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0
#include <apdu.h>
#include <ccid.h>
#include <device.h>
#include <webusb.h>

Expand All @@ -14,18 +15,22 @@ static uint8_t state;
static uint16_t apdu_buffer_size;
static CAPDU apdu_cmd;
static RAPDU apdu_resp;
static uint32_t last_keepalive;

uint8_t USBD_WEBUSB_Init(USBD_HandleTypeDef *pdev) {
UNUSED(pdev);

state = STATE_IDLE;
apdu_cmd.data = global_buffer;
apdu_resp.data = global_buffer;
last_keepalive = 0;

return USBD_OK;
}

uint8_t USBD_WEBUSB_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) {
CCID_eject();
last_keepalive = device_get_tick();
switch (req->bRequest) {
case WEBUSB_REQ_CMD:
if (acquire_apdu_buffer(BUFFER_OWNER_WEBUSB) != 0) {
Expand Down Expand Up @@ -66,6 +71,7 @@ uint8_t USBD_WEBUSB_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) {
}

void WebUSB_Loop(void) {
if (device_get_tick() - last_keepalive > 2000) CCID_insert();
if (state != STATE_PROCESS) return;

DBG_MSG("C: ");
Expand Down

0 comments on commit 8cb70fd

Please sign in to comment.