diff --git a/ChangeLog b/ChangeLog
index 9478e0c14ef9bdfcb519a39e85f90c1a89dc83de..a1f17ccb6b84d9d969013d1d100578d9af48afd4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-25  Niels Möller  <nisse@lysator.liu.se>
+
+	* examples/hogweed-benchmark.c: Add benchmarking of OpenSSL's RSA
+	functions.
+
 2013-04-24  Niels Möller  <nisse@lysator.liu.se>
 
 	* nettle.texinfo (Miscellaneous functions): Updated memxor
diff --git a/examples/hogweed-benchmark.c b/examples/hogweed-benchmark.c
index 56860e0e13263dca9fab88e6c1cb5d82e63ee60a..b4d0821f494021c9d7826ee5e3d1ba545469f9fb 100644
--- a/examples/hogweed-benchmark.c
+++ b/examples/hogweed-benchmark.c
@@ -48,9 +48,11 @@
 #include "../gmp-glue.h"
 
 #if WITH_OPENSSL
+#include <openssl/rsa.h>
 #include <openssl/ec.h>
 #include <openssl/ecdsa.h>
 #include <openssl/objects.h>
+#include <openssl/err.h>
 #endif
 
 #define BENCH_INTERVAL 0.1
@@ -492,7 +494,64 @@ bench_ecdsa_clear (void *p)
 }
 
 #if WITH_OPENSSL
-struct openssl_ctx
+struct openssl_rsa_ctx
+{
+  RSA *key;
+  unsigned char *ref;
+  unsigned char *signature;
+  unsigned int siglen;
+  uint8_t *digest;
+};
+
+static void *
+bench_openssl_rsa_init (unsigned size)
+{
+  struct openssl_rsa_ctx *ctx = xalloc (sizeof (*ctx));
+
+  ctx->key = RSA_generate_key (size, 65537, NULL, NULL);
+  ctx->ref = xalloc (RSA_size (ctx->key));
+  ctx->signature = xalloc (RSA_size (ctx->key));
+  ctx->digest = hash_string (&nettle_sha1, 3, "foo");
+
+  if (! RSA_sign (NID_sha1, ctx->digest, SHA1_DIGEST_SIZE,
+		  ctx->ref, &ctx->siglen, ctx->key))
+    die ("OpenSSL RSA_sign failed: error = %ld.\n", ERR_get_error());
+
+  return ctx;
+}
+
+static void
+bench_openssl_rsa_sign (void *p)
+{
+  const struct openssl_rsa_ctx *ctx = (const struct openssl_rsa_ctx *) p;
+  unsigned siglen;
+
+  if (! RSA_sign (NID_sha1, ctx->digest, SHA1_DIGEST_SIZE,
+		  ctx->signature, &siglen, ctx->key))
+    die ("OpenSSL RSA_sign failed: error = %ld.\n", ERR_get_error());
+}
+
+static void
+bench_openssl_rsa_verify (void *p)
+{
+  const struct openssl_rsa_ctx *ctx = (const struct openssl_rsa_ctx *) p;
+  if (! RSA_verify (NID_sha1, ctx->digest, SHA1_DIGEST_SIZE,
+		    ctx->ref, ctx->siglen, ctx->key))
+    die ("OpenSSL RSA_verify failed: error = %ld.\n", ERR_get_error());    
+}
+
+static void
+bench_openssl_rsa_clear (void *p)
+{
+  struct openssl_rsa_ctx *ctx = (struct openssl_rsa_ctx *) p;
+  RSA_free (ctx->key);
+  free (ctx->ref);
+  free (ctx->signature);
+  free (ctx->digest);
+  free (ctx);
+}
+
+struct openssl_ecdsa_ctx
 {
   EC_KEY *key;
   ECDSA_SIG *signature;
@@ -501,9 +560,9 @@ struct openssl_ctx
 };
 
 static void *
-bench_openssl_init (unsigned size)
+bench_openssl_ecdsa_init (unsigned size)
 {
-  struct openssl_ctx *ctx = xalloc (sizeof (*ctx));
+  struct openssl_ecdsa_ctx *ctx = xalloc (sizeof (*ctx));
 
   /* Apparently, secp192r1 and secp256r1 are missing */
   switch (size)
@@ -551,26 +610,26 @@ bench_openssl_init (unsigned size)
 }
 
 static void
-bench_openssl_sign (void *p)
+bench_openssl_ecdsa_sign (void *p)
 {
-  const struct openssl_ctx *ctx = (const struct openssl_ctx *) p;
+  const struct openssl_ecdsa_ctx *ctx = (const struct openssl_ecdsa_ctx *) p;
   ECDSA_SIG *sig = ECDSA_do_sign (ctx->digest, ctx->digest_length, ctx->key);
   ECDSA_SIG_free (sig);
 }
 
 static void
-bench_openssl_verify (void *p)
+bench_openssl_ecdsa_verify (void *p)
 {
-  const struct openssl_ctx *ctx = (const struct openssl_ctx *) p;
+  const struct openssl_ecdsa_ctx *ctx = (const struct openssl_ecdsa_ctx *) p;
   int res = ECDSA_do_verify (ctx->digest, ctx->digest_length,
 			     ctx->signature, ctx->key);
   if (res != 1)
     die ("Openssl ECDSA_do_verify failed.\n");      
 }
 static void
-bench_openssl_clear (void *p)
+bench_openssl_ecdsa_clear (void *p)
 {
-  struct openssl_ctx *ctx = (struct openssl_ctx *) p;
+  struct openssl_ecdsa_ctx *ctx = (struct openssl_ecdsa_ctx *) p;
   ECDSA_SIG_free (ctx->signature);
   EC_KEY_free (ctx->key);
   free (ctx->digest);
@@ -581,6 +640,10 @@ bench_openssl_clear (void *p)
 struct alg alg_list[] = {
   { "rsa",   1024, bench_rsa_init,   bench_rsa_sign,   bench_rsa_verify,   bench_rsa_clear },
   { "rsa",   2048, bench_rsa_init,   bench_rsa_sign,   bench_rsa_verify,   bench_rsa_clear },
+#if WITH_OPENSSL
+  { "rsa (openssl)",  1024, bench_openssl_rsa_init, bench_openssl_rsa_sign, bench_openssl_rsa_verify, bench_openssl_rsa_clear },
+  { "rsa (openssl)",  2048, bench_openssl_rsa_init, bench_openssl_rsa_sign, bench_openssl_rsa_verify, bench_openssl_rsa_clear },
+#endif
   { "dsa",   1024, bench_dsa_init,   bench_dsa_sign,   bench_dsa_verify,   bench_dsa_clear },
 #if 0
   { "dsa",2048, bench_dsa_init, bench_dsa_sign,   bench_dsa_verify, bench_dsa_clear },
@@ -591,9 +654,9 @@ struct alg alg_list[] = {
   { "ecdsa",  384, bench_ecdsa_init, bench_ecdsa_sign, bench_ecdsa_verify, bench_ecdsa_clear },
   { "ecdsa",  521, bench_ecdsa_init, bench_ecdsa_sign, bench_ecdsa_verify, bench_ecdsa_clear },
 #if WITH_OPENSSL
-  { "ecdsa (openssl)",  224, bench_openssl_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
-  { "ecdsa (openssl)",  384, bench_openssl_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
-  { "ecdsa (openssl)",  521, bench_openssl_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
+  { "ecdsa (openssl)",  224, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
+  { "ecdsa (openssl)",  384, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
+  { "ecdsa (openssl)",  521, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
 #endif
 };