1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-12-02 01:17:52 +03:00

Add more error checks to privatekey_file_to_buffer().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@559 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-04-19 09:01:16 +00:00
parent a1e154e9d5
commit cc92391034

View File

@@ -328,91 +328,114 @@ static int privatekey_dek_header(char *header, unsigned int header_len,
static BUFFER *privatekey_file_to_buffer(FILE *fp, int type, static BUFFER *privatekey_file_to_buffer(FILE *fp, int type,
ssh_auth_callback cb, void *userdata, char *desc) { ssh_auth_callback cb, void *userdata, char *desc) {
BUFFER *buffer = NULL;
BUFFER *out = NULL;
char buf[MAXLINESIZE] = {0}; char buf[MAXLINESIZE] = {0};
char *header_begin; unsigned char *iv = NULL;
const char *header_begin;
const char *header_end;
unsigned int header_begin_size; unsigned int header_begin_size;
char *header_end;
unsigned int header_end_size; unsigned int header_end_size;
BUFFER *buffer=buffer_new(); unsigned int key_len = 0;
BUFFER *ret; unsigned int iv_len = 0;
int len;
int algo = 0; int algo = 0;
int mode = 0; int mode = 0;
unsigned int key_len = 0; int len;
unsigned char *iv = NULL;
unsigned int iv_len = 0;
switch(type) buffer = buffer_new();
{ if (buffer == NULL) {
return NULL;
}
switch(type) {
case TYPE_DSS: case TYPE_DSS:
header_begin=DSA_HEADER_BEGIN; header_begin = DSA_HEADER_BEGIN;
header_end=DSA_HEADER_END; header_end = DSA_HEADER_END;
break; break;
case TYPE_RSA: case TYPE_RSA:
header_begin=RSA_HEADER_BEGIN; header_begin = RSA_HEADER_BEGIN;
header_end=RSA_HEADER_END; header_end = RSA_HEADER_END;
break; break;
default: default:
buffer_free(buffer);
return NULL; return NULL;
} }
header_begin_size=strlen(header_begin);
header_end_size=strlen(header_end); header_begin_size = strlen(header_begin);
while (read_line(buf,MAXLINESIZE,fp) && strncmp(buf,header_begin,header_begin_size)) header_end_size = strlen(header_end);
while (read_line(buf, MAXLINESIZE, fp) &&
strncmp(buf, header_begin, header_begin_size))
; ;
len = read_line(buf, MAXLINESIZE, fp); len = read_line(buf, MAXLINESIZE, fp);
if (len > 11 && !strncmp("Proc-Type: 4,ENCRYPTED", buf, 11)) if (len > 11 && strncmp("Proc-Type: 4,ENCRYPTED", buf, 11) == 0) {
{
len = read_line(buf, MAXLINESIZE, fp); len = read_line(buf, MAXLINESIZE, fp);
if (len > 10 && !strncmp("DEK-Info: ", buf, 10)) if (len > 10 && strncmp("DEK-Info: ", buf, 10) == 0) {
{
if ((privatekey_dek_header(buf + 10, len - 10, &algo, &mode, &key_len, if ((privatekey_dek_header(buf + 10, len - 10, &algo, &mode, &key_len,
&iv, &iv_len) < 0) &iv, &iv_len) < 0)
|| read_line(buf, MAXLINESIZE, fp)) || read_line(buf, MAXLINESIZE, fp)) {
{
buffer_free(buffer); buffer_free(buffer);
free(iv); SAFE_FREE(iv);
return NULL;
}
} else {
buffer_free(buffer);
SAFE_FREE(iv);
return NULL;
}
} else {
if (buffer_add_data(buffer, buf, len) < 0) {
buffer_free(buffer);
SAFE_FREE(iv);
return NULL; return NULL;
} }
} }
else
{ while ((len = read_line(buf,MAXLINESIZE,fp)) &&
strncmp(buf, header_end, header_end_size) != 0) {
if (len == -1) {
buffer_free(buffer); buffer_free(buffer);
free(iv); SAFE_FREE(iv);
return NULL;
}
if (buffer_add_data(buffer, buf, len) < 0) {
buffer_free(buffer);
SAFE_FREE(iv);
return NULL; return NULL;
} }
} }
else
buffer_add_data(buffer,buf,len); if (strncmp(buf,header_end,header_end_size) != 0) {
while ((len = read_line(buf,MAXLINESIZE,fp))
&& strncmp(buf,header_end,header_end_size))
{
if (len == -1)
{
buffer_free(buffer); buffer_free(buffer);
free(iv); SAFE_FREE(iv);
return NULL; return NULL;
} }
buffer_add_data(buffer,buf,len);
} if (buffer_add_data(buffer, "\0", 1) < 0) {
if (strncmp(buf,header_end,header_end_size))
{
buffer_free(buffer); buffer_free(buffer);
free(iv); SAFE_FREE(iv);
return NULL; return NULL;
} }
buffer_add_data(buffer,"\0",1);
ret=base64_to_bin(buffer_get(buffer)); out = base64_to_bin(buffer_get(buffer));
buffer_free(buffer); buffer_free(buffer);
if (algo) if (out == NULL) {
{ SAFE_FREE(iv);
if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, ret, return NULL;
}
if (algo) {
if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, out,
cb, userdata, desc) < 0) { cb, userdata, desc) < 0) {
free(iv); buffer_free(out);
SAFE_FREE(iv);
return NULL; return NULL;
} }
} }
free(iv); SAFE_FREE(iv);
return ret;
return out;
} }
static int read_rsa_privatekey(FILE *fp, gcry_sexp_t *r, static int read_rsa_privatekey(FILE *fp, gcry_sexp_t *r,