Mercurial > dropbear
comparison common-algo.c @ 1672:3a97f14c0235
Add Chacha20-Poly1305, AES128-GCM and AES256-GCM support (#93)
* Add Chacha20-Poly1305 authenticated encryption
* Add general AEAD approach.
* Add [email protected] algo using LibTomCrypt chacha and
poly1305 routines.
Chacha20-Poly1305 is generally faster than AES256 on CPU w/o dedicated
AES instructions, having the same key size.
Compiling in will add ~5,5kB to binary size on x86-64.
function old new delta
chacha_crypt - 1397 +1397
_poly1305_block - 608 +608
poly1305_done - 595 +595
dropbear_chachapoly_crypt - 457 +457
.rodata 26976 27392 +416
poly1305_process - 290 +290
poly1305_init - 221 +221
chacha_setup - 218 +218
encrypt_packet 1068 1270 +202
dropbear_chachapoly_getlength - 147 +147
decrypt_packet 756 897 +141
chacha_ivctr64 - 137 +137
read_packet 543 637 +94
dropbear_chachapoly_start - 94 +94
read_kex_algos 792 880 +88
chacha_keystream - 69 +69
dropbear_mode_chachapoly - 48 +48
sshciphers 280 320 +40
dropbear_mode_none 24 48 +24
dropbear_mode_ctr 24 48 +24
dropbear_mode_cbc 24 48 +24
dropbear_chachapoly_mac - 24 +24
dropbear_chachapoly - 24 +24
gen_new_keys 848 854 +6
------------------------------------------------------------------------------
(add/remove: 14/0 grow/shrink: 10/0 up/down: 5388/0) Total: 5388 bytes
* Add AES128-GCM and AES256-GCM authenticated encryption
* Add general AES-GCM mode.
* Add [email protected] and [email protected] algo using
LibTomCrypt gcm routines.
AES-GCM is combination of AES CTR mode and GHASH, slower than AES-CTR on
CPU w/o dedicated AES/GHASH instructions therefore disabled by default.
Compiling in will add ~6kB to binary size on x86-64.
function old new delta
gcm_process - 1060 +1060
.rodata 26976 27808 +832
gcm_gf_mult - 820 +820
gcm_add_aad - 660 +660
gcm_shift_table - 512 +512
gcm_done - 471 +471
gcm_add_iv - 384 +384
gcm_init - 347 +347
dropbear_gcm_crypt - 309 +309
encrypt_packet 1068 1270 +202
decrypt_packet 756 897 +141
gcm_reset - 118 +118
read_packet 543 637 +94
read_kex_algos 792 880 +88
sshciphers 280 360 +80
gcm_mult_h - 80 +80
dropbear_gcm_start - 62 +62
dropbear_mode_gcm - 48 +48
dropbear_mode_none 24 48 +24
dropbear_mode_ctr 24 48 +24
dropbear_mode_cbc 24 48 +24
dropbear_ghash - 24 +24
dropbear_gcm_getlength - 24 +24
gen_new_keys 848 854 +6
------------------------------------------------------------------------------
(add/remove: 14/0 grow/shrink: 10/0 up/down: 6434/0) Total: 6434 bytes
author | Vladislav Grishenko <themiron@users.noreply.github.com> |
---|---|
date | Mon, 25 May 2020 20:50:25 +0500 |
parents | d32bcb5c557d |
children | e0871128e61f |
comparison
equal
deleted
inserted
replaced
1671:5c8913b7464c | 1672:3a97f14c0235 |
---|---|
28 #include "session.h" | 28 #include "session.h" |
29 #include "dbutil.h" | 29 #include "dbutil.h" |
30 #include "dh_groups.h" | 30 #include "dh_groups.h" |
31 #include "ltc_prng.h" | 31 #include "ltc_prng.h" |
32 #include "ecc.h" | 32 #include "ecc.h" |
33 #include "gcm.h" | |
34 #include "chachapoly.h" | |
33 | 35 |
34 /* This file (algo.c) organises the ciphers which can be used, and is used to | 36 /* This file (algo.c) organises the ciphers which can be used, and is used to |
35 * decide which ciphers/hashes/compression/signing to use during key exchange*/ | 37 * decide which ciphers/hashes/compression/signing to use during key exchange*/ |
36 | 38 |
37 static int void_cipher(const unsigned char* in, unsigned char* out, | 39 static int void_cipher(const unsigned char* in, unsigned char* out, |
84 | 86 |
85 /* A few void* s are required to silence warnings | 87 /* A few void* s are required to silence warnings |
86 * about the symmetric_CBC vs symmetric_CTR cipher_state pointer */ | 88 * about the symmetric_CBC vs symmetric_CTR cipher_state pointer */ |
87 #if DROPBEAR_ENABLE_CBC_MODE | 89 #if DROPBEAR_ENABLE_CBC_MODE |
88 const struct dropbear_cipher_mode dropbear_mode_cbc = | 90 const struct dropbear_cipher_mode dropbear_mode_cbc = |
89 {(void*)cbc_start, (void*)cbc_encrypt, (void*)cbc_decrypt}; | 91 {(void*)cbc_start, (void*)cbc_encrypt, (void*)cbc_decrypt, NULL, NULL, NULL}; |
90 #endif /* DROPBEAR_ENABLE_CBC_MODE */ | 92 #endif /* DROPBEAR_ENABLE_CBC_MODE */ |
91 | 93 |
92 const struct dropbear_cipher_mode dropbear_mode_none = | 94 const struct dropbear_cipher_mode dropbear_mode_none = |
93 {void_start, void_cipher, void_cipher}; | 95 {void_start, void_cipher, void_cipher, NULL, NULL, NULL}; |
94 | 96 |
95 #if DROPBEAR_ENABLE_CTR_MODE | 97 #if DROPBEAR_ENABLE_CTR_MODE |
96 /* a wrapper to make ctr_start and cbc_start look the same */ | 98 /* a wrapper to make ctr_start and cbc_start look the same */ |
97 static int dropbear_big_endian_ctr_start(int cipher, | 99 static int dropbear_big_endian_ctr_start(int cipher, |
98 const unsigned char *IV, | 100 const unsigned char *IV, |
99 const unsigned char *key, int keylen, | 101 const unsigned char *key, int keylen, |
100 int num_rounds, symmetric_CTR *ctr) { | 102 int num_rounds, symmetric_CTR *ctr) { |
101 return ctr_start(cipher, IV, key, keylen, num_rounds, CTR_COUNTER_BIG_ENDIAN, ctr); | 103 return ctr_start(cipher, IV, key, keylen, num_rounds, CTR_COUNTER_BIG_ENDIAN, ctr); |
102 } | 104 } |
103 const struct dropbear_cipher_mode dropbear_mode_ctr = | 105 const struct dropbear_cipher_mode dropbear_mode_ctr = |
104 {(void*)dropbear_big_endian_ctr_start, (void*)ctr_encrypt, (void*)ctr_decrypt}; | 106 {(void*)dropbear_big_endian_ctr_start, (void*)ctr_encrypt, (void*)ctr_decrypt, NULL, NULL, NULL}; |
105 #endif /* DROPBEAR_ENABLE_CTR_MODE */ | 107 #endif /* DROPBEAR_ENABLE_CTR_MODE */ |
106 | 108 |
107 /* Mapping of ssh hashes to libtomcrypt hashes, including keysize etc. | 109 /* Mapping of ssh hashes to libtomcrypt hashes, including keysize etc. |
108 {&hash_desc, keysize, hashsize} */ | 110 {&hash_desc, keysize, hashsize} */ |
109 | 111 |
135 /* The following map ssh names to internal values. | 137 /* The following map ssh names to internal values. |
136 * The ordering here is important for the client - the first mode | 138 * The ordering here is important for the client - the first mode |
137 * that is also supported by the server will get used. */ | 139 * that is also supported by the server will get used. */ |
138 | 140 |
139 algo_type sshciphers[] = { | 141 algo_type sshciphers[] = { |
142 #if DROPBEAR_CHACHA20POLY1305 | |
143 {"[email protected]", 0, &dropbear_chachapoly, 1, &dropbear_mode_chachapoly}, | |
144 #endif | |
145 | |
146 #if DROPBEAR_ENABLE_GCM_MODE | |
147 #if DROPBEAR_AES128 | |
148 {"[email protected]", 0, &dropbear_aes128, 1, &dropbear_mode_gcm}, | |
149 #endif | |
150 #if DROPBEAR_AES256 | |
151 {"[email protected]", 0, &dropbear_aes256, 1, &dropbear_mode_gcm}, | |
152 #endif | |
153 #endif /* DROPBEAR_ENABLE_GCM_MODE */ | |
154 | |
140 #if DROPBEAR_ENABLE_CTR_MODE | 155 #if DROPBEAR_ENABLE_CTR_MODE |
141 #if DROPBEAR_AES128 | 156 #if DROPBEAR_AES128 |
142 {"aes128-ctr", 0, &dropbear_aes128, 1, &dropbear_mode_ctr}, | 157 {"aes128-ctr", 0, &dropbear_aes128, 1, &dropbear_mode_ctr}, |
143 #endif | 158 #endif |
144 #if DROPBEAR_AES256 | 159 #if DROPBEAR_AES256 |