Lines Matching full:card

2  * CCID Card Device. Emulated card.
14 * Usage 1: standard, mirror hardware reader+card:
15 * qemu .. -usb -device usb-ccid -device ccid-card-emulated
23 * -device ccid-card-emulated,cert1=user1,cert2=user2,cert3=user3
41 #define DPRINTF(card, lvl, fmt, ...) \ argument
43 if (lvl <= card->debug) {\
44 printf("ccid-card-emul: %s: " fmt , __func__, ## __VA_ARGS__);\
49 #define TYPE_EMULATED_CCID "ccid-card-emulated"
142 EmulatedState *card = EMULATED_CCID_CARD(base); in emulated_apdu_from_guest() local
149 qemu_mutex_lock(&card->vreader_mutex); in emulated_apdu_from_guest()
150 QSIMPLEQ_INSERT_TAIL(&card->guest_apdu_list, event, entry); in emulated_apdu_from_guest()
151 qemu_mutex_unlock(&card->vreader_mutex); in emulated_apdu_from_guest()
152 qemu_mutex_lock(&card->handle_apdu_mutex); in emulated_apdu_from_guest()
153 qemu_cond_signal(&card->handle_apdu_cond); in emulated_apdu_from_guest()
154 qemu_mutex_unlock(&card->handle_apdu_mutex); in emulated_apdu_from_guest()
159 EmulatedState *card = EMULATED_CCID_CARD(base); in emulated_get_atr() local
161 *len = card->atr_length; in emulated_get_atr()
162 return card->atr; in emulated_get_atr()
165 static void emulated_push_event(EmulatedState *card, EmulEvent *event) in emulated_push_event() argument
167 qemu_mutex_lock(&card->event_list_mutex); in emulated_push_event()
168 QSIMPLEQ_INSERT_TAIL(&(card->event_list), event, entry); in emulated_push_event()
169 qemu_mutex_unlock(&card->event_list_mutex); in emulated_push_event()
170 event_notifier_set(&card->notifier); in emulated_push_event()
173 static void emulated_push_type(EmulatedState *card, uint32_t type) in emulated_push_type() argument
179 emulated_push_event(card, event); in emulated_push_type()
182 static void emulated_push_error(EmulatedState *card, uint64_t code) in emulated_push_error() argument
189 emulated_push_event(card, event); in emulated_push_error()
192 static void emulated_push_data_type(EmulatedState *card, uint32_t type, in emulated_push_data_type() argument
201 emulated_push_event(card, event); in emulated_push_data_type()
204 static void emulated_push_reader_insert(EmulatedState *card) in emulated_push_reader_insert() argument
206 emulated_push_type(card, EMUL_READER_INSERT); in emulated_push_reader_insert()
209 static void emulated_push_reader_remove(EmulatedState *card) in emulated_push_reader_remove() argument
211 emulated_push_type(card, EMUL_READER_REMOVE); in emulated_push_reader_remove()
214 static void emulated_push_card_insert(EmulatedState *card, in emulated_push_card_insert() argument
217 emulated_push_data_type(card, EMUL_CARD_INSERT, atr, len); in emulated_push_card_insert()
220 static void emulated_push_card_remove(EmulatedState *card) in emulated_push_card_remove() argument
222 emulated_push_type(card, EMUL_CARD_REMOVE); in emulated_push_card_remove()
225 static void emulated_push_response_apdu(EmulatedState *card, in emulated_push_response_apdu() argument
228 emulated_push_data_type(card, EMUL_RESPONSE_APDU, apdu, len); in emulated_push_response_apdu()
234 EmulatedState *card = arg; in handle_apdu_thread() local
241 qemu_mutex_lock(&card->handle_apdu_mutex); in handle_apdu_thread()
242 qemu_cond_wait(&card->handle_apdu_cond, &card->handle_apdu_mutex); in handle_apdu_thread()
243 qemu_mutex_unlock(&card->handle_apdu_mutex); in handle_apdu_thread()
244 if (card->quit_apdu_thread) { in handle_apdu_thread()
245 card->quit_apdu_thread = 0; /* debugging */ in handle_apdu_thread()
248 WITH_QEMU_LOCK_GUARD(&card->vreader_mutex) { in handle_apdu_thread()
249 while (!QSIMPLEQ_EMPTY(&card->guest_apdu_list)) { in handle_apdu_thread()
250 event = QSIMPLEQ_FIRST(&card->guest_apdu_list); in handle_apdu_thread()
252 QSIMPLEQ_REMOVE_HEAD(&card->guest_apdu_list, entry); in handle_apdu_thread()
254 DPRINTF(card, 1, "unexpected message in handle_apdu_thread\n"); in handle_apdu_thread()
258 if (card->reader == NULL) { in handle_apdu_thread()
259 DPRINTF(card, 1, "reader is NULL\n"); in handle_apdu_thread()
264 reader_status = vreader_xfr_bytes(card->reader, in handle_apdu_thread()
267 DPRINTF(card, 2, "got back apdu of length %d\n", recv_len); in handle_apdu_thread()
269 emulated_push_response_apdu(card, recv_data, recv_len); in handle_apdu_thread()
271 emulated_push_error(card, reader_status); in handle_apdu_thread()
285 EmulatedState *card = arg; in event_thread() local
295 if (card->reader == NULL && event->reader != NULL) { in event_thread()
296 /* Happens after device_add followed by card remove or insert. in event_thread()
300 card->reader = vreader_reference(event->reader); in event_thread()
302 if (event->reader != card->reader) { in event_thread()
316 if (card->reader != NULL) { in event_thread()
317 DPRINTF(card, 2, "READER INSERT - replacing %s with %s\n", in event_thread()
318 vreader_get_name(card->reader), reader_name); in event_thread()
319 qemu_mutex_lock(&card->vreader_mutex); in event_thread()
320 vreader_free(card->reader); in event_thread()
321 qemu_mutex_unlock(&card->vreader_mutex); in event_thread()
322 emulated_push_reader_remove(card); in event_thread()
324 qemu_mutex_lock(&card->vreader_mutex); in event_thread()
325 DPRINTF(card, 2, "READER INSERT %s\n", reader_name); in event_thread()
326 card->reader = vreader_reference(event->reader); in event_thread()
327 qemu_mutex_unlock(&card->vreader_mutex); in event_thread()
328 emulated_push_reader_insert(card); in event_thread()
331 DPRINTF(card, 2, " READER REMOVE: %s\n", in event_thread()
333 qemu_mutex_lock(&card->vreader_mutex); in event_thread()
334 vreader_free(card->reader); in event_thread()
335 card->reader = NULL; in event_thread()
336 qemu_mutex_unlock(&card->vreader_mutex); in event_thread()
337 emulated_push_reader_remove(card); in event_thread()
344 card->atr_length = (uint8_t)atr_len; in event_thread()
345 DPRINTF(card, 2, " CARD INSERT\n"); in event_thread()
346 emulated_push_card_insert(card, atr, atr_len); in event_thread()
349 DPRINTF(card, 2, " CARD REMOVE\n"); in event_thread()
350 emulated_push_card_remove(card); in event_thread()
365 EmulatedState *card = container_of(notifier, EmulatedState, notifier); in card_event_handler() local
368 event_notifier_test_and_clear(&card->notifier); in card_event_handler()
369 QEMU_LOCK_GUARD(&card->event_list_mutex); in card_event_handler()
370 QSIMPLEQ_FOREACH_SAFE(event, &card->event_list, entry, next) { in card_event_handler()
371 DPRINTF(card, 2, "event %s\n", emul_event_to_string(event->p.gen.type)); in card_event_handler()
374 ccid_card_send_apdu_to_guest(&card->base, event->p.data.data, in card_event_handler()
378 ccid_card_ccid_attach(&card->base); in card_event_handler()
381 ccid_card_ccid_detach(&card->base); in card_event_handler()
385 card->atr_length = event->p.data.len; in card_event_handler()
386 memcpy(card->atr, event->p.data.data, card->atr_length); in card_event_handler()
387 ccid_card_card_inserted(&card->base); in card_event_handler()
390 ccid_card_card_removed(&card->base); in card_event_handler()
393 ccid_card_card_error(&card->base, event->p.error.code); in card_event_handler()
396 DPRINTF(card, 2, "unexpected event\n"); in card_event_handler()
401 QSIMPLEQ_INIT(&card->event_list); in card_event_handler()
404 static int init_event_notifier(EmulatedState *card, Error **errp) in init_event_notifier() argument
406 if (event_notifier_init(&card->notifier, false) < 0) { in init_event_notifier()
407 error_setg(errp, "ccid-card-emul: event notifier creation failed"); in init_event_notifier()
410 event_notifier_set_handler(&card->notifier, card_event_handler); in init_event_notifier()
414 static void clean_event_notifier(EmulatedState *card) in clean_event_notifier() argument
416 event_notifier_set_handler(&card->notifier, NULL); in clean_event_notifier()
417 event_notifier_cleanup(&card->notifier); in clean_event_notifier()
444 static int emulated_initialize_vcard_from_certificates(EmulatedState *card) in emulated_initialize_vcard_from_certificates() argument
450 card->db ? card->db : CERTIFICATES_DEFAULT_DB, in emulated_initialize_vcard_from_certificates()
451 card->cert1, card->cert2, card->cert3); in emulated_initialize_vcard_from_certificates()
491 EmulatedState *card = EMULATED_CCID_CARD(base); in emulated_realize() local
495 QSIMPLEQ_INIT(&card->event_list); in emulated_realize()
496 QSIMPLEQ_INIT(&card->guest_apdu_list); in emulated_realize()
497 qemu_mutex_init(&card->event_list_mutex); in emulated_realize()
498 qemu_mutex_init(&card->vreader_mutex); in emulated_realize()
499 qemu_mutex_init(&card->handle_apdu_mutex); in emulated_realize()
500 qemu_cond_init(&card->handle_apdu_cond); in emulated_realize()
501 card->reader = NULL; in emulated_realize()
502 card->quit_apdu_thread = 0; in emulated_realize()
503 if (init_event_notifier(card, errp) < 0) { in emulated_realize()
507 card->backend = 0; in emulated_realize()
508 if (card->backend_str) { in emulated_realize()
509 card->backend = parse_enumeration(card->backend_str, in emulated_realize()
513 if (card->backend == 0) { in emulated_realize()
521 /* TODO: a passthru backend that works on local machine. third card type?*/ in emulated_realize()
522 if (card->backend == BACKEND_CERTIFICATES) { in emulated_realize()
523 if (card->cert1 != NULL && card->cert2 != NULL && card->cert3 != NULL) { in emulated_realize()
524 ret = emulated_initialize_vcard_from_certificates(card); in emulated_realize()
531 if (card->backend != BACKEND_NSS_EMULATED) { in emulated_realize()
537 if (card->cert1 != NULL || card->cert2 != NULL || card->cert3 != NULL) { in emulated_realize()
549 qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread, in emulated_realize()
550 card, QEMU_THREAD_JOINABLE); in emulated_realize()
551 qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread, in emulated_realize()
552 card, QEMU_THREAD_JOINABLE); in emulated_realize()
557 clean_event_notifier(card); in emulated_realize()
559 qemu_cond_destroy(&card->handle_apdu_cond); in emulated_realize()
560 qemu_mutex_destroy(&card->handle_apdu_mutex); in emulated_realize()
561 qemu_mutex_destroy(&card->vreader_mutex); in emulated_realize()
562 qemu_mutex_destroy(&card->event_list_mutex); in emulated_realize()
567 EmulatedState *card = EMULATED_CCID_CARD(base); in emulated_unrealize() local
571 qemu_thread_join(&card->event_thread_id); in emulated_unrealize()
573 card->quit_apdu_thread = 1; /* stop handle_apdu thread */ in emulated_unrealize()
574 qemu_cond_signal(&card->handle_apdu_cond); in emulated_unrealize()
575 qemu_thread_join(&card->apdu_thread_id); in emulated_unrealize()
577 clean_event_notifier(card); in emulated_unrealize()
579 qemu_cond_destroy(&card->handle_apdu_cond); in emulated_unrealize()
580 qemu_mutex_destroy(&card->handle_apdu_mutex); in emulated_unrealize()
581 qemu_mutex_destroy(&card->vreader_mutex); in emulated_unrealize()
582 qemu_mutex_destroy(&card->event_list_mutex); in emulated_unrealize()