Lines Matching refs:key

118 static void u2f_passthru_reset(U2FPassthruState *key)  in u2f_passthru_reset()  argument
120 timer_del(&key->timer); in u2f_passthru_reset()
121 qemu_set_fd_handler(key->hidraw_fd, NULL, NULL, key); in u2f_passthru_reset()
122 key->last_transaction_time = 0; in u2f_passthru_reset()
123 key->current_transactions_start = 0; in u2f_passthru_reset()
124 key->current_transactions_end = 0; in u2f_passthru_reset()
125 key->current_transactions_num = 0; in u2f_passthru_reset()
130 U2FPassthruState *key = opaque; in u2f_timeout_check() local
133 if (time > key->last_transaction_time + TRANSACTION_TIMEOUT) { in u2f_timeout_check()
134 u2f_passthru_reset(key); in u2f_timeout_check()
136 timer_mod(&key->timer, time + TRANSACTION_TIMEOUT / 4); in u2f_timeout_check()
140 static int u2f_transaction_get_index(U2FPassthruState *key, uint32_t cid) in u2f_transaction_get_index() argument
142 for (int i = 0; i < key->current_transactions_num; ++i) { in u2f_transaction_get_index()
143 int index = (key->current_transactions_start + i) in u2f_transaction_get_index()
145 if (cid == key->current_transactions[index].cid) { in u2f_transaction_get_index()
152 static struct transaction *u2f_transaction_get(U2FPassthruState *key, in u2f_transaction_get() argument
155 int index = u2f_transaction_get_index(key, cid); in u2f_transaction_get()
159 return &key->current_transactions[index]; in u2f_transaction_get()
162 static struct transaction *u2f_transaction_get_from_nonce(U2FPassthruState *key, in u2f_transaction_get_from_nonce() argument
165 for (int i = 0; i < key->current_transactions_num; ++i) { in u2f_transaction_get_from_nonce()
166 int index = (key->current_transactions_start + i) in u2f_transaction_get_from_nonce()
168 if (key->current_transactions[index].cid == BROADCAST_CID in u2f_transaction_get_from_nonce()
169 && memcmp(nonce, key->current_transactions[index].nonce, in u2f_transaction_get_from_nonce()
171 return &key->current_transactions[index]; in u2f_transaction_get_from_nonce()
177 static void u2f_transaction_close(U2FPassthruState *key, uint32_t cid) in u2f_transaction_close() argument
180 index = u2f_transaction_get_index(key, cid); in u2f_transaction_close()
187 while (next_index != key->current_transactions_end) { in u2f_transaction_close()
188 memcpy(&key->current_transactions[index], in u2f_transaction_close()
189 &key->current_transactions[next_index], in u2f_transaction_close()
196 key->current_transactions_end = index; in u2f_transaction_close()
197 --key->current_transactions_num; in u2f_transaction_close()
199 if (key->current_transactions_num == 0) { in u2f_transaction_close()
200 u2f_passthru_reset(key); in u2f_transaction_close()
204 static void u2f_transaction_add(U2FPassthruState *key, uint32_t cid, in u2f_transaction_add() argument
210 if (key->current_transactions_num >= CURRENT_TRANSACTIONS_NUM) { in u2f_transaction_add()
212 index = key->current_transactions_start; in u2f_transaction_add()
213 transaction = &key->current_transactions[index]; in u2f_transaction_add()
214 u2f_transaction_close(key, transaction->cid); in u2f_transaction_add()
218 index = key->current_transactions_end; in u2f_transaction_add()
219 key->current_transactions_end = (index + 1) % CURRENT_TRANSACTIONS_NUM; in u2f_transaction_add()
220 ++key->current_transactions_num; in u2f_transaction_add()
223 transaction = &key->current_transactions[index]; in u2f_transaction_add()
236 static void u2f_transaction_start(U2FPassthruState *key, in u2f_transaction_start() argument
243 u2f_transaction_add(key, packet_init->cid, packet_init->data); in u2f_transaction_start()
245 u2f_transaction_add(key, packet_init->cid, NULL); in u2f_transaction_start()
250 if (key->last_transaction_time == 0) { in u2f_transaction_start()
251 qemu_set_fd_handler(key->hidraw_fd, u2f_passthru_read, NULL, key); in u2f_transaction_start()
252 timer_init_ms(&key->timer, QEMU_CLOCK_VIRTUAL, u2f_timeout_check, key); in u2f_transaction_start()
253 timer_mod(&key->timer, time + TRANSACTION_TIMEOUT / 4); in u2f_transaction_start()
255 key->last_transaction_time = time; in u2f_transaction_start()
258 static void u2f_passthru_recv_from_host(U2FPassthruState *key, in u2f_passthru_recv_from_host() argument
272 transaction = u2f_transaction_get_from_nonce(key, packet_init->data); in u2f_passthru_recv_from_host()
274 transaction = u2f_transaction_get(key, cid); in u2f_passthru_recv_from_host()
300 u2f_transaction_close(key, cid); in u2f_passthru_recv_from_host()
302 u2f_send_to_guest(&key->base, packet); in u2f_passthru_recv_from_host()
307 U2FPassthruState *key = opaque; in u2f_passthru_read() local
308 U2FKeyState *base = &key->base; in u2f_passthru_read()
317 ret = read(key->hidraw_fd, packet, sizeof(packet)); in u2f_passthru_read()
322 u2f_passthru_reset(key); in u2f_passthru_read()
329 u2f_passthru_recv_from_host(key, packet); in u2f_passthru_read()
335 U2FPassthruState *key = PASSTHRU_U2F_KEY(base); in u2f_passthru_recv_from_guest() local
340 u2f_transaction_start(key, (struct packet_init *)packet); in u2f_passthru_recv_from_guest()
346 written = write(key->hidraw_fd, host_packet, sizeof(host_packet)); in u2f_passthru_recv_from_guest()
461 U2FPassthruState *key = PASSTHRU_U2F_KEY(base); in u2f_passthru_unrealize() local
463 u2f_passthru_reset(key); in u2f_passthru_unrealize()
464 qemu_close(key->hidraw_fd); in u2f_passthru_unrealize()
469 U2FPassthruState *key = PASSTHRU_U2F_KEY(base); in u2f_passthru_realize() local
472 if (key->hidraw == NULL) { in u2f_passthru_realize()
485 fd = qemu_open_old(key->hidraw, O_RDWR); in u2f_passthru_realize()
488 key->hidraw); in u2f_passthru_realize()
499 key->hidraw_fd = fd; in u2f_passthru_realize()
500 u2f_passthru_reset(key); in u2f_passthru_realize()
505 U2FPassthruState *key = opaque; in u2f_passthru_post_load() local
506 u2f_passthru_reset(key); in u2f_passthru_post_load()