| 781 |
} |
} |
| 782 |
} |
} |
| 783 |
|
|
| 784 |
// 公開鍵が等しいかを検証する |
|
| 785 |
|
// 公開鍵の比較を行う。 |
| 786 |
|
// |
| 787 |
|
// return |
| 788 |
// -1 ... 鍵の型が違う |
// -1 ... 鍵の型が違う |
| 789 |
// 0 ... 等しくない |
// 0 ... 等しくない |
| 790 |
// 1 ... 等しい |
// 1 ... 等しい |
| 791 |
static int match_key(PTInstVar pvar, Key *key) |
int HOSTS_compare_public_key(Key *src, Key *key) |
| 792 |
{ |
{ |
| 793 |
int bits; |
int bits; |
| 794 |
unsigned char FAR * exp; |
unsigned char FAR * exp; |
| 797 |
const EC_POINT *pa, *pb; |
const EC_POINT *pa, *pb; |
| 798 |
Key *a, *b; |
Key *a, *b; |
| 799 |
|
|
| 800 |
if (pvar->hosts_state.hostkey.type != key->type) { |
if (src->type != key->type) { |
| 801 |
return -1; |
return -1; |
| 802 |
} |
} |
| 803 |
|
|
| 808 |
mod = key->mod; |
mod = key->mod; |
| 809 |
|
|
| 810 |
/* just check for equal exponent and modulus */ |
/* just check for equal exponent and modulus */ |
| 811 |
return equal_mp_ints(exp, pvar->hosts_state.hostkey.exp) |
return equal_mp_ints(exp, src->exp) |
| 812 |
&& equal_mp_ints(mod, pvar->hosts_state.hostkey.mod); |
&& equal_mp_ints(mod, src->mod); |
| 813 |
/* |
/* |
| 814 |
return equal_mp_ints(exp, pvar->hosts_state.key_exp) |
return equal_mp_ints(exp, pvar->hosts_state.key_exp) |
| 815 |
&& equal_mp_ints(mod, pvar->hosts_state.key_mod); |
&& equal_mp_ints(mod, pvar->hosts_state.key_mod); |
| 816 |
*/ |
*/ |
| 817 |
|
|
| 818 |
case KEY_RSA: // SSH2 RSA host public key |
case KEY_RSA: // SSH2 RSA host public key |
| 819 |
return key->rsa != NULL && pvar->hosts_state.hostkey.rsa != NULL && |
return key->rsa != NULL && src->rsa != NULL && |
| 820 |
BN_cmp(key->rsa->e, pvar->hosts_state.hostkey.rsa->e) == 0 && |
BN_cmp(key->rsa->e, src->rsa->e) == 0 && |
| 821 |
BN_cmp(key->rsa->n, pvar->hosts_state.hostkey.rsa->n) == 0; |
BN_cmp(key->rsa->n, src->rsa->n) == 0; |
| 822 |
|
|
| 823 |
case KEY_DSA: // SSH2 DSA host public key |
case KEY_DSA: // SSH2 DSA host public key |
| 824 |
return key->dsa != NULL && pvar->hosts_state.hostkey.dsa && |
return key->dsa != NULL && src->dsa && |
| 825 |
BN_cmp(key->dsa->p, pvar->hosts_state.hostkey.dsa->p) == 0 && |
BN_cmp(key->dsa->p, src->dsa->p) == 0 && |
| 826 |
BN_cmp(key->dsa->q, pvar->hosts_state.hostkey.dsa->q) == 0 && |
BN_cmp(key->dsa->q, src->dsa->q) == 0 && |
| 827 |
BN_cmp(key->dsa->g, pvar->hosts_state.hostkey.dsa->g) == 0 && |
BN_cmp(key->dsa->g, src->dsa->g) == 0 && |
| 828 |
BN_cmp(key->dsa->pub_key, pvar->hosts_state.hostkey.dsa->pub_key) == 0; |
BN_cmp(key->dsa->pub_key, src->dsa->pub_key) == 0; |
| 829 |
|
|
| 830 |
case KEY_ECDSA256: |
case KEY_ECDSA256: |
| 831 |
case KEY_ECDSA384: |
case KEY_ECDSA384: |
| 832 |
case KEY_ECDSA521: |
case KEY_ECDSA521: |
| 833 |
if (key->ecdsa == NULL || pvar->hosts_state.hostkey.ecdsa == NULL) { |
if (key->ecdsa == NULL || src->ecdsa == NULL) { |
| 834 |
return FALSE; |
return FALSE; |
| 835 |
} |
} |
| 836 |
group = EC_KEY_get0_group(key->ecdsa); |
group = EC_KEY_get0_group(key->ecdsa); |
| 837 |
pa = EC_KEY_get0_public_key(key->ecdsa), |
pa = EC_KEY_get0_public_key(key->ecdsa), |
| 838 |
pb = EC_KEY_get0_public_key(pvar->hosts_state.hostkey.ecdsa); |
pb = EC_KEY_get0_public_key(src->ecdsa); |
| 839 |
return EC_POINT_cmp(group, pa, pb, NULL) == 0; |
return EC_POINT_cmp(group, pa, pb, NULL) == 0; |
| 840 |
|
|
| 841 |
case KEY_ED25519: |
case KEY_ED25519: |
| 842 |
a = key; |
a = key; |
| 843 |
b = &pvar->hosts_state.hostkey; |
b = src; |
| 844 |
return a->ed25519_pk != NULL && b->ed25519_pk != NULL && |
return a->ed25519_pk != NULL && b->ed25519_pk != NULL && |
| 845 |
memcmp(a->ed25519_pk, b->ed25519_pk, ED25519_PK_SZ) == 0; |
memcmp(a->ed25519_pk, b->ed25519_pk, ED25519_PK_SZ) == 0; |
| 846 |
|
|
| 847 |
default: |
default: |
| 848 |
return FALSE; |
return FALSE; |
| 849 |
} |
} |
| 850 |
|
} |
| 851 |
|
|
| 852 |
|
|
| 853 |
|
// 公開鍵が等しいかを検証する |
| 854 |
|
// -1 ... 鍵の型が違う |
| 855 |
|
// 0 ... 等しくない |
| 856 |
|
// 1 ... 等しい |
| 857 |
|
static int match_key(PTInstVar pvar, Key *key) |
| 858 |
|
{ |
| 859 |
|
return HOSTS_compare_public_key(&pvar->hosts_state.hostkey, key); |
| 860 |
} |
} |
| 861 |
|
|
| 862 |
static void init_hosts_dlg(PTInstVar pvar, HWND dlg) |
static void init_hosts_dlg(PTInstVar pvar, HWND dlg) |