| 642 |
pvar->hosts_state.hostkey.type = key->type; |
pvar->hosts_state.hostkey.type = key->type; |
| 643 |
pvar->hosts_state.hostkey.dsa = key->dsa; |
pvar->hosts_state.hostkey.dsa = key->dsa; |
| 644 |
pvar->hosts_state.hostkey.rsa = key->rsa; |
pvar->hosts_state.hostkey.rsa = key->rsa; |
| 645 |
|
pvar->hosts_state.hostkey.ecdsa = key->ecdsa; |
| 646 |
|
|
| 647 |
index += eat_base64(data + index); |
index += eat_base64(data + index); |
| 648 |
index += eat_spaces(data + index); |
index += eat_spaces(data + index); |
| 792 |
int bits; |
int bits; |
| 793 |
unsigned char FAR * exp; |
unsigned char FAR * exp; |
| 794 |
unsigned char FAR * mod; |
unsigned char FAR * mod; |
| 795 |
|
const EC_GROUP *group; |
| 796 |
|
const EC_POINT *pa, *pb; |
| 797 |
|
|
| 798 |
if (key->type == KEY_RSA1) { // SSH1 host public key |
switch (key->type) { |
| 799 |
|
case KEY_RSA1: // SSH1 host public key |
| 800 |
bits = key->bits; |
bits = key->bits; |
| 801 |
exp = key->exp; |
exp = key->exp; |
| 802 |
mod = key->mod; |
mod = key->mod; |
| 809 |
&& equal_mp_ints(mod, pvar->hosts_state.key_mod); |
&& equal_mp_ints(mod, pvar->hosts_state.key_mod); |
| 810 |
*/ |
*/ |
| 811 |
|
|
| 812 |
} else if (key->type == KEY_RSA) { // SSH2 RSA host public key |
case KEY_RSA: // SSH2 RSA host public key |
|
|
|
| 813 |
return key->rsa != NULL && pvar->hosts_state.hostkey.rsa != NULL && |
return key->rsa != NULL && pvar->hosts_state.hostkey.rsa != NULL && |
| 814 |
BN_cmp(key->rsa->e, pvar->hosts_state.hostkey.rsa->e) == 0 && |
BN_cmp(key->rsa->e, pvar->hosts_state.hostkey.rsa->e) == 0 && |
| 815 |
BN_cmp(key->rsa->n, pvar->hosts_state.hostkey.rsa->n) == 0; |
BN_cmp(key->rsa->n, pvar->hosts_state.hostkey.rsa->n) == 0; |
| 816 |
|
|
| 817 |
} else if (key->type == KEY_DSA) { // SSH2 DSA host public key |
case KEY_DSA: // SSH2 DSA host public key |
|
|
|
| 818 |
return key->dsa != NULL && pvar->hosts_state.hostkey.dsa && |
return key->dsa != NULL && pvar->hosts_state.hostkey.dsa && |
| 819 |
BN_cmp(key->dsa->p, pvar->hosts_state.hostkey.dsa->p) == 0 && |
BN_cmp(key->dsa->p, pvar->hosts_state.hostkey.dsa->p) == 0 && |
| 820 |
BN_cmp(key->dsa->q, pvar->hosts_state.hostkey.dsa->q) == 0 && |
BN_cmp(key->dsa->q, pvar->hosts_state.hostkey.dsa->q) == 0 && |
| 821 |
BN_cmp(key->dsa->g, pvar->hosts_state.hostkey.dsa->g) == 0 && |
BN_cmp(key->dsa->g, pvar->hosts_state.hostkey.dsa->g) == 0 && |
| 822 |
BN_cmp(key->dsa->pub_key, pvar->hosts_state.hostkey.dsa->pub_key) == 0; |
BN_cmp(key->dsa->pub_key, pvar->hosts_state.hostkey.dsa->pub_key) == 0; |
| 823 |
|
|
| 824 |
} |
case KEY_ECDSA256: |
| 825 |
else { |
case KEY_ECDSA384: |
| 826 |
|
case KEY_ECDSA521: |
| 827 |
|
if (key->ecdsa == NULL || pvar->hosts_state.hostkey.ecdsa == NULL) { |
| 828 |
|
return FALSE; |
| 829 |
|
} |
| 830 |
|
group = EC_KEY_get0_group(key->ecdsa); |
| 831 |
|
pa = EC_KEY_get0_public_key(key->ecdsa), |
| 832 |
|
pb = EC_KEY_get0_public_key(pvar->hosts_state.hostkey.ecdsa); |
| 833 |
|
return EC_POINT_cmp(group, pa, pb, NULL) == 0; |
| 834 |
|
|
| 835 |
|
default: |
| 836 |
return FALSE; |
return FALSE; |
| 837 |
} |
} |
| 838 |
|
|
| 906 |
int index; |
int index; |
| 907 |
enum ssh_keytype type = pvar->hosts_state.hostkey.type; |
enum ssh_keytype type = pvar->hosts_state.hostkey.type; |
| 908 |
|
|
| 909 |
if (type == KEY_RSA1) { |
switch (type) { |
| 910 |
|
case KEY_RSA1: |
| 911 |
|
{ |
| 912 |
int result_len = host_len + 50 + 8 + |
int result_len = host_len + 50 + 8 + |
| 913 |
get_ushort16_MSBfirst(pvar->hosts_state.hostkey.exp) / 3 + |
get_ushort16_MSBfirst(pvar->hosts_state.hostkey.exp) / 3 + |
| 914 |
get_ushort16_MSBfirst(pvar->hosts_state.hostkey.mod) / 3; |
get_ushort16_MSBfirst(pvar->hosts_state.hostkey.mod) / 3; |
| 934 |
index += print_mp_int(result + index, pvar->hosts_state.hostkey.mod); |
index += print_mp_int(result + index, pvar->hosts_state.hostkey.mod); |
| 935 |
strncpy_s(result + index, result_len - index, " \r\n", _TRUNCATE); |
strncpy_s(result + index, result_len - index, " \r\n", _TRUNCATE); |
| 936 |
|
|
| 937 |
} else if (type == KEY_RSA || type == KEY_DSA) { |
break; |
| 938 |
|
} |
| 939 |
|
|
| 940 |
|
case KEY_RSA: |
| 941 |
|
case KEY_DSA: |
| 942 |
|
case KEY_ECDSA256: |
| 943 |
|
case KEY_ECDSA384: |
| 944 |
|
case KEY_ECDSA521: |
| 945 |
|
{ |
| 946 |
Key *key = &pvar->hosts_state.hostkey; |
Key *key = &pvar->hosts_state.hostkey; |
| 947 |
char *blob = NULL; |
char *blob = NULL; |
| 948 |
int blen, uulen, msize; |
int blen, uulen, msize; |
| 983 |
if (uu != NULL) |
if (uu != NULL) |
| 984 |
free(uu); |
free(uu); |
| 985 |
|
|
| 986 |
} else { |
break; |
| 987 |
|
} |
| 988 |
|
|
| 989 |
|
default: |
| 990 |
return NULL; |
return NULL; |
| 991 |
|
|
| 992 |
} |
} |
| 1107 |
} |
} |
| 1108 |
|
|
| 1109 |
// 接続中のサーバのキーを読み込む |
// 接続中のサーバのキーを読み込む |
| 1110 |
if (pvar->hosts_state.hostkey.type == KEY_RSA1) { // SSH1 |
switch (pvar->hosts_state.hostkey.type) { |
| 1111 |
|
case KEY_RSA1: // SSH1 |
| 1112 |
key.type = KEY_RSA1; |
key.type = KEY_RSA1; |
| 1113 |
key.bits = pvar->hosts_state.hostkey.bits; |
key.bits = pvar->hosts_state.hostkey.bits; |
| 1114 |
key.exp = copy_mp_int(pvar->hosts_state.hostkey.exp); |
key.exp = copy_mp_int(pvar->hosts_state.hostkey.exp); |
| 1115 |
key.mod = copy_mp_int(pvar->hosts_state.hostkey.mod); |
key.mod = copy_mp_int(pvar->hosts_state.hostkey.mod); |
| 1116 |
} else if (pvar->hosts_state.hostkey.type == KEY_RSA) { // SSH2 RSA |
break; |
| 1117 |
|
case KEY_RSA: // SSH2 RSA |
| 1118 |
key.type = KEY_RSA; |
key.type = KEY_RSA; |
| 1119 |
key.rsa = duplicate_RSA(pvar->hosts_state.hostkey.rsa); |
key.rsa = duplicate_RSA(pvar->hosts_state.hostkey.rsa); |
| 1120 |
} else { // SSH2 DSA |
break; |
| 1121 |
|
case KEY_DSA: // SSH2 DSA |
| 1122 |
key.type = KEY_DSA; |
key.type = KEY_DSA; |
| 1123 |
key.dsa = duplicate_DSA(pvar->hosts_state.hostkey.dsa); |
key.dsa = duplicate_DSA(pvar->hosts_state.hostkey.dsa); |
| 1124 |
|
break; |
| 1125 |
|
case KEY_ECDSA256: |
| 1126 |
|
case KEY_ECDSA384: |
| 1127 |
|
case KEY_ECDSA521: |
| 1128 |
|
key.type = pvar->hosts_state.hostkey.type; |
| 1129 |
|
key.ecdsa = EC_KEY_dup(pvar->hosts_state.hostkey.ecdsa); |
| 1130 |
|
break; |
| 1131 |
} |
} |
| 1132 |
|
|
| 1133 |
// ファイルから読み込む |
// ファイルから読み込む |
| 1567 |
|
|
| 1568 |
// known_hosts に存在しないキーはあとでファイルへ書き込むために、ここで保存しておく。 |
// known_hosts に存在しないキーはあとでファイルへ書き込むために、ここで保存しておく。 |
| 1569 |
pvar->hosts_state.hostkey.type = key->type; |
pvar->hosts_state.hostkey.type = key->type; |
| 1570 |
if (key->type == KEY_RSA1) { // SSH1 |
switch (key->type) { |
| 1571 |
|
case KEY_RSA1: // SSH1 |
| 1572 |
pvar->hosts_state.hostkey.bits = key->bits; |
pvar->hosts_state.hostkey.bits = key->bits; |
| 1573 |
pvar->hosts_state.hostkey.exp = copy_mp_int(key->exp); |
pvar->hosts_state.hostkey.exp = copy_mp_int(key->exp); |
| 1574 |
pvar->hosts_state.hostkey.mod = copy_mp_int(key->mod); |
pvar->hosts_state.hostkey.mod = copy_mp_int(key->mod); |
| 1575 |
|
break; |
| 1576 |
} else if (key->type == KEY_RSA) { // SSH2 RSA |
case KEY_RSA: // SSH2 RSA |
| 1577 |
pvar->hosts_state.hostkey.rsa = duplicate_RSA(key->rsa); |
pvar->hosts_state.hostkey.rsa = duplicate_RSA(key->rsa); |
| 1578 |
|
break; |
| 1579 |
} else { // SSH2 DSA |
case KEY_DSA: // SSH2 DSA |
| 1580 |
pvar->hosts_state.hostkey.dsa = duplicate_DSA(key->dsa); |
pvar->hosts_state.hostkey.dsa = duplicate_DSA(key->dsa); |
| 1581 |
|
break; |
| 1582 |
|
case KEY_ECDSA256: // SSH2 ECDSA |
| 1583 |
|
case KEY_ECDSA384: |
| 1584 |
|
case KEY_ECDSA521: |
| 1585 |
|
pvar->hosts_state.hostkey.ecdsa = EC_KEY_dup(key->ecdsa); |
| 1586 |
|
break; |
| 1587 |
} |
} |
| 1588 |
free(pvar->hosts_state.prefetched_hostname); |
free(pvar->hosts_state.prefetched_hostname); |
| 1589 |
pvar->hosts_state.prefetched_hostname = _strdup(hostname); |
pvar->hosts_state.prefetched_hostname = _strdup(hostname); |