summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2014-05-01 16:06:24 +0000
committerjsing <>2014-05-01 16:06:24 +0000
commit8adb3dbae070d097e78bcc87a567ccd28d073da5 (patch)
tree7c3bd1b71964d068f0975d770db3b39f16cf4756 /src
parent01bc5de569d5ec2e77fcaec43eae5ce76f9c3800 (diff)
downloadopenbsd-8adb3dbae070d097e78bcc87a567ccd28d073da5.tar.gz
openbsd-8adb3dbae070d097e78bcc87a567ccd28d073da5.tar.bz2
openbsd-8adb3dbae070d097e78bcc87a567ccd28d073da5.zip
Provide an EVP implementation for ChaCha.
ok miod@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/chacha/chacha.c20
-rw-r--r--src/lib/libcrypto/chacha/chacha.h11
-rw-r--r--src/lib/libcrypto/evp/c_allc.c4
-rw-r--r--src/lib/libcrypto/evp/e_chacha.c65
-rw-r--r--src/lib/libcrypto/evp/evp.h4
-rw-r--r--src/lib/libcrypto/objects/objects.txt4
-rw-r--r--src/lib/libssl/src/crypto/chacha/chacha.c20
-rw-r--r--src/lib/libssl/src/crypto/chacha/chacha.h11
-rw-r--r--src/lib/libssl/src/crypto/evp/c_allc.c4
-rw-r--r--src/lib/libssl/src/crypto/evp/e_chacha.c65
-rw-r--r--src/lib/libssl/src/crypto/evp/evp.h4
-rw-r--r--src/lib/libssl/src/crypto/objects/objects.txt4
-rw-r--r--src/regress/lib/libcrypto/evp/evptest.c7
-rw-r--r--src/regress/lib/libcrypto/evp/evptests.txt10
14 files changed, 233 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
19void 20void
21ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, uint32_t keybits)
22{
23 chacha_keysetup((chacha_ctx *)ctx, key, keybits);
24}
25
26void
27ChaCha_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
33void
34ChaCha(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
39void
20CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, 40CRYPTO_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 @@
29extern "C" { 29extern "C" {
30#endif 30#endif
31 31
32typedef struct {
33 unsigned int input[16];
34} ChaCha_ctx;
35
36void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key,
37 unsigned int keybits);
38void ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv,
39 const unsigned char *counter);
40void ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in,
41 size_t len);
42
32void CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, 43void 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
25static int chacha_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
26 const unsigned char *in, size_t len);
27static int chacha_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
28 const unsigned char *iv, int enc);
29
30static 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
41const EVP_CIPHER *
42EVP_chacha20(void)
43{
44 return(&chacha20_cipher);
45}
46
47static int
48chacha_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
57static int
58chacha_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);
838const EVP_CIPHER *EVP_seed_ofb(void); 838const EVP_CIPHER *EVP_seed_ofb(void);
839#endif 839#endif
840 840
841#ifndef OPENSSL_NO_CHACHA
842const EVP_CIPHER *EVP_chacha20(void);
843#endif
844
841void OPENSSL_add_all_algorithms_noconf(void); 845void OPENSSL_add_all_algorithms_noconf(void);
842void OPENSSL_add_all_algorithms_conf(void); 846void 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
1309brainpool 1 14 : brainpoolP512t1 1309brainpool 1 14 : brainpoolP512t1
1310 1310
13111 2 250 1 223 101 256 1 : FRP256v1 13111 2 250 1 223 101 256 1 : FRP256v1
1312
1313# ChaCha Stream Cipher
1314!Cname chacha20
1315 : ChaCha : chacha
diff --git a/src/lib/libssl/src/crypto/chacha/chacha.c b/src/lib/libssl/src/crypto/chacha/chacha.c
index d76d64de4a..1bc95f502d 100644
--- a/src/lib/libssl/src/crypto/chacha/chacha.c
+++ b/src/lib/libssl/src/crypto/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
19void 20void
21ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, uint32_t keybits)
22{
23 chacha_keysetup((chacha_ctx *)ctx, key, keybits);
24}
25
26void
27ChaCha_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
33void
34ChaCha(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
39void
20CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, 40CRYPTO_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/libssl/src/crypto/chacha/chacha.h b/src/lib/libssl/src/crypto/chacha/chacha.h
index d66a719ae4..456d960ed9 100644
--- a/src/lib/libssl/src/crypto/chacha/chacha.h
+++ b/src/lib/libssl/src/crypto/chacha/chacha.h
@@ -29,6 +29,17 @@
29extern "C" { 29extern "C" {
30#endif 30#endif
31 31
32typedef struct {
33 unsigned int input[16];
34} ChaCha_ctx;
35
36void ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key,
37 unsigned int keybits);
38void ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv,
39 const unsigned char *counter);
40void ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in,
41 size_t len);
42
32void CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, 43void 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/libssl/src/crypto/evp/c_allc.c b/src/lib/libssl/src/crypto/evp/c_allc.c
index 2a45d435e5..2047b6cd61 100644
--- a/src/lib/libssl/src/crypto/evp/c_allc.c
+++ b/src/lib/libssl/src/crypto/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/libssl/src/crypto/evp/e_chacha.c b/src/lib/libssl/src/crypto/evp/e_chacha.c
new file mode 100644
index 0000000000..4a20186006
--- /dev/null
+++ b/src/lib/libssl/src/crypto/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
25static int chacha_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
26 const unsigned char *in, size_t len);
27static int chacha_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
28 const unsigned char *iv, int enc);
29
30static 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
41const EVP_CIPHER *
42EVP_chacha20(void)
43{
44 return(&chacha20_cipher);
45}
46
47static int
48chacha_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
57static int
58chacha_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/libssl/src/crypto/evp/evp.h b/src/lib/libssl/src/crypto/evp/evp.h
index f43fe33b47..fa98d4d93c 100644
--- a/src/lib/libssl/src/crypto/evp/evp.h
+++ b/src/lib/libssl/src/crypto/evp/evp.h
@@ -838,6 +838,10 @@ const EVP_CIPHER *EVP_seed_cfb128(void);
838const EVP_CIPHER *EVP_seed_ofb(void); 838const EVP_CIPHER *EVP_seed_ofb(void);
839#endif 839#endif
840 840
841#ifndef OPENSSL_NO_CHACHA
842const EVP_CIPHER *EVP_chacha20(void);
843#endif
844
841void OPENSSL_add_all_algorithms_noconf(void); 845void OPENSSL_add_all_algorithms_noconf(void);
842void OPENSSL_add_all_algorithms_conf(void); 846void OPENSSL_add_all_algorithms_conf(void);
843 847
diff --git a/src/lib/libssl/src/crypto/objects/objects.txt b/src/lib/libssl/src/crypto/objects/objects.txt
index 487e079255..bb44aa77a3 100644
--- a/src/lib/libssl/src/crypto/objects/objects.txt
+++ b/src/lib/libssl/src/crypto/objects/objects.txt
@@ -1309,3 +1309,7 @@ brainpool 1 13 : brainpoolP512r1
1309brainpool 1 14 : brainpoolP512t1 1309brainpool 1 14 : brainpoolP512t1
1310 1310
13111 2 250 1 223 101 256 1 : FRP256v1 13111 2 250 1 223 101 256 1 : FRP256v1
1312
1313# ChaCha Stream Cipher
1314!Cname chacha20
1315 : ChaCha : chacha
diff --git a/src/regress/lib/libcrypto/evp/evptest.c b/src/regress/lib/libcrypto/evp/evptest.c
index 164d8f3e01..de1bcce41d 100644
--- a/src/regress/lib/libcrypto/evp/evptest.c
+++ b/src/regress/lib/libcrypto/evp/evptest.c
@@ -429,6 +429,13 @@ int main(int argc,char **argv)
429 continue; 429 continue;
430 } 430 }
431#endif 431#endif
432#ifdef OPENSSL_NO_CHACHA
433 if (strstr(cipher, "ChaCha") == cipher)
434 {
435 fprintf(stdout, "Cipher disabled, skipping %s\n", cipher);
436 continue;
437 }
438#endif
432 fprintf(stderr,"Can't find %s\n",cipher); 439 fprintf(stderr,"Can't find %s\n",cipher);
433 exit(3); 440 exit(3);
434 } 441 }
diff --git a/src/regress/lib/libcrypto/evp/evptests.txt b/src/regress/lib/libcrypto/evp/evptests.txt
index c273707c14..bdee5a88f7 100644
--- a/src/regress/lib/libcrypto/evp/evptests.txt
+++ b/src/regress/lib/libcrypto/evp/evptests.txt
@@ -332,3 +332,13 @@ SEED-ECB:00000000000000000000000000000000::000102030405060708090A0B0C0D0E0F:5EBA
332SEED-ECB:000102030405060708090A0B0C0D0E0F::00000000000000000000000000000000:C11F22F20140505084483597E4370F43:1 332SEED-ECB:000102030405060708090A0B0C0D0E0F::00000000000000000000000000000000:C11F22F20140505084483597E4370F43:1
333SEED-ECB:4706480851E61BE85D74BFB3FD956185::83A2F8A288641FB9A4E9A5CC2F131C7D:EE54D13EBCAE706D226BC3142CD40D4A:1 333SEED-ECB:4706480851E61BE85D74BFB3FD956185::83A2F8A288641FB9A4E9A5CC2F131C7D:EE54D13EBCAE706D226BC3142CD40D4A:1
334SEED-ECB:28DBC3BC49FFD87DCFA509B11D422BE7::B41E6BE2EBA84A148E2EED84593C5EC7:9B9B7BFCD1813CB95D0B3618F40F5122:1 334SEED-ECB:28DBC3BC49FFD87DCFA509B11D422BE7::B41E6BE2EBA84A148E2EED84593C5EC7:9B9B7BFCD1813CB95D0B3618F40F5122:1
335
336# ChaCha test vectors
337ChaCha:0000000000000000000000000000000000000000000000000000000000000000:0000000000000000:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586:1
338ChaCha:0100000000000000000000000000000000000000000000000000000000000000:0000000000000000:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:c5d30a7ce1ec119378c84f487d775a8542f13ece238a9455e8229e888de85bbd29eb63d0a17a5b999b52da22be4023eb07620a54f6fa6ad8737b71eb0464dac0:1
339ChaCha:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff:ffffffffffffffff:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:d9bf3f6bce6ed0b54254557767fb57443dd4778911b606055c39cc25e674b8363feabc57fde54f790c52c8ae43240b79d49042b777bfd6cb80e931270b7f50eb:1
340ChaCha:5555555555555555555555555555555555555555555555555555555555555555:aaaaaaaaaaaaaaaa:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:aff7418293f3a553894b1e7484bd1e8ede196eced5a1d6814de37091e07e076e34bbba8107a686c982850f0a7353940d40db1ab0b5765b78b4cf473d9485a3dd:1
341ChaCha:5555555555555555555555555555555555555555555555555555555555555555:5555555555555555:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:bea9411aa453c5434a5ae8c92862f564396855a9ea6e22d6d3b50ae1b3663311a4a3606c671d605ce16c3aece8e61ea145c59775017bee2fa6f88afc758069f7:1
342ChaCha:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaa:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:9aa2a9f656efde5aa7591c5fed4b35aea2895dec7cb4543b9e9f21f5e7bcbcf3c43c748a970888f8248393a09d43e0b7e164bc4d0b0fb240a2d72115c4808906:1
343ChaCha:00112233445566778899aabbccddeeffffeeddccbbaa99887766554433221100:0f1e2d3c4b5a6978:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:9fadf409c00811d00431d67efbd88fba59218d5d6708b1d685863fabbb0e961eea480fd6fb532bfd494b2151015057423ab60a63fe4f55f7a212e2167ccab931:1
344ChaCha:c46ec1b18ce8a878725a37e780dfb7351f68ed2e194c79fbc6aebee1a667975d:1ada31d5cf688221:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000:f63a89b75c2271f9368816542ba52f06ed49241792302b00b5e8f80ae9a473afc25b218f519af0fdd406362e8d69de7f54c604a6e00f353f110f771bdca8ab92:1