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) {