~ubuntu-branches/ubuntu/vivid/nettle/vivid-proposed

« back to all changes in this revision

Viewing changes to salsa20-core-internal.c

  • Committer: Package Import Robot
  • Author(s): Magnus Holmgren
  • Date: 2013-03-24 11:38:21 UTC
  • mfrom: (1.5.2)
  • mto: (8.1.7 sid)
  • mto: This revision was merged to the branch mainline in revision 14.
  • Revision ID: package-import@ubuntu.com-20130324113821-47kc1q7ojsxmuevv
Tags: 2.6-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* salsa20-core-internal.c
 
2
 *
 
3
 * Internal interface to the Salsa20 core function.
 
4
 */
 
5
 
 
6
/* nettle, low-level cryptographics library
 
7
 *
 
8
 * Copyright (C) 2012 Simon Josefsson, Niels Möller
 
9
 *  
 
10
 * The nettle library is free software; you can redistribute it and/or modify
 
11
 * it under the terms of the GNU Lesser General Public License as published by
 
12
 * the Free Software Foundation; either version 2.1 of the License, or (at your
 
13
 * option) any later version.
 
14
 * 
 
15
 * The nettle library is distributed in the hope that it will be useful, but
 
16
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 
17
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 
18
 * License for more details.
 
19
 * 
 
20
 * You should have received a copy of the GNU Lesser General Public License
 
21
 * along with the nettle library; see the file COPYING.LIB.  If not, write to
 
22
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 
23
 * MA 02111-1301, USA.
 
24
 */
 
25
 
 
26
/* Based on:
 
27
   salsa20-ref.c version 20051118
 
28
   D. J. Bernstein
 
29
   Public domain.
 
30
*/
 
31
 
 
32
#if HAVE_CONFIG_H
 
33
# include "config.h"
 
34
#endif
 
35
 
 
36
#include <assert.h>
 
37
#include <string.h>
 
38
 
 
39
#include "salsa20.h"
 
40
 
 
41
#include "macros.h"
 
42
 
 
43
#ifdef WORDS_BIGENDIAN
 
44
#define LE_SWAP32(v)                            \
 
45
  ((ROTL32(8,  v) & 0x00FF00FFUL) |             \
 
46
   (ROTL32(24, v) & 0xFF00FF00UL))
 
47
#else
 
48
#define LE_SWAP32(v) (v)
 
49
#endif
 
50
 
 
51
#define QROUND(x0, x1, x2, x3) do { \
 
52
  x1 ^= ROTL32(7, x0 + x3);         \
 
53
  x2 ^= ROTL32(9, x1 + x0);         \
 
54
  x3 ^= ROTL32(13, x2 + x1);        \
 
55
  x0 ^= ROTL32(18, x3 + x2);        \
 
56
  } while(0)
 
57
 
 
58
void
 
59
_salsa20_core(uint32_t *dst, const uint32_t *src, unsigned rounds)
 
60
{
 
61
  uint32_t x[_SALSA20_INPUT_LENGTH];
 
62
  unsigned i;
 
63
 
 
64
  assert ( (rounds & 1) == 0);
 
65
 
 
66
  memcpy (x, src, sizeof(x));
 
67
  for (i = 0; i < rounds;i += 2)
 
68
    {
 
69
      QROUND(x[0], x[4], x[8], x[12]);
 
70
      QROUND(x[5], x[9], x[13], x[1]);
 
71
      QROUND(x[10], x[14], x[2], x[6]);
 
72
      QROUND(x[15], x[3], x[7], x[11]);
 
73
 
 
74
      QROUND(x[0], x[1], x[2], x[3]);
 
75
      QROUND(x[5], x[6], x[7], x[4]);
 
76
      QROUND(x[10], x[11], x[8], x[9]);
 
77
      QROUND(x[15], x[12], x[13], x[14]);
 
78
    }
 
79
 
 
80
  for (i = 0; i < _SALSA20_INPUT_LENGTH; i++)
 
81
    {
 
82
      uint32_t t = x[i] + src[i];
 
83
      dst[i] = LE_SWAP32 (t);
 
84
    }
 
85
}