commit: c2e4d05a2baf81e0f6b26fd932cfc963de6c88f3
parent 479b4a9313cd551db129a7a5d399d4a2975f1fb9
Author: Michael Forney <mforney@mforney.org>
Date: Sun, 3 Nov 2019 12:08:12 -0800
Add libfido2 git
Diffstat:
8 files changed, 307 insertions(+), 0 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -110,6 +110,10 @@
path = pkg/libffi/src
url = https://github.com/libffi/libffi
ignore = all
+[submodule "pkg/libfido2/src"]
+ path = pkg/libfido2/src
+ url = https://github.com/Yubico/libfido2.git
+ ignore = all
[submodule "pkg/libinput/src"]
path = pkg/libinput/src
url = https://github.com/oasislinux/libinput
diff --git a/pkg/gen.lua b/pkg/gen.lua
@@ -38,6 +38,7 @@ subgen 'libdrm'
subgen 'libevdev'
subgen 'libevent'
subgen 'libffi'
+subgen 'libfido2'
subgen 'libinput'
subgen 'libjpeg-turbo'
subgen 'libnl'
diff --git a/pkg/libfido2/config.h b/pkg/libfido2/config.h
@@ -0,0 +1,16 @@
+#define TLS _Thread_local
+#define HAS_DEV_URANDOM
+#define HAVE_ENDIAN_H
+#define HAVE_ERR_H
+#define HAVE_UNISTD_H
+#define HAVE_SIGNAL_H
+#define HAVE_STRLCPY
+#define HAVE_STRLCAT
+#define HAVE_RECALLOCARRAY
+#define HAVE_GETPAGESIZE
+#define HAVE_SYSCONF
+#define HAVE_EXPLICIT_BZERO
+#define HAVE_TIMINGSAFE_BCMP
+#define HAVE_READPASSPHRASE
+#define HAVE_GETLINE
+#define HAVE_GETOPT
diff --git a/pkg/libfido2/gen.lua b/pkg/libfido2/gen.lua
@@ -0,0 +1,51 @@
+cflags{
+ '-include $dir/config.h',
+ '-D _FIDO_INTERNAL',
+ '-I $builddir/pkg/libcbor/include',
+ '-I $builddir/pkg/libressl/include',
+ '-I $srcdir/src',
+ '-I pkg/openbsd/include',
+}
+
+pkg.deps = {
+ 'pkg/libcbor/headers',
+ 'pkg/libressl/headers',
+}
+
+lib('libfido2.a', [[
+ src/(
+ aes256.c
+ assert.c
+ authkey.c
+ bio.c
+ blob.c
+ buf.c
+ cbor.c
+ cred.c
+ credman.c
+ dev.c
+ ecdh.c
+ eddsa.c
+ err.c
+ es256.c
+ hid.c
+ info.c
+ io.c
+ iso7816.c
+ log.c
+ pin.c
+ reset.c
+ rs256.c
+ u2f.c
+
+ hid_linux.c
+ )
+ $builddir/pkg/libcbor/libcbor.a
+]])
+
+lib('libsk-libfido2.a', {
+ 'tools/sk-libfido2.c',
+ 'libfido2.a.d',
+})
+
+fetch 'git'
diff --git a/pkg/libfido2/patch/0001-Rename-log_-symbols-to-prevent-conflict-when-linking.patch b/pkg/libfido2/patch/0001-Rename-log_-symbols-to-prevent-conflict-when-linking.patch
@@ -0,0 +1,41 @@
+From 448eaf9f2d065bcf76c0c9e253a24f743032ddba Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sun, 3 Nov 2019 11:37:52 -0800
+Subject: [PATCH] Rename log_* symbols to prevent conflict when linking
+ statically
+
+---
+ src/extern.h | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/src/extern.h b/src/extern.h
+index 2f69094..a6c757d 100644
+--- a/src/extern.h
++++ b/src/extern.h
+@@ -92,14 +92,17 @@ int rx_cbor_status(fido_dev_t *, int);
+ #define log_xxd(...) do { /* nothing */ } while (0)
+ #else
+ #ifdef __GNUC__
+-void log_init(void);
+-void log_debug(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+-void log_xxd(const void *, size_t);
++void fido_log_init(void);
++void fido_log_debug(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
++void fido_log_xxd(const void *, size_t);
+ #else
+-void log_init(void);
+-void log_debug(const char *, ...);
+-void log_xxd(const void *, size_t);
++void fido_log_init(void);
++void fido_log_debug(const char *, ...);
++void fido_log_xxd(const void *, size_t);
+ #endif /* __GNUC__ */
++#define log_init fido_log_init
++#define log_debug fido_log_debug
++#define log_xxd fido_log_xxd
+ #endif /* FIDO_NO_DIAGNOSTIC */
+
+ /* u2f */
+--
+2.23.0
+
diff --git a/pkg/libfido2/patch/0002-hid_linux-Use-sysfs-instead-of-libudev.patch b/pkg/libfido2/patch/0002-hid_linux-Use-sysfs-instead-of-libudev.patch
@@ -0,0 +1,192 @@
+From 8cd6f18a9435ced27e765cb8d50991097a00d8c1 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Fri, 1 Nov 2019 19:39:45 -0700
+Subject: [PATCH] hid_linux: Use sysfs instead of libudev
+
+---
+ src/hid_linux.c | 102 ++++++++++++++++++------------------------------
+ 1 file changed, 37 insertions(+), 65 deletions(-)
+
+diff --git a/src/hid_linux.c b/src/hid_linux.c
+index 9d55453..2a888e5 100644
+--- a/src/hid_linux.c
++++ b/src/hid_linux.c
+@@ -9,8 +9,8 @@
+ #include <sys/ioctl.h>
+ #include <linux/hidraw.h>
+
++#include <dirent.h>
+ #include <fcntl.h>
+-#include <libudev.h>
+ #include <string.h>
+ #include <unistd.h>
+
+@@ -147,23 +147,20 @@ is_fido(const char *path)
+ }
+
+ static int
+-parse_uevent(struct udev_device *dev, int16_t *vendor_id, int16_t *product_id)
++parse_uevent(const char *path, int16_t *vendor_id, int16_t *product_id)
+ {
+- const char *uevent;
+- char *cp;
+- char *p;
+- char *s;
++ FILE *fp;
++ char *p = NULL;
++ size_t n = 0;
+ int ok = -1;
+ short unsigned int x;
+ short unsigned int y;
+
+- if ((uevent = udev_device_get_sysattr_value(dev, "uevent")) == NULL)
++ fp = fopen(path, "r");
++ if (!fp)
+ return (-1);
+
+- if ((s = cp = strdup(uevent)) == NULL)
+- return (-1);
+-
+- for ((p = strsep(&cp, "\n")); p && *p != '\0'; (p = strsep(&cp, "\n"))) {
++ while (getline(&p, &n, fp) >= 0) {
+ if (strncmp(p, "HID_ID=", 7) == 0) {
+ if (sscanf(p + 7, "%*x:%hx:%hx", &x, &y) == 2) {
+ *vendor_id = (int16_t)x;
+@@ -174,50 +171,32 @@ parse_uevent(struct udev_device *dev, int16_t *vendor_id, int16_t *product_id)
+ }
+ }
+
+- free(s);
+-
++ free(p);
++ fclose(fp);
+ return (ok);
+ }
+
+ static int
+-copy_info(fido_dev_info_t *di, struct udev *udev,
+- struct udev_list_entry *udev_entry)
++copy_info(fido_dev_info_t *di, const char *name)
+ {
+- const char *name;
+- const char *path;
+- const char *manufacturer;
+- const char *product;
+- struct udev_device *dev = NULL;
+- struct udev_device *hid_parent;
+- struct udev_device *usb_parent;
+- int ok = -1;
++ char path[PATH_MAX];
++ int r, ok = -1;
+
+ memset(di, 0, sizeof(*di));
+
+- if ((name = udev_list_entry_get_name(udev_entry)) == NULL ||
+- (dev = udev_device_new_from_syspath(udev, name)) == NULL ||
+- (path = udev_device_get_devnode(dev)) == NULL ||
+- is_fido(path) == 0)
+- goto fail;
+-
+- if ((hid_parent = udev_device_get_parent_with_subsystem_devtype(dev,
+- "hid", NULL)) == NULL)
++ snprintf(path, sizeof(path), "/dev/%s", name);
++ if (is_fido(path) == 0)
+ goto fail;
++ di->path = strdup(path);
+
+- if ((usb_parent = udev_device_get_parent_with_subsystem_devtype(dev,
+- "usb", "usb_device")) == NULL)
++ r = snprintf(path, sizeof(path), "/sys/class/hidraw/%s/device/uevent", name);
++ if (r < 0 || (size_t)r >= sizeof(path))
+ goto fail;
+-
+- if (parse_uevent(hid_parent, &di->vendor_id, &di->product_id) < 0 ||
+- (manufacturer = udev_device_get_sysattr_value(usb_parent,
+- "manufacturer")) == NULL ||
+- (product = udev_device_get_sysattr_value(usb_parent,
+- "product")) == NULL)
++ if (parse_uevent(path, &di->vendor_id, &di->product_id) < 0)
+ goto fail;
+
+- di->path = strdup(path);
+- di->manufacturer = strdup(manufacturer);
+- di->product = strdup(product);
++ di->manufacturer = strdup("Unknown");
++ di->product = strdup("Unknown");
+
+ if (di->path == NULL ||
+ di->manufacturer == NULL ||
+@@ -226,9 +205,6 @@ copy_info(fido_dev_info_t *di, struct udev *udev,
+
+ ok = 0;
+ fail:
+- if (dev != NULL)
+- udev_device_unref(dev);
+-
+ if (ok < 0) {
+ free(di->path);
+ free(di->manufacturer);
+@@ -239,14 +215,17 @@ fail:
+ return (ok);
+ }
+
++static int
++filter_hidraw(const struct dirent *d)
++{
++ return strncmp(d->d_name, "hidraw", 6) == 0;
++}
++
+ int
+ fido_dev_info_manifest(fido_dev_info_t *devlist, size_t ilen, size_t *olen)
+ {
+- struct udev *udev = NULL;
+- struct udev_enumerate *udev_enum = NULL;
+- struct udev_list_entry *udev_list;
+- struct udev_list_entry *udev_entry;
+- int r = FIDO_ERR_INTERNAL;
++ struct dirent **entries;
++ int i, n, r = FIDO_ERR_INTERNAL;
+
+ *olen = 0;
+
+@@ -256,29 +235,22 @@ fido_dev_info_manifest(fido_dev_info_t *devlist, size_t ilen, size_t *olen)
+ if (devlist == NULL)
+ return (FIDO_ERR_INVALID_ARGUMENT);
+
+- if ((udev = udev_new()) == NULL ||
+- (udev_enum = udev_enumerate_new(udev)) == NULL)
++ n = scandir("/sys/class/hidraw", &entries, filter_hidraw, alphasort);
++ if (n == -1)
+ goto fail;
+-
+- if (udev_enumerate_add_match_subsystem(udev_enum, "hidraw") < 0 ||
+- udev_enumerate_scan_devices(udev_enum) < 0 ||
+- (udev_list = udev_enumerate_get_list_entry(udev_enum)) == NULL)
+- goto fail;
+-
+- udev_list_entry_foreach(udev_entry, udev_list) {
+- if (copy_info(&devlist[*olen], udev, udev_entry) == 0) {
++ for (i = 0; i < n; ++i) {
++ if (copy_info(&devlist[*olen], entries[i]->d_name) == 0) {
+ if (++(*olen) == ilen)
+ break;
+ }
++ free(entries[i]);
+ }
++ for (; i < n; ++i)
++ free(entries[i]);
++ free(entries);
+
+ r = FIDO_OK;
+ fail:
+- if (udev_enum != NULL)
+- udev_enumerate_unref(udev_enum);
+- if (udev != NULL)
+- udev_unref(udev);
+-
+ return (r);
+ }
+
+--
+2.23.0
+
diff --git a/pkg/libfido2/src b/pkg/libfido2/src
@@ -0,0 +1 @@
+Subproject commit 6a628b3d3a9d62a58f94d48340ef9eeca2d672b9
diff --git a/pkg/libfido2/ver b/pkg/libfido2/ver
@@ -0,0 +1 @@
+1.2.0-55-g6a628b3 r0