|
|
|
|
@ -17,7 +17,6 @@
|
|
|
|
|
static int tests_passed = 0, tests_total = 0; |
|
|
|
|
static struct SC_MYKEYS s_keys, c_keys; |
|
|
|
|
|
|
|
|
|
#define BASE_PORT 23456 |
|
|
|
|
|
|
|
|
|
#ifdef __linux__ |
|
|
|
|
#define WIRE_PADDING 32 |
|
|
|
|
@ -205,9 +204,8 @@ static int peer_send(struct test_peer *p, const uint8_t *data, size_t len) {
|
|
|
|
|
static int test1_sizes(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 1; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, NULL); TASSERT(sc); |
|
|
|
|
|
|
|
|
|
size_t sizes[] = {0, 1, 16, 17, 255, 256, 1000, 65535}; |
|
|
|
|
@ -245,9 +243,8 @@ static int test1_sizes(void) {
|
|
|
|
|
static int test2_many(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 2; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, NULL); TASSERT(sc); |
|
|
|
|
|
|
|
|
|
int sent = 0, ticks = 0; |
|
|
|
|
@ -283,9 +280,8 @@ static int test2_many(void) {
|
|
|
|
|
static int test3_wrong_key(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 3; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
|
|
|
|
|
struct SC_MYKEYS rogue; |
|
|
|
|
TASSERT(sc_generate_keypair(&rogue) == SC_OK); |
|
|
|
|
@ -311,9 +307,8 @@ static int test3_wrong_key(void) {
|
|
|
|
|
static int test4_close(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 4; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, NULL); TASSERT(sc); |
|
|
|
|
|
|
|
|
|
int closed = 0, ticks = 0; |
|
|
|
|
@ -352,7 +347,6 @@ static void multi_connect_cb(struct stcp_conn *conn, void *arg) {
|
|
|
|
|
|
|
|
|
|
static int test5_multi(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
uint16_t port = BASE_PORT + 5; |
|
|
|
|
|
|
|
|
|
#define NCLI 3 |
|
|
|
|
struct test_peer srvp[NCLI]; |
|
|
|
|
@ -360,7 +354,8 @@ static int test5_multi(void) {
|
|
|
|
|
memset(srvp, 0, sizeof(srvp)); memset(clip, 0, sizeof(clip)); |
|
|
|
|
|
|
|
|
|
g_multi_peers = srvp; g_multi_idx = 0; g_multi_max = NCLI; |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, multi_connect_cb, NULL, NULL, NULL, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, multi_connect_cb, NULL, NULL, NULL, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
|
|
|
|
|
struct stcp_client *clients[NCLI] = {0}; |
|
|
|
|
for (int i = 0; i < NCLI; i++) { |
|
|
|
|
@ -410,9 +405,8 @@ static int test5_multi(void) {
|
|
|
|
|
static int test6_interleaved(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 6; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, NULL); TASSERT(sc); |
|
|
|
|
|
|
|
|
|
int round = 0, ticks = 0; |
|
|
|
|
@ -444,9 +438,8 @@ static int test6_interleaved(void) {
|
|
|
|
|
static int test7_bulk_4mb(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 7; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, NULL); TASSERT(sc); |
|
|
|
|
|
|
|
|
|
#define N_BULK 64 |
|
|
|
|
@ -483,9 +476,8 @@ static int test7_bulk_4mb(void) {
|
|
|
|
|
static int test8_srv_recv_close(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 8; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, NULL); TASSERT(sc); |
|
|
|
|
|
|
|
|
|
int ticks = 0; |
|
|
|
|
@ -574,9 +566,8 @@ static int build_malicious_handshake(uint16_t padding_size, uint8_t *out) {
|
|
|
|
|
static int test9_raw_handshake_ok(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 9; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
|
|
|
|
|
uint8_t buf[SC_PUBKEY_ENC_SIZE + STCP_HS_ENC_CLIENT + 8]; |
|
|
|
|
TASSERT(build_malicious_handshake(8, buf) == 0); |
|
|
|
|
@ -601,9 +592,8 @@ static int test9_raw_handshake_ok(void) {
|
|
|
|
|
static int test10_oversized_padding(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 10; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
|
|
|
|
|
uint8_t buf[SC_PUBKEY_ENC_SIZE + STCP_HS_ENC_CLIENT]; |
|
|
|
|
TASSERT(build_malicious_handshake(0xFFFF, buf) == 0); |
|
|
|
|
@ -628,9 +618,8 @@ static int test10_oversized_padding(void) {
|
|
|
|
|
static int test11_garbage_handshake(void) { |
|
|
|
|
struct UASYNC *ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 11; |
|
|
|
|
|
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
|
|
|
|
|
uint8_t buf[SC_PUBKEY_ENC_SIZE + STCP_HS_ENC_CLIENT]; |
|
|
|
|
for (int i = 0; i < (int)sizeof(buf); i++) buf[i] = (uint8_t)(i * 31 + 7); |
|
|
|
|
@ -660,9 +649,9 @@ static int test12_padding_boundaries(void) {
|
|
|
|
|
si.padding.min = si.padding.max = i ? ETCP_PADDING_MAX : 0; |
|
|
|
|
ci.padding.min = ci.padding.max = i ? 0 : ETCP_PADDING_MAX; |
|
|
|
|
struct test_peer srv = {0}, cli = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 12 + i; |
|
|
|
|
struct stcp_server* ss = stcp_server_create(ua, port, &s_keys, NULL, &si, |
|
|
|
|
struct stcp_server* ss = stcp_server_create(ua, 0, &s_keys, NULL, &si, |
|
|
|
|
server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
struct stcp_client* sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, |
|
|
|
|
NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, |
|
|
|
|
NULL, NULL, peer_close_cb, &cli, NULL, 0, NULL, NULL, &ci); TASSERT(sc); |
|
|
|
|
@ -700,9 +689,9 @@ static int test13_salted_handshakes(void) {
|
|
|
|
|
struct test_peer srv[2] = {{0}}, cli[2] = {{0}}; |
|
|
|
|
struct stcp_client* clients[2] = {0}; |
|
|
|
|
g_multi_peers = srv; g_multi_idx = 0; g_multi_max = 2; |
|
|
|
|
capture_port = BASE_PORT + 14 + round; |
|
|
|
|
struct stcp_server* ss = stcp_server_create(ua, capture_port, &s_keys, ed_server, &si, |
|
|
|
|
struct stcp_server* ss = stcp_server_create(ua, 0, &s_keys, ed_server, &si, |
|
|
|
|
multi_connect_cb, NULL, NULL, NULL, AF_INET); TASSERT(ss); |
|
|
|
|
capture_port = stcp_server_get_port(ss); TASSERT(capture_port); |
|
|
|
|
memset(wire, 0, sizeof(wire)); wire_count = 0; capture_wire = 1; |
|
|
|
|
for (int i = 0; i < 2; i++) { |
|
|
|
|
clients[i] = stcp_client_connect(ua, "127.0.0.1", capture_port, &c_keys, s_keys.public_key, |
|
|
|
|
@ -765,9 +754,9 @@ static int test13_salted_handshakes(void) {
|
|
|
|
|
static int test14_modified_salt(void) { |
|
|
|
|
struct UASYNC* ua = uasync_create(); TASSERT(ua); |
|
|
|
|
struct test_peer srv = {0}; |
|
|
|
|
uint16_t port = BASE_PORT + 16; |
|
|
|
|
struct stcp_server* ss = stcp_server_create(ua, port, &s_keys, NULL, NULL, |
|
|
|
|
struct stcp_server* ss = stcp_server_create(ua, 0, &s_keys, NULL, NULL, |
|
|
|
|
server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
uint8_t packet[STCP_HS_CLIENT_MIN + 8]; |
|
|
|
|
TASSERT(build_malicious_handshake(8, packet) == 0); |
|
|
|
|
packet[0] ^= 1; |
|
|
|
|
@ -792,9 +781,9 @@ static int test15_reality_records(void) {
|
|
|
|
|
cfg.enabled = 1; cfg.short_id_count = 1; |
|
|
|
|
TASSERT(!reality_generate_keypair(cfg.private_key, cc.server_static_pubkey)); |
|
|
|
|
strcpy(cc.server_name, "www.microsoft.com"); |
|
|
|
|
uint16_t port = BASE_PORT + 17; |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, port, &s_keys, NULL, &si, |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, &si, |
|
|
|
|
server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
stcp_server_set_reality(ss, &cfg); |
|
|
|
|
#ifdef __linux__ |
|
|
|
|
capture_port = port; reality_capture = 1; reality_send_calls = 0; reality_tamper = round == 2; |
|
|
|
|
@ -886,11 +875,12 @@ static int test16_reality_allocation_failures(void) {
|
|
|
|
|
cfg.enabled = 1; cfg.short_id_count = 1; |
|
|
|
|
TASSERT(!reality_generate_keypair(cfg.private_key, cc.server_static_pubkey)); |
|
|
|
|
strcpy(cc.server_name, "www.microsoft.com"); |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, BASE_PORT + 18, &s_keys, NULL, &si, |
|
|
|
|
struct stcp_server *ss = stcp_server_create(ua, 0, &s_keys, NULL, &si, |
|
|
|
|
server_connect_cb, &srv, peer_close_cb, &srv, AF_INET); TASSERT(ss); |
|
|
|
|
uint16_t port = stcp_server_get_port(ss); TASSERT(port); |
|
|
|
|
stcp_server_set_reality(ss, &cfg); |
|
|
|
|
reality_fault = failure; |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", BASE_PORT + 18, &c_keys, s_keys.public_key, |
|
|
|
|
struct stcp_client *sc = stcp_client_connect(ua, "127.0.0.1", port, &c_keys, s_keys.public_key, |
|
|
|
|
NULL, 0, NULL, 0, 200, 0, client_ready_cb, &cli, |
|
|
|
|
NULL, NULL, peer_close_cb, &cli, NULL, 3000, &cc, NULL, NULL); TASSERT(sc); |
|
|
|
|
for (unsigned i = 0; !cli.closed && !srv.closed && i < 1000; i++) uasync_poll(ua, 1); |
|
|
|
|
|