mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-11-27 13:21:11 +03:00
Improve publickey_from_file().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@567 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
@@ -253,7 +253,8 @@ PRIVATE_KEY *privatekey_from_file(SSH_SESSION *session, const char *filename,
|
|||||||
STRING *publickey_to_string(PUBLIC_KEY *key);
|
STRING *publickey_to_string(PUBLIC_KEY *key);
|
||||||
PUBLIC_KEY *publickey_from_privatekey(PRIVATE_KEY *prv);
|
PUBLIC_KEY *publickey_from_privatekey(PRIVATE_KEY *prv);
|
||||||
void privatekey_free(PRIVATE_KEY *prv);
|
void privatekey_free(PRIVATE_KEY *prv);
|
||||||
STRING *publickey_from_file(SSH_SESSION *session, const char *filename,int *_type);
|
STRING *publickey_from_file(SSH_SESSION *session, const char *filename,
|
||||||
|
int *type);
|
||||||
STRING *publickey_from_next_file(SSH_SESSION *session, const char **pub_keys_path,
|
STRING *publickey_from_next_file(SSH_SESSION *session, const char **pub_keys_path,
|
||||||
const char **keys_path, char **privkeyfile, int *type, int *count);
|
const char **keys_path, char **privkeyfile, int *type, int *count);
|
||||||
int ssh_is_server_known(SSH_SESSION *session);
|
int ssh_is_server_known(SSH_SESSION *session);
|
||||||
|
|||||||
@@ -851,56 +851,72 @@ void privatekey_free(PRIVATE_KEY *prv) {
|
|||||||
* \see publickey_from_privatekey()
|
* \see publickey_from_privatekey()
|
||||||
*/
|
*/
|
||||||
STRING *publickey_from_file(SSH_SESSION *session, const char *filename,
|
STRING *publickey_from_file(SSH_SESSION *session, const char *filename,
|
||||||
int *_type) {
|
int *type) {
|
||||||
BUFFER *buffer;
|
BUFFER *buffer = NULL;
|
||||||
int type;
|
char buf[4096] = {0};
|
||||||
STRING *str;
|
STRING *str = NULL;
|
||||||
char buf[4096]; /* noone will have bigger keys that that */
|
char *ptr = NULL;
|
||||||
/* where have i head that again ? */
|
int key_type;
|
||||||
int fd=open(filename,O_RDONLY);
|
int fd = -1;
|
||||||
int r;
|
int r;
|
||||||
char *ptr;
|
|
||||||
if(fd<0){
|
fd = open(filename, O_RDONLY);
|
||||||
ssh_set_error(session,SSH_REQUEST_DENIED,"nonexistent public key file");
|
if (fd < 0) {
|
||||||
return NULL;
|
ssh_set_error(session, SSH_REQUEST_DENIED, "Public key file doesn't exist");
|
||||||
}
|
return NULL;
|
||||||
if(read(fd,buf,8)!=8){
|
}
|
||||||
close(fd);
|
|
||||||
ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file");
|
if (read(fd, buf, 8) != 8) {
|
||||||
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);
|
|
||||||
close(fd);
|
close(fd);
|
||||||
if(r<=0){
|
ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file");
|
||||||
ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file");
|
return NULL;
|
||||||
return NULL;
|
}
|
||||||
}
|
|
||||||
buf[r]=0;
|
buf[7] = '\0';
|
||||||
ptr=strchr(buf,' ');
|
|
||||||
if(ptr)
|
key_type = ssh_type_from_name(buf);
|
||||||
*ptr=0; /* eliminates the garbage at end of file */
|
if (key_type == -1) {
|
||||||
buffer=base64_to_bin(buf);
|
close(fd);
|
||||||
if(buffer){
|
ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file");
|
||||||
str=string_new(buffer_get_len(buffer));
|
return NULL;
|
||||||
string_fill(str,buffer_get(buffer),buffer_get_len(buffer));
|
}
|
||||||
buffer_free(buffer);
|
|
||||||
if(_type)
|
r = read(fd, buf, sizeof(buf) - 1);
|
||||||
*_type=type;
|
close(fd);
|
||||||
return str;
|
if (r <= 0) {
|
||||||
} else {
|
ssh_set_error(session, SSH_REQUEST_DENIED, "Invalid public key file");
|
||||||
ssh_set_error(session,SSH_REQUEST_DENIED,"Invalid public key file");
|
return NULL;
|
||||||
return NULL; /* invalid file */
|
}
|
||||||
}
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user