diff --git a/examples/rsa-sign.c b/examples/rsa-sign.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b53e6eb2875bda6bb87153bb267dbaedfa84a4c
--- /dev/null
+++ b/examples/rsa-sign.c
@@ -0,0 +1,144 @@
+/* rsa-sign.c
+ *
+ */
+
+/* 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 */
+
+#if !HAVE_LIBGMP
+int
+main(int argc, char **argv)
+{
+  fprintf(stderr,
+	  "You need to install GMP somewhere where Nettle can find it,\n"
+	  "and recompile Nettle\n");
+  return EXIT_FAILURE;
+}
+#endif /* !HAVE_LIBGMP */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "rsa.h"
+
+#define BUFSIZE 1000
+
+static int
+read_key(const char *name,
+	 struct rsa_private_key *key)
+{
+  uint8_t buffer[BUFSIZE];
+  unsigned done;
+
+  int fd = open(name, O_RDONLY);
+  if (fd < 0)
+    {
+      fprintf(stderr, "Failed to open `%s': %s\n",
+	      name, strerror(errno));
+      return 0;
+    }
+
+  for (done = 0; done < sizeof(buffer) ;)
+    {
+      int res = read(fd, buffer, sizeof(buffer) - done);
+      if (!res)
+	break;
+      else if (res < 0 && errno == EINTR)
+	continue;
+      else if (res < 0)
+	{
+	  fprintf(stderr, "Failed reading `%s': %s\n",
+		  name, strerror(errno));
+	  return 0;
+	}
+      else
+	done += res;
+    }
+  return rsa_keypair_from_sexp(NULL, key,
+			       done, buffer);
+}
+
+int
+main(int argc, char **argv)
+{
+  struct rsa_private_key key;
+  struct sha1_ctx hash;
+  mpz_t s;
+  
+  if (argc != 2)
+    {
+      fprintf(stderr, "Usage: rsa-sign PRIVATE-KEY < file\n");
+      return EXIT_FAILURE;
+    }
+
+  rsa_init_private_key(&key);
+  
+  if (!read_key(argv[1], &key))
+    {
+      fprintf(stderr, "Invalid key\n");
+      return EXIT_FAILURE;
+    }
+
+  sha1_init(&hash);
+  for (;;)
+    {
+      uint8_t buffer[BUFSIZE];
+      int res = read(STDIN_FILENO, buffer, sizeof(buffer));
+      if (!res)
+	/* EOF */
+	break;
+      else if (res < 0 && errno == EINTR)
+	continue;
+      else if (res < 0)
+	{
+	  fprintf(stderr, "Failed reading stdin: %s\n",
+		  strerror(errno));
+	  return 0;
+	}
+      else
+	sha1_update(&hash, res, buffer);
+    }
+
+  mpz_init(s);
+  rsa_sha1_sign(&key, &hash, s);
+
+  if (!mpz_out_str(stdout, 16, s))
+    {
+      fprintf(stderr, "Failed writing signature: %s\n",
+	      strerror(errno));
+      return 0;
+    }
+
+  putchar('\n');
+  
+  mpz_clear(s);
+  rsa_clear_private_key(&key);
+
+  return EXIT_SUCCESS;
+}