diff --git a/examples/rsa-keygen.c b/examples/rsa-keygen.c
index 6353c6fca66d427d4b109eb40aec28633574cb17..39b0f42178ca74e59f3f764c201a71106988c5ac 100644
--- a/examples/rsa-keygen.c
+++ b/examples/rsa-keygen.c
@@ -35,7 +35,7 @@
 #include <stdio.h>
 #include <string.h>
 
-#if !HAVE_LIBGMP
+#if !WITH_PUBLIC_KEY
 int
 main(int argc, char **argv)
 {
@@ -44,7 +44,7 @@ main(int argc, char **argv)
 	  "and recompile Nettle\n");
   return EXIT_FAILURE;
 }
-#endif /* !HAVE_LIBGMP */
+#else /* WITH_PUBLIC_KEY */
 
 #include <unistd.h>
 #include <fcntl.h>
@@ -56,11 +56,11 @@ main(int argc, char **argv)
 #include "sexp.h"
 #include "yarrow.h"
 
+#include "io.h"
+
 #define KEYSIZE 500
 #define ESIZE 30
 
-#define RANDOM_DEVICE "/dev/urandom"
-
 static void
 progress(void *ctx, int c)
 {
@@ -68,32 +68,6 @@ progress(void *ctx, int c)
   fputc(c, stderr);
 }
 
-static int
-write_file(const char *name, struct nettle_buffer *buffer)
-{
-  const uint8_t *data = buffer->contents;
-  unsigned length = buffer->size;
-  int fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0600);
-  
-  if (fd < 0)
-    return 0;
-
-  while (length)
-    {
-      int res = write(fd, data, length);
-      if (res < 0)
-	{
-	  if (errno == EINTR)
-	    continue;
-	  else
-	    return 0;
-	}
-      data += res;
-      length -= res;
-    }
-
-  return 1;
-}
 
 int
 main(int argc, char **argv)
@@ -101,23 +75,26 @@ main(int argc, char **argv)
   struct yarrow256_ctx yarrow;
   struct rsa_public_key pub;
   struct rsa_private_key priv;
-  char buf[16];
-  int fd;
 
   int c;
   char *pub_name = NULL;
-  char *priv_name = NULL;
-  struct stat sbuf;
+  const char *priv_name = NULL;
+  const char *random_name = NULL;
   
   struct nettle_buffer pub_buffer;
   struct nettle_buffer priv_buffer;
 
-  while ( (c = getopt(argc, argv, "o:")) != -1)
+  while ( (c = getopt(argc, argv, "o:r:")) != -1)
     switch (c)
       {
       case 'o':
 	priv_name = optarg;
 	break;
+
+      case 'r':
+	random_name = optarg;
+	break;
+	
       case '?':
 	if (isprint (optopt))
 	  fprintf(stderr, "Unknown option `-%c'.\n", optopt);
@@ -135,12 +112,6 @@ main(int argc, char **argv)
       return EXIT_FAILURE;
     }
 
-  if (stat(priv_name, &sbuf) == 0)
-    {
-      fprintf(stderr, "The output file `%s' already exists.\n", priv_name);
-      return EXIT_FAILURE;
-    }
-
   asprintf(&pub_name, "%s.pub", priv_name);
   if (!pub_name)
     {
@@ -148,25 +119,12 @@ main(int argc, char **argv)
       return EXIT_FAILURE;
     }
   
-  if (stat(pub_name, &sbuf) == 0)
-    {
-      fprintf(stderr, "The output file `%s' already exists.\n", pub_name);
-      return EXIT_FAILURE;
-    }
-    
-  /* Read some data to seed the generator */
-  if ( ( (fd = open(RANDOM_DEVICE, O_RDONLY)) < 0)
-       || (sizeof(buf) != read(fd, buf, sizeof(buf))))
-    {
-      fprintf(stderr, "Failed to open `%s': %s\n",
-	      RANDOM_DEVICE, strerror(errno));
-      return EXIT_FAILURE;
-    }
-  
   /* NOTE: No sources */
   yarrow256_init(&yarrow, 0, NULL);
-  yarrow256_seed(&yarrow, sizeof(buf), buf);
-  
+
+  /* Read some data to seed the generator */
+  simple_random(&yarrow, random_name);
+
   rsa_init_public_key(&pub);
   rsa_init_private_key(&priv);
 
@@ -195,14 +153,14 @@ main(int argc, char **argv)
       return EXIT_FAILURE;
     }
   
-  if (!write_file(pub_name, &pub_buffer))
+  if (!write_file(pub_name, pub_buffer.size, pub_buffer.contents))
     {
       fprintf(stderr, "Failed to write public key: %s\n",
 	      strerror(errno));
       return EXIT_FAILURE;
     }
 
-  if (!write_file(priv_name, &priv_buffer))
+  if (!write_file(priv_name, priv_buffer.size, priv_buffer.contents))
     {
       fprintf(stderr, "Failed to write private key: %s\n",
 	      strerror(errno));
@@ -211,3 +169,4 @@ main(int argc, char **argv)
 
   return EXIT_SUCCESS;
 }
+#endif /* WITH_PUBLIC_KEY */