1.4.6
by Magnus Holmgren
Import upstream version 2.7 |
1 |
/* salsa20r12-crypt.c
|
2 |
*
|
|
3 |
* The Salsa20 stream cipher.
|
|
4 |
*/
|
|
5 |
||
6 |
/* nettle, low-level cryptographics library
|
|
7 |
*
|
|
8 |
* Copyright (C) 2013 Nikos Mavrogiannopoulos
|
|
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 <string.h> |
|
37 |
||
38 |
#include "salsa20.h" |
|
39 |
||
40 |
#include "macros.h" |
|
41 |
#include "memxor.h" |
|
42 |
||
43 |
void
|
|
44 |
salsa20r12_crypt(struct salsa20_ctx *ctx, |
|
45 |
unsigned length, |
|
46 |
uint8_t *c, |
|
47 |
const uint8_t *m) |
|
48 |
{
|
|
49 |
uint32_t x[_SALSA20_INPUT_LENGTH]; |
|
50 |
||
51 |
if (!length) |
|
52 |
return; |
|
53 |
||
54 |
for (;;) |
|
55 |
{
|
|
56 |
||
57 |
_salsa20_core (x, ctx->input, 12); |
|
58 |
||
59 |
ctx->input[9] += (++ctx->input[8] == 0); |
|
60 |
||
61 |
/* stopping at 2^70 length per nonce is user's responsibility */
|
|
62 |
||
63 |
if (length <= SALSA20_BLOCK_SIZE) |
|
64 |
{
|
|
65 |
memxor3 (c, m, (uint8_t *) x, length); |
|
66 |
return; |
|
67 |
}
|
|
68 |
memxor3 (c, m, (uint8_t *) x, SALSA20_BLOCK_SIZE); |
|
69 |
||
70 |
length -= SALSA20_BLOCK_SIZE; |
|
71 |
c += SALSA20_BLOCK_SIZE; |
|
72 |
m += SALSA20_BLOCK_SIZE; |
|
73 |
}
|
|
74 |
}
|