|
Packit |
6c0a39 |
/*
|
|
Packit |
6c0a39 |
* This file is part of the SSH Library
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* Copyright (c) 2018 by Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* The SSH Library is free software; you can redistribute it and/or modify
|
|
Packit |
6c0a39 |
* it under the terms of the GNU Lesser General Public License as published by
|
|
Packit |
6c0a39 |
* the Free Software Foundation; either version 2.1 of the License, or (at your
|
|
Packit |
6c0a39 |
* option) any later version.
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* The SSH Library is distributed in the hope that it will be useful, but
|
|
Packit |
6c0a39 |
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
Packit |
6c0a39 |
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
Packit |
6c0a39 |
* License for more details.
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
6c0a39 |
* along with the SSH Library; see the file COPYING. If not, write to
|
|
Packit |
6c0a39 |
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
Packit |
6c0a39 |
* MA 02111-1307, USA.
|
|
Packit |
6c0a39 |
*/
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/*
|
|
Packit |
6c0a39 |
* This test checks if the messages accepted by the packet filter were intented
|
|
Packit |
6c0a39 |
* to be accepted.
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* The process consists in 2 steps:
|
|
Packit |
6c0a39 |
* - Try the filter with a message type in an arbitrary state
|
|
Packit |
6c0a39 |
* - If the message is accepted by the filter, check if the message is in the
|
|
Packit |
6c0a39 |
* set of accepted states.
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* Only the values selected by the flag (COMPARE_*) are considered.
|
|
Packit |
6c0a39 |
* */
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#include "config.h"
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#define LIBSSH_STATIC
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#include "torture.h"
|
|
Packit |
6c0a39 |
#include "libssh/priv.h"
|
|
Packit |
6c0a39 |
#include "libssh/libssh.h"
|
|
Packit |
6c0a39 |
#include "libssh/session.h"
|
|
Packit |
6c0a39 |
#include "libssh/auth.h"
|
|
Packit |
6c0a39 |
#include "libssh/ssh2.h"
|
|
Packit |
6c0a39 |
#include "libssh/packet.h"
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#include "packet.c"
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#define COMPARE_SESSION_STATE 1
|
|
Packit |
6c0a39 |
#define COMPARE_ROLE (1 << 1)
|
|
Packit |
6c0a39 |
#define COMPARE_DH_STATE (1 << 2)
|
|
Packit |
6c0a39 |
#define COMPARE_AUTH_STATE (1 << 3)
|
|
Packit |
6c0a39 |
#define COMPARE_GLOBAL_REQ_STATE (1 << 4)
|
|
Packit |
6c0a39 |
#define COMPARE_CURRENT_METHOD (1 << 5)
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#define SESSION_STATE_COUNT 11
|
|
Packit |
6c0a39 |
#define DH_STATE_COUNT 4
|
|
Packit |
6c0a39 |
#define AUTH_STATE_COUNT 15
|
|
Packit |
6c0a39 |
#define GLOBAL_REQ_STATE_COUNT 5
|
|
Packit |
6c0a39 |
#define MESSAGE_COUNT 100 // from 1 to 100
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#define ROLE_CLIENT 0
|
|
Packit |
6c0a39 |
#define ROLE_SERVER 1
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/*
|
|
Packit |
6c0a39 |
* This is the list of currently unfiltered message types.
|
|
Packit |
6c0a39 |
* Only unrecognized types should be in this list.
|
|
Packit |
6c0a39 |
* */
|
|
Packit |
6c0a39 |
static uint8_t unfiltered[] = {
|
|
Packit |
6c0a39 |
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
|
Packit |
6c0a39 |
22, 23, 24, 25, 26, 27, 28, 29,
|
|
Packit |
6c0a39 |
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
|
|
Packit |
6c0a39 |
54, 55, 56, 57, 58, 59,
|
|
Packit |
6c0a39 |
62,
|
|
Packit |
6c0a39 |
67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
|
|
Packit |
6c0a39 |
83, 84, 85, 86, 87, 88, 89,
|
|
Packit |
6c0a39 |
};
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
typedef struct global_state_st {
|
|
Packit |
6c0a39 |
/* If the bit in this flag is zero, the corresponding state is not
|
|
Packit |
6c0a39 |
* considered, working as a wildcard (meaning any value is accepted) */
|
|
Packit |
6c0a39 |
uint32_t flags;
|
|
Packit |
6c0a39 |
uint8_t role;
|
|
Packit |
6c0a39 |
enum ssh_session_state_e session;
|
|
Packit |
6c0a39 |
enum ssh_dh_state_e dh;
|
|
Packit |
6c0a39 |
enum ssh_auth_state_e auth;
|
|
Packit |
6c0a39 |
enum ssh_channel_request_state_e global_req;
|
|
Packit |
6c0a39 |
} global_state;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static int cmp_state(const void *e1, const void *e2)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
global_state *s1 = (global_state *) e1;
|
|
Packit |
6c0a39 |
global_state *s2 = (global_state *) e2;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Compare role (client == 0 or server == 1)*/
|
|
Packit |
6c0a39 |
if (s1->role < s2->role) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->role > s2->role) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Compare session state */
|
|
Packit |
6c0a39 |
if (s1->session < s2->session) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->session > s2->session) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Compare DH state */
|
|
Packit |
6c0a39 |
if (s1->dh < s2->dh) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->dh > s2->dh) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Compare auth */
|
|
Packit |
6c0a39 |
if (s1->auth < s2->auth) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->auth > s2->auth) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Compare global_req */
|
|
Packit |
6c0a39 |
if (s1->global_req < s2->global_req) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->global_req > s2->global_req) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* If all equal, they are equal */
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static int cmp_state_search(const void *key, const void *array_element)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
global_state *s1 = (global_state *) key;
|
|
Packit |
6c0a39 |
global_state *s2 = (global_state *) array_element;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int result = 0;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (s2->flags & COMPARE_ROLE) {
|
|
Packit |
6c0a39 |
/* Compare role (client == 0 or server == 1)*/
|
|
Packit |
6c0a39 |
if (s1->role < s2->role) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->role > s2->role) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (s2->flags & COMPARE_SESSION_STATE) {
|
|
Packit |
6c0a39 |
/* Compare session state */
|
|
Packit |
6c0a39 |
if (s1->session < s2->session) {
|
|
Packit |
6c0a39 |
result = -1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->session > s2->session) {
|
|
Packit |
6c0a39 |
result = 1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (s2->flags & COMPARE_DH_STATE) {
|
|
Packit |
6c0a39 |
/* Compare DH state */
|
|
Packit |
6c0a39 |
if (s1->dh < s2->dh) {
|
|
Packit |
6c0a39 |
result = -1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->dh > s2->dh) {
|
|
Packit |
6c0a39 |
result = 1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (s2->flags & COMPARE_AUTH_STATE) {
|
|
Packit |
6c0a39 |
/* Compare auth */
|
|
Packit |
6c0a39 |
if (s1->auth < s2->auth) {
|
|
Packit |
6c0a39 |
result = -1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->auth > s2->auth) {
|
|
Packit |
6c0a39 |
result = 1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (s2->flags & COMPARE_GLOBAL_REQ_STATE) {
|
|
Packit |
6c0a39 |
/* Compare global_req */
|
|
Packit |
6c0a39 |
if (s1->global_req < s2->global_req) {
|
|
Packit |
6c0a39 |
result = -1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (s1->global_req > s2->global_req) {
|
|
Packit |
6c0a39 |
result = 1;
|
|
Packit |
6c0a39 |
goto end;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
end:
|
|
Packit |
6c0a39 |
return result;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static int is_state_accepted(global_state *tested, global_state *accepted,
|
|
Packit |
6c0a39 |
int accepted_len)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
global_state *found = NULL;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
found = bsearch(tested, accepted, accepted_len, sizeof(global_state),
|
|
Packit |
6c0a39 |
cmp_state_search);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (found != NULL) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static int cmp_uint8(const void *i, const void *j)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
uint8_t e1 = *((uint8_t *)i);
|
|
Packit |
6c0a39 |
uint8_t e2 = *((uint8_t *)j);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (e1 < e2) {
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (e1 > e2) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static int check_unfiltered(uint8_t msg_type)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
uint8_t *found;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
found = bsearch(&msg_type, unfiltered, sizeof(unfiltered)/sizeof(uint8_t),
|
|
Packit |
6c0a39 |
sizeof(uint8_t), cmp_uint8);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (found != NULL) {
|
|
Packit |
6c0a39 |
return 1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static void torture_packet_filter_check_unfiltered(void **state)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
ssh_session session;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int role_c;
|
|
Packit |
6c0a39 |
int auth_c;
|
|
Packit |
6c0a39 |
int session_c;
|
|
Packit |
6c0a39 |
int dh_c;
|
|
Packit |
6c0a39 |
int global_req_c;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
uint8_t msg_type;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
enum ssh_packet_filter_result_e rc;
|
|
Packit |
6c0a39 |
int in_unfiltered;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
(void)state;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
session = ssh_new();
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
for (msg_type = 1; msg_type <= MESSAGE_COUNT; msg_type++) {
|
|
Packit |
6c0a39 |
session->in_packet.type = msg_type;
|
|
Packit |
6c0a39 |
for (role_c = 0; role_c < 2; role_c++) {
|
|
Packit |
6c0a39 |
session->server = role_c;
|
|
Packit |
6c0a39 |
for (session_c = 0; session_c < SESSION_STATE_COUNT; session_c++) {
|
|
Packit |
6c0a39 |
session->session_state = session_c;
|
|
Packit |
6c0a39 |
for (dh_c = 0; dh_c < DH_STATE_COUNT; dh_c++) {
|
|
Packit |
6c0a39 |
session->dh_handshake_state = dh_c;
|
|
Packit |
6c0a39 |
for (auth_c = 0; auth_c < AUTH_STATE_COUNT; auth_c++) {
|
|
Packit |
6c0a39 |
session->auth.state = auth_c;
|
|
Packit |
6c0a39 |
for (global_req_c = 0;
|
|
Packit |
6c0a39 |
global_req_c < GLOBAL_REQ_STATE_COUNT;
|
|
Packit |
6c0a39 |
global_req_c++)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
session->global_req_state = global_req_c;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
rc = ssh_packet_incoming_filter(session);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (rc == SSH_PACKET_UNKNOWN) {
|
|
Packit |
6c0a39 |
in_unfiltered = check_unfiltered(msg_type);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (!in_unfiltered) {
|
|
Packit |
6c0a39 |
fprintf(stderr, "Message type %d UNFILTERED "
|
|
Packit |
6c0a39 |
"in state: role %d, session %d, dh %d, auth %d\n",
|
|
Packit |
6c0a39 |
msg_type, role_c, session_c, dh_c, auth_c);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
assert_int_equal(in_unfiltered, 1);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else {
|
|
Packit |
6c0a39 |
in_unfiltered = check_unfiltered(msg_type);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (in_unfiltered) {
|
|
Packit |
6c0a39 |
fprintf(stderr, "Message type %d NOT UNFILTERED "
|
|
Packit |
6c0a39 |
"in state: role %d, session %d, dh %d, auth %d\n",
|
|
Packit |
6c0a39 |
msg_type, role_c, session_c, dh_c, auth_c);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
assert_int_equal(in_unfiltered, 0);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
ssh_free(session);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static int check_message_in_all_states(global_state accepted[],
|
|
Packit |
6c0a39 |
int accepted_count, uint8_t msg_type)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
ssh_session session;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int role_c;
|
|
Packit |
6c0a39 |
int auth_c;
|
|
Packit |
6c0a39 |
int session_c;
|
|
Packit |
6c0a39 |
int dh_c;
|
|
Packit |
6c0a39 |
int global_req_c;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
enum ssh_packet_filter_result_e rc;
|
|
Packit |
6c0a39 |
int in_accepted;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
global_state key;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
session = ssh_new();
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Sort the accepted array so that the elements can be searched using
|
|
Packit |
6c0a39 |
* bsearch */
|
|
Packit |
6c0a39 |
qsort(accepted, accepted_count, sizeof(global_state), cmp_state);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
session->in_packet.type = msg_type;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
for (role_c = 0; role_c < 2; role_c++) {
|
|
Packit |
6c0a39 |
session->server = role_c;
|
|
Packit |
6c0a39 |
key.role = role_c;
|
|
Packit |
6c0a39 |
for (session_c = 0; session_c < SESSION_STATE_COUNT; session_c++) {
|
|
Packit |
6c0a39 |
session->session_state = session_c;
|
|
Packit |
6c0a39 |
key.session = session_c;
|
|
Packit |
6c0a39 |
for (dh_c = 0; dh_c < DH_STATE_COUNT; dh_c++) {
|
|
Packit |
6c0a39 |
session->dh_handshake_state = dh_c;
|
|
Packit |
6c0a39 |
key.dh = dh_c;
|
|
Packit |
6c0a39 |
for (auth_c = 0; auth_c < AUTH_STATE_COUNT; auth_c++) {
|
|
Packit |
6c0a39 |
session->auth.state = auth_c;
|
|
Packit |
6c0a39 |
key.auth = auth_c;
|
|
Packit |
6c0a39 |
for (global_req_c = 0;
|
|
Packit |
6c0a39 |
global_req_c < GLOBAL_REQ_STATE_COUNT;
|
|
Packit |
6c0a39 |
global_req_c++)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
session->global_req_state = global_req_c;
|
|
Packit |
6c0a39 |
key.global_req = global_req_c;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
rc = ssh_packet_incoming_filter(session);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (rc == SSH_PACKET_ALLOWED) {
|
|
Packit |
6c0a39 |
in_accepted = is_state_accepted(&key, accepted,
|
|
Packit |
6c0a39 |
accepted_count);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (!in_accepted) {
|
|
Packit |
6c0a39 |
fprintf(stderr, "Message type %d ALLOWED "
|
|
Packit |
6c0a39 |
"in state: role %d, session %d, dh %d, auth %d\n",
|
|
Packit |
6c0a39 |
msg_type, role_c, session_c, dh_c, auth_c);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
assert_int_equal(in_accepted, 1);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else if (rc == SSH_PACKET_DENIED) {
|
|
Packit |
6c0a39 |
in_accepted = is_state_accepted(&key, accepted, accepted_count);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
if (in_accepted) {
|
|
Packit |
6c0a39 |
fprintf(stderr, "Message type %d DENIED "
|
|
Packit |
6c0a39 |
"in state: role %d, session %d, dh %d, auth %d\n",
|
|
Packit |
6c0a39 |
msg_type, role_c, session_c, dh_c, auth_c);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
assert_int_equal(in_accepted, 0);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
else {
|
|
Packit |
6c0a39 |
fprintf(stderr, "Message type %d UNFILTERED "
|
|
Packit |
6c0a39 |
"in state: role %d, session %d, dh %d, auth %d\n",
|
|
Packit |
6c0a39 |
msg_type, role_c, session_c, dh_c, auth_c);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
ssh_free(session);
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static void torture_packet_filter_check_auth_success(void **state)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
int rc;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
global_state accepted[] = {
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_ROLE |
|
|
Packit |
6c0a39 |
COMPARE_AUTH_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE),
|
|
Packit |
6c0a39 |
.role = ROLE_CLIENT,
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATING,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
.auth = SSH_AUTH_STATE_PUBKEY_AUTH_SENT,
|
|
Packit |
6c0a39 |
},
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_ROLE |
|
|
Packit |
6c0a39 |
COMPARE_AUTH_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE),
|
|
Packit |
6c0a39 |
.role = ROLE_CLIENT,
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATING,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
.auth = SSH_AUTH_STATE_PASSWORD_AUTH_SENT,
|
|
Packit |
6c0a39 |
},
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_ROLE |
|
|
Packit |
6c0a39 |
COMPARE_AUTH_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE),
|
|
Packit |
6c0a39 |
.role = ROLE_CLIENT,
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATING,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
.auth = SSH_AUTH_STATE_GSSAPI_MIC_SENT,
|
|
Packit |
6c0a39 |
},
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_ROLE |
|
|
Packit |
6c0a39 |
COMPARE_AUTH_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE),
|
|
Packit |
6c0a39 |
.role = ROLE_CLIENT,
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATING,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
.auth = SSH_AUTH_STATE_KBDINT_SENT,
|
|
Packit |
6c0a39 |
},
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_ROLE |
|
|
Packit |
6c0a39 |
COMPARE_AUTH_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE |
|
|
Packit |
6c0a39 |
COMPARE_CURRENT_METHOD),
|
|
Packit |
6c0a39 |
.role = ROLE_CLIENT,
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATING,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
.auth = SSH_AUTH_STATE_AUTH_NONE_SENT,
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
};
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int accepted_count = 5;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Unused */
|
|
Packit |
6c0a39 |
(void) state;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
rc = check_message_in_all_states(accepted, accepted_count,
|
|
Packit |
6c0a39 |
SSH2_MSG_USERAUTH_SUCCESS);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
assert_int_equal(rc, 0);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static void torture_packet_filter_check_msg_ext_info(void **state)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
int rc;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
global_state accepted[] = {
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE),
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATING,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
},
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = (COMPARE_SESSION_STATE |
|
|
Packit |
6c0a39 |
COMPARE_DH_STATE),
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATED,
|
|
Packit |
6c0a39 |
.dh = DH_STATE_FINISHED,
|
|
Packit |
6c0a39 |
},
|
|
Packit |
6c0a39 |
};
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int accepted_count = 2;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Unused */
|
|
Packit |
6c0a39 |
(void) state;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
rc = check_message_in_all_states(accepted, accepted_count,
|
|
Packit |
6c0a39 |
SSH2_MSG_EXT_INFO);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
assert_int_equal(rc, 0);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
static void torture_packet_filter_check_channel_open(void **state)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
int rc;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* The only condition to accept a CHANNEL_OPEN is to be authenticated */
|
|
Packit |
6c0a39 |
global_state accepted[] = {
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
.flags = COMPARE_SESSION_STATE,
|
|
Packit |
6c0a39 |
.session = SSH_SESSION_STATE_AUTHENTICATED,
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
};
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int accepted_count = 1;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/* Unused */
|
|
Packit |
6c0a39 |
(void) state;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
rc = check_message_in_all_states(accepted, accepted_count,
|
|
Packit |
6c0a39 |
SSH2_MSG_CHANNEL_OPEN);
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
assert_int_equal(rc, 0);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
int torture_run_tests(void)
|
|
Packit |
6c0a39 |
{
|
|
Packit |
6c0a39 |
int rc;
|
|
Packit |
6c0a39 |
struct CMUnitTest tests[] = {
|
|
Packit |
6c0a39 |
cmocka_unit_test(torture_packet_filter_check_auth_success),
|
|
Packit |
6c0a39 |
cmocka_unit_test(torture_packet_filter_check_channel_open),
|
|
Packit |
6c0a39 |
cmocka_unit_test(torture_packet_filter_check_unfiltered),
|
|
Packit |
6c0a39 |
cmocka_unit_test(torture_packet_filter_check_msg_ext_info)
|
|
Packit |
6c0a39 |
};
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
ssh_init();
|
|
Packit |
6c0a39 |
torture_filter_tests(tests);
|
|
Packit |
6c0a39 |
rc = cmocka_run_group_tests(tests, NULL, NULL);
|
|
Packit |
6c0a39 |
ssh_finalize();
|
|
Packit |
6c0a39 |
return rc;
|
|
Packit |
6c0a39 |
}
|