New primitive (get-entropy bv) randomly fills a 32-byte vector.
authorTaylor R Campbell <campbell@mumble.net>
Wed, 7 Nov 2018 07:52:46 +0000 (07:52 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 7 Nov 2018 07:52:46 +0000 (07:52 +0000)
src/microcode/makegen/files-core.scm
src/microcode/makegen/files-unix.scm
src/microcode/osentropy.h [new file with mode: 0644]
src/microcode/prentropy.c [new file with mode: 0644]
src/microcode/uxentropy.c [new file with mode: 0644]

index d359de20d04f7dc960d35ff532e9363e1d88ae1c..834890cef89d3ac507c550eb1008359942942628 100644 (file)
@@ -69,6 +69,7 @@ USA.
 "ostty"
 "outf"
 "prchacha"
+"prentropy"
 "prim"
 "primutl"
 "prkeccak"
index 913f62d35dd436c7afa698729d449e8f4ae5c49b..d5a6e69a53c86fdec6bd2b7114afb142e5817908 100644 (file)
@@ -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 (file)
index 0000000..3112bdc
--- /dev/null
@@ -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 <stddef.h>
+
+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 (file)
index 0000000..110f2ac
--- /dev/null
@@ -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 (file)
index 0000000..057d927
--- /dev/null
@@ -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 <unistd.h>
+
+#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 ();
+}