diff options
author | jsing <> | 2014-05-01 16:06:24 +0000 |
---|---|---|
committer | jsing <> | 2014-05-01 16:06:24 +0000 |
commit | 8adb3dbae070d097e78bcc87a567ccd28d073da5 (patch) | |
tree | 7c3bd1b71964d068f0975d770db3b39f16cf4756 /src/lib/libcrypto | |
parent | 01bc5de569d5ec2e77fcaec43eae5ce76f9c3800 (diff) | |
download | openbsd-8adb3dbae070d097e78bcc87a567ccd28d073da5.tar.gz openbsd-8adb3dbae070d097e78bcc87a567ccd28d073da5.tar.bz2 openbsd-8adb3dbae070d097e78bcc87a567ccd28d073da5.zip |
Provide an EVP implementation for ChaCha.
ok miod@
Diffstat (limited to 'src/lib/libcrypto')
-rw-r--r-- | src/lib/libcrypto/chacha/chacha.c | 20 | ||||
-rw-r--r-- | src/lib/libcrypto/chacha/chacha.h | 11 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/c_allc.c | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/e_chacha.c | 65 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/evp.h | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/objects/objects.txt | 4 |
6 files changed, 108 insertions, 0 deletions
diff --git a/src/lib/libcrypto/chacha/chacha.c b/src/lib/libcrypto/chacha/chacha.c index d76d64de4a..1bc95f502d 100644 --- a/src/lib/libcrypto/chacha/chacha.c +++ b/src/lib/libcrypto/chacha/chacha.c | |||
@@ -14,9 +14,29 @@ | |||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "chacha.h" | ||
17 | #include "chacha-merged.c" | 18 | #include "chacha-merged.c" |
18 | 19 | ||
19 | void | 20 | void |
21 | ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, uint32_t keybits) | ||
22 | { | ||
23 | chacha_keysetup((chacha_ctx *)ctx, key, keybits); | ||
24 | } | ||
25 | |||
26 | void | ||
27 | ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv, | ||
28 | const unsigned char *counter) | ||
29 | { | ||
30 | chacha_ivsetup((chacha_ctx *)ctx, iv, counter); | ||
31 | } | ||
32 | |||
33 | void | ||
34 | ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len) | ||
35 | { | ||
36 | chacha_encrypt_bytes((chacha_ctx *)ctx, in, out, (uint32_t)len); | ||
37 | } | ||
38 | |||
39 | void | ||
20 | CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, | 40 | CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, |
21 | const unsigned char key[32], const unsigned char iv[8], size_t counter) | 41 | const unsigned char key[32], const unsigned char iv[8], size_t counter) |
22 | { | 42 | { |
diff --git a/src/lib/libcrypto/chacha/chacha.h b/src/lib/libcrypto/chacha/chacha.h index d66a719ae4..456d960ed9 100644 --- a/src/lib/libcrypto/chacha/chacha.h +++ b/src/lib/libcrypto/chacha/chacha.h | |||
@@ -29,6 +29,17 @@ | |||
29 | extern "C" { | 29 | extern "C" { |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | typedef struct { | ||
33 | unsigned int input[16]; | ||
34 | } ChaCha_ctx; | ||
35 | |||
36 | void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, | ||
37 | unsigned int keybits); | ||
38 | void ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv, | ||
39 | const unsigned char *counter); | ||
40 | void ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, | ||
41 | size_t len); | ||
42 | |||
32 | void CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, | 43 | void CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, |
33 | const unsigned char key[32], const unsigned char iv[8], size_t counter); | 44 | const unsigned char key[32], const unsigned char iv[8], size_t counter); |
34 | 45 | ||
diff --git a/src/lib/libcrypto/evp/c_allc.c b/src/lib/libcrypto/evp/c_allc.c index 2a45d435e5..2047b6cd61 100644 --- a/src/lib/libcrypto/evp/c_allc.c +++ b/src/lib/libcrypto/evp/c_allc.c | |||
@@ -227,4 +227,8 @@ void OpenSSL_add_all_ciphers(void) | |||
227 | EVP_add_cipher_alias(SN_camellia_256_cbc,"CAMELLIA256"); | 227 | EVP_add_cipher_alias(SN_camellia_256_cbc,"CAMELLIA256"); |
228 | EVP_add_cipher_alias(SN_camellia_256_cbc,"camellia256"); | 228 | EVP_add_cipher_alias(SN_camellia_256_cbc,"camellia256"); |
229 | #endif | 229 | #endif |
230 | |||
231 | #ifndef OPENSSL_NO_CHACHA | ||
232 | EVP_add_cipher(EVP_chacha20()); | ||
233 | #endif | ||
230 | } | 234 | } |
diff --git a/src/lib/libcrypto/evp/e_chacha.c b/src/lib/libcrypto/evp/e_chacha.c new file mode 100644 index 0000000000..4a20186006 --- /dev/null +++ b/src/lib/libcrypto/evp/e_chacha.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | ||
3 | * | ||
4 | * Permission to use, copy, modify, and distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #ifndef OPENSSL_NO_CHACHA | ||
18 | |||
19 | #include <openssl/chacha.h> | ||
20 | #include <openssl/evp.h> | ||
21 | #include <openssl/objects.h> | ||
22 | |||
23 | #include "evp_locl.h" | ||
24 | |||
25 | static int chacha_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
26 | const unsigned char *in, size_t len); | ||
27 | static int chacha_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, | ||
28 | const unsigned char *iv, int enc); | ||
29 | |||
30 | static const EVP_CIPHER chacha20_cipher = { | ||
31 | .nid = NID_chacha20, | ||
32 | .block_size = 1, | ||
33 | .key_len = 32, | ||
34 | .iv_len = 8, | ||
35 | .flags = EVP_CIPH_STREAM_CIPHER, | ||
36 | .init = chacha_init, | ||
37 | .do_cipher = chacha_cipher, | ||
38 | .ctx_size = sizeof(ChaCha_ctx) | ||
39 | }; | ||
40 | |||
41 | const EVP_CIPHER * | ||
42 | EVP_chacha20(void) | ||
43 | { | ||
44 | return(&chacha20_cipher); | ||
45 | } | ||
46 | |||
47 | static int | ||
48 | chacha_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, | ||
49 | const unsigned char *iv, int enc) | ||
50 | { | ||
51 | ChaCha_set_key((ChaCha_ctx *)ctx->cipher_data, key, | ||
52 | EVP_CIPHER_CTX_key_length(ctx) * 8); | ||
53 | ChaCha_set_iv((ChaCha_ctx *)ctx->cipher_data, iv, NULL); | ||
54 | return 1; | ||
55 | } | ||
56 | |||
57 | static int | ||
58 | chacha_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, | ||
59 | size_t len) | ||
60 | { | ||
61 | ChaCha((ChaCha_ctx *)ctx->cipher_data, out, in, len); | ||
62 | return 1; | ||
63 | } | ||
64 | |||
65 | #endif | ||
diff --git a/src/lib/libcrypto/evp/evp.h b/src/lib/libcrypto/evp/evp.h index f43fe33b47..fa98d4d93c 100644 --- a/src/lib/libcrypto/evp/evp.h +++ b/src/lib/libcrypto/evp/evp.h | |||
@@ -838,6 +838,10 @@ const EVP_CIPHER *EVP_seed_cfb128(void); | |||
838 | const EVP_CIPHER *EVP_seed_ofb(void); | 838 | const EVP_CIPHER *EVP_seed_ofb(void); |
839 | #endif | 839 | #endif |
840 | 840 | ||
841 | #ifndef OPENSSL_NO_CHACHA | ||
842 | const EVP_CIPHER *EVP_chacha20(void); | ||
843 | #endif | ||
844 | |||
841 | void OPENSSL_add_all_algorithms_noconf(void); | 845 | void OPENSSL_add_all_algorithms_noconf(void); |
842 | void OPENSSL_add_all_algorithms_conf(void); | 846 | void OPENSSL_add_all_algorithms_conf(void); |
843 | 847 | ||
diff --git a/src/lib/libcrypto/objects/objects.txt b/src/lib/libcrypto/objects/objects.txt index 487e079255..bb44aa77a3 100644 --- a/src/lib/libcrypto/objects/objects.txt +++ b/src/lib/libcrypto/objects/objects.txt | |||
@@ -1309,3 +1309,7 @@ brainpool 1 13 : brainpoolP512r1 | |||
1309 | brainpool 1 14 : brainpoolP512t1 | 1309 | brainpool 1 14 : brainpoolP512t1 |
1310 | 1310 | ||
1311 | 1 2 250 1 223 101 256 1 : FRP256v1 | 1311 | 1 2 250 1 223 101 256 1 : FRP256v1 |
1312 | |||
1313 | # ChaCha Stream Cipher | ||
1314 | !Cname chacha20 | ||
1315 | : ChaCha : chacha | ||