diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-19 09:01:16 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-19 09:01:16 +0000 |
commit | cc923910345694fa1b65ef0e4ca8ad2a59065935 (patch) | |
tree | 518194e3fd650e0854abdf1944f09f937e990631 /libssh/keyfiles.c | |
parent | a1e154e9d5fb72024fac5bf943529ed467aeabc0 (diff) | |
download | libssh-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.c | 117 |
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, |