xref: /openbsd-src/lib/libfido2/src/reset.c (revision ab19a69ebe1d1275c01611de862453c36b3d15b9)
1d75efeb7Sdjm /*
2d75efeb7Sdjm  * Copyright (c) 2018 Yubico AB. All rights reserved.
3d75efeb7Sdjm  * Use of this source code is governed by a BSD-style
4d75efeb7Sdjm  * license that can be found in the LICENSE file.
5d75efeb7Sdjm  */
6d75efeb7Sdjm 
7d75efeb7Sdjm #include "fido.h"
8d75efeb7Sdjm 
9d75efeb7Sdjm static int
fido_dev_reset_tx(fido_dev_t * dev,int * ms)10*ab19a69eSdjm fido_dev_reset_tx(fido_dev_t *dev, int *ms)
11d75efeb7Sdjm {
12d75efeb7Sdjm 	const unsigned char cbor[] = { CTAP_CBOR_RESET };
13d75efeb7Sdjm 
14*ab19a69eSdjm 	if (fido_tx(dev, CTAP_CMD_CBOR, cbor, sizeof(cbor), ms) < 0) {
1532a20e26Sdjm 		fido_log_debug("%s: fido_tx", __func__);
16d75efeb7Sdjm 		return (FIDO_ERR_TX);
17d75efeb7Sdjm 	}
18d75efeb7Sdjm 
19d75efeb7Sdjm 	return (FIDO_OK);
20d75efeb7Sdjm }
21d75efeb7Sdjm 
22d75efeb7Sdjm static int
fido_dev_reset_wait(fido_dev_t * dev,int * ms)23*ab19a69eSdjm fido_dev_reset_wait(fido_dev_t *dev, int *ms)
24d75efeb7Sdjm {
25d75efeb7Sdjm 	int r;
26d75efeb7Sdjm 
27*ab19a69eSdjm 	if ((r = fido_dev_reset_tx(dev, ms)) != FIDO_OK ||
2832a20e26Sdjm 	    (r = fido_rx_cbor_status(dev, ms)) != FIDO_OK)
29d75efeb7Sdjm 		return (r);
30d75efeb7Sdjm 
31c4a807edSdjm 	if (dev->flags & FIDO_DEV_PIN_SET) {
32c4a807edSdjm 		dev->flags &= ~FIDO_DEV_PIN_SET;
33c4a807edSdjm 		dev->flags |= FIDO_DEV_PIN_UNSET;
34c4a807edSdjm 	}
35c4a807edSdjm 
36d75efeb7Sdjm 	return (FIDO_OK);
37d75efeb7Sdjm }
38d75efeb7Sdjm 
39d75efeb7Sdjm int
fido_dev_reset(fido_dev_t * dev)40d75efeb7Sdjm fido_dev_reset(fido_dev_t *dev)
41d75efeb7Sdjm {
42*ab19a69eSdjm 	int ms = dev->timeout_ms;
43*ab19a69eSdjm 
44*ab19a69eSdjm 	return (fido_dev_reset_wait(dev, &ms));
45d75efeb7Sdjm }
46