1 /* $OpenBSD: chacha.c,v 1.7 2015/12/09 14:07:55 bcook Exp $ */
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include <openssl/chacha.h>
22 #include "chacha-merged.c"
25 ChaCha_set_key(ChaCha_ctx
*ctx
, const unsigned char *key
, uint32_t keybits
)
27 chacha_keysetup((chacha_ctx
*)ctx
, key
, keybits
);
32 ChaCha_set_iv(ChaCha_ctx
*ctx
, const unsigned char *iv
,
33 const unsigned char *counter
)
35 chacha_ivsetup((chacha_ctx
*)ctx
, iv
, counter
);
40 ChaCha(ChaCha_ctx
*ctx
, unsigned char *out
, const unsigned char *in
, size_t len
)
45 /* Consume remaining keystream, if any exists. */
46 if (ctx
->unused
> 0) {
47 k
= ctx
->ks
+ 64 - ctx
->unused
;
48 l
= (len
> ctx
->unused
) ? ctx
->unused
: len
;
49 for (i
= 0; i
< l
; i
++)
50 *(out
++) = *(in
++) ^ *(k
++);
55 chacha_encrypt_bytes((chacha_ctx
*)ctx
, in
, out
, (uint32_t)len
);
59 CRYPTO_chacha_20(unsigned char *out
, const unsigned char *in
, size_t len
,
60 const unsigned char key
[32], const unsigned char iv
[8], uint64_t counter
)
62 struct chacha_ctx ctx
;
65 * chacha_ivsetup expects the counter to be in u8. Rather than
66 * converting size_t to u8 and then back again, pass a counter of
67 * NULL and manually assign it afterwards.
69 chacha_keysetup(&ctx
, key
, 256);
70 chacha_ivsetup(&ctx
, iv
, NULL
);
72 ctx
.input
[12] = (uint32_t)counter
;
73 ctx
.input
[13] = (uint32_t)(counter
>> 32);
76 chacha_encrypt_bytes(&ctx
, in
, out
, (uint32_t)len
);