From a6b67c3425e9e12c292fa38a189e6faa8afb02fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Tue, 17 Apr 2012 21:53:22 +0200 Subject: [PATCH] Moved salsa20_set_key to a separate file. Inlined salsa20_hash into salsa20_crypt. --- ChangeLog | 7 +++ Makefile.in | 2 +- salsa20-set-key.c | 88 ++++++++++++++++++++++++++++++++++++++ salsa20.c | 107 +++++++++++----------------------------------- 4 files changed, 120 insertions(+), 84 deletions(-) create mode 100644 salsa20-set-key.c diff --git a/ChangeLog b/ChangeLog index 548e2325..c615d6ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-04-17 Niels Möller <nisse@lysator.liu.se> + + * salsa20.c (salsa20_hash): Deleted function, inlined into + salsa20_crypt. + (salsa20_set_key, salsa20_set_iv): Moved, to... + * salsa20-set-key.c: ...new file. + 2012-04-15 Niels Möller <nisse@lysator.liu.se> * testsuite/salsa20-test.c (test_salsa20_stream): New function. diff --git a/Makefile.in b/Makefile.in index 2e7b7fc3..471c71ca 100644 --- a/Makefile.in +++ b/Makefile.in @@ -81,7 +81,7 @@ nettle_SOURCES = aes-decrypt-internal.c aes-decrypt.c \ md2.c md2-meta.c md4.c md4-meta.c \ md5.c md5-compress.c md5-compat.c md5-meta.c \ ripemd160.c ripemd160-compress.c ripemd160-meta.c \ - salsa20.c \ + salsa20.c salsa20-set-key.c \ sha1.c sha1-compress.c sha1-meta.c \ sha256.c sha256-compress.c sha224-meta.c sha256-meta.c \ sha512.c sha512-compress.c sha384-meta.c sha512-meta.c \ diff --git a/salsa20-set-key.c b/salsa20-set-key.c new file mode 100644 index 00000000..ecb0a213 --- /dev/null +++ b/salsa20-set-key.c @@ -0,0 +1,88 @@ +/* salsa20-set-key.c + * + * The Salsa20 stream cipher. + */ + +/* nettle, low-level cryptographics library + * + * Copyright (C) 2012 Simon Josefsson, 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. + */ + +/* Based on: + salsa20-ref.c version 20051118 + D. J. Bernstein + Public domain. +*/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include <assert.h> + +#include "salsa20.h" + +#include "macros.h" + +void +salsa20_set_key(struct salsa20_ctx *ctx, + unsigned length, const uint8_t *key) +{ + static const uint32_t sigma[4] = { + /* "expand 32-byte k" */ + 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 + }; + static const uint32_t tau[4] = { + /* "expand 16-byte k" */ + 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 + }; + const uint32_t *constants; + + assert (length == SALSA20_MIN_KEY_SIZE || length == SALSA20_MAX_KEY_SIZE); + + ctx->input[1] = LE_READ_UINT32(key + 0); + ctx->input[2] = LE_READ_UINT32(key + 4); + ctx->input[3] = LE_READ_UINT32(key + 8); + ctx->input[4] = LE_READ_UINT32(key + 12); + if (length == SALSA20_MAX_KEY_SIZE) { /* recommended */ + ctx->input[11] = LE_READ_UINT32(key + 16); + ctx->input[12] = LE_READ_UINT32(key + 20); + ctx->input[13] = LE_READ_UINT32(key + 24); + ctx->input[14] = LE_READ_UINT32(key + 28); + constants = sigma; + } else { /* kbits == 128 */ + ctx->input[11] = ctx->input[1]; + ctx->input[12] = ctx->input[2]; + ctx->input[13] = ctx->input[3]; + ctx->input[14] = ctx->input[4]; + constants = tau; + } + ctx->input[0] = constants[0]; + ctx->input[5] = constants[1]; + ctx->input[10] = constants[2]; + ctx->input[15] = constants[3]; +} + +void +salsa20_set_iv(struct salsa20_ctx *ctx, const uint8_t *iv) +{ + ctx->input[6] = LE_READ_UINT32(iv + 0); + ctx->input[7] = LE_READ_UINT32(iv + 4); + ctx->input[8] = 0; + ctx->input[9] = 0; +} diff --git a/salsa20.c b/salsa20.c index 19c82056..6b4898b0 100644 --- a/salsa20.c +++ b/salsa20.c @@ -33,7 +33,6 @@ # include "config.h" #endif -#include <assert.h> #include <string.h> #include "salsa20.h" @@ -56,107 +55,49 @@ x0 ^= ROTL32(18, x3 + x2); \ } while(0) -static void -salsa20_hash(uint32_t *output, const uint32_t *input) -{ - uint32_t x[_SALSA20_INPUT_LENGTH]; - int i; - - memcpy (x, input, sizeof (x)); - - for (i = 20;i > 0;i -= 2) { - QROUND(x[0], x[4], x[8], x[12]); - QROUND(x[5], x[9], x[13], x[1]); - QROUND(x[10], x[14], x[2], x[6]); - QROUND(x[15], x[3], x[7], x[11]); - - QROUND(x[0], x[1], x[2], x[3]); - QROUND(x[5], x[6], x[7], x[4]); - QROUND(x[10], x[11], x[8], x[9]); - QROUND(x[15], x[12], x[13], x[14]); - } - for (i = 0;i < _SALSA20_INPUT_LENGTH;++i) - { - uint32_t t = x[i] + input[i]; - /* NOTE: We return a word array of byte-swapped values, rather - than using a byte array and LE_WRITE_UINT32, to avoid having - to care about unaligned bytes. */ - output[i] = LE_SWAP32 (t); - } -} - -void -salsa20_set_key(struct salsa20_ctx *ctx, - unsigned length, const uint8_t *key) -{ - static const uint32_t sigma[4] = { - /* "expand 32-byte k" */ - 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 - }; - static const uint32_t tau[4] = { - /* "expand 16-byte k" */ - 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 - }; - const uint32_t *constants; - - assert (length == SALSA20_MIN_KEY_SIZE || length == SALSA20_MAX_KEY_SIZE); - - ctx->input[1] = LE_READ_UINT32(key + 0); - ctx->input[2] = LE_READ_UINT32(key + 4); - ctx->input[3] = LE_READ_UINT32(key + 8); - ctx->input[4] = LE_READ_UINT32(key + 12); - if (length == SALSA20_MAX_KEY_SIZE) { /* recommended */ - ctx->input[11] = LE_READ_UINT32(key + 16); - ctx->input[12] = LE_READ_UINT32(key + 20); - ctx->input[13] = LE_READ_UINT32(key + 24); - ctx->input[14] = LE_READ_UINT32(key + 28); - constants = sigma; - } else { /* kbits == 128 */ - ctx->input[11] = ctx->input[1]; - ctx->input[12] = ctx->input[2]; - ctx->input[13] = ctx->input[3]; - ctx->input[14] = ctx->input[4]; - constants = tau; - } - ctx->input[0] = constants[0]; - ctx->input[5] = constants[1]; - ctx->input[10] = constants[2]; - ctx->input[15] = constants[3]; -} - -void -salsa20_set_iv(struct salsa20_ctx *ctx, const uint8_t *iv) -{ - ctx->input[6] = LE_READ_UINT32(iv + 0); - ctx->input[7] = LE_READ_UINT32(iv + 4); - ctx->input[8] = 0; - ctx->input[9] = 0; -} - void salsa20_crypt(struct salsa20_ctx *ctx, unsigned length, uint8_t *c, const uint8_t *m) { - uint32_t output[_SALSA20_INPUT_LENGTH]; - if (!length) return; for (;;) { - salsa20_hash(output,ctx->input); + uint32_t x[_SALSA20_INPUT_LENGTH]; + int i; + memcpy (x, ctx->input, sizeof(x)); + for (i = 0;i < 10;i ++) + { + QROUND(x[0], x[4], x[8], x[12]); + QROUND(x[5], x[9], x[13], x[1]); + QROUND(x[10], x[14], x[2], x[6]); + QROUND(x[15], x[3], x[7], x[11]); + + QROUND(x[0], x[1], x[2], x[3]); + QROUND(x[5], x[6], x[7], x[4]); + QROUND(x[10], x[11], x[8], x[9]); + QROUND(x[15], x[12], x[13], x[14]); + } + + for (i = 0;i < _SALSA20_INPUT_LENGTH;++i) + { + uint32_t t = x[i] + ctx->input[i]; + x[i] = LE_SWAP32 (t); + } + ctx->input[9] += (++ctx->input[8] == 0); /* stopping at 2^70 length per nonce is user's responsibility */ if (length <= SALSA20_BLOCK_SIZE) { - memxor3 (c, m, (uint8_t *) output, length); + memxor3 (c, m, (uint8_t *) x, length); return; } - memxor3 (c, m, (uint8_t *) output, SALSA20_BLOCK_SIZE); + memxor3 (c, m, (uint8_t *) x, SALSA20_BLOCK_SIZE); length -= SALSA20_BLOCK_SIZE; c += SALSA20_BLOCK_SIZE; -- GitLab