aboutsummaryrefslogtreecommitdiff
path: root/regress/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'regress/dev.c')
-rw-r--r--regress/dev.c234
1 files changed, 14 insertions, 220 deletions
diff --git a/regress/dev.c b/regress/dev.c
index 0ba552b70552..55107df34c71 100644
--- a/regress/dev.c
+++ b/regress/dev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019-2022 Yubico AB. All rights reserved.
+ * Copyright (c) 2019-2024 Yubico AB. All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file.
* SPDX-License-Identifier: BSD-2-Clause
@@ -16,166 +16,16 @@
#include <fido.h>
#include "../fuzz/wiredata_fido2.h"
-
-#define REPORT_LEN (64 + 1)
-
-static uint8_t ctap_nonce[8];
-static uint8_t *wiredata_ptr;
-static size_t wiredata_len;
-static int fake_dev_handle;
-static int initialised;
-static long interval_ms;
-
-#if defined(_MSC_VER)
-static int
-nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
-{
- if (rmtp != NULL) {
- errno = EINVAL;
- return (-1);
- }
-
- Sleep((DWORD)(rqtp->tv_sec * 1000) + (DWORD)(rqtp->tv_nsec / 1000000));
-
- return (0);
-}
-#endif
-
-static void *
-dummy_open(const char *path)
-{
- (void)path;
-
- return (&fake_dev_handle);
-}
-
-static void
-dummy_close(void *handle)
-{
- assert(handle == &fake_dev_handle);
-}
-
-static int
-dummy_read(void *handle, unsigned char *ptr, size_t len, int ms)
-{
- struct timespec tv;
- size_t n;
- long d;
-
- assert(handle == &fake_dev_handle);
- assert(ptr != NULL);
- assert(len == REPORT_LEN - 1);
-
- if (wiredata_ptr == NULL)
- return (-1);
-
- if (!initialised) {
- assert(wiredata_len >= REPORT_LEN - 1);
- memcpy(&wiredata_ptr[7], &ctap_nonce, sizeof(ctap_nonce));
- initialised = 1;
- }
-
- if (ms >= 0 && ms < interval_ms)
- d = ms;
- else
- d = interval_ms;
-
- if (d) {
- tv.tv_sec = d / 1000;
- tv.tv_nsec = (d % 1000) * 1000000;
- if (nanosleep(&tv, NULL) == -1)
- err(1, "nanosleep");
- }
-
- if (d != interval_ms)
- return (-1); /* timeout */
-
- if (wiredata_len < len)
- n = wiredata_len;
- else
- n = len;
-
- memcpy(ptr, wiredata_ptr, n);
- wiredata_ptr += n;
- wiredata_len -= n;
-
- return ((int)n);
-}
-
-static int
-dummy_write(void *handle, const unsigned char *ptr, size_t len)
-{
- struct timespec tv;
-
- assert(handle == &fake_dev_handle);
- assert(ptr != NULL);
- assert(len == REPORT_LEN);
-
- if (!initialised)
- memcpy(&ctap_nonce, &ptr[8], sizeof(ctap_nonce));
-
- if (interval_ms) {
- tv.tv_sec = interval_ms / 1000;
- tv.tv_nsec = (interval_ms % 1000) * 1000000;
- if (nanosleep(&tv, NULL) == -1)
- err(1, "nanosleep");
- }
-
- return ((int)len);
-}
-
-static uint8_t *
-wiredata_setup(const uint8_t *data, size_t len)
-{
- const uint8_t ctap_init_data[] = { WIREDATA_CTAP_INIT };
-
- assert(wiredata_ptr == NULL);
- assert(SIZE_MAX - len > sizeof(ctap_init_data));
- assert((wiredata_ptr = malloc(sizeof(ctap_init_data) + len)) != NULL);
-
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:6386)
-#endif
- memcpy(wiredata_ptr, ctap_init_data, sizeof(ctap_init_data));
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
- if (len)
- memcpy(wiredata_ptr + sizeof(ctap_init_data), data, len);
-
- wiredata_len = sizeof(ctap_init_data) + len;
-
- return (wiredata_ptr);
-}
-
-static void
-wiredata_clear(uint8_t **wiredata)
-{
- free(*wiredata);
- *wiredata = NULL;
- wiredata_ptr = NULL;
- wiredata_len = 0;
- initialised = 0;
-}
+#include "extern.h"
/* gh#56 */
static void
open_iff_ok(void)
{
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_ERR_RX);
assert(fido_dev_close(dev) == FIDO_ERR_INVALID_ARGUMENT);
@@ -188,18 +38,10 @@ reopen(void)
const uint8_t cbor_info_data[] = { WIREDATA_CTAP_CBOR_INFO };
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(cbor_info_data, sizeof(cbor_info_data));
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_close(dev) == FIDO_OK);
wiredata_clear(&wiredata);
@@ -217,18 +59,10 @@ double_open(void)
const uint8_t cbor_info_data[] = { WIREDATA_CTAP_CBOR_INFO };
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(cbor_info_data, sizeof(cbor_info_data));
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_open(dev, "dummy") == FIDO_ERR_INVALID_ARGUMENT);
assert(fido_dev_close(dev) == FIDO_OK);
@@ -242,19 +76,11 @@ double_close(void)
const uint8_t cbor_info_data[] = { WIREDATA_CTAP_CBOR_INFO };
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(cbor_info_data, sizeof(cbor_info_data));
assert((dev = fido_dev_new()) != NULL);
assert(fido_dev_close(dev) == FIDO_ERR_INVALID_ARGUMENT);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_close(dev) == FIDO_ERR_INVALID_ARGUMENT);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_close(dev) == FIDO_OK);
@@ -269,18 +95,10 @@ is_fido2(void)
const uint8_t cbor_info_data[] = { WIREDATA_CTAP_CBOR_INFO };
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(cbor_info_data, sizeof(cbor_info_data));
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_is_fido2(dev) == true);
assert(fido_dev_supports_pin(dev) == true);
@@ -313,18 +131,10 @@ has_pin(void)
};
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(set_pin_data, sizeof(set_pin_data));
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_has_pin(dev) == false);
assert(fido_dev_set_pin(dev, "top secret", NULL) == FIDO_OK);
@@ -350,26 +160,18 @@ timeout_rx(void)
};
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(timeout_rx_data, sizeof(timeout_rx_data));
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_set_timeout(dev, 3 * 1000) == FIDO_OK);
- interval_ms = 1000;
+ set_read_interval(1000);
assert(fido_dev_reset(dev) == FIDO_ERR_RX);
assert(fido_dev_close(dev) == FIDO_OK);
fido_dev_free(&dev);
wiredata_clear(&wiredata);
- interval_ms = 0;
+ set_read_interval(0);
}
static void
@@ -386,26 +188,18 @@ timeout_ok(void)
};
uint8_t *wiredata;
fido_dev_t *dev = NULL;
- fido_dev_io_t io;
-
- memset(&io, 0, sizeof(io));
-
- io.open = dummy_open;
- io.close = dummy_close;
- io.read = dummy_read;
- io.write = dummy_write;
wiredata = wiredata_setup(timeout_ok_data, sizeof(timeout_ok_data));
assert((dev = fido_dev_new()) != NULL);
- assert(fido_dev_set_io_functions(dev, &io) == FIDO_OK);
+ setup_dummy_io(dev);
assert(fido_dev_open(dev, "dummy") == FIDO_OK);
assert(fido_dev_set_timeout(dev, 30 * 1000) == FIDO_OK);
- interval_ms = 1000;
+ set_read_interval(1000);
assert(fido_dev_reset(dev) == FIDO_OK);
assert(fido_dev_close(dev) == FIDO_OK);
fido_dev_free(&dev);
wiredata_clear(&wiredata);
- interval_ms = 0;
+ set_read_interval(0);
}
static void