#include "internal/sockets.h"
static const unsigned char alpn_ossltest[] = {
/* "\x08ossltest" (hex for EBCDIC resilience) */
0x08, 0x6f, 0x73, 0x73, 0x6c, 0x74, 0x65, 0x73, 0x74
};
DEF_FUNC(hf_unbind)
{
int ok = 0;
const char *name;
F_POP(name);
RADIX_PROCESS_set_obj(RP(), name, NULL);
ok = 1;
err:
return ok;
}
static int ssl_ctx_select_alpn(SSL *ssl,
const unsigned char **out, unsigned char *out_len,
const unsigned char *in, unsigned int in_len,
void *arg)
{
if (SSL_select_next_proto((unsigned char **)out, out_len,
alpn_ossltest, sizeof(alpn_ossltest), in, in_len)
!= OPENSSL_NPN_NEGOTIATED)
return SSL_TLSEXT_ERR_ALERT_FATAL;
return SSL_TLSEXT_ERR_OK;
}
static int ssl_ctx_configure(SSL_CTX *ctx, int is_server)
{
if (!TEST_true(ossl_quic_set_diag_title(ctx, "quic_radix_test")))
return 0;
if (!is_server)
return 1;
if (!TEST_int_eq(SSL_CTX_use_certificate_file(ctx, cert_file,
SSL_FILETYPE_PEM), 1)
|| !TEST_int_eq(SSL_CTX_use_PrivateKey_file(ctx, key_file,
SSL_FILETYPE_PEM), 1))
return 0;
SSL_CTX_set_alpn_select_cb(ctx, ssl_ctx_select_alpn, NULL);
return 1;
}
static int ssl_create_bound_socket(uint16_t listen_port,
int *p_fd, uint16_t *p_result_port)
{
int ok = 0;
int fd = -1;
BIO_ADDR *addr = NULL;
union BIO_sock_info_u info;
struct in_addr ina;
ina.s_addr = htonl(INADDR_LOOPBACK);
fd = BIO_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0);
if (!TEST_int_ge(fd, 0))
goto err;
if (!TEST_true(BIO_socket_nbio(fd, 1)))
goto err;
if (!TEST_ptr(addr = BIO_ADDR_new()))
goto err;
if (!TEST_true(BIO_ADDR_rawmake(addr, AF_INET,
&ina, sizeof(ina), 0)))
goto err;
if (!TEST_true(BIO_bind(fd, addr, 0)))
goto err;
info.addr = addr;
if (!TEST_true(BIO_sock_info(fd, BIO_SOCK_INFO_ADDRESS, &info)))
goto err;
if (!TEST_int_gt(BIO_ADDR_rawport(addr), 0))
goto err;
ok = 1;
err:
if (!ok && fd >= 0)
BIO_closesocket(fd);
else if (ok) {
*p_fd = fd;
if (p_result_port != NULL)
*p_result_port = BIO_ADDR_rawport(addr);
}
BIO_ADDR_free(addr);
return ok;
}
static int ssl_attach_bio_dgram(SSL *ssl,
uint16_t local_port, uint16_t *actual_port)
{
int s_fd = -1;
BIO *bio;
if (!TEST_true(ssl_create_bound_socket(local_port, &s_fd, actual_port)))
return 0;
if (!TEST_ptr(bio = BIO_new_dgram(s_fd