| 102 |
typedef struct { |
typedef struct { |
| 103 |
int cnt; |
int cnt; |
| 104 |
HWND dlg; |
HWND dlg; |
| 105 |
enum ssh_keytype type; |
ssh_keytype type; |
| 106 |
} cbarg_t; |
} cbarg_t; |
| 107 |
|
|
| 108 |
/* WIN32 allows multiple instances of a DLL */ |
/* WIN32 allows multiple instances of a DLL */ |
| 178 |
init_TTSSH(pvar); |
init_TTSSH(pvar); |
| 179 |
} |
} |
| 180 |
|
|
| 181 |
|
static void normalize_generic_order(char *buf, char default_strings[], int default_strings_len) |
| 182 |
|
{ |
| 183 |
|
char listed[max(KEX_DH_MAX,max(SSH_CIPHER_MAX,max(KEY_MAX,max(HMAC_MAX,COMP_MAX)))) + 1]; |
| 184 |
|
char allowed[max(KEX_DH_MAX,max(SSH_CIPHER_MAX,max(KEY_MAX,max(HMAC_MAX,COMP_MAX)))) + 1]; |
| 185 |
|
int i, j; |
| 186 |
|
|
| 187 |
|
memset(listed, 0, sizeof(listed)); |
| 188 |
|
memset(allowed, 0, sizeof(allowed)); |
| 189 |
|
for (i = 0; i < default_strings_len ; i++) { |
| 190 |
|
allowed[default_strings[i]] = 1; |
| 191 |
|
} |
| 192 |
|
|
| 193 |
|
for (i = 0; buf[i] != 0; i++) { |
| 194 |
|
int num = buf[i] - '0'; |
| 195 |
|
|
| 196 |
|
if (num < 0 || num > default_strings_len |
| 197 |
|
|| !allowed[num] |
| 198 |
|
|| listed[num]) { |
| 199 |
|
memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1); |
| 200 |
|
i--; |
| 201 |
|
} else { |
| 202 |
|
listed[num] = 1; |
| 203 |
|
} |
| 204 |
|
} |
| 205 |
|
|
| 206 |
|
for (j = 0; j < default_strings_len ; j++) { |
| 207 |
|
int num = default_strings[j]; |
| 208 |
|
|
| 209 |
|
if (!listed[num]) { |
| 210 |
|
buf[i] = num + '0'; |
| 211 |
|
i++; |
| 212 |
|
} |
| 213 |
|
} |
| 214 |
|
|
| 215 |
|
buf[i] = 0; |
| 216 |
|
} |
| 217 |
|
|
| 218 |
/* |
/* |
| 219 |
* Remove unsupported cipher or duplicated cipher. |
* Remove unsupported cipher or duplicated cipher. |
| 220 |
* Add unspecified ciphers at the end of list. |
* Add unspecified ciphers at the end of list. |
| 221 |
*/ |
*/ |
| 222 |
static void normalize_cipher_order(char FAR * buf) |
static void normalize_cipher_order(char FAR * buf) |
| 223 |
{ |
{ |
|
char ciphers_listed[SSH_CIPHER_MAX + 1]; |
|
|
char ciphers_allowed[SSH_CIPHER_MAX + 1]; |
|
|
int i, j; |
|
|
|
|
| 224 |
/* SSH_CIPHER_NONE means that all ciphers below that one are disabled. |
/* SSH_CIPHER_NONE means that all ciphers below that one are disabled. |
| 225 |
We *never* allow no encryption. */ |
We *never* allow no encryption. */ |
| 226 |
#if 0 |
#if 0 |
| 227 |
static char default_ciphers[] = { |
static char default_strings[] = { |
| 228 |
SSH_CIPHER_3DES, |
SSH_CIPHER_3DES, |
| 229 |
SSH_CIPHER_NONE, |
SSH_CIPHER_NONE, |
| 230 |
SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH |
SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH |
| 231 |
}; |
}; |
| 232 |
#else |
#else |
| 233 |
// for SSH2(yutaka) |
// for SSH2(yutaka) |
| 234 |
static char default_ciphers[] = { |
static char default_strings[] = { |
| 235 |
SSH2_CIPHER_AES256_CTR, |
SSH2_CIPHER_AES256_CTR, |
| 236 |
SSH2_CIPHER_AES256_CBC, |
SSH2_CIPHER_AES256_CBC, |
| 237 |
SSH2_CIPHER_AES192_CTR, |
SSH2_CIPHER_AES192_CTR, |
| 254 |
}; |
}; |
| 255 |
#endif |
#endif |
| 256 |
|
|
| 257 |
memset(ciphers_listed, 0, sizeof(ciphers_listed)); |
normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings)); |
|
|
|
|
memset(ciphers_allowed, 0, sizeof(ciphers_allowed)); |
|
|
for (i = 0; i < NUM_ELEM(default_ciphers); i++) { |
|
|
ciphers_allowed[default_ciphers[i]] = 1; |
|
|
} |
|
|
|
|
|
for (i = 0; buf[i] != 0; i++) { |
|
|
int cipher_num = buf[i] - '0'; |
|
|
|
|
|
if (cipher_num < 0 || cipher_num > SSH_CIPHER_MAX |
|
|
|| !ciphers_allowed[cipher_num] |
|
|
|| ciphers_listed[cipher_num]) { |
|
|
memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1); |
|
|
i--; |
|
|
} else { |
|
|
ciphers_listed[cipher_num] = 1; |
|
|
} |
|
|
} |
|
|
|
|
|
for (j = 0; j < NUM_ELEM(default_ciphers); j++) { |
|
|
int cipher_num = default_ciphers[j]; |
|
|
|
|
|
if (!ciphers_listed[cipher_num]) { |
|
|
buf[i] = cipher_num + '0'; |
|
|
i++; |
|
|
} |
|
|
} |
|
|
|
|
|
buf[i] = 0; |
|
|
} |
|
|
|
|
|
static void normalize_generic_order(char *buf, char default_strings[], int default_strings_len) |
|
|
{ |
|
|
char listed[KEX_DH_MAX + 1]; |
|
|
char allowed[KEX_DH_MAX + 1]; |
|
|
int i, j; |
|
|
|
|
|
memset(listed, 0, sizeof(listed)); |
|
|
memset(allowed, 0, sizeof(allowed)); |
|
|
for (i = 0; i < default_strings_len ; i++) { |
|
|
allowed[default_strings[i]] = 1; |
|
|
} |
|
|
|
|
|
for (i = 0; buf[i] != 0; i++) { |
|
|
int num = buf[i] - '0'; |
|
|
|
|
|
if (num < 0 || num > default_strings_len |
|
|
|| !allowed[num] |
|
|
|| listed[num]) { |
|
|
memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1); |
|
|
i--; |
|
|
} else { |
|
|
listed[num] = 1; |
|
|
} |
|
|
} |
|
|
|
|
|
for (j = 0; j < default_strings_len ; j++) { |
|
|
int num = default_strings[j]; |
|
|
|
|
|
if (!listed[num]) { |
|
|
buf[i] = num + '0'; |
|
|
i++; |
|
|
} |
|
|
} |
|
|
|
|
|
buf[i] = 0; |
|
| 258 |
} |
} |
| 259 |
|
|
| 260 |
static void normalize_kex_order(char FAR * buf) |
static void normalize_kex_order(char FAR * buf) |
| 303 |
static char default_strings[] = { |
static char default_strings[] = { |
| 304 |
COMP_DELAYED, |
COMP_DELAYED, |
| 305 |
COMP_ZLIB, |
COMP_ZLIB, |
| 306 |
|
COMP_NOCOMP, |
| 307 |
COMP_NONE, |
COMP_NONE, |
| 308 |
}; |
}; |
| 309 |
|
|
| 2323 |
UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:"); |
UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:"); |
| 2324 |
append_about_text(dlg, pvar->ts->UIMsg, buf); |
append_about_text(dlg, pvar->ts->UIMsg, buf); |
| 2325 |
|
|
| 2326 |
append_about_text(dlg, "KEX:", ssh2_kex_algorithms[pvar->kex_type].name); |
append_about_text(dlg, "KEX:", get_kex_algorithm_name(pvar->kex_type)); |
| 2327 |
|
|
| 2328 |
strncpy_s(buf, sizeof(buf), get_sshname_from_keytype(pvar->hostkey_type), _TRUNCATE); |
strncpy_s(buf, sizeof(buf), get_ssh_keytype_name(pvar->hostkey_type), _TRUNCATE); |
| 2329 |
UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:"); |
UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:"); |
| 2330 |
append_about_text(dlg, pvar->ts->UIMsg, buf); |
append_about_text(dlg, pvar->ts->UIMsg, buf); |
| 2331 |
|
|
| 2332 |
// add HMAC algorithm (2004.12.17 yutaka) |
// add HMAC algorithm (2004.12.17 yutaka) |
| 2333 |
buf[0] = '\0'; |
buf[0] = '\0'; |
| 2334 |
strncat_s(buf, sizeof(buf), ssh2_macs[pvar->ctos_hmac].name , _TRUNCATE); |
strncat_s(buf, sizeof(buf), get_ssh2_mac_name(pvar->ctos_hmac) , _TRUNCATE); |
| 2335 |
UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server,"); |
UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server,"); |
| 2336 |
strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE); |
strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE); |
| 2337 |
strncat_s(buf, sizeof(buf), ssh2_macs[pvar->stoc_hmac].name , _TRUNCATE); |
strncat_s(buf, sizeof(buf), get_ssh2_mac_name(pvar->stoc_hmac) , _TRUNCATE); |
| 2338 |
UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server"); |
UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server"); |
| 2339 |
strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE); |
strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE); |
| 2340 |
append_about_text(dlg, "HMAC:", buf); |
append_about_text(dlg, "HMAC:", buf); |
| 2948 |
RSA *rsa; |
RSA *rsa; |
| 2949 |
DSA *dsa; |
DSA *dsa; |
| 2950 |
EC_KEY *ecdsa; |
EC_KEY *ecdsa; |
| 2951 |
enum ssh_keytype type; |
ssh_keytype type; |
| 2952 |
} ssh_private_key_t; |
} ssh_private_key_t; |
| 2953 |
|
|
| 2954 |
static ssh_private_key_t private_key = {NULL, NULL, NULL, KEY_UNSPEC}; |
static ssh_private_key_t private_key = {NULL, NULL, NULL, KEY_UNSPEC}; |
| 2957 |
RSA *rsa; |
RSA *rsa; |
| 2958 |
DSA *dsa; |
DSA *dsa; |
| 2959 |
EC_KEY *ecdsa; |
EC_KEY *ecdsa; |
| 2960 |
enum ssh_keytype type; |
ssh_keytype type; |
| 2961 |
} ssh_public_key_t; |
} ssh_public_key_t; |
| 2962 |
|
|
| 2963 |
static ssh_public_key_t public_key = {NULL, NULL, NULL, KEY_UNSPEC}; |
static ssh_public_key_t public_key = {NULL, NULL, NULL, KEY_UNSPEC}; |
| 2984 |
public_key.type = KEY_UNSPEC; |
public_key.type = KEY_UNSPEC; |
| 2985 |
} |
} |
| 2986 |
|
|
| 2987 |
static BOOL generate_ssh_key(enum ssh_keytype type, int bits, void (*cbfunc)(int, int, void *), void *cbarg) |
static BOOL generate_ssh_key(ssh_keytype type, int bits, void (*cbfunc)(int, int, void *), void *cbarg) |
| 2988 |
{ |
{ |
| 2989 |
// if SSH key already is generated, should free the resource. |
// if SSH key already is generated, should free the resource. |
| 2990 |
free_ssh_key(); |
free_ssh_key(); |
| 3573 |
static BOOL CALLBACK TTXKeyGenerator(HWND dlg, UINT msg, WPARAM wParam, |
static BOOL CALLBACK TTXKeyGenerator(HWND dlg, UINT msg, WPARAM wParam, |
| 3574 |
LPARAM lParam) |
LPARAM lParam) |
| 3575 |
{ |
{ |
| 3576 |
static enum ssh_keytype key_type; |
static ssh_keytype key_type; |
| 3577 |
static int saved_key_bits; |
static int saved_key_bits; |
| 3578 |
char uimsg[MAX_UIMSG]; |
char uimsg[MAX_UIMSG]; |
| 3579 |
LOGFONT logfont; |
LOGFONT logfont; |
| 3930 |
case KEY_ECDSA256: // ECDSA |
case KEY_ECDSA256: // ECDSA |
| 3931 |
case KEY_ECDSA384: |
case KEY_ECDSA384: |
| 3932 |
case KEY_ECDSA521: |
case KEY_ECDSA521: |
| 3933 |
keyname = get_sshname_from_keytype(public_key.type); |
keyname = get_ssh_keytype_name(public_key.type); |
| 3934 |
buffer_put_string(b, keyname, strlen(keyname)); |
buffer_put_string(b, keyname, strlen(keyname)); |
| 3935 |
s = curve_keytype_to_name(public_key.type); |
s = curve_keytype_to_name(public_key.type); |
| 3936 |
buffer_put_string(b, s, strlen(s)); |
buffer_put_string(b, s, strlen(s)); |