提交 fd4e98ec 编写于 作者: M Matt Caswell

Add support for DTLSv1_listen in s_server

DTLSv1_listen is a commonly used function within DTLS solutions for
listening for new incoming connections. This commit adds support to s_server
for using it.
Reviewed-by: NAndy Polyakov <appro@openssl.org>
上级 912c89c5
...@@ -261,6 +261,7 @@ static int enable_timeouts = 0; ...@@ -261,6 +261,7 @@ static int enable_timeouts = 0;
static long socket_mtu; static long socket_mtu;
#ifndef OPENSSL_NO_DTLS1 #ifndef OPENSSL_NO_DTLS1
static int cert_chain = 0; static int cert_chain = 0;
static int dtlslisten = 0;
#endif #endif
static BIO *serverinfo_in = NULL; static BIO *serverinfo_in = NULL;
...@@ -807,7 +808,7 @@ typedef enum OPTION_choice { ...@@ -807,7 +808,7 @@ typedef enum OPTION_choice {
OPT_SRPUSERSEED, OPT_REV, OPT_WWW, OPT_UPPER_WWW, OPT_HTTP, OPT_SRPUSERSEED, OPT_REV, OPT_WWW, OPT_UPPER_WWW, OPT_HTTP,
OPT_SSL3, OPT_SSL3,
OPT_TLS1_2, OPT_TLS1_1, OPT_TLS1, OPT_DTLS, OPT_DTLS1, OPT_TLS1_2, OPT_TLS1_1, OPT_TLS1, OPT_DTLS, OPT_DTLS1,
OPT_DTLS1_2, OPT_TIMEOUT, OPT_MTU, OPT_CHAIN, OPT_DTLS1_2, OPT_TIMEOUT, OPT_MTU, OPT_CHAIN, OPT_LISTEN,
OPT_ID_PREFIX, OPT_RAND, OPT_SERVERNAME, OPT_SERVERNAME_FATAL, OPT_ID_PREFIX, OPT_RAND, OPT_SERVERNAME, OPT_SERVERNAME_FATAL,
OPT_CERT2, OPT_KEY2, OPT_NEXTPROTONEG, OPT_ALPN, OPT_JPAKE, OPT_CERT2, OPT_KEY2, OPT_NEXTPROTONEG, OPT_ALPN, OPT_JPAKE,
OPT_SRTP_PROFILES, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN, OPT_SRTP_PROFILES, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN,
...@@ -937,6 +938,8 @@ OPTIONS s_server_options[] = { ...@@ -937,6 +938,8 @@ OPTIONS s_server_options[] = {
{"timeout", OPT_TIMEOUT, '-', "Enable timeouts"}, {"timeout", OPT_TIMEOUT, '-', "Enable timeouts"},
{"mtu", OPT_MTU, 'p', "Set link layer MTU"}, {"mtu", OPT_MTU, 'p', "Set link layer MTU"},
{"chain", OPT_CHAIN, '-', "Read a certificate chain"}, {"chain", OPT_CHAIN, '-', "Read a certificate chain"},
{"listen", OPT_LISTEN, '-',
"Listen for a DTLS ClientHello with a cookie and then connect"},
#endif #endif
#ifndef OPENSSL_NO_DH #ifndef OPENSSL_NO_DH
{"no_dhe", OPT_NO_DHE, '-', "Disable ephemeral DH"}, {"no_dhe", OPT_NO_DHE, '-', "Disable ephemeral DH"},
...@@ -1369,6 +1372,9 @@ int s_server_main(int argc, char *argv[]) ...@@ -1369,6 +1372,9 @@ int s_server_main(int argc, char *argv[])
case OPT_CHAIN: case OPT_CHAIN:
cert_chain = 1; cert_chain = 1;
break; break;
case OPT_LISTEN:
dtlslisten = 1;
break;
#else #else
case OPT_DTLS: case OPT_DTLS:
case OPT_DTLS1: case OPT_DTLS1:
...@@ -1376,6 +1382,7 @@ int s_server_main(int argc, char *argv[]) ...@@ -1376,6 +1382,7 @@ int s_server_main(int argc, char *argv[])
case OPT_TIMEOUT: case OPT_TIMEOUT:
case OPT_MTU: case OPT_MTU:
case OPT_CHAIN: case OPT_CHAIN:
case OPT_LISTEN:
break; break;
#endif #endif
case OPT_ID_PREFIX: case OPT_ID_PREFIX:
...@@ -1434,6 +1441,11 @@ int s_server_main(int argc, char *argv[]) ...@@ -1434,6 +1441,11 @@ int s_server_main(int argc, char *argv[])
BIO_printf(bio_err, "Can't use -HTTP, -www or -WWW with DTLS\n"); BIO_printf(bio_err, "Can't use -HTTP, -www or -WWW with DTLS\n");
goto end; goto end;
} }
if (dtlslisten && socket_type != SOCK_DGRAM) {
BIO_printf(bio_err, "Can only use -listen with DTLS\n");
goto end;
}
#endif #endif
if (unix_path && (socket_type != SOCK_STREAM)) { if (unix_path && (socket_type != SOCK_STREAM)) {
...@@ -2383,8 +2395,31 @@ static int init_ssl_connection(SSL *con) ...@@ -2383,8 +2395,31 @@ static int init_ssl_connection(SSL *con)
unsigned next_proto_neg_len; unsigned next_proto_neg_len;
#endif #endif
unsigned char *exportedkeymat; unsigned char *exportedkeymat;
struct sockaddr client;
#ifndef OPENSSL_NO_DTLS1
if(dtlslisten) {
i = DTLSv1_listen(con, &client);
if (i > 0) {
BIO *wbio;
int fd;
wbio = SSL_get_wbio(con);
if(wbio) {
BIO_get_fd(wbio, &fd);
}
if(!wbio || connect(fd, &client, sizeof(struct sockaddr))) {
BIO_printf(bio_err, "ERROR - unable to connect\n");
return 0;
}
dtlslisten = 0;
i = SSL_accept(con);
}
} else
#endif
i = SSL_accept(con);
i = SSL_accept(con);
#ifdef CERT_CB_TEST_RETRY #ifdef CERT_CB_TEST_RETRY
{ {
while (i <= 0 && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP while (i <= 0 && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP
...@@ -2412,10 +2447,13 @@ static int init_ssl_connection(SSL *con) ...@@ -2412,10 +2447,13 @@ static int init_ssl_connection(SSL *con)
#endif #endif
if (i <= 0) { if (i <= 0) {
if (BIO_sock_should_retry(i)) { #ifndef OPENSSL_NO_DTLS1
if ((dtlslisten && i == 0)
|| (!dtlslisten && BIO_sock_should_retry(i))) {
BIO_printf(bio_s_out, "DELAY\n"); BIO_printf(bio_s_out, "DELAY\n");
return (1); return (1);
} }
#endif
BIO_printf(bio_err, "ERROR\n"); BIO_printf(bio_err, "ERROR\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册