diff --git a/ChangeLog b/ChangeLog
index 67acb06afa1935bfc092f69a662e9f358eca86cc..7cdde45dede94953c3f5b1fd9ced45756a0315c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-10-12  Niels Möller  <nisse@lysator.liu.se>
+
+	* skein256.c (_skein256_expand): New function.
+	(skein256_process_block): Use it.
+	* testsuite/skein256-test.c (test_skein256_block): Use it.
+
 2016-10-10  Niels Möller  <nisse@lysator.liu.se>
 
 	* skein.h (struct skein256_ctx): New context struct.
diff --git a/skein.h b/skein.h
index da795d41e04e7b3fef808c343ef37163be4c5924..a5d09de18f7e2e22c4094e29a31c8ec59693707f 100644
--- a/skein.h
+++ b/skein.h
@@ -44,6 +44,7 @@ extern "C" {
 #define skein256_init nettle_skein256_init
 #define skein256_update nettle_skein256_update
 #define skein256_digest nettle_skein256_digest
+#define _skein256_expand _nettle_skein256_expand
 #define _skein256_block _nettle_skein256_block
 
 #define SKEIN256_BLOCK_SIZE 32
@@ -79,6 +80,10 @@ skein256_digest(struct skein256_ctx *ctx,
 
 #define _SKEIN_C240 0x1BD11BDAA9FC1A22ULL
 
+void
+_skein256_expand(uint64_t keys[_SKEIN256_NKEYS],
+		 uint64_t tweak[_SKEIN_NTWEAK]);
+
 void
 _skein256_block (uint64_t dst[_SKEIN256_LENGTH],
 		 const uint64_t keys[_SKEIN256_NKEYS],
diff --git a/skein256.c b/skein256.c
index 8e3f3a9e03575121d7c74863c78d56c9d476a3e1..703182a91b1d218add4e1888d5d2cca6e64f9a13 100644
--- a/skein256.c
+++ b/skein256.c
@@ -138,6 +138,19 @@ _skein256_block (uint64_t dst[_SKEIN256_LENGTH],
   dst[3] = s3 ^ w3;
 }
 
+void
+_skein256_expand(uint64_t keys[_SKEIN256_NKEYS],
+		 uint64_t tweak[_SKEIN_NTWEAK])
+{
+  uint64_t sum;
+  unsigned i;
+
+  for (i = 0, sum = _SKEIN_C240; i < _SKEIN256_LENGTH; i++)
+    sum ^= keys[i];
+  keys[_SKEIN256_LENGTH] = sum;
+  tweak[2] = tweak[0] ^ tweak[1];
+}
+
 void
 skein256_init(struct skein256_ctx *ctx)
 {
@@ -158,19 +171,14 @@ skein256_process_block(struct skein256_ctx *ctx,
 		       const uint8_t *data)
 {
   /* Expand key */
-  uint64_t tweak[3];
-  uint64_t sum;
-  unsigned i;
-
-  for (i = 0, sum = _SKEIN_C240; i < _SKEIN256_LENGTH; i++)
-    sum ^= ctx->state[i];
-  ctx->state[_SKEIN256_LENGTH] = sum;
+  uint64_t tweak[_SKEIN_NTWEAK];
 
   tag |= ((ctx->count == 0) << 6);
 
   tweak[0] = (ctx->count << 5) + length;
   tweak[1] = (ctx->count >> 59) | ((unsigned long long) tag << 56);
-  tweak[2] = tweak[0] ^ tweak[1];
+  _skein256_expand(ctx->state, tweak);
+
   _skein256_block(ctx->state, ctx->state, tweak, data);
 
   ctx->count++;
diff --git a/testsuite/skein256-test.c b/testsuite/skein256-test.c
index b36c208617d09e9efac6807778bce21f7c81df60..2613d9ba6a1b42ecc83110b915b555cd35c91fda 100644
--- a/testsuite/skein256-test.c
+++ b/testsuite/skein256-test.c
@@ -22,18 +22,10 @@ test_skein256_block (const uint64_t keys[4],
   uint64_t keys_expanded[_SKEIN256_NKEYS];
   uint64_t tweak_expanded[_SKEIN_NTWEAK];
   uint64_t output[_SKEIN256_LENGTH];
-  uint64_t sum;
-  unsigned i;
-  for (i = 0, sum = _SKEIN_C240; i < _SKEIN256_LENGTH; i++)
-    {
-      keys_expanded[i] = keys[i];
-      sum ^= keys[i];
-    }
-  keys_expanded[_SKEIN256_LENGTH] = sum;
-  tweak_expanded[0] = tweak[0];
-  tweak_expanded[1] = tweak[1];
-  tweak_expanded[2] = tweak[0] ^ tweak[1];
 
+  memcpy (keys_expanded, keys, _SKEIN256_LENGTH * sizeof(*keys));
+  memcpy (tweak_expanded, tweak, 2*sizeof(*tweak));
+  _skein256_expand (keys_expanded, tweak_expanded);
   _skein256_block(output, keys_expanded, tweak_expanded, msg);
   if (memcmp (output, ref, sizeof(output)) != 0)
     {