Mercurial > dropbear
changeset 683:63f8d6c469cf
ENABLE_USER_ALGO_LIST should work for the client
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 17 May 2012 00:26:12 +0800 |
parents | 4edea9f363d0 |
children | c37857676924 167fdc091c05 |
files | algo.h common-algo.c common-kex.c options.h |
diffstat | 4 files changed, 27 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
--- a/algo.h Thu May 17 00:12:42 2012 +0800 +++ b/algo.h Thu May 17 00:26:12 2012 +0800 @@ -89,7 +89,7 @@ int *goodguess); #ifdef ENABLE_USER_ALGO_LIST -int check_user_algos(char* user_algo_list, algo_type * algos, +int check_user_algos(const char* user_algo_list, algo_type * algos, const char *algo_desc); char * algolist_string(algo_type algos[]); #endif
--- a/common-algo.c Thu May 17 00:12:42 2012 +0800 +++ b/common-algo.c Thu May 17 00:26:12 2012 +0800 @@ -297,7 +297,7 @@ return ret_list; } -static int +static algo_type* check_algo(const char* algo_name, algo_type *algos) { algo_type *a; @@ -305,32 +305,25 @@ { if (strcmp(a->name, algo_name) == 0) { - a->usable = 2; - return DROPBEAR_SUCCESS; + return a; } } - return DROPBEAR_FAILURE; + return NULL; } -/* helper for check_user_algos */ static void try_add_algo(const char *algo_name, algo_type *algos, - const char *algo_desc, char ** out_list, int *num_ret) + const char *algo_desc, algo_type * new_algos, int *num_ret) { - if (check_algo(algo_name, algos) == DROPBEAR_FAILURE) + algo_type *match_algo = check_algo(algo_name, algos); + if (!match_algo) { dropbear_log(LOG_WARNING, "This Dropbear program does not support '%s' %s algorithm", algo_name, algo_desc); return; } - if (*num_ret != 0) - { - **out_list = ','; - (*out_list)++; - } - - *out_list += sprintf(*out_list, "%s", algo_name); + new_algos[*num_ret] = *match_algo; (*num_ret)++; } @@ -338,41 +331,32 @@ * options. Any that are not acceptable are removed in-place. Returns the * number of valid algorithms. */ int -check_user_algos(char* user_algo_list, algo_type * algos, +check_user_algos(const char* user_algo_list, algo_type * algos, const char *algo_desc) { + algo_type new_algos[MAX_PROPOSED_ALGO]; /* this has two passes. first we sweep through the given list of * algorithms and mark them as usable=2 in the algo_type[] array... */ int num_ret = 0; char *work_list = m_strdup(user_algo_list); char *last_name = work_list; - char *out_list = user_algo_list; char *c; for (c = work_list; *c; c++) { if (*c == ',') { *c = '\0'; - try_add_algo(last_name, algos, algo_desc, &out_list, &num_ret); + try_add_algo(last_name, algos, algo_desc, new_algos, &num_ret); last_name = c++; } } - try_add_algo(last_name, algos, algo_desc, &out_list, &num_ret); + try_add_algo(last_name, algos, algo_desc, new_algos, &num_ret); m_free(work_list); - /* ...then we mark anything with usable==1 as usable=0, and - * usable==2 as usable=1. */ - algo_type *a; - for (a = algos; a->name != NULL; a++) - { - if (a->usable == 1) - { - a->usable = 0; - } else if (a->usable == 2) - { - a->usable = 1; - } - } + new_algos[num_ret].name = NULL; + + /* Copy one more as a blank delimiter */ + memcpy(algos, new_algos, sizeof(*new_algos) * (num_ret+1)); return num_ret; } #endif // ENABLE_USER_ALGO_LIST
--- a/common-kex.c Thu May 17 00:12:42 2012 +0800 +++ b/common-kex.c Thu May 17 00:26:12 2012 +0800 @@ -106,39 +106,17 @@ /* server_host_key_algorithms */ buf_put_algolist(ses.writepayload, sshhostkey); -#ifdef ENABLE_USER_ALGO_LIST - if (opts.cipher_list) - { - /* encryption_algorithms_client_to_server */ - buf_putbytes(ses.writepayload, opts.cipher_list, strlen(opts.cipher_list)); - /* encryption_algorithms_server_to_client */ - buf_putbytes(ses.writepayload, opts.cipher_list, strlen(opts.cipher_list)); - } - else -#endif - { - /* encryption_algorithms_client_to_server */ - buf_put_algolist(ses.writepayload, sshciphers); - /* encryption_algorithms_server_to_client */ - buf_put_algolist(ses.writepayload, sshciphers); - } + /* encryption_algorithms_client_to_server */ + buf_put_algolist(ses.writepayload, sshciphers); + + /* encryption_algorithms_server_to_client */ + buf_put_algolist(ses.writepayload, sshciphers); -#ifdef ENABLE_USER_ALGO_LIST - if (opts.mac_list) - { - /* mac_algorithms_client_to_server */ - buf_putbytes(ses.writepayload, opts.mac_list, strlen(opts.mac_list)); - /* mac_algorithms_server_to_client */ - buf_putbytes(ses.writepayload, opts.mac_list, strlen(opts.mac_list)); - } - else -#endif - { - /* mac_algorithms_client_to_server */ - buf_put_algolist(ses.writepayload, sshhashes); - /* mac_algorithms_server_to_client */ - buf_put_algolist(ses.writepayload, sshhashes); - } + /* mac_algorithms_client_to_server */ + buf_put_algolist(ses.writepayload, sshhashes); + + /* mac_algorithms_server_to_client */ + buf_put_algolist(ses.writepayload, sshhashes); /* compression_algorithms_client_to_server */
--- a/options.h Thu May 17 00:12:42 2012 +0800 +++ b/options.h Thu May 17 00:26:12 2012 +0800 @@ -81,7 +81,7 @@ #define ENABLE_CLI_NETCAT /* Whether to support "-c" and "-m" flags to choose ciphers/MACs at runtime */ -/* #define ENABLE_USER_ALGO_LIST*/ +#define ENABLE_USER_ALGO_LIST /* Encryption - at least one required. * Protocol RFC requires 3DES and recommends AES128 for interoperability.