| 666 |
return 0; |
return 0; |
| 667 |
} |
} |
| 668 |
|
|
| 669 |
|
static char * |
| 670 |
|
key_fingerprint_hash(u_char *dgst_raw, u_int dgst_raw_len) |
| 671 |
|
{ |
| 672 |
|
char *retval; |
| 673 |
|
unsigned int i, retval_len; |
| 674 |
|
|
| 675 |
|
retval_len = dgst_raw_len * 3 + 1; |
| 676 |
|
retval = malloc(retval_len); |
| 677 |
|
retval[0] = '\0'; |
| 678 |
|
for (i = 0; i < dgst_raw_len; i++) { |
| 679 |
|
char hex[4]; |
| 680 |
|
_snprintf_s(hex, sizeof(hex), _TRUNCATE, "%02x:", dgst_raw[i]); |
| 681 |
|
strncat_s(retval, retval_len, hex, _TRUNCATE); |
| 682 |
|
} |
| 683 |
|
|
| 684 |
|
/* Remove the trailing ':' character */ |
| 685 |
|
retval[(dgst_raw_len * 3) - 1] = '\0'; |
| 686 |
|
|
| 687 |
|
return (retval); |
| 688 |
|
} |
| 689 |
|
|
| 690 |
// based on OpenSSH 5.1 |
// based on OpenSSH 5.1 |
| 691 |
#define FLDBASE 8 |
#define FLDBASE 8 |
| 692 |
#define FLDSIZE_Y (FLDBASE + 1) |
#define FLDSIZE_Y (FLDBASE + 1) |
| 774 |
// |
// |
| 775 |
// fingerprint(指紋:ホスト公開鍵のハッシュ)を生成する |
// fingerprint(指紋:ホスト公開鍵のハッシュ)を生成する |
| 776 |
// |
// |
| 777 |
char *key_fingerprint(Key *key, enum fp_rep dgst_rep) |
char *key_fingerprint(Key *key, enum fp_rep dgst_rep, enum fp_type dgst_type) |
| 778 |
{ |
{ |
| 779 |
char *retval = NULL; |
char *retval = NULL; |
| 780 |
unsigned char *dgst_raw; |
unsigned char *dgst_raw; |
| 781 |
int dgst_raw_len; |
int dgst_raw_len; |
|
int i, retval_len; |
|
| 782 |
|
|
| 783 |
// fingerprintのハッシュ値(バイナリ)を求める |
// fingerprintのハッシュ値(バイナリ)を求める |
| 784 |
dgst_raw = key_fingerprint_raw(key, SSH_FP_MD5, &dgst_raw_len); |
dgst_raw = key_fingerprint_raw(key, dgst_type, &dgst_raw_len); |
| 785 |
if (dgst_raw == NULL) |
if (dgst_raw == NULL) |
| 786 |
return NULL; |
return NULL; |
| 787 |
|
|
| 788 |
if (dgst_rep == SSH_FP_HEX) { |
if (dgst_rep == SSH_FP_HEX) { |
| 789 |
// 16進表記へ変換する |
retval = key_fingerprint_hash(dgst_raw, dgst_raw_len); |
|
retval_len = dgst_raw_len * 3 + 1; |
|
|
retval = malloc(retval_len); |
|
|
retval[0] = '\0'; |
|
|
for (i = 0; i < dgst_raw_len; i++) { |
|
|
char hex[4]; |
|
|
_snprintf_s(hex, sizeof(hex), _TRUNCATE, "%02x:", dgst_raw[i]); |
|
|
strncat_s(retval, retval_len, hex, _TRUNCATE); |
|
|
} |
|
|
|
|
|
/* Remove the trailing ':' character */ |
|
|
retval[(dgst_raw_len * 3) - 1] = '\0'; |
|
| 790 |
|
|
| 791 |
} else if (dgst_rep == SSH_FP_RANDOMART) { |
} else if (dgst_rep == SSH_FP_RANDOMART) { |
| 792 |
retval = key_fingerprint_randomart(dgst_raw, dgst_raw_len, key); |
retval = key_fingerprint_randomart(dgst_raw, dgst_raw_len, key); |
| 1963 |
for (i = 0; i < ctx->nkeys; i++) { |
for (i = 0; i < ctx->nkeys; i++) { |
| 1964 |
if (ctx->keys_seen[i]) |
if (ctx->keys_seen[i]) |
| 1965 |
continue; |
continue; |
| 1966 |
fp = key_fingerprint(ctx->keys[i], SSH_FP_HEX); |
fp = key_fingerprint(ctx->keys[i], SSH_FP_HEX, SSH_FP_MD5); |
| 1967 |
buf[0] = 0; |
buf[0] = 0; |
| 1968 |
strcat_s(buf, sizeof(buf), get_sshname_from_key(ctx->keys[i])); |
strcat_s(buf, sizeof(buf), get_sshname_from_key(ctx->keys[i])); |
| 1969 |
strcat_s(buf, sizeof(buf), " "); |
strcat_s(buf, sizeof(buf), " "); |
| 1978 |
_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, ctx->nold); |
_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, ctx->nold); |
| 1979 |
SetDlgItemText(dlg, IDC_REMOVEKEY_TEXT, buf); |
SetDlgItemText(dlg, IDC_REMOVEKEY_TEXT, buf); |
| 1980 |
for (i = 0; i < ctx->nold; i++) { |
for (i = 0; i < ctx->nold; i++) { |
| 1981 |
fp = key_fingerprint(ctx->old_keys[i], SSH_FP_HEX); |
fp = key_fingerprint(ctx->old_keys[i], SSH_FP_HEX, SSH_FP_MD5); |
| 1982 |
buf[0] = 0; |
buf[0] = 0; |
| 1983 |
strcat_s(buf, sizeof(buf), get_sshname_from_key(ctx->old_keys[i])); |
strcat_s(buf, sizeof(buf), get_sshname_from_key(ctx->old_keys[i])); |
| 1984 |
strcat_s(buf, sizeof(buf), " "); |
strcat_s(buf, sizeof(buf), " "); |
| 2236 |
free(blob); |
free(blob); |
| 2237 |
blob = NULL; |
blob = NULL; |
| 2238 |
|
|
| 2239 |
fp = key_fingerprint(key, SSH_FP_HEX); |
fp = key_fingerprint(key, SSH_FP_HEX, SSH_FP_MD5); |
| 2240 |
_snprintf_s(msg, sizeof(msg), _TRUNCATE, "Received %s host key %s", |
_snprintf_s(msg, sizeof(msg), _TRUNCATE, "Received %s host key %s", |
| 2241 |
get_sshname_from_key(key), fp); |
get_sshname_from_key(key), fp); |
| 2242 |
notify_verbose_message(pvar, msg, LOG_LEVEL_VERBOSE); |
notify_verbose_message(pvar, msg, LOG_LEVEL_VERBOSE); |