This patch allows to transfer both request/response between utilities and
userspace URBs transfer over SSL. OpenSSL is used for the implementation.
Options --with-ssl=yes at ./configure and --ssl to command and daemon enable
SSL. Default of --with-ssl is depends on existence of OpenSSL package. If it
exists, default is --with-ssl=yes otherwise no.
If user space URBs transfer is not activated, ie. usbip_ux.ko is not installed,
the utilites will fail in socket preparation.
To compile and execute the utilities, OpenSSL headers and libraries
(openssl-devel or openssl-dev package) are needed.
Supported certificate files format is PEM.
Related options and their default are as following.
--ssl
Activate SSL. Default is non SSL.
--tcp-port
TCP port number. Default is 3240 for non SSL or 443 for SSL.
--key
Private key file. Default is ./cert/server.key (for usbipd and usbipa)
or ./cert/client.key (for usbip).
--cert
Certificate file. Default is ./cert/server.crt (for usbipd and usbipa)
or ./cert/client.crt (for usbip).
--root
Root CA's certification. Default is none.
--verification
Verification mode from none | relaxed | strict | once
(for usbipd and usbipa) or none | relaxed (for usbip).
Default is none.
Signed-off-by: Nobuo Iwata <[email protected]>
---
tools/usb/usbip/configure.ac | 34 ++++++
tools/usb/usbip/src/Makefile.am | 10 +-
tools/usb/usbip/src/usbip.c | 55 ++++++++-
tools/usb/usbip/src/usbip_network.c | 47 ++++++++
tools/usb/usbip/src/usbip_network.h | 3 +
tools/usb/usbip/src/usbip_ssl.c | 232 ++++++++++++++++++++++++++++++++++++
tools/usb/usbip/src/usbip_ssl.h | 35 ++++++
tools/usb/usbip/src/usbipd.c | 108 ++++++++++++++++-
8 files changed, 516 insertions(+), 8 deletions(-)
create mode 100644 tools/usb/usbip/src/usbip_ssl.c
create mode 100644 tools/usb/usbip/src/usbip_ssl.h
diff --git a/tools/usb/usbip/configure.ac b/tools/usb/usbip/configure.ac
index 607d05c..3b8277e 100644
--- a/tools/usb/usbip/configure.ac
+++ b/tools/usb/usbip/configure.ac
@@ -90,6 +90,40 @@ AC_ARG_WITH([usbids-dir],
[USBIDS_DIR=$withval], [USBIDS_DIR="/usr/share/hwdata/"])
AC_SUBST([USBIDS_DIR])
+# Checks for SSL.
+AC_MSG_CHECKING([whether to use SSL])
+AC_ARG_WITH([ssl],
+ [AS_HELP_STRING([--with-ssl],
+ [use SSL (OpenSSL)])],
+ dnl [ACTION-IF-GIVEN]
+ [if test "$withval" = "yes"; then
+ AC_MSG_RESULT([yes])
+ AC_MSG_CHECKING([for SSL_METHOD])
+ saved_LIBS="$LIBS"
+ LIBS="-lssl -lcrypt $saved_LIBS"
+ AC_TRY_LINK(
+ [#include <openssl/ssl.h>],
+ [SSL_METHOD *m = SSLv23_method();],
+ [AC_MSG_RESULT([yes]);
+ AC_DEFINE([USE_SSL], [1], [use ssl])
+ AC_SUBST([SSL_LIBS], ["-lssl -lcrypto"])],
+ [AC_MSG_RESULT([not found]); exit 1])
+ else
+ AC_MSG_RESULT([no]);
+ fi],
+ dnl [ACTION-IF-NOT-GIVEN]
+ [AC_MSG_RESULT([(default)])
+ AC_MSG_CHECKING([for SSL_METHOD])
+ saved_LIBS="$LIBS"
+ LIBS="-lssl -lcrypt $saved_LIBS"
+ AC_TRY_LINK(
+ [#include <openssl/ssl.h>],
+ [SSL_METHOD *m = SSLv23_method();],
+ [AC_MSG_RESULT([yes]);
+ AC_DEFINE([USE_SSL], [1], [use ssl])
+ AC_SUBST([SSL_LIBS], ["-lssl -lcrypto"])],
+ [AC_MSG_RESULT([no]); LIBS="$saved_LIBS"])])
+
# use _FORTIFY_SOURCE
AC_MSG_CHECKING([whether to use fortify])
AC_ARG_WITH([fortify],
diff --git a/tools/usb/usbip/src/Makefile.am b/tools/usb/usbip/src/Makefile.am
index f5697c2..cbe55ec 100644
--- a/tools/usb/usbip/src/Makefile.am
+++ b/tools/usb/usbip/src/Makefile.am
@@ -1,14 +1,18 @@
AM_CPPFLAGS = -I$(top_srcdir)/libsrc -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"'
AM_CFLAGS = @EXTRA_CFLAGS@
+AM_LDFLAGS = @SSL_LIBS@
LDADD = $(top_builddir)/libsrc/libusbip.la
sbin_PROGRAMS := usbip usbipd usbipa
-usbip_SOURCES := usbip.h utils.h usbip.c utils.c usbip_network.c \
+usbip_SOURCES := usbip.h utils.h usbip.c utils.c \
+ usbip_network.c usbip_ssl.c \
usbip_attach.c usbip_detach.c usbip_list.c \
usbip_bind.c usbip_unbind.c usbip_port.c \
usbip_connect.c usbip_disconnect.c
-usbipd_SOURCES := usbip_network.h usbipd.c usbipd_dev.c usbip_network.c
+usbipd_SOURCES := usbip_network.h usbipd.c usbipd_dev.c \
+ usbip_network.c usbip_ssl.c
-usbipa_SOURCES := usbip_network.h usbipd.c usbipd_app.c usbip_network.c
+usbipa_SOURCES := usbip_network.h usbipd.c usbipd_app.c \
+ usbip_network.c usbip_ssl.c
diff --git a/tools/usb/usbip/src/usbip.c b/tools/usb/usbip/src/usbip.c
index 9d1468f..e743d82 100644
--- a/tools/usb/usbip/src/usbip.c
+++ b/tools/usb/usbip/src/usbip.c
@@ -30,14 +30,29 @@
#include "usbip_network.h"
#include "usbip.h"
+#ifdef USE_SSL
+#include "usbip_ssl.h"
+
+int usbip_use_ssl = 0;
+char *usbip_ssl_default_cert = "cert/client.crt";
+char *usbip_ssl_default_key = "cert/client.key";
+#endif
+
static int usbip_help(int argc, char *argv[]);
static int usbip_version(int argc, char *argv[]);
static const char usbip_version_string[] = PACKAGE_STRING;
static const char usbip_usage_string[] =
- "usbip [--debug] [--log] [--tcp-port PORT] [version]\n"
- " [help] <command> <args>\n";
+ "usbip [--debug] [--log] [--tcp-port PORT]"
+#ifdef USE_SSL
+ " [--ssl]\n"
+ " [--key KEY-FILE] [--cert CERT-FILE] [--root
ROOT-CERT-FILE]\n"
+ " [--verification-mode <none | relaxed>]\n"
+#else
+ "\n"
+#endif
+ " [version] [help] <command> <args>\n";
static void usbip_usage(void)
{
@@ -161,6 +176,13 @@ int main(int argc, char *argv[])
{ "debug", no_argument, NULL, 'd' },
{ "log", no_argument, NULL, 'l' },
{ "tcp-port", required_argument, NULL, 't' },
+#ifdef USE_SSL
+ { "ssl", no_argument, NULL, 's' },
+ { "cert", required_argument, NULL, 'c' },
+ { "key", required_argument, NULL, 'k' },
+ { "root", required_argument, NULL, 'r' },
+ { "verification", required_argument, NULL, 'V' },
+#endif
{ NULL, 0, NULL, 0 }
};
@@ -171,7 +193,11 @@ int main(int argc, char *argv[])
usbip_use_stderr = 1;
opterr = 0;
for (;;) {
- opt = getopt_long(argc, argv, "+dlt:", opts, NULL);
+ opt = getopt_long(argc, argv, "+dlt:"
+#ifdef USE_SSL
+ "sc:k:r:V:"
+#endif
+ , opts, NULL);
if (opt == -1)
break;
@@ -187,6 +213,26 @@ int main(int argc, char *argv[])
case 't':
usbip_setup_port_number(optarg);
break;
+#ifdef USE_SSL
+ case 's':
+ usbip_use_ssl = 1;
+ break;
+ case 'c':
+ usbip_ssl_setup_cert(optarg);
+ break;
+ case 'k':
+ usbip_ssl_setup_key(optarg);
+ break;
+ case 'r':
+ usbip_ssl_setup_root(optarg);
+ break;
+ case 'V':
+ if (usbip_ssl_setup_verification_mode(optarg, 1)) {
+ usbip_usage();
+ goto out;
+ }
+ break;
+#endif
case '?':
printf("usbip: invalid option\n");
default:
@@ -194,6 +240,9 @@ int main(int argc, char *argv[])
goto out;
}
}
+#ifdef USE_SSL
+ usbip_fixup_port_number();
+#endif
cmd = argv[optind];
if (cmd) {
diff --git a/tools/usb/usbip/src/usbip_network.c
b/tools/usb/usbip/src/usbip_network.c
index 329de34..39ed18c 100644
--- a/tools/usb/usbip/src/usbip_network.c
+++ b/tools/usb/usbip/src/usbip_network.c
@@ -33,8 +33,16 @@
#include "usbip_common.h"
#include "usbip_network.h"
+#ifdef USE_SSL
+#include "usbip_ssl.h"
+
+extern int usbip_use_ssl;
+SSL_CTX *usbip_ssl_context;
+#endif
+
int usbip_port = 3240;
char *usbip_port_string = "3240";
+static int usbip_port_default = 1;
void usbip_setup_port_number(char *arg)
{
@@ -60,9 +68,20 @@ void usbip_setup_port_number(char *arg)
usbip_port = port;
usbip_port_string = arg;
+ usbip_port_default = 0;
info("using port %d (\"%s\")", usbip_port, usbip_port_string);
}
+#ifdef USE_SSL
+void usbip_fixup_port_number(void)
+{
+ if (usbip_port_default) {
+ usbip_port = 443;
+ usbip_port_string = "443";
+ }
+}
+#endif
+
void usbip_net_pack_uint32_t(int pack, uint32_t *num)
{
uint32_t i;
@@ -316,13 +335,41 @@ usbip_sock_t *usbip_net_tcp_connect(char *hostname, char
*service)
close(sockfd);
return NULL;
}
+#ifdef USE_SSL
+ if (usbip_use_ssl) {
+ SSL *ssl;
+ usbip_ssl_context = usbip_ssl_setup(0);
+ if (usbip_ssl_context == NULL) {
+ close(sockfd);
+ return NULL;
+ }
+ ssl = usbip_ssl_connect(usbip_ssl_context, sockfd);
+ if (ssl == NULL) {
+ usbip_ssl_teardown(usbip_ssl_context);
+ close(sockfd);
+ return NULL;
+ }
+ usbip_sock_init(sock, sockfd, ssl,
+ usbip_ssl_send, usbip_ssl_recv,
+ usbip_ssl_shutdown);
+ } else {
+ usbip_sock_init(sock, sockfd, NULL, NULL, NULL, NULL);
+ }
+#else
usbip_sock_init(sock, sockfd, NULL, NULL, NULL, NULL);
+#endif
return sock;
}
void usbip_net_tcp_close(usbip_sock_t *sock)
{
+#ifdef USE_SSL
+ if (usbip_use_ssl) {
+ usbip_ssl_close((SSL*)sock->arg);
+ usbip_ssl_teardown(usbip_ssl_context);
+ }
+#endif
close(sock->fd);
free(sock);
}
diff --git a/tools/usb/usbip/src/usbip_network.h
b/tools/usb/usbip/src/usbip_network.h
index 1c304e0..3f7d0d3 100644
--- a/tools/usb/usbip/src/usbip_network.h
+++ b/tools/usb/usbip/src/usbip_network.h
@@ -17,6 +17,9 @@
extern int usbip_port;
extern char *usbip_port_string;
void usbip_setup_port_number(char *arg);
+#ifdef USE_SSL
+void usbip_fixup_port_number(void);
+#endif
/* ---------------------------------------------------------------------- */
/* Common header for all the kinds of PDUs. */
diff --git a/tools/usb/usbip/src/usbip_ssl.c b/tools/usb/usbip/src/usbip_ssl.c
new file mode 100644
index 0000000..f6b0db6
--- /dev/null
+++ b/tools/usb/usbip/src/usbip_ssl.c
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2015 Nobuo Iwata
+ *
+ * OpenSSL functions for USB/IP.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+
+#ifdef USE_SSL
+
+#include "usbip_ssl.h"
+#include "usbip_common.h"
+#include "usbip_ux.h"
+
+extern char *usbip_ssl_default_cert;
+extern char *usbip_ssl_default_key;
+
+static const char *ssl_cert = NULL;
+static const char *ssl_key = NULL;
+static const char *ssl_root = NULL;
+static int ssl_verification_mode = SSL_VERIFY_NONE;
+
+void usbip_ssl_setup_cert(const char *arg)
+{
+ dbg("Parsing cert arg '%s'", arg);
+ ssl_cert = arg;
+}
+
+void usbip_ssl_setup_key(const char *arg)
+{
+ dbg("Parsing key arg '%s'", arg);
+ ssl_cert = arg;
+}
+
+void usbip_ssl_setup_root(const char *arg)
+{
+ dbg("Parsing root arg '%s'", arg);
+ ssl_root = arg;
+}
+
+int usbip_ssl_setup_verification_mode(const char *arg, int server)
+{
+ dbg("Parsing verification arg '%s'", arg);
+ if (!strcmp(arg, "none")) {
+ ssl_verification_mode = SSL_VERIFY_NONE;
+ } else if (!strcmp(arg, "relaxed")) {
+ ssl_verification_mode = SSL_VERIFY_PEER;
+ } else if (server && !strcmp(arg, "strict")) {
+ ssl_verification_mode = SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
+ } else if (server && !strcmp(arg, "once")) {
+ ssl_verification_mode = SSL_VERIFY_CLIENT_ONCE;
+ } else {
+ return -1;
+ }
+ return 0;
+}
+
+static int load_cert(SSL_CTX *ctx)
+{
+ int ret;
+
+ if (ssl_cert == NULL) {
+ ssl_cert = usbip_ssl_default_cert;
+ }
+ if (ssl_key == NULL) {
+ ssl_key = usbip_ssl_default_key;
+ }
+ ret = SSL_CTX_use_certificate_file(ctx, ssl_cert, SSL_FILETYPE_PEM);
+ if (ret != 1) {
+ err("Fail to load cert: %s",
ERR_reason_error_string(ERR_get_error()));
+ return -1;
+ }
+ ret = SSL_CTX_use_PrivateKey_file(ctx, ssl_key, SSL_FILETYPE_PEM);
+ if (ret != 1) {
+ err("Fail to load key: %s",
ERR_reason_error_string(ERR_get_error()));
+ return -1;
+ }
+ if (ssl_root != NULL) {
+ ret = SSL_CTX_load_verify_locations(ctx, ssl_root, NULL);
+ if (ret != 1) {
+ err("Fail to load root: %s",
ERR_reason_error_string(ERR_get_error()));
+ return -1;
+ }
+ }
+ return 0;
+}
+
+SSL_CTX *usbip_ssl_setup(int server)
+{
+ SSL_CTX *ctx;
+
+ SSL_library_init();
+ SSL_load_error_strings();
+ ERR_load_BIO_strings();
+ OpenSSL_add_all_algorithms();
+
+ if (!usbip_ux_installed()) {
+ err("Userspace transmission is not enabled for SSL.");
+ goto err0;
+ }
+ if (server) {
+ ctx = SSL_CTX_new(SSLv23_server_method());
+ } else {
+ ctx = SSL_CTX_new(SSLv3_client_method());
+ }
+ if (ctx == NULL) {
+ err("Fail to create context: %s",
ERR_reason_error_string(ERR_get_error()));
+ goto err0;
+ }
+ if (load_cert(ctx)) {
+ goto err1;
+ }
+ SSL_CTX_set_verify(ctx, ssl_verification_mode, NULL);
+ return ctx;
+err1:
+ SSL_CTX_free(ctx);
+err0:
+ return NULL;
+}
+
+void usbip_ssl_teardown(SSL_CTX *ctx)
+{
+ SSL_CTX_free(ctx);
+}
+
+static SSL *alloc_ssl(SSL_CTX *ctx, int sockfd)
+{
+ SSL *ssl;
+
+ ssl = SSL_new(ctx);
+ if (ssl == NULL) {
+ err("Fail to create ssl: %s",
ERR_reason_error_string(ERR_get_error()));
+ goto err0;
+ }
+ if (SSL_set_fd(ssl, sockfd) != 1) {
+ err("Fail to set fd to ssl: %s",
ERR_reason_error_string(ERR_get_error()));
+ goto err1;
+ }
+ return ssl;
+err1:
+ SSL_free(ssl);
+err0:
+ return NULL;
+}
+
+SSL *usbip_ssl_accept(SSL_CTX *ctx, int sockfd)
+{
+ SSL *ssl;
+ int ret;
+
+ ssl = alloc_ssl(ctx, sockfd);
+ if (ssl == NULL) {
+ goto err0;
+ }
+ ret = SSL_accept(ssl);
+ if (ret != 1) {
+ err("Fail to accept: %s",
ERR_reason_error_string(ERR_get_error()));
+ if (ret < 0) {
+ SSL_shutdown(ssl);
+ }
+ goto err1;
+ }
+ return ssl;
+err1:
+ SSL_free(ssl);
+err0:
+ return NULL;
+}
+
+SSL *usbip_ssl_connect(SSL_CTX *ctx, int sockfd)
+{
+ SSL *ssl;
+ int ret;
+
+ ssl = alloc_ssl(ctx, sockfd);
+ if (ssl == NULL) {
+ goto err0;
+ }
+ ret = SSL_connect(ssl);
+ if (ret != 1) {
+ err("Fail to connect: %s",
ERR_reason_error_string(ERR_get_error()));
+ if (ret < 0) {
+ SSL_shutdown(ssl);
+ }
+ goto err1;
+ }
+ return ssl;
+err1:
+ SSL_free(ssl);
+err0:
+ return NULL;
+}
+
+void usbip_ssl_close(SSL *ssl)
+{
+ SSL_free(ssl);
+}
+
+ssize_t usbip_ssl_send(void *arg, void *buf, size_t len)
+{
+ SSL *ssl = (SSL*)arg;
+ return SSL_write(ssl, buf, len);
+}
+
+ssize_t usbip_ssl_recv(void *arg, void *buf, size_t len, int all)
+{
+ SSL *ssl = (SSL*)arg;
+ char *p = (char*)buf;
+ ssize_t bytes, received = 0;
+
+ do {
+ bytes = SSL_read(ssl, p+received, len-received);
+ if (bytes == 0) {
+ return received;
+ } else if (bytes < 0) {
+ return -1;
+ }
+ received += bytes;
+ } while(all && received < (ssize_t)len);
+ return received;
+}
+
+void usbip_ssl_shutdown(void *arg)
+{
+ SSL *ssl = (SSL*)arg;
+ SSL_shutdown(ssl);
+}
+
+#endif /* USE_SSL */
+
diff --git a/tools/usb/usbip/src/usbip_ssl.h b/tools/usb/usbip/src/usbip_ssl.h
new file mode 100644
index 0000000..78b1181
--- /dev/null
+++ b/tools/usb/usbip/src/usbip_ssl.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 Nobuo Iwata
+ *
+ * OpenSSL functions for USB/IP.
+ */
+
+#ifndef __USBIP_SSL_H
+#define __USBIP_SSL_H
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+
+#ifdef USE_SSL
+
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <unistd.h>
+
+void usbip_ssl_setup_cert(const char *arg);
+void usbip_ssl_setup_key(const char *arg);
+void usbip_ssl_setup_root(const char *arg);
+int usbip_ssl_setup_verification_mode(const char *arg, int server);
+SSL_CTX *usbip_ssl_setup(int server);
+void usbip_ssl_teardown(SSL_CTX *ctx);
+SSL *usbip_ssl_accept(SSL_CTX *ctx, int sockfd);
+SSL *usbip_ssl_connect(SSL_CTX *ctx, int sockfd);
+void usbip_ssl_close(SSL *ssl);
+ssize_t usbip_ssl_send(void *arg, void *buf, size_t len);
+ssize_t usbip_ssl_recv(void *arg, void *buf, size_t len, int all);
+void usbip_ssl_shutdown(void *arg);
+
+#endif /* USE_SSL */
+
+#endif /* !__USBIP_SSL_H */
diff --git a/tools/usb/usbip/src/usbipd.c b/tools/usb/usbip/src/usbipd.c
index 5f7cd86..07d5edd 100644
--- a/tools/usb/usbip/src/usbipd.c
+++ b/tools/usb/usbip/src/usbipd.c
@@ -46,6 +46,15 @@
#include "usbip_ux.h"
#include "list.h"
+#ifdef USE_SSL
+#include "usbip_ssl.h"
+
+int usbip_use_ssl = 0;
+char *usbip_ssl_default_cert = "cert/server.crt";
+char *usbip_ssl_default_key = "cert/server.key";
+SSL_CTX *usbip_ssl_context;
+#endif
+
extern char *usbip_progname;
#define MAXSOCKFD 20
@@ -77,6 +86,28 @@ static const char usbipd_help_string[] =
"\n"
" -tPORT, --tcp-port PORT\n"
" Listen on TCP/IP port PORT.\n"
+#ifdef USE_SSL
+ " Default is 3240 for non-SSL or 443 for SSL.\n"
+#else
+ " Default is 3240.\n"
+#endif
+#ifdef USE_SSL
+ "\n"
+ " -s, --ssl\n"
+ " Use SSL.\n"
+ "\n"
+ " -kKEY-FILE, --key KEY-FILE\n"
+ " Private key file. Default is %s.\n"
+ "\n"
+ " -cCERT-FILE, --cert CERT-FILE\n"
+ " Certificate file. Default is %s.\n"
+ "\n"
+ " -rROOT-CERT-FILE, --root ROOT-CERT-FILE\n"
+ " Trusted CA file. Default is none.\n"
+ "\n"
+ " -VVERIFICATION-MODE, --verification VERIFICATION-MODE\n"
+ " Verification mode - none(default), relaxed, strict or
once.\n"
+#endif
"\n"
" -h, --help\n"
" Print this help.\n"
@@ -86,7 +117,11 @@ static const char usbipd_help_string[] =
static void usbipd_help(void)
{
- printf(usbipd_help_string, usbip_progname, usbip_default_pid_file);
+ printf(usbipd_help_string, usbip_progname, usbip_default_pid_file
+#ifdef USE_SSL
+ , usbip_ssl_default_key, usbip_ssl_default_cert
+#endif
+ );
}
#ifdef HAVE_LIBWRAP
@@ -153,8 +188,26 @@ int process_request(int listenfd)
childpid = fork();
if (childpid == 0) {
close(listenfd);
+#ifdef USE_SSL
+ if (usbip_use_ssl) {
+ SSL *ssl = usbip_ssl_accept(usbip_ssl_context, connfd);
+ if (ssl == NULL) {
+ close(connfd);
+ exit(1);
+ }
+ usbip_sock_init(&sock, connfd, ssl,
+ usbip_ssl_send, usbip_ssl_recv,
+ usbip_ssl_shutdown);
+ usbip_recv_pdu(&sock, host, port);
+ usbip_ssl_close(ssl);
+ } else {
+ usbip_sock_init(&sock, connfd, NULL, NULL, NULL, NULL);
+ usbip_recv_pdu(&sock, host, port);
+ }
+#else
usbip_sock_init(&sock, connfd, NULL, NULL, NULL, NULL);
usbip_recv_pdu(&sock, host, port);
+#endif
close(connfd);
exit(0);
}
@@ -229,6 +282,9 @@ static int listen_all_addrinfo(struct addrinfo *ai_head,
int sockfdlist[],
}
info("listening on %s", ai_buf);
+#ifdef USE_SSL
+ if (usbip_use_ssl) info("using ssl");
+#endif
sockfdlist[nsockfd++] = sock;
}
@@ -351,6 +407,15 @@ static int do_standalone_mode(int daemonize, int ipv4, int
ipv6)
usbip_driver_close();
return -1;
}
+#ifdef USE_SSL
+ if (usbip_use_ssl) {
+ usbip_ssl_context = usbip_ssl_setup(1);
+ if (usbip_ssl_context == NULL) {
+ usbip_driver_close();
+ return -1;
+ }
+ }
+#endif
nsockfd = listen_all_addrinfo(ai_head, sockfdlist,
sizeof(sockfdlist) / sizeof(*sockfdlist));
freeaddrinfo(ai_head);
@@ -396,6 +461,11 @@ static int do_standalone_mode(int daemonize, int ipv4, int
ipv6)
}
info("shutting down " PROGNAME);
+#ifdef USE_SSL
+ if (usbip_use_ssl) {
+ usbip_ssl_teardown(usbip_ssl_context);
+ }
+#endif
free(fds);
usbip_driver_close();
@@ -412,6 +482,13 @@ int main(int argc, char *argv[])
{ "debug", no_argument, NULL, 'd' },
{ "pid", optional_argument, NULL, 'P' },
{ "tcp-port", required_argument, NULL, 't' },
+#ifdef USE_SSL
+ { "ssl", no_argument, NULL, 's' },
+ { "cert", required_argument, NULL, 'c' },
+ { "key", required_argument, NULL, 'k' },
+ { "root", required_argument, NULL, 'r' },
+ { "verification", required_argument, NULL, 'V' },
+#endif
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'v' },
{ NULL, 0, NULL, 0 }
@@ -437,7 +514,11 @@ int main(int argc, char *argv[])
cmd = cmd_standalone_mode;
for (;;) {
- opt = getopt_long(argc, argv, "46DdP::t:hv", longopts, NULL);
+ opt = getopt_long(argc, argv, "46DdP::t:"
+#ifdef USE_SSL
+ "sc:k:r:V:"
+#endif
+ "hv", longopts, NULL);
if (opt == -1)
break;
@@ -464,6 +545,26 @@ int main(int argc, char *argv[])
case 't':
usbip_setup_port_number(optarg);
break;
+#ifdef USE_SSL
+ case 's':
+ usbip_use_ssl = 1;
+ break;
+ case 'c':
+ usbip_ssl_setup_cert(optarg);
+ break;
+ case 'k':
+ usbip_ssl_setup_key(optarg);
+ break;
+ case 'r':
+ usbip_ssl_setup_root(optarg);
+ break;
+ case 'V':
+ if (usbip_ssl_setup_verification_mode(optarg, 1)) {
+ usbipd_help();
+ goto err_out;
+ }
+ break;
+#endif
case 'v':
cmd = cmd_version;
break;
@@ -473,6 +574,9 @@ int main(int argc, char *argv[])
goto err_out;
}
}
+#ifdef USE_SSL
+ usbip_fixup_port_number();
+#endif
if (!ipv4 && !ipv6)
ipv4 = ipv6 = 1;
--
2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html