diff --git a/examples/io.c b/examples/io.c
new file mode 100644
index 0000000000000000000000000000000000000000..8ce412c072aae1e3df3b5eb1ba009e8fc13a28f7
--- /dev/null
+++ b/examples/io.c
@@ -0,0 +1,180 @@
+/* io.c
+ *
+ * Miscellaneous functions used by the example programs.
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2002 Niels Möller
+ *  
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ * 
+ * The nettle library 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 Lesser General Public
+ * License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "io.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+
+#define RANDOM_DEVICE "/dev/urandom"
+#define BUFSIZE 1000
+
+int quiet_flag = 0;
+
+void
+werror(const char *format, ...)
+{
+  if (!quiet_flag)
+    {
+      va_list args;
+      va_start(args, format);
+      vfprintf(stderr, format, args);
+      va_end(args);
+    }
+}
+
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+unsigned
+read_file(const char *name, unsigned max_size, char **buffer)
+{
+  unsigned size;
+  unsigned done;
+  FILE *f;
+    
+  f = fopen(name, "rb");
+  if (!f)
+    return 0;
+
+  *buffer = NULL;
+
+  if (max_size && max_size < 100)
+    size = max_size;
+  else
+    size = 100;
+  
+  for (size = 100, done = 0;
+       (!max_size || done < max_size) && !feof(f);
+       size *= 2)
+    {
+      char *p;
+
+      if (size > max_size)
+	size = max_size;
+
+      /* Space for terminating NUL */
+      p = realloc(*buffer, size + 1);
+
+      if (!p)
+	{
+	fail:
+	  fclose(f);
+	  free(*buffer);
+	  *buffer = NULL;
+	  return 0;
+	}
+
+      *buffer = p;
+      done += fread(buffer + done, 1, size - done, f);
+
+      if (ferror(f))
+	goto fail;
+    }
+  
+  fclose(f);
+
+  /* NUL-terminate the data. */
+  (*buffer)[done] = '\0';
+  return done;
+}
+
+int
+write_file(const char *name, unsigned size, const char *buffer)
+{
+  FILE *f = fopen(name, "wb");
+  unsigned res;
+  
+  if (!f)
+    return 0;
+
+  res = fwrite(buffer, 1, size, f);
+  
+  if (res < size || ferror(f))
+    res = 0;
+
+  fclose(f);
+
+  return res > 0;
+}
+
+int
+simple_random(struct yarrow256_ctx *ctx, const char *name)
+{
+  unsigned length;
+  char *buffer;
+
+  if (name)
+    length = read_file(name, 0, &buffer);
+  else
+    length = read_file(RANDOM_DEVICE, 20, &buffer);
+  
+  if (!length)
+    return 0;
+
+  yarrow256_seed(ctx, length, buffer);
+
+  return 1;
+}
+
+int
+hash_file(const struct nettle_hash *hash, void *ctx, FILE *f)
+{
+  for (;;)
+    {
+      char buffer[BUFSIZE];
+      size_t res = fread(buffer, 1, sizeof(buffer), f);
+      if (ferror(f))
+	return 0;
+      
+      hash->update(ctx, res, buffer);
+      if (feof(f))
+	return 1;
+    }
+}
+
+#if WITH_PUBLIC_KEY
+int
+read_rsa_key(const char *name,
+	     struct rsa_public_key *pub,
+	     struct rsa_private_key *priv)
+{
+  unsigned length;
+  char *buffer;
+  int res;
+  
+  length = read_file(name, 0, &buffer);
+  if (!length)
+    return 0;
+
+  res = rsa_keypair_from_sexp(pub, priv, length, buffer);
+  free(buffer);
+
+  return res;
+}
+#endif /* WITH_PUBLIC_KEY */
diff --git a/examples/io.h b/examples/io.h
new file mode 100644
index 0000000000000000000000000000000000000000..cecd8919dc2b657bcf70b9f186e9d259c67135d7
--- /dev/null
+++ b/examples/io.h
@@ -0,0 +1,65 @@
+/* io.c
+ *
+ * Miscellaneous functions used by the example programs.
+ */
+
+/* nettle, low-level cryptographics library
+ *
+ * Copyright (C) 2002 Niels Möller
+ *  
+ * The nettle library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ * 
+ * The nettle library 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 Lesser General Public
+ * License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the nettle library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#ifndef NETTLE_EXAMPLES_IO_H_INCLUDED
+#define NETTLE_EXAMPLES_IO_H_INCLUDED
+
+#include "nettle-meta.h"
+#include "rsa.h"
+#include "yarrow.h"
+
+#include <stdio.h>
+
+extern int quiet_flag;
+
+void
+werror(const char *format, ...)
+#if __GNUC___
+     __attribute__((__format__ (__printf__,1, 2)))
+#endif
+     ;
+
+/* If size is > 0, read at most that many bytes. If size == 0,
+ * read until EOF. Allocates the buffer dynamically. */
+unsigned
+read_file(const char *name, unsigned size, char **buffer);
+
+int
+write_file(const char *name, unsigned size, const char *buffer);
+
+int
+simple_random(struct yarrow256_ctx *ctx, const char *name);
+
+int
+hash_file(const struct nettle_hash *hash, void *ctx, FILE *f);
+
+#if WITH_PUBLIC_KEY
+int
+read_rsa_key(const char *name,
+	     struct rsa_public_key *pub,
+	     struct rsa_private_key *priv);
+#endif
+
+#endif /* NETTLE_EXAMPLES_IO_H_INCLUDED */