| 354 |
// bcrypt KDF 形式で読む |
// bcrypt KDF 形式で読む |
| 355 |
// based on key_parse_private2() @ OpenSSH 6.5 |
// based on key_parse_private2() @ OpenSSH 6.5 |
| 356 |
static Key *read_SSH2_private2_key(PTInstVar pvar, |
static Key *read_SSH2_private2_key(PTInstVar pvar, |
| 357 |
FILE * fp, |
FILE * fp, |
| 358 |
char * passphrase, |
char * passphrase, |
| 359 |
BOOL * invalid_passphrase, |
BOOL * invalid_passphrase, |
| 360 |
BOOL is_auto_login, |
BOOL is_auto_login, |
| 361 |
char *errmsg, |
char *errmsg, |
| 362 |
int errmsg_len) |
int errmsg_len) |
| 363 |
{ |
{ |
| 364 |
/* (A) |
/* (A) |
| 365 |
* buffer_consume系関数を使う場合は、buffer_lenとbuffer_ptrが使えないので、 |
* buffer_consume系関数を使う場合は、buffer_lenとbuffer_ptrが使えないので、 |
| 553 |
// 復号化 |
// 復号化 |
| 554 |
cp = buffer_append_space(b, len); |
cp = buffer_append_space(b, len); |
| 555 |
cipher_init_SSH2(cipher_ctx, key, keylen, key + keylen, ivlen, CIPHER_DECRYPT, |
cipher_init_SSH2(cipher_ctx, key, keylen, key + keylen, ivlen, CIPHER_DECRYPT, |
| 556 |
get_cipher_EVP_CIPHER(cipher), 0, 0, pvar); |
get_cipher_EVP_CIPHER(cipher), 0, 0, pvar); |
| 557 |
ret = EVP_Cipher(cipher_ctx, cp, buffer_tail_ptr(copy_consumed), len); |
ret = EVP_Cipher(cipher_ctx, cp, buffer_tail_ptr(copy_consumed), len); |
| 558 |
if (ret == 0) { |
if (ret == 0) { |
|
cipher_cleanup_SSH2(cipher_ctx); |
|
| 559 |
goto error; |
goto error; |
| 560 |
} |
} |
|
cipher_cleanup_SSH2(cipher_ctx); |
|
| 561 |
buffer_consume(copy_consumed, len); |
buffer_consume(copy_consumed, len); |
| 562 |
|
|
| 563 |
if (buffer_remain_len(copy_consumed) != 0) { |
if (buffer_remain_len(copy_consumed) != 0) { |
| 605 |
buffer_free(kdf); |
buffer_free(kdf); |
| 606 |
buffer_free(encoded); |
buffer_free(encoded); |
| 607 |
buffer_free(copy_consumed); |
buffer_free(copy_consumed); |
| 608 |
|
cipher_free_SSH2(cipher_ctx); |
| 609 |
|
|
| 610 |
free(ciphername); |
free(ciphername); |
| 611 |
free(kdfname); |
free(kdfname); |
| 614 |
free(salt); |
free(salt); |
| 615 |
free(comment); |
free(comment); |
| 616 |
|
|
|
if (cipher_ctx) { |
|
|
EVP_CIPHER_CTX_free(cipher_ctx); |
|
|
} |
|
|
|
|
| 617 |
// KDF ではなかった |
// KDF ではなかった |
| 618 |
if (keyfmt == NULL) { |
if (keyfmt == NULL) { |
| 619 |
fseek(fp, 0, SEEK_SET); |
fseek(fp, 0, SEEK_SET); |
| 938 |
} |
} |
| 939 |
|
|
| 940 |
cipher_ctx = EVP_CIPHER_CTX_new(); |
cipher_ctx = EVP_CIPHER_CTX_new(); |
| 941 |
if (ctx == NULL) { |
if (cipher_ctx == NULL) { |
| 942 |
EVP_MD_CTX_free(ctx); |
EVP_MD_CTX_free(ctx); |
| 943 |
goto error; |
goto error; |
| 944 |
} |
} |
| 965 |
if (ret == 0) { |
if (ret == 0) { |
| 966 |
strncpy_s(errmsg, errmsg_len, "Key decrypt error", _TRUNCATE); |
strncpy_s(errmsg, errmsg_len, "Key decrypt error", _TRUNCATE); |
| 967 |
free(decrypted); |
free(decrypted); |
| 968 |
cipher_cleanup_SSH2(cipher_ctx); |
cipher_free_SSH2(cipher_ctx); |
|
EVP_CIPHER_CTX_free(cipher_ctx); |
|
| 969 |
goto error; |
goto error; |
| 970 |
} |
} |
| 971 |
buffer_clear(prikey); |
buffer_clear(prikey); |
| 972 |
buffer_append(prikey, decrypted, len); |
buffer_append(prikey, decrypted, len); |
| 973 |
free(decrypted); |
free(decrypted); |
| 974 |
cipher_cleanup_SSH2(cipher_ctx); |
cipher_free_SSH2(cipher_ctx); |
|
EVP_CIPHER_CTX_free(cipher_ctx); |
|
| 975 |
} |
} |
| 976 |
|
|
| 977 |
// verity MAC |
// verity MAC |
| 1534 |
ret = EVP_Cipher(cipher_ctx, decrypted, blob->buf + blob->offset, len); |
ret = EVP_Cipher(cipher_ctx, decrypted, blob->buf + blob->offset, len); |
| 1535 |
if (ret == 0) { |
if (ret == 0) { |
| 1536 |
strncpy_s(errmsg, errmsg_len, "Key decrypt error", _TRUNCATE); |
strncpy_s(errmsg, errmsg_len, "Key decrypt error", _TRUNCATE); |
| 1537 |
cipher_cleanup_SSH2(cipher_ctx); |
cipher_free_SSH2(cipher_ctx); |
|
EVP_CIPHER_CTX_free(cipher_ctx); |
|
| 1538 |
goto error; |
goto error; |
| 1539 |
} |
} |
| 1540 |
buffer_append(blob2, decrypted, len); |
buffer_append(blob2, decrypted, len); |
| 1541 |
free(decrypted); |
free(decrypted); |
| 1542 |
cipher_cleanup_SSH2(cipher_ctx); |
cipher_free_SSH2(cipher_ctx); |
|
EVP_CIPHER_CTX_free(cipher_ctx); |
|
| 1543 |
|
|
| 1544 |
*invalid_passphrase = TRUE; |
*invalid_passphrase = TRUE; |
| 1545 |
} |
} |