| 32 |
|
|
| 33 |
|
|
| 34 |
struct ssh2_host_key_t { |
struct ssh2_host_key_t { |
| 35 |
|
ssh_keyalgo algo; |
| 36 |
ssh_keytype type; |
ssh_keytype type; |
| 37 |
|
int digest_type; |
| 38 |
char *name; |
char *name; |
| 39 |
}; |
}; |
| 40 |
|
|
| 41 |
static const struct ssh2_host_key_t ssh2_host_key[] = { |
static const struct ssh2_host_key_t ssh2_host_key[] = { |
| 42 |
{KEY_RSA1, "ssh-rsa1"}, // for SSH1 only |
{KEY_ALGO_RSA1, KEY_RSA1, NID_sha1, "ssh-rsa1"}, // for SSH1 only |
| 43 |
{KEY_RSA, "ssh-rsa"}, // RFC4253 |
{KEY_ALGO_RSA, KEY_RSA, NID_sha1, "ssh-rsa"}, // RFC4253 |
| 44 |
{KEY_DSA, "ssh-dss"}, // RFC4253 |
{KEY_ALGO_DSA, KEY_DSA, NID_sha1, "ssh-dss"}, // RFC4253 |
| 45 |
{KEY_ECDSA256, "ecdsa-sha2-nistp256"}, // RFC5656 |
{KEY_ALGO_ECDSA256, KEY_ECDSA256, NID_sha256, "ecdsa-sha2-nistp256"}, // RFC5656 |
| 46 |
{KEY_ECDSA384, "ecdsa-sha2-nistp384"}, // RFC5656 |
{KEY_ALGO_ECDSA384, KEY_ECDSA384, NID_sha384, "ecdsa-sha2-nistp384"}, // RFC5656 |
| 47 |
{KEY_ECDSA521, "ecdsa-sha2-nistp521"}, // RFC5656 |
{KEY_ALGO_ECDSA521, KEY_ECDSA521, NID_sha512, "ecdsa-sha2-nistp521"}, // RFC5656 |
| 48 |
{KEY_ED25519, "ssh-ed25519"}, // draft-bjh21-ssh-ed25519-02 |
{KEY_ALGO_ED25519, KEY_ED25519, NID_sha512, "ssh-ed25519"}, // RDC8709 |
| 49 |
{KEY_UNSPEC, "ssh-unknown"}, |
{KEY_ALGO_UNSPEC, KEY_UNSPEC, NID_undef, "ssh-unknown"}, |
| 50 |
{KEY_NONE, NULL}, |
{KEY_ALGO_NONE, KEY_NONE, NID_undef, NULL}, |
| 51 |
}; |
}; |
| 52 |
|
|
| 53 |
struct ssh_digest_t { |
struct ssh_digest_t { |
| 111 |
return get_ssh2_hostkey_type_name(key->type); |
return get_ssh2_hostkey_type_name(key->type); |
| 112 |
} |
} |
| 113 |
|
|
| 114 |
|
char* get_ssh2_keyalgo_name(ssh_keyalgo algo) |
| 115 |
|
{ |
| 116 |
|
const struct ssh2_host_key_t *ptr = ssh2_host_key; |
| 117 |
|
|
| 118 |
|
while (ptr->name != NULL) { |
| 119 |
|
if (algo == ptr->algo) { |
| 120 |
|
return ptr->name; |
| 121 |
|
} |
| 122 |
|
ptr++; |
| 123 |
|
} |
| 124 |
|
|
| 125 |
|
// not found. |
| 126 |
|
return "ssh-unknown"; |
| 127 |
|
} |
| 128 |
|
|
| 129 |
|
ssh_keyalgo get_ssh2_keyalgo_from_name(const char *name) |
| 130 |
|
{ |
| 131 |
|
const struct ssh2_host_key_t *ptr = ssh2_host_key; |
| 132 |
|
|
| 133 |
|
while (ptr->name != NULL) { |
| 134 |
|
if (strcmp(name, ptr->name) == 0) { |
| 135 |
|
return ptr->algo; |
| 136 |
|
} |
| 137 |
|
ptr++; |
| 138 |
|
} |
| 139 |
|
|
| 140 |
|
// not found. |
| 141 |
|
return KEY_ALGO_UNSPEC; |
| 142 |
|
} |
| 143 |
|
|
| 144 |
|
int get_ssh2_keyalgo_hashtype(ssh_keyalgo algo) |
| 145 |
|
{ |
| 146 |
|
const struct ssh2_host_key_t *ptr = ssh2_host_key; |
| 147 |
|
|
| 148 |
|
while (ptr->name != NULL) { |
| 149 |
|
if (algo == ptr->algo) { |
| 150 |
|
return ptr->digest_type; |
| 151 |
|
} |
| 152 |
|
ptr++; |
| 153 |
|
} |
| 154 |
|
|
| 155 |
|
// not found. |
| 156 |
|
return NID_sha1; |
| 157 |
|
} |
| 158 |
|
|
| 159 |
|
ssh_keytype get_ssh2_keytype_from_keyalgo(ssh_keyalgo algo) |
| 160 |
|
{ |
| 161 |
|
const struct ssh2_host_key_t *ptr = ssh2_host_key; |
| 162 |
|
|
| 163 |
|
while (ptr->name != NULL) { |
| 164 |
|
if (algo == ptr->algo) { |
| 165 |
|
return ptr->type; |
| 166 |
|
} |
| 167 |
|
ptr++; |
| 168 |
|
} |
| 169 |
|
|
| 170 |
|
// not found. |
| 171 |
|
return KEY_UNSPEC; |
| 172 |
|
} |
| 173 |
|
|
| 174 |
|
const char* get_ssh2_keytype_name_from_keyalgo(ssh_keyalgo algo) |
| 175 |
|
{ |
| 176 |
|
return get_ssh2_hostkey_type_name(get_ssh2_keytype_from_keyalgo(algo)); |
| 177 |
|
} |
| 178 |
|
|
| 179 |
char* get_digest_algorithm_name(digest_algorithm id) |
char* get_digest_algorithm_name(digest_algorithm id) |
| 180 |
{ |
{ |
| 181 |
const struct ssh_digest_t *ptr = ssh_digests; |
const struct ssh_digest_t *ptr = ssh_digests; |
| 194 |
void normalize_host_key_order(char *buf) |
void normalize_host_key_order(char *buf) |
| 195 |
{ |
{ |
| 196 |
static char default_strings[] = { |
static char default_strings[] = { |
| 197 |
KEY_ECDSA256, |
KEY_ALGO_ECDSA256, |
| 198 |
KEY_ECDSA384, |
KEY_ALGO_ECDSA384, |
| 199 |
KEY_ECDSA521, |
KEY_ALGO_ECDSA521, |
| 200 |
KEY_ED25519, |
KEY_ALGO_ED25519, |
| 201 |
KEY_RSA, |
KEY_ALGO_RSA, |
| 202 |
KEY_DSA, |
KEY_ALGO_DSA, |
| 203 |
KEY_NONE, |
KEY_ALGO_NONE, |
| 204 |
}; |
}; |
| 205 |
|
|
| 206 |
normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings)); |
normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings)); |
| 207 |
} |
} |
| 208 |
|
|
| 209 |
ssh_keytype choose_SSH2_host_key_algorithm(char *server_proposal, char *my_proposal) |
ssh_keyalgo choose_SSH2_host_key_algorithm(char *server_proposal, char *my_proposal) |
| 210 |
{ |
{ |
| 211 |
ssh_keytype type = KEY_UNSPEC; |
ssh_keytype type = KEY_UNSPEC; |
| 212 |
char str_keytype[20]; |
char str_keytype[20]; |
| 214 |
|
|
| 215 |
choose_SSH2_proposal(server_proposal, my_proposal, str_keytype, sizeof(str_keytype)); |
choose_SSH2_proposal(server_proposal, my_proposal, str_keytype, sizeof(str_keytype)); |
| 216 |
|
|
| 217 |
while (ptr->name != NULL) { |
return get_ssh2_keyalgo_from_name(str_keytype); |
|
if (strcmp(ptr->name, str_keytype) == 0) { |
|
|
type = ptr->type; |
|
|
break; |
|
|
} |
|
|
ptr++; |
|
|
} |
|
|
|
|
|
return (type); |
|
| 218 |
} |
} |
| 219 |
|
|
| 220 |
// Host Keyアルゴリズム優先順位に応じて、myproposal[]を書き換える。 |
// Host Keyアルゴリズム優先順位に応じて、myproposal[]を書き換える。 |
| 235 |
index = pvar->settings.HostKeyOrder[i] - '0'; |
index = pvar->settings.HostKeyOrder[i] - '0'; |
| 236 |
if (index == KEY_NONE) // disabled line |
if (index == KEY_NONE) // disabled line |
| 237 |
break; |
break; |
| 238 |
strncat_s(buf, sizeof(buf), get_ssh2_hostkey_type_name(index), _TRUNCATE); |
strncat_s(buf, sizeof(buf), get_ssh2_keyalgo_name(index), _TRUNCATE); |
| 239 |
strncat_s(buf, sizeof(buf), ",", _TRUNCATE); |
strncat_s(buf, sizeof(buf), ",", _TRUNCATE); |
| 240 |
} |
} |
| 241 |
len = strlen(buf); |
len = strlen(buf); |