diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-20 09:14:35 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-20 09:14:35 +0000 |
commit | e067061263de0e682eef8060777a2e730eb06b92 (patch) | |
tree | 6436897e96171887b0eae22a4bf28261fb982a16 /libssh/keyfiles.c | |
parent | 9001a34cd3d99607d38084479f7ba3e0d3e7c485 (diff) | |
download | libssh-e067061263de0e682eef8060777a2e730eb06b92.tar.gz libssh-e067061263de0e682eef8060777a2e730eb06b92.tar.xz libssh-e067061263de0e682eef8060777a2e730eb06b92.zip |
Improve publickey_from_file().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@567 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/keyfiles.c')
-rw-r--r-- | libssh/keyfiles.c | 114 |
1 files changed, 65 insertions, 49 deletions
diff --git a/libssh/keyfiles.c b/libssh/keyfiles.c index bd2c90cf..5242ee42 100644 --- a/libssh/keyfiles.c +++ b/libssh/keyfiles.c @@ -851,56 +851,72 @@ void privatekey_free(PRIVATE_KEY *prv) { * \see publickey_from_privatekey() */ STRING *publickey_from_file(SSH_SESSION *session, const char *filename, - int *_type) { - BUFFER *buffer; - int type; - STRING *str; - char buf[4096]; /* noone will have bigger keys that that */ - /* where have i head that again ? */ - int fd=open(filename,O_RDONLY); - int r; - char *ptr; - if(fd<0){ - ssh_set_error(session,SSH_REQUEST_DENIED,"nonexistent public key file"); - return NULL; - } - if(read(fd,buf,8)!=8){ - close(fd); - ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file"); - return NULL; - } - buf[7]=0; - if(!strcmp(buf,"ssh-dss")) - type=TYPE_DSS; - else if (!strcmp(buf,"ssh-rsa")) - type=TYPE_RSA; - else { - close(fd); - ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file"); - return NULL; - } - r=read(fd,buf,sizeof(buf)-1); + int *type) { + BUFFER *buffer = NULL; + char buf[4096] = {0}; + STRING *str = NULL; + char *ptr = NULL; + int key_type; + int fd = -1; + int r; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + ssh_set_error(session, SSH_REQUEST_DENIED, "Public key file doesn't exist"); + return NULL; + } + + if (read(fd, buf, 8) != 8) { close(fd); - if(r<=0){ - ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file"); - return NULL; - } - buf[r]=0; - ptr=strchr(buf,' '); - if(ptr) - *ptr=0; /* eliminates the garbage at end of file */ - buffer=base64_to_bin(buf); - if(buffer){ - str=string_new(buffer_get_len(buffer)); - string_fill(str,buffer_get(buffer),buffer_get_len(buffer)); - buffer_free(buffer); - if(_type) - *_type=type; - return str; - } else { - ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file"); - return NULL; /* invalid file */ - } + ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file"); + return NULL; + } + + buf[7] = '\0'; + + key_type = ssh_type_from_name(buf); + if (key_type == -1) { + close(fd); + ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file"); + return NULL; + } + + r = read(fd, buf, sizeof(buf) - 1); + close(fd); + if (r <= 0) { + ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file"); + return NULL; + } + + buf[r] = 0; + ptr = strchr(buf, ' '); + + /* eliminate the garbage at end of file */ + if (ptr) { + *ptr = '\0'; + } + + buffer = base64_to_bin(buf); + if (buffer == NULL) { + ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file"); + return NULL; + } + + str = string_new(buffer_get_len(buffer)); + if (str == NULL) { + ssh_set_error(session, SSH_FATAL, "Not enough space"); + buffer_free(buffer); + return NULL; + } + + string_fill(str, buffer_get(buffer), buffer_get_len(buffer)); + buffer_free(buffer); + + if (type) { + *type = key_type; + } + + return str; } |