From 2620c890164cba8d125a8390b9637859cbc92f2e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Tue, 18 Mar 2014 21:51:11 +0100
Subject: [PATCH] Resurrect nettle_arcfour128, as an internal aead.

Do benchmarking of arcfour, salsa20 and chacha via time_aead.
---
 ChangeLog                   |  9 +++++++++
 examples/nettle-benchmark.c |  4 ++++
 examples/nettle-openssl.c   | 28 ++++++++++++++++++++++++++++
 nettle-internal.c           | 13 ++++++++++++-
 nettle-internal.h           |  2 ++
 5 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 28d2a750..99ff77ee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2014-03-18  Niels Möller  <nisse@lysator.liu.se>
 
+	* examples/nettle-benchmark.c (main): Add benchmarking of arcfour,
+	salsa20 and chacha, via time_aead.
+
+	* nettle-internal.c (nettle_arcfour128): Define, as a struct
+	nettle_aead (with NULL set_nonce, update, and digest methods).
+	* examples/nettle-openssl.c (nettle_openssl_arcfour128): Likewise.
+	* nettle-internal.h (nettle_arcfour128)
+	(nettle_openssl_arcfour128): Declare.
+
 	* nettle-types.h (nettle_cipher_func): New typedef, similar to
 	nettle_crypt_func, but with a const context, intended for block
 	ciphers.
diff --git a/examples/nettle-benchmark.c b/examples/nettle-benchmark.c
index 60ca4f2b..c95a7eea 100644
--- a/examples/nettle-benchmark.c
+++ b/examples/nettle-benchmark.c
@@ -747,6 +747,10 @@ main(int argc, char **argv)
 
   const struct nettle_aead *aeads[] =
     {
+      /* Stream ciphers */
+      &nettle_arcfour128, OPENSSL(&nettle_openssl_arcfour128)
+      &nettle_salsa20, &nettle_salsa20r12, &nettle_chacha,
+      /* Proper AEAD algorithme. */
       &nettle_gcm_aes128,
       &nettle_gcm_aes192,
       &nettle_gcm_aes256,
diff --git a/examples/nettle-openssl.c b/examples/nettle-openssl.c
index c1653933..651931fc 100644
--- a/examples/nettle-openssl.c
+++ b/examples/nettle-openssl.c
@@ -149,6 +149,34 @@ nettle_openssl_aes256 = {
   openssl_aes_encrypt, openssl_aes_decrypt
 };
 
+/* Arcfour */
+static nettle_set_key_func openssl_arcfour128_set_key;
+static void
+openssl_arcfour128_set_key(void *ctx, const uint8_t *key)
+{
+  RC4_set_key(ctx, 16, key);
+}
+
+static nettle_crypt_func openssl_arcfour_crypt;
+static void
+openssl_arcfour_crypt(void *ctx, size_t length,
+		      uint8_t *dst, const uint8_t *src)
+{
+  RC4(ctx, length, src, dst);
+}
+
+const struct nettle_aead
+nettle_openssl_arcfour128 = {
+  "openssl arcfour128", sizeof(RC4_KEY),
+  1, 16, 0, 0,
+  openssl_arcfour128_set_key,
+  openssl_arcfour128_set_key,
+  NULL, NULL,
+  openssl_arcfour_crypt,
+  openssl_arcfour_crypt,
+  NULL,  
+};
+
 /* Blowfish */
 static nettle_set_key_func openssl_bf128_set_key;
 static void
diff --git a/nettle-internal.c b/nettle-internal.c
index 639a66ad..9db46e92 100644
--- a/nettle-internal.c
+++ b/nettle-internal.c
@@ -32,6 +32,7 @@
 #include <stdlib.h>
 
 #include "nettle-internal.h"
+#include "arcfour.h"
 #include "blowfish.h"
 #include "des.h"
 #include "chacha.h"
@@ -71,6 +72,17 @@ nettle_blowfish128 =
     (nettle_cipher_func *) blowfish_decrypt
   };
 
+const struct nettle_aead
+nettle_arcfour128 = {
+  "arcfour128", sizeof(struct arcfour_ctx),
+  1, ARCFOUR128_KEY_SIZE, 0, 0,
+  (nettle_set_key_func *) arcfour128_set_key,
+  (nettle_set_key_func *) arcfour128_set_key,
+  NULL, NULL,
+  (nettle_crypt_func *) arcfour_crypt,
+  (nettle_crypt_func *) arcfour_crypt,
+  NULL,  
+};
 
 const struct nettle_aead
 nettle_chacha = {
@@ -113,4 +125,3 @@ nettle_salsa20r12 = {
   (nettle_crypt_func *) salsa20r12_crypt,
   NULL,
 };
-
diff --git a/nettle-internal.h b/nettle-internal.h
index 18173681..6dce67b2 100644
--- a/nettle-internal.h
+++ b/nettle-internal.h
@@ -63,6 +63,7 @@ extern const struct nettle_cipher nettle_unified_aes192;
 extern const struct nettle_cipher nettle_unified_aes256;
 
 /* Stream ciphers treated as aead algorithms with no authentication. */
+extern const struct nettle_aead nettle_arcfour128;
 extern const struct nettle_aead nettle_chacha;
 extern const struct nettle_aead nettle_salsa20;
 extern const struct nettle_aead nettle_salsa20r12;
@@ -75,6 +76,7 @@ extern const struct nettle_cipher nettle_openssl_aes256;
 extern const struct nettle_cipher nettle_openssl_blowfish128;
 extern const struct nettle_cipher nettle_openssl_des;
 extern const struct nettle_cipher nettle_openssl_cast128;
+extern const struct nettle_aead nettle_openssl_arcfour128;
 
 extern const struct nettle_hash nettle_openssl_md5;
 extern const struct nettle_hash nettle_openssl_sha1;
-- 
GitLab