Blame tests/unittests/torture_packet_filter.c

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
}