mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-12-17 06:18:58 +03:00
Add key validation in server side authentication
This commit is contained in:
@@ -186,6 +186,13 @@ enum ssh_channel_requests_e {
|
|||||||
SSH_CHANNEL_REQUEST_WINDOW_CHANGE,
|
SSH_CHANNEL_REQUEST_WINDOW_CHANGE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ssh_publickey_state_e {
|
||||||
|
SSH_PUBLICKEY_STATE_ERROR=-1,
|
||||||
|
SSH_PUBLICKEY_STATE_NONE=0,
|
||||||
|
SSH_PUBLICKEY_STATE_VALID=1,
|
||||||
|
SSH_PUBLICKEY_STATE_WRONG=2
|
||||||
|
};
|
||||||
|
|
||||||
/* status flags */
|
/* status flags */
|
||||||
#define SSH_CLOSED 0x01
|
#define SSH_CLOSED 0x01
|
||||||
#define SSH_READ_PENDING 0x02
|
#define SSH_READ_PENDING 0x02
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ LIBSSH_API int ssh_message_reply_default(ssh_message msg);
|
|||||||
LIBSSH_API char *ssh_message_auth_user(ssh_message msg);
|
LIBSSH_API char *ssh_message_auth_user(ssh_message msg);
|
||||||
LIBSSH_API char *ssh_message_auth_password(ssh_message msg);
|
LIBSSH_API char *ssh_message_auth_password(ssh_message msg);
|
||||||
LIBSSH_API ssh_public_key ssh_message_auth_publickey(ssh_message msg);
|
LIBSSH_API ssh_public_key ssh_message_auth_publickey(ssh_message msg);
|
||||||
|
LIBSSH_API enum ssh_publickey_state_e ssh_message_auth_publickey_state(ssh_message msg);
|
||||||
LIBSSH_API int ssh_message_auth_reply_success(ssh_message msg,int partial);
|
LIBSSH_API int ssh_message_auth_reply_success(ssh_message msg,int partial);
|
||||||
LIBSSH_API int ssh_message_auth_reply_pk_ok(ssh_message msg, ssh_string algo, ssh_string pubkey);
|
LIBSSH_API int ssh_message_auth_reply_pk_ok(ssh_message msg, ssh_string algo, ssh_string pubkey);
|
||||||
LIBSSH_API int ssh_message_auth_set_methods(ssh_message msg, int methods);
|
LIBSSH_API int ssh_message_auth_set_methods(ssh_message msg, int methods);
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ static ssh_message handle_userauth_request(ssh_session session){
|
|||||||
if (msg->auth_request.public_key == NULL) {
|
if (msg->auth_request.public_key == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
msg->auth_request.signature_state = 0;
|
msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_NONE;
|
||||||
// has a valid signature ?
|
// has a valid signature ?
|
||||||
if(has_sign) {
|
if(has_sign) {
|
||||||
SIGNATURE *signature = NULL;
|
SIGNATURE *signature = NULL;
|
||||||
@@ -231,7 +231,7 @@ static ssh_message handle_userauth_request(ssh_session session){
|
|||||||
sign = buffer_get_ssh_string(session->in_buffer);
|
sign = buffer_get_ssh_string(session->in_buffer);
|
||||||
if(sign == NULL) {
|
if(sign == NULL) {
|
||||||
ssh_log(session, SSH_LOG_PACKET, "Invalid signature packet from peer");
|
ssh_log(session, SSH_LOG_PACKET, "Invalid signature packet from peer");
|
||||||
msg->auth_request.signature_state = -2;
|
msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_ERROR;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
signature = signature_from_string(session, sign, public_key,
|
signature = signature_from_string(session, sign, public_key,
|
||||||
@@ -241,7 +241,7 @@ static ssh_message handle_userauth_request(ssh_session session){
|
|||||||
(digest != NULL && signature != NULL &&
|
(digest != NULL && signature != NULL &&
|
||||||
sig_verify(session, public_key, signature,
|
sig_verify(session, public_key, signature,
|
||||||
buffer_get(digest), buffer_get_len(digest)) < 0)) {
|
buffer_get(digest), buffer_get_len(digest)) < 0)) {
|
||||||
ssh_log(session, SSH_LOG_PACKET, "Invalid signature from peer");
|
ssh_log(session, SSH_LOG_PACKET, "Wrong signature from peer");
|
||||||
|
|
||||||
string_free(sign);
|
string_free(sign);
|
||||||
sign = NULL;
|
sign = NULL;
|
||||||
@@ -250,7 +250,7 @@ static ssh_message handle_userauth_request(ssh_session session){
|
|||||||
signature_free(signature);
|
signature_free(signature);
|
||||||
signature = NULL;
|
signature = NULL;
|
||||||
|
|
||||||
msg->auth_request.signature_state = -1;
|
msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_WRONG;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -263,7 +263,7 @@ static ssh_message handle_userauth_request(ssh_session session){
|
|||||||
signature_free(signature);
|
signature_free(signature);
|
||||||
signature = NULL;
|
signature = NULL;
|
||||||
|
|
||||||
msg->auth_request.signature_state = 1;
|
msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_VALID;
|
||||||
}
|
}
|
||||||
SAFE_FREE(service_c);
|
SAFE_FREE(service_c);
|
||||||
leave_function();
|
leave_function();
|
||||||
|
|||||||
@@ -760,6 +760,13 @@ ssh_public_key ssh_message_auth_publickey(ssh_message msg){
|
|||||||
return msg->auth_request.public_key;
|
return msg->auth_request.public_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ssh_publickey_state_e ssh_message_auth_publickey_state(ssh_message msg){
|
||||||
|
if (msg == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return msg->auth_request.signature_state;
|
||||||
|
}
|
||||||
|
|
||||||
int ssh_message_auth_set_methods(ssh_message msg, int methods) {
|
int ssh_message_auth_set_methods(ssh_message msg, int methods) {
|
||||||
if (msg == NULL || msg->session == NULL) {
|
if (msg == NULL || msg->session == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user