On Sun, Aug 27, 2017 at 09:51:23PM +0200, Jasper Lievisse Adriaanse wrote: > Hi > > Instead of adding a new driver for each USB RNG device here's a diff to > combine the existing ualea(4) driver and support for a new device (ChaosKey > support by abieber@) into urng(4). > > The plan is to merge uonerng(4) into it as well as support for future > devices into this single driver. > > This was tested by abieber@ with a ChaosKey and Sean with an Alea II. > > OK?
I'd like to have more OK's than just mine, but for sure the '#define URNG_DEBUG 1' should be removed before it goes in :D I have been running this since yesterday without issues, so OK from me! > > Cheers, > Jasper > > Index: share/man/man4/Makefile > =================================================================== > RCS file: /cvs/src/share/man/man4/Makefile,v > retrieving revision 1.656 > diff -u -p -r1.656 Makefile > --- share/man/man4/Makefile 25 Aug 2017 11:17:35 -0000 1.656 > +++ share/man/man4/Makefile 26 Aug 2017 19:44:32 -0000 > @@ -61,7 +61,7 @@ MAN= aac.4 ac97.4 acphy.4 \ > stp.4 sv.4 switch.4 sym.4 tcic.4 tcp.4 termios.4 tht.4 ti.4 tl.4 \ > tlphy.4 thmc.4 tpm.4 tqphy.4 trm.4 trunk.4 tsl.4 tty.4 tun.4 tap.4 \ > twe.4 \ > - txp.4 txphy.4 ualea.4 uaudio.4 uark.4 uath.4 ubcmtp.4 uberry.4 ubsa.4 \ > + txp.4 txphy.4 uaudio.4 uark.4 uath.4 ubcmtp.4 uberry.4 ubsa.4 \ > ubsec.4 \ > ucom.4 uchcom.4 ucycom.4 uslhcom.4 udav.4 udcf.4 udl.4 udp.4 udsbr.4 \ > uftdi.4 ugen.4 ugl.4 ugold.4 uguru.4 uhci.4 uhid.4 uhidev.4 uipaq.4 \ > @@ -69,7 +69,7 @@ MAN= aac.4 ac97.4 acphy.4 \ > ukphy.4 ulpt.4 umass.4 umb.4 umbg.4 umcs.4 umct.4 umidi.4 umodem.4 \ > ums.4 umsm.4 unix.4 uonerng.4 uow.4 uoaklux.4 uoakrh.4 uoakv.4 upd.4 \ > upgt.4 upl.4 uplcom.4 ural.4 ure.4 url.4 urlphy.4 \ > - urndis.4 urtw.4 urtwn.4 usb.4 uscom.4 uslcom.4 usps.4 \ > + urndis.4 urng.4 urtw.4 urtwn.4 usb.4 uscom.4 uslcom.4 usps.4 \ > uthum.4 uticom.4 utpms.4 utwitch.4 utrh.4 uts.4 utvfu.4 uvideo.4 \ > uvisor.4 uvscom.4 uwacom.4 \ > vether.4 vga.4 vgafb.4 vge.4 \ > Index: share/man/man4/ualea.4 > =================================================================== > RCS file: share/man/man4/ualea.4 > diff -N share/man/man4/ualea.4 > --- share/man/man4/ualea.4 16 Apr 2015 08:56:53 -0000 1.1 > +++ /dev/null 1 Jan 1970 00:00:00 -0000 > @@ -1,54 +0,0 @@ > -.\" $OpenBSD: ualea.4,v 1.1 2015/04/16 08:56:53 mpi Exp $ > -.\" > -.\" Copyright (c) 2007 Marc Balmer <mbal...@openbsd.org> > -.\" Copyright (c) 2015 Sean Levy <att...@stalphonsos.com> > -.\" > -.\" Permission to use, copy, modify, and distribute this software for any > -.\" purpose with or without fee is hereby granted, provided that the above > -.\" copyright notice and this permission notice appear in all copies. > -.\" > -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > -.\" > -.Dd $Mdocdate: April 16 2015 $ > -.Dt UALEA 4 > -.Os > -.Sh NAME > -.Nm ualea > -.Nd Araneus Alea II USB TRNG > -.Sh SYNOPSIS > -.Cd "ualea* at uhub?" > -.Sh DESCRIPTION > -The > -.Nm > -driver provides support for the Araneus Alea II, a USB true random > -number generator (TRNG). > -It delivers 100kbit/sec of hardware-generated entropy. > -.Nm > -reads raw entropy from the Alea II and uses > -.Xr add_true_randomness 9 > -to add it to the system entropy pool. > -.Pp > -The product documentation states that the USB interface used by the > -Alea II is the same as that used by its predecessor the Alea I; > -theoretically this means that the Alea I should work but this has not > -been tested. > -.Sh SEE ALSO > -.Xr intro 4 , > -.Xr usb 4 , > -.Xr add_true_randomness 9 > -.Sh HISTORY > -The > -.Nm > -driver first appeared in > -.Ox 5.7 . > -.Sh AUTHORS > -The > -.Nm > -driver was written by > -.An Sean Levy Aq Mt att...@stalphonsos.com . > Index: share/man/man4/urng.4 > =================================================================== > RCS file: share/man/man4/urng.4 > diff -N share/man/man4/urng.4 > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ share/man/man4/urng.4 26 Aug 2017 20:34:54 -0000 > @@ -0,0 +1,63 @@ > +.\" $OpenBSD$ > +.\" > +.\" Copyright (c) 2015 Sean Levy <att...@stalphonsos.com> > +.\" Copyright (c) 2017 Jasper Lievisse Adriaanse <jas...@openbsd.org> > +.\" > +.\" Permission to use, copy, modify, and distribute this software for any > +.\" purpose with or without fee is hereby granted, provided that the above > +.\" copyright notice and this permission notice appear in all copies. > +.\" > +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > +.\" > +.Dd $Mdocdate$ > +.Dt URNG 4 > +.Os > +.Sh NAME > +.Nm urng > +.Nd USB Random Number Generator devices > +.Sh SYNOPSIS > +.Cd "urng* at uhub?" > +.Sh DESCRIPTION > +The > +.Nm > +driver provides support for various true random number generator > +(TRNG) devices connected via USB. > +.Nm > +reads raw entropy from the device at a (hardware dependent) interval > +and stirs it into the system entropy pool with > +.Xr add_true_randomness 9 . > +.Sh HARDWARE > +The following devices are supported by this driver: > +.Pp > +.Bl -tag -width "Altusmetrum" > +.It Araneus Alea II > +Capable of delivering 100kbit/sec of hardware-generated entropy. > +The product documentation states that the USB interface used by the > +Alea II is the same as that used by its predecessor the Alea I; > +theoretically this means that the Alea I should work but this has not > +been tested. > +.It Altusmetrum ChaosKey 1.0 > +This device is capable of providing entropy at 10Mbit/s. > +.El > +.Sh SEE ALSO > +.Xr intro 4 , > +.Xr usb 4 , > +.Xr add_true_randomness 9 > +.Sh HISTORY > +The > +.Nm > +driver first appeared in > +.Ox 6.2 . > +.Sh AUTHORS > +The > +.Nm > +driver was written by > +.An Aaron Bieber Aq Mt abie...@openbsd.org , > +.An Jasper Lievisse Adriaanse Aq Mt jas...@openbsd.org , > +.An Sean Levy Aq Mt att...@stalphonsos.com . > Index: share/man/man4/usb.4 > =================================================================== > RCS file: /cvs/src/share/man/man4/usb.4,v > retrieving revision 1.183 > diff -u -p -r1.183 usb.4 > --- share/man/man4/usb.4 22 Mar 2017 06:09:31 -0000 1.183 > +++ share/man/man4/usb.4 26 Aug 2017 20:10:25 -0000 > @@ -288,8 +288,6 @@ USB Mobile Broadband Interface Model (MB > .El > .Ss Miscellaneous devices > .Bl -tag -width 12n -offset ind -compact > -.It Xr ualea 4 > -Araneus Alea II USB TRNG > .It Xr uberry 4 > Research In Motion BlackBerry > .It Xr ugen 4 > @@ -304,6 +302,8 @@ Moonbase Otago OneRNG TRNG > Maxim/Dallas DS2490 USB 1-Wire adapter > .It Xr upl 4 > Prolific based host-to-host adapters > +.It Xr urng 4 > +USB Random Number Generator devices > .It Xr usps 4 > USPS composite AC power and temperature sensor > .It Xr uts 4 > Index: sys/arch/alpha/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/alpha/conf/GENERIC,v > retrieving revision 1.259 > diff -u -p -r1.259 GENERIC > --- sys/arch/alpha/conf/GENERIC 31 Aug 2016 12:46:45 -0000 1.259 > +++ sys/arch/alpha/conf/GENERIC 26 Aug 2017 19:43:23 -0000 > @@ -62,7 +62,7 @@ usb* at ohci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/amd64/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v > retrieving revision 1.444 > diff -u -p -r1.444 GENERIC > --- sys/arch/amd64/conf/GENERIC 14 Jun 2017 22:35:43 -0000 1.444 > +++ sys/arch/amd64/conf/GENERIC 26 Aug 2017 19:43:21 -0000 > @@ -204,8 +204,9 @@ usb* at ohci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > +urng* at uhub? # USB Random Number Generator > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > uvisor* at uhub? # Handspring Visor > Index: sys/arch/arm64/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/arm64/conf/GENERIC,v > retrieving revision 1.35 > diff -u -p -r1.35 GENERIC > --- sys/arch/arm64/conf/GENERIC 25 Aug 2017 10:29:54 -0000 1.35 > +++ sys/arch/arm64/conf/GENERIC 26 Aug 2017 19:43:17 -0000 > @@ -133,7 +133,7 @@ usb* at xhci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/armv7/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/armv7/conf/GENERIC,v > retrieving revision 1.88 > diff -u -p -r1.88 GENERIC > --- sys/arch/armv7/conf/GENERIC 14 Aug 2017 21:46:02 -0000 1.88 > +++ sys/arch/armv7/conf/GENERIC 26 Aug 2017 19:43:14 -0000 > @@ -180,7 +180,7 @@ usb* at ehci? flags 0x1 > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/hppa/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/hppa/conf/GENERIC,v > retrieving revision 1.173 > diff -u -p -r1.173 GENERIC > --- sys/arch/hppa/conf/GENERIC 4 Sep 2016 10:22:06 -0000 1.173 > +++ sys/arch/hppa/conf/GENERIC 26 Aug 2017 19:43:10 -0000 > @@ -120,7 +120,7 @@ ure* at uhub? # Realtek RTL8152 based > a > rsu* at uhub? # Realtek RTL8188SU/RTL8191SU/RTL8192SU > > # untested USB devices > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/i386/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v > retrieving revision 1.828 > diff -u -p -r1.828 GENERIC > --- sys/arch/i386/conf/GENERIC 18 May 2017 13:29:32 -0000 1.828 > +++ sys/arch/i386/conf/GENERIC 26 Aug 2017 19:43:08 -0000 > @@ -228,7 +228,7 @@ usb* at ohci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/landisk/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/landisk/conf/GENERIC,v > retrieving revision 1.51 > diff -u -p -r1.51 GENERIC > --- sys/arch/landisk/conf/GENERIC 28 Jun 2016 04:41:37 -0000 1.51 > +++ sys/arch/landisk/conf/GENERIC 26 Aug 2017 19:43:05 -0000 > @@ -86,7 +86,7 @@ usb* at ohci? > # USB Hubs > uhub* at usb? > uhub* at uhub? port ? configuration ? interface ? > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/loongson/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/loongson/conf/GENERIC,v > retrieving revision 1.55 > diff -u -p -r1.55 GENERIC > --- sys/arch/loongson/conf/GENERIC 21 May 2017 13:00:53 -0000 1.55 > +++ sys/arch/loongson/conf/GENERIC 26 Aug 2017 19:43:01 -0000 > @@ -119,7 +119,7 @@ usb* at ehci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/macppc/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/macppc/conf/GENERIC,v > retrieving revision 1.260 > diff -u -p -r1.260 GENERIC > --- sys/arch/macppc/conf/GENERIC 12 Sep 2016 08:28:44 -0000 1.260 > +++ sys/arch/macppc/conf/GENERIC 26 Aug 2017 19:42:55 -0000 > @@ -207,7 +207,7 @@ usb* at ehci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/octeon/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/octeon/conf/GENERIC,v > retrieving revision 1.39 > diff -u -p -r1.39 GENERIC > --- sys/arch/octeon/conf/GENERIC 1 Aug 2017 16:18:11 -0000 1.39 > +++ sys/arch/octeon/conf/GENERIC 26 Aug 2017 19:42:50 -0000 > @@ -91,7 +91,7 @@ usb* at xhci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/arch/sparc64/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/conf/GENERIC,v > retrieving revision 1.306 > diff -u -p -r1.306 GENERIC > --- sys/arch/sparc64/conf/GENERIC 26 Jan 2017 12:18:55 -0000 1.306 > +++ sys/arch/sparc64/conf/GENERIC 26 Aug 2017 19:42:27 -0000 > @@ -175,7 +175,7 @@ usb* at xhci? > # USB devices > uhub* at usb? # USB Hubs > uhub* at uhub? # USB Hubs > -ualea* at uhub? # Araneus Alea II TRNG > +urng* at uhub? # USB Random Number Generator > uonerng* at uhub? # Moonbase Otago OneRNG > umodem* at uhub? # USB Modems/Serial > ucom* at umodem? > Index: sys/dev/usb/files.usb > =================================================================== > RCS file: /cvs/src/sys/dev/usb/files.usb,v > retrieving revision 1.131 > diff -u -p -r1.131 files.usb > --- sys/dev/usb/files.usb 12 Sep 2016 08:12:06 -0000 1.131 > +++ sys/dev/usb/files.usb 26 Aug 2017 19:40:34 -0000 > @@ -167,15 +167,15 @@ attach uoakv at uhidbus > file dev/usb/uoakv.c uoakv > > # Misc > -# Araneus Alea II TRNG > -device ualea > -attach ualea at uhub > -file dev/usb/ualea.c ualea > - > # Moonbase Otago OneRNG TRNG > device uonerng > attach uonerng at uhub > file dev/usb/uonerng.c uonerng > + > +# USB Random Number Generator > +device urng > +attach urng at uhub > +file dev/usb/urng.c > > # Gude Expert mouseCLOCK DCF77 time signal station receiver > device udcf > Index: sys/dev/usb/ualea.c > =================================================================== > RCS file: sys/dev/usb/ualea.c > diff -N sys/dev/usb/ualea.c > --- sys/dev/usb/ualea.c 17 Apr 2015 07:17:51 -0000 1.2 > +++ /dev/null 1 Jan 1970 00:00:00 -0000 > @@ -1,195 +0,0 @@ > -/* $OpenBSD: ualea.c,v 1.2 2015/04/17 07:17:51 mpi Exp $ */ > -/* > - * Copyright (c) 2006 Alexander Yurchenko <gra...@openbsd.org> > - * Copyright (c) 2007 Marc Balmer <mbal...@openbsd.org> > - * Copyright (C) 2015 Sean Levy <att...@stalphonsos.com> > - * > - * Permission to use, copy, modify, and distribute this software for any > - * purpose with or without fee is hereby granted, provided that the above > - * copyright notice and this permission notice appear in all copies. > - * > - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > - */ > - > -/* > - * Alea II TRNG. Produces 100kbit/sec of entropy by black magic > - * > - * Product information in English can be found here: > - * http://www.araneus.fi/products/alea2/en/ > - */ > - > -#include <sys/param.h> > -#include <sys/systm.h> > -#include <sys/device.h> > -#include <sys/timeout.h> > - > -#include <dev/usb/usb.h> > -#include <dev/usb/usbdi.h> > -#include <dev/usb/usbdevs.h> > - > -#include <dev/rndvar.h> > - > -#define ALEA_IFACE 0 > -#define ALEA_ENDPOINT 1 > -#define ALEA_MSECS 100 > -#define ALEA_READ_TIMEOUT 5000 > -#define ALEA_BUFSIZ 128 > - > -#define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname) > - > -struct ualea_softc { > - struct device sc_dev; > - struct usbd_device *sc_udev; > - struct usbd_pipe *sc_pipe; > - struct timeout sc_timeout; > - struct usb_task sc_task; > - struct usbd_xfer *sc_xfer; > - int *sc_buf; > -}; > - > -int ualea_match(struct device *, void *, void *); > -void ualea_attach(struct device *, struct device *, void *); > -int ualea_detach(struct device *, int); > -void ualea_task(void *); > -void ualea_timeout(void *); > - > -struct cfdriver ualea_cd = { > - NULL, "ualea", DV_DULL > -}; > - > -const struct cfattach ualea_ca = { > - sizeof(struct ualea_softc), ualea_match, ualea_attach, ualea_detach > -}; > - > -int > -ualea_match(struct device *parent, void *match, void *aux) > -{ > - struct usb_attach_arg *uaa = aux; > - > - if (uaa->iface == NULL) > - return (UMATCH_NONE); > - if ((uaa->vendor == USB_VENDOR_ARANEUS) && > - (uaa->product == USB_PRODUCT_ARANEUS_ALEA) && > - (uaa->ifaceno == ALEA_IFACE)) > - return (UMATCH_VENDOR_PRODUCT); > - return (UMATCH_NONE); > -} > - > -void > -ualea_attach(struct device *parent, struct device *self, void *aux) > -{ > - struct ualea_softc *sc = (struct ualea_softc *)self; > - struct usb_attach_arg *uaa = aux; > - usb_interface_descriptor_t *id; > - usb_endpoint_descriptor_t *ed; > - int ep_ibulk = -1; > - usbd_status error; > - int i; > - > - sc->sc_udev = uaa->device; > - id = usbd_get_interface_descriptor(uaa->iface); > - for (i = 0; i < id->bNumEndpoints; i++) { > - ed = usbd_interface2endpoint_descriptor(uaa->iface, i); > - if (ed == NULL) { > - printf("%s: failed to get endpoint %d descriptor\n", > - DEVNAME(sc), i); > - return; > - } > - if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && > - UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK && > - UE_GET_ADDR(ed->bEndpointAddress) == ALEA_ENDPOINT) { > - ep_ibulk = ed->bEndpointAddress; > - break; > - } > - } > - if (ep_ibulk == -1) { > - printf("%s: missing endpoint\n", DEVNAME(sc)); > - return; > - } > - error = usbd_open_pipe(uaa->iface, ep_ibulk, USBD_EXCLUSIVE_USE, > - &sc->sc_pipe); > - if (error) { > - printf("%s: failed to open bulk-in pipe: %s\n", > - DEVNAME(sc), usbd_errstr(error)); > - return; > - } > - sc->sc_xfer = usbd_alloc_xfer(sc->sc_udev); > - if (sc->sc_xfer == NULL) { > - printf("%s: could not alloc xfer\n", DEVNAME(sc)); > - return; > - } > - sc->sc_buf = usbd_alloc_buffer(sc->sc_xfer, ALEA_BUFSIZ); > - if (sc->sc_buf == NULL) { > - printf("%s: could not alloc %d-byte buffer\n", DEVNAME(sc), > - ALEA_BUFSIZ); > - return; > - } > - usb_init_task(&sc->sc_task, ualea_task, sc, USB_TASK_TYPE_GENERIC); > - timeout_set(&sc->sc_timeout, ualea_timeout, sc); > - usb_add_task(sc->sc_udev, &sc->sc_task); > -} > - > -int > -ualea_detach(struct device *self, int flags) > -{ > - struct ualea_softc *sc = (struct ualea_softc *)self; > - > - usb_rem_task(sc->sc_udev, &sc->sc_task); > - if (timeout_initialized(&sc->sc_timeout)) > - timeout_del(&sc->sc_timeout); > - if (sc->sc_xfer) > - usbd_free_xfer(sc->sc_xfer); > - if (sc->sc_pipe != NULL) > - usbd_close_pipe(sc->sc_pipe); > - > - return (0); > -} > - > -void > -ualea_task(void *arg) > -{ > - struct ualea_softc *sc = (struct ualea_softc *)arg; > - usbd_status error; > - u_int32_t len, i; > - > - usbd_setup_xfer(sc->sc_xfer, sc->sc_pipe, NULL, sc->sc_buf, > - ALEA_BUFSIZ, USBD_SHORT_XFER_OK | USBD_SYNCHRONOUS, > - ALEA_READ_TIMEOUT, NULL); > - error = usbd_transfer(sc->sc_xfer); > - if (error) { > - printf("%s: xfer failed: %s\n", DEVNAME(sc), > - usbd_errstr(error)); > - goto bail; > - } > - usbd_get_xfer_status(sc->sc_xfer, NULL, NULL, &len, NULL); > - if (len < sizeof(int)) { > - printf("%s: xfer too short (%u bytes) - dropping\n", > - DEVNAME(sc), len); > - goto bail; > - } > - len /= sizeof(int); > - /* > - * A random(|ness) koan: > - * children chug entropy like thirsty rhinos > - * surfing at the mall > - * privacy died in their hands > - */ > - for (i = 0; i < len; i++) > - add_true_randomness(sc->sc_buf[i]); > -bail: > - timeout_add_msec(&sc->sc_timeout, ALEA_MSECS); > -} > - > -void > -ualea_timeout(void *arg) > -{ > - struct ualea_softc *sc = arg; > - > - usb_add_task(sc->sc_udev, &sc->sc_task); > -} > Index: sys/dev/usb/urng.c > =================================================================== > RCS file: sys/dev/usb/urng.c > diff -N sys/dev/usb/urng.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ sys/dev/usb/urng.c 26 Aug 2017 20:19:10 -0000 > @@ -0,0 +1,240 @@ > +/* $OpenBSD$ */ > + > +/* > + * Copyright (c) 2006 Alexander Yurchenko <gra...@openbsd.org> > + * Copyright (c) 2007 Marc Balmer <mbal...@openbsd.org> > + * Copyright (C) 2015 Sean Levy <att...@stalphonsos.com> > + * Copyright (c) 2017 Aaron Bieber <abie...@openbsd.org> > + * Copyright (c) 2017 Jasper Lievisse Adriaanse <jas...@openbsd.org> > + * > + * Permission to use, copy, modify, and distribute this software for any > + * purpose with or without fee is hereby granted, provided that the above > + * copyright notice and this permission notice appear in all copies. > + * > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > + */ > + > +/* > + * Universal TRNG driver for a collection of TRNG devices: > + * - ChaosKey TRNG > + * http://altusmetrum.org/ChaosKey/ > + * - Alea II TRNG. Produces 100kbit/sec of entropy by black magic > + * http://www.araneus.fi/products/alea2/en/ > + */ > + > +#include <sys/param.h> > +#include <sys/systm.h> > +#include <sys/device.h> > +#include <sys/timeout.h> > + > +#include <dev/usb/usb.h> > +#include <dev/usb/usbdi.h> > +#include <dev/usb/usbdevs.h> > + > +#include <dev/rndvar.h> > + > +#define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname) > + > +#define URNG_DEBUG 1 > +#ifdef URNG_DEBUG > +#define DPRINTF(x) printf x > +#else > +#define DPRINTF(x) > +#endif > + > +struct urng_chip { > + int bufsiz; > + int endpoint; > + int iface; > + int msecs; > + int read_timeout; > +}; > + > +struct urng_softc { > + struct device sc_dev; > + struct usbd_device *sc_udev; > + struct usbd_pipe *sc_pipe; > + struct timeout sc_timeout; > + struct usb_task sc_task; > + struct usbd_xfer *sc_xfer; > + struct urng_chip sc_chip; > + int *sc_buf; > +}; > + > +int urng_match(struct device *, void *, void *); > +void urng_attach(struct device *, struct device *, void *); > +int urng_detach(struct device *, int); > +void urng_task(void *); > +void urng_timeout(void *); > + > +struct cfdriver urng_cd = { > + NULL, "urng", DV_DULL > +}; > + > +const struct cfattach urng_ca = { > + sizeof(struct urng_softc), urng_match, urng_attach, urng_detach > +}; > + > +struct urng_type { > + struct usb_devno urng_dev; > + struct urng_chip urng_chip; > +}; > + > +static const struct urng_type urng_devs[] = { > + { { USB_VENDOR_OPENMOKO2, USB_PRODUCT_OPENMOKO2_CHAOSKEY }, {64, 6, 0, > 100, 5000} }, > + { { USB_VENDOR_ARANEUS, USB_PRODUCT_ARANEUS_ALEA }, {128, 1, 0, 100, > 5000} }, > +}; > +#define urng_lookup(v, p) ((struct urng_type *)usb_lookup(urng_devs, v, p)) > + > +int > +urng_match(struct device *parent, void *match, void *aux) > +{ > + struct usb_attach_arg *uaa = aux; > + > + if (uaa->iface == NULL) > + return (UMATCH_NONE); > + > + if (urng_lookup(uaa->vendor, uaa->product) != NULL) > + return (UMATCH_VENDOR_PRODUCT); > + > + return (UMATCH_NONE); > +} > + > +void > +urng_attach(struct device *parent, struct device *self, void *aux) > +{ > + struct urng_softc *sc = (struct urng_softc *)self; > + struct usb_attach_arg *uaa = aux; > + usb_interface_descriptor_t *id; > + usb_endpoint_descriptor_t *ed; > + int ep_ibulk = -1; > + usbd_status error; > + int i; > + > + sc->sc_udev = uaa->device; > + sc->sc_chip.bufsiz = urng_lookup(uaa->vendor, > uaa->product)->urng_chip.bufsiz; > + sc->sc_chip.endpoint = urng_lookup(uaa->vendor, > uaa->product)->urng_chip.endpoint; > + sc->sc_chip.iface = urng_lookup(uaa->vendor, > uaa->product)->urng_chip.iface; > + sc->sc_chip.msecs = urng_lookup(uaa->vendor, > uaa->product)->urng_chip.msecs; > + sc->sc_chip.read_timeout = urng_lookup(uaa->vendor, > uaa->product)->urng_chip.read_timeout; > + > + DPRINTF(("%s: bufsiz: %d, endpoint: %d iface: %d, msecs: %d, > read_timeout: %d\n", > + DEVNAME(sc), > + sc->sc_chip.bufsiz, > + sc->sc_chip.endpoint, > + sc->sc_chip.iface, > + sc->sc_chip.msecs, > + sc->sc_chip.read_timeout)); > + > + id = usbd_get_interface_descriptor(uaa->iface); > + for (i = 0; i < id->bNumEndpoints; i++) { > + ed = usbd_interface2endpoint_descriptor(uaa->iface, i); > + if (ed == NULL) { > + printf("%s: failed to get endpoint %d descriptor\n", > + DEVNAME(sc), i); > + return; > + } > + if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && > + UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK && > + UE_GET_ADDR(ed->bEndpointAddress) == sc->sc_chip.endpoint) { > + ep_ibulk = ed->bEndpointAddress; > + break; > + } > + } > + > + if (ep_ibulk == -1) { > + printf("%s: missing endpoint\n", DEVNAME(sc)); > + return; > + } > + > + error = usbd_open_pipe(uaa->iface, ep_ibulk, USBD_EXCLUSIVE_USE, > + &sc->sc_pipe); > + if (error) { > + printf("%s: failed to open bulk-in pipe: %s\n", > + DEVNAME(sc), usbd_errstr(error)); > + return; > + } > + > + sc->sc_xfer = usbd_alloc_xfer(sc->sc_udev); > + if (sc->sc_xfer == NULL) { > + printf("%s: could not alloc xfer\n", DEVNAME(sc)); > + return; > + } > + > + sc->sc_buf = usbd_alloc_buffer(sc->sc_xfer, sc->sc_chip.bufsiz); > + if (sc->sc_buf == NULL) { > + printf("%s: could not alloc %d-byte buffer\n", DEVNAME(sc), > + sc->sc_chip.bufsiz); > + return; > + } > + > + usb_init_task(&sc->sc_task, urng_task, sc, USB_TASK_TYPE_GENERIC); > + timeout_set(&sc->sc_timeout, urng_timeout, sc); > + usb_add_task(sc->sc_udev, &sc->sc_task); > + > + return; > +} > + > +int > +urng_detach(struct device *self, int flags) > +{ > + struct urng_softc *sc = (struct urng_softc *)self; > + > + usb_rem_task(sc->sc_udev, &sc->sc_task); > + if (timeout_initialized(&sc->sc_timeout)) > + timeout_del(&sc->sc_timeout); > + if (sc->sc_xfer) > + usbd_free_xfer(sc->sc_xfer); > + if (sc->sc_pipe != NULL) > + usbd_close_pipe(sc->sc_pipe); > + > + return (0); > +} > + > + > +void > +urng_task(void *arg) > +{ > + struct urng_softc *sc = (struct urng_softc *)arg; > + usbd_status error; > + u_int32_t len, i; > + > + usbd_setup_xfer(sc->sc_xfer, sc->sc_pipe, NULL, sc->sc_buf, > + sc->sc_chip.bufsiz, USBD_SHORT_XFER_OK | USBD_SYNCHRONOUS, > + sc->sc_chip.read_timeout, NULL); > + > + error = usbd_transfer(sc->sc_xfer); > + if (error) { > + printf("%s: xfer failed: %s\n", DEVNAME(sc), > + usbd_errstr(error)); > + goto bail; > + } > + > + usbd_get_xfer_status(sc->sc_xfer, NULL, NULL, &len, NULL); > + if (len < sizeof(int)) { > + printf("%s: xfer too short (%u bytes) - dropping\n", > + DEVNAME(sc), len); > + goto bail; > + } > + > + len /= sizeof(int); > + for (i = 0; i < len; i++) { > + add_true_randomness(sc->sc_buf[i]); > + } > +bail: > + timeout_add_msec(&sc->sc_timeout, sc->sc_chip.msecs); > +} > + > +void > +urng_timeout(void *arg) > +{ > + struct urng_softc *sc = arg; > + > + usb_add_task(sc->sc_udev, &sc->sc_task); > +} > > -- > jasper > -- PGP: 0x1F81112D62A9ADCE / 3586 3350 BFEA C101 DB1A 4AF0 1F81 112D 62A9 ADCE