From 76a216bae12dfa1efc0e56a9486eb34ca75741b6 Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Wed, 7 Nov 2018 07:52:46 +0000 Subject: [PATCH] New primitive (get-entropy bv) randomly fills a 32-byte vector. (cherry picked from commit 478d7736541b1e0dcc686d94f923d33041ba6b78) --- src/microcode/makegen/files-core.scm | 1 + src/microcode/makegen/files-unix.scm | 1 + src/microcode/osentropy.h | 34 +++++++++++++++++ src/microcode/prentropy.c | 40 ++++++++++++++++++++ src/microcode/uxentropy.c | 55 ++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+) create mode 100644 src/microcode/osentropy.h create mode 100644 src/microcode/prentropy.c create mode 100644 src/microcode/uxentropy.c diff --git a/src/microcode/makegen/files-core.scm b/src/microcode/makegen/files-core.scm index 192d87591..5afb1835b 100644 --- a/src/microcode/makegen/files-core.scm +++ b/src/microcode/makegen/files-core.scm @@ -69,6 +69,7 @@ USA. "ostty" "outf" "prchacha" +"prentropy" "prim" "primutl" "prkeccak" diff --git a/src/microcode/makegen/files-unix.scm b/src/microcode/makegen/files-unix.scm index 4212a051d..d4c63c5fa 100644 --- a/src/microcode/makegen/files-unix.scm +++ b/src/microcode/makegen/files-unix.scm @@ -32,6 +32,7 @@ USA. "pruxio" "ux" "uxctty" +"uxentropy" "uxenv" "uxfile" "uxfs" diff --git a/src/microcode/osentropy.h b/src/microcode/osentropy.h new file mode 100644 index 000000000..3112bdcea --- /dev/null +++ b/src/microcode/osentropy.h @@ -0,0 +1,34 @@ +/* -*-C-*- + +Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, + 2017, 2018 Massachusetts Institute of Technology + +This file is part of MIT/GNU Scheme. + +MIT/GNU Scheme is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +MIT/GNU Scheme is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with MIT/GNU Scheme; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, +USA. + +*/ + +#ifndef MITSCHEME_OSENTROPY_H +#define MITSCHEME_OSENTROPY_H + +#include + +void OS_get_entropy (uint8_t [32]); + +#endif /* MITSCHEME_OSENTROPY_H */ diff --git a/src/microcode/prentropy.c b/src/microcode/prentropy.c new file mode 100644 index 000000000..110f2acb6 --- /dev/null +++ b/src/microcode/prentropy.c @@ -0,0 +1,40 @@ +/* -*-C-*- + +Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, + 2017, 2018 Massachusetts Institute of Technology + +This file is part of MIT/GNU Scheme. + +MIT/GNU Scheme is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +MIT/GNU Scheme is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with MIT/GNU Scheme; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, +USA. + +*/ + +#include "prims.h" + +DEFINE_PRIMITIVE ("GET-ENTROPY", Prim_get_entropy, 1, 1, + "(BYTEVECTOR)\n\ +Randomize the 32-byte vector BYTEVECTOR from the system entropy pool.") +{ + PRIMITIVE_HEADER (1); + unsigned long nbytes; + uint8_t * buf = (arg_bytevector (1, (&nbytes))); + if (nbytes != 32) + error_bad_range_arg (1); + OS_get_entropy (buf); + PRIMITIVE_RETURN (UNSPECIFIC); +} diff --git a/src/microcode/uxentropy.c b/src/microcode/uxentropy.c new file mode 100644 index 000000000..057d92743 --- /dev/null +++ b/src/microcode/uxentropy.c @@ -0,0 +1,55 @@ +/* -*-C-*- + +Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, + 2017, 2018 Massachusetts Institute of Technology + +This file is part of MIT/GNU Scheme. + +MIT/GNU Scheme is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +MIT/GNU Scheme is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with MIT/GNU Scheme; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, +USA. + +*/ + +#include "prims.h" +#include "ux.h" + +#include + +#define PATH_URANDOM "/dev/urandom" + +void +OS_get_entropy (uint8_t buf [32]) +{ + size_t nbytes = 32; + int fd; + STD_FD_SYSTEM_CALL (syscall_open, fd, (UX_open (PATH_URANDOM, O_RDONLY))); + ssize_t nread; + while ((nread = (UX_read (fd, buf, nbytes))) != 0) + { + if (nread == -1) + { + UX_prim_check_errno (syscall_read); + continue; + } + if (((size_t) nread) >= nbytes) + return; + nbytes -= ((size_t) nread); + buf += ((size_t) nread); + } + /* Premature EOF makes no sense on /dev/urandom. */ + error_external_return (); +} -- 2.25.1