Lines Matching full:card
2 * CCID Passthru Card Device emulation
26 #define DPRINTF(card, lvl, fmt, ...) \ argument
28 if (lvl <= card->debug) { \
29 printf("ccid-card-passthru: " fmt , ## __VA_ARGS__); \
45 /* From an Athena smart card */
68 #define TYPE_CCID_PASSTHRU "ccid-card-passthru"
74 * This code should not depend on the card type. in DECLARE_INSTANCE_CHECKER()
123 PassthruState *card = opaque; in ccid_card_vscard_can_read() local
125 return VSCARD_IN_SIZE >= card->vscard_in_pos ? in ccid_card_vscard_can_read()
126 VSCARD_IN_SIZE - card->vscard_in_pos : 0; in ccid_card_vscard_can_read()
130 PassthruState *card, VSCMsgHeader *hdr, VSCMsgInit *init) in ccid_card_vscard_handle_init() argument
148 DPRINTF(card, D_WARN, in ccid_card_vscard_handle_init()
152 ccid_card_vscard_send_init(card); in ccid_card_vscard_handle_init()
155 static int check_atr(PassthruState *card, uint8_t *data, int len) in check_atr() argument
167 DPRINTF(card, D_WARN, "atr's T0 is 0x%X, not in {0x3b, 0x3f}\n", in check_atr()
190 DPRINTF(card, D_WARN, in check_atr()
196 DPRINTF(card, D_WARN, in check_atr()
201 DPRINTF(card, D_VERBOSE, in check_atr()
208 static void ccid_card_vscard_handle_message(PassthruState *card, in ccid_card_vscard_handle_message() argument
215 DPRINTF(card, D_INFO, "VSC_ATR %d\n", scr_msg_header->length); in ccid_card_vscard_handle_message()
218 ccid_card_vscard_send_error(card, scr_msg_header->reader_id, in ccid_card_vscard_handle_message()
222 if (!check_atr(card, data, scr_msg_header->length)) { in ccid_card_vscard_handle_message()
224 ccid_card_vscard_send_error(card, scr_msg_header->reader_id, in ccid_card_vscard_handle_message()
228 memcpy(card->atr, data, scr_msg_header->length); in ccid_card_vscard_handle_message()
229 card->atr_length = scr_msg_header->length; in ccid_card_vscard_handle_message()
230 ccid_card_card_inserted(&card->base); in ccid_card_vscard_handle_message()
231 ccid_card_vscard_send_error(card, scr_msg_header->reader_id, in ccid_card_vscard_handle_message()
236 &card->base, data, scr_msg_header->length); in ccid_card_vscard_handle_message()
239 DPRINTF(card, D_INFO, "VSC_CardRemove\n"); in ccid_card_vscard_handle_message()
240 ccid_card_card_removed(&card->base); in ccid_card_vscard_handle_message()
241 ccid_card_vscard_send_error(card, in ccid_card_vscard_handle_message()
246 card, scr_msg_header, (VSCMsgInit *)data); in ccid_card_vscard_handle_message()
249 ccid_card_card_error(&card->base, *(uint32_t *)data); in ccid_card_vscard_handle_message()
252 if (ccid_card_ccid_attach(&card->base) < 0) { in ccid_card_vscard_handle_message()
253 ccid_card_vscard_send_error(card, VSCARD_UNDEFINED_READER_ID, in ccid_card_vscard_handle_message()
256 ccid_card_vscard_send_error(card, VSCARD_MINIMAL_READER_ID, in ccid_card_vscard_handle_message()
261 ccid_card_ccid_detach(&card->base); in ccid_card_vscard_handle_message()
262 ccid_card_vscard_send_error(card, in ccid_card_vscard_handle_message()
268 ccid_card_vscard_send_error(card, scr_msg_header->reader_id, in ccid_card_vscard_handle_message()
273 static void ccid_card_vscard_drop_connection(PassthruState *card) in ccid_card_vscard_drop_connection() argument
275 qemu_chr_fe_deinit(&card->cs, true); in ccid_card_vscard_drop_connection()
276 card->vscard_in_pos = card->vscard_in_hdr = 0; in ccid_card_vscard_drop_connection()
281 PassthruState *card = opaque; in ccid_card_vscard_read() local
284 if (card->vscard_in_pos + size > VSCARD_IN_SIZE) { in ccid_card_vscard_read()
287 card->vscard_in_pos, size, VSCARD_IN_SIZE); in ccid_card_vscard_read()
288 ccid_card_vscard_drop_connection(card); in ccid_card_vscard_read()
291 assert(card->vscard_in_pos < VSCARD_IN_SIZE); in ccid_card_vscard_read()
292 assert(card->vscard_in_hdr < VSCARD_IN_SIZE); in ccid_card_vscard_read()
293 memcpy(card->vscard_in_data + card->vscard_in_pos, buf, size); in ccid_card_vscard_read()
294 card->vscard_in_pos += size; in ccid_card_vscard_read()
295 hdr = (VSCMsgHeader *)(card->vscard_in_data + card->vscard_in_hdr); in ccid_card_vscard_read()
297 while ((card->vscard_in_pos - card->vscard_in_hdr >= sizeof(VSCMsgHeader)) in ccid_card_vscard_read()
298 &&(card->vscard_in_pos - card->vscard_in_hdr >= in ccid_card_vscard_read()
303 ccid_card_vscard_handle_message(card, hdr); in ccid_card_vscard_read()
304 card->vscard_in_hdr += hdr->length + sizeof(VSCMsgHeader); in ccid_card_vscard_read()
305 hdr = (VSCMsgHeader *)(card->vscard_in_data + card->vscard_in_hdr); in ccid_card_vscard_read()
307 if (card->vscard_in_hdr == card->vscard_in_pos) { in ccid_card_vscard_read()
308 card->vscard_in_pos = card->vscard_in_hdr = 0; in ccid_card_vscard_read()
314 PassthruState *card = opaque; in ccid_card_vscard_event() local
318 card->vscard_in_pos = card->vscard_in_hdr = 0; in ccid_card_vscard_event()
321 DPRINTF(card, D_INFO, "%s: CHR_EVENT_OPENED\n", __func__); in ccid_card_vscard_event()
336 PassthruState *card = PASSTHRU_CCID_CARD(base); in passthru_apdu_from_guest() local
338 if (!qemu_chr_fe_backend_connected(&card->cs)) { in passthru_apdu_from_guest()
342 ccid_card_vscard_send_apdu(card, apdu, len); in passthru_apdu_from_guest()
347 PassthruState *card = PASSTHRU_CCID_CARD(base); in passthru_get_atr() local
349 *len = card->atr_length; in passthru_get_atr()
350 return card->atr; in passthru_get_atr()
355 PassthruState *card = PASSTHRU_CCID_CARD(base); in passthru_realize() local
357 card->vscard_in_pos = 0; in passthru_realize()
358 card->vscard_in_hdr = 0; in passthru_realize()
359 if (qemu_chr_fe_backend_connected(&card->cs)) { in passthru_realize()
360 DPRINTF(card, D_INFO, "ccid-card-passthru: initing chardev"); in passthru_realize()
361 qemu_chr_fe_set_handlers(&card->cs, in passthru_realize()
364 ccid_card_vscard_event, NULL, card, NULL, true); in passthru_realize()
365 ccid_card_vscard_send_init(card); in passthru_realize()
370 card->debug = parse_debug_env("QEMU_CCID_PASSTHRU_DEBUG", D_VERBOSE, in passthru_realize()
371 card->debug); in passthru_realize()
373 memcpy(card->atr, DEFAULT_ATR, sizeof(DEFAULT_ATR)); in passthru_realize()
374 card->atr_length = sizeof(DEFAULT_ATR); in passthru_realize()
378 .name = "ccid-card-passthru",