aboutsummaryrefslogtreecommitdiff
path: root/libssh/keyfiles.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-19 09:01:16 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-19 09:01:16 +0000
commitcc923910345694fa1b65ef0e4ca8ad2a59065935 (patch)
tree518194e3fd650e0854abdf1944f09f937e990631 /libssh/keyfiles.c
parenta1e154e9d5fb72024fac5bf943529ed467aeabc0 (diff)
downloadlibssh-cc923910345694fa1b65ef0e4ca8ad2a59065935.tar.gz
libssh-cc923910345694fa1b65ef0e4ca8ad2a59065935.tar.xz
libssh-cc923910345694fa1b65ef0e4ca8ad2a59065935.zip
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
Diffstat (limited to 'libssh/keyfiles.c')
-rw-r--r--libssh/keyfiles.c117
1 files changed, 70 insertions, 47 deletions
diff --git a/libssh/keyfiles.c b/libssh/keyfiles.c
index 04f25970..e8b9ebbf 100644
--- a/libssh/keyfiles.c
+++ b/libssh/keyfiles.c
@@ -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,
ssh_auth_callback cb, void *userdata, char *desc) {
+ BUFFER *buffer = NULL;
+ BUFFER *out = NULL;
char buf[MAXLINESIZE] = {0};
- char *header_begin;
+ unsigned char *iv = NULL;
+ const char *header_begin;
+ const char *header_end;
unsigned int header_begin_size;
- char *header_end;
unsigned int header_end_size;
- BUFFER *buffer=buffer_new();
- BUFFER *ret;
- int len;
- int algo = 0;
- int mode = 0;
unsigned int key_len = 0;
- unsigned char *iv = NULL;
unsigned int iv_len = 0;
+ int algo = 0;
+ int mode = 0;
+ int len;
- switch(type)
- {
+ buffer = buffer_new();
+ if (buffer == NULL) {
+ return NULL;
+ }
+
+ switch(type) {
case TYPE_DSS:
- header_begin=DSA_HEADER_BEGIN;
- header_end=DSA_HEADER_END;
+ header_begin = DSA_HEADER_BEGIN;
+ header_end = DSA_HEADER_END;
break;
case TYPE_RSA:
- header_begin=RSA_HEADER_BEGIN;
- header_end=RSA_HEADER_END;
+ header_begin = RSA_HEADER_BEGIN;
+ header_end = RSA_HEADER_END;
break;
default:
+ buffer_free(buffer);
return NULL;
}
- header_begin_size=strlen(header_begin);
- header_end_size=strlen(header_end);
- while (read_line(buf,MAXLINESIZE,fp) && strncmp(buf,header_begin,header_begin_size))
+
+ header_begin_size = strlen(header_begin);
+ 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);
- 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);
- 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,
&iv, &iv_len) < 0)
- || read_line(buf, MAXLINESIZE, fp))
- {
+ || read_line(buf, MAXLINESIZE, fp)) {
buffer_free(buffer);
- free(iv);
+ SAFE_FREE(iv);
return NULL;
}
+ } else {
+ buffer_free(buffer);
+ SAFE_FREE(iv);
+ return NULL;
}
- else
- {
+ } else {
+ if (buffer_add_data(buffer, buf, len) < 0) {
buffer_free(buffer);
- free(iv);
+ SAFE_FREE(iv);
return NULL;
}
}
- else
- buffer_add_data(buffer,buf,len);
- while ((len = read_line(buf,MAXLINESIZE,fp))
- && strncmp(buf,header_end,header_end_size))
- {
- if (len == -1)
- {
+
+ while ((len = read_line(buf,MAXLINESIZE,fp)) &&
+ strncmp(buf, header_end, header_end_size) != 0) {
+ if (len == -1) {
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;
}
- buffer_add_data(buffer,buf,len);
}
- if (strncmp(buf,header_end,header_end_size))
- {
+
+ if (strncmp(buf,header_end,header_end_size) != 0) {
buffer_free(buffer);
- free(iv);
+ SAFE_FREE(iv);
return NULL;
}
- buffer_add_data(buffer,"\0",1);
- ret=base64_to_bin(buffer_get(buffer));
+
+ if (buffer_add_data(buffer, "\0", 1) < 0) {
+ buffer_free(buffer);
+ SAFE_FREE(iv);
+ return NULL;
+ }
+
+ out = base64_to_bin(buffer_get(buffer));
buffer_free(buffer);
- if (algo)
- {
- if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, ret,
+ if (out == NULL) {
+ SAFE_FREE(iv);
+ return NULL;
+ }
+
+ if (algo) {
+ if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, out,
cb, userdata, desc) < 0) {
- free(iv);
+ buffer_free(out);
+ SAFE_FREE(iv);
return NULL;
}
}
- free(iv);
- return ret;
+ SAFE_FREE(iv);
+
+ return out;
}
static int read_rsa_privatekey(FILE *fp, gcry_sexp_t *r,