diff options
| author | jsing <> | 2014-11-02 14:45:05 +0000 |
|---|---|---|
| committer | jsing <> | 2014-11-02 14:45:05 +0000 |
| commit | 44fdefc6525622fe6d745eb387fa3266f9028afb (patch) | |
| tree | d9142429aca61b41c92ba09dd825948905416233 /src/lib/libtls/tls_client.c | |
| parent | 4b5b1f9d30def9cb46fc251452c167712a74d45a (diff) | |
| download | openbsd-44fdefc6525622fe6d745eb387fa3266f9028afb.tar.gz openbsd-44fdefc6525622fe6d745eb387fa3266f9028afb.tar.bz2 openbsd-44fdefc6525622fe6d745eb387fa3266f9028afb.zip | |
Add a tls_connect_fds() function that allows a secure connection to be
established using a pair of existing file descriptors.
Based on a diff/request from Jan Klemkow.
Rides previous libtls rename/library bump.
Discussed with tedu@.
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libtls/tls_client.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/lib/libtls/tls_client.c b/src/lib/libtls/tls_client.c index 853766f87b..a4528b9b87 100644 --- a/src/lib/libtls/tls_client.c +++ b/src/lib/libtls/tls_client.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_client.c,v 1.1 2014/10/31 13:46:17 jsing Exp $ */ | 1 | /* $OpenBSD: tls_client.c,v 1.2 2014/11/02 14:45:05 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -123,6 +123,15 @@ err: | |||
| 123 | int | 123 | int |
| 124 | tls_connect_socket(struct tls *ctx, int socket, const char *hostname) | 124 | tls_connect_socket(struct tls *ctx, int socket, const char *hostname) |
| 125 | { | 125 | { |
| 126 | ctx->socket = socket; | ||
| 127 | |||
| 128 | return tls_connect_fds(ctx, socket, socket, hostname); | ||
| 129 | } | ||
| 130 | |||
| 131 | int | ||
| 132 | tls_connect_fds(struct tls *ctx, int fd_read, int fd_write, | ||
| 133 | const char *hostname) | ||
| 134 | { | ||
| 126 | union { struct in_addr ip4; struct in6_addr ip6; } addrbuf; | 135 | union { struct in_addr ip4; struct in6_addr ip6; } addrbuf; |
| 127 | X509 *cert = NULL; | 136 | X509 *cert = NULL; |
| 128 | int ret; | 137 | int ret; |
| @@ -132,7 +141,10 @@ tls_connect_socket(struct tls *ctx, int socket, const char *hostname) | |||
| 132 | goto err; | 141 | goto err; |
| 133 | } | 142 | } |
| 134 | 143 | ||
| 135 | ctx->socket = socket; | 144 | if (fd_read < 0 || fd_write < 0) { |
| 145 | tls_set_error(ctx, "invalid file descriptors"); | ||
| 146 | return (-1); | ||
| 147 | } | ||
| 136 | 148 | ||
| 137 | if ((ctx->ssl_ctx = SSL_CTX_new(SSLv23_client_method())) == NULL) { | 149 | if ((ctx->ssl_ctx = SSL_CTX_new(SSLv23_client_method())) == NULL) { |
| 138 | tls_set_error(ctx, "ssl context failure"); | 150 | tls_set_error(ctx, "ssl context failure"); |
| @@ -166,7 +178,8 @@ tls_connect_socket(struct tls *ctx, int socket, const char *hostname) | |||
| 166 | tls_set_error(ctx, "ssl connection failure"); | 178 | tls_set_error(ctx, "ssl connection failure"); |
| 167 | goto err; | 179 | goto err; |
| 168 | } | 180 | } |
| 169 | if (SSL_set_fd(ctx->ssl_conn, ctx->socket) != 1) { | 181 | if (SSL_set_rfd(ctx->ssl_conn, fd_read) != 1 || |
| 182 | SSL_set_wfd(ctx->ssl_conn, fd_write) != 1) { | ||
| 170 | tls_set_error(ctx, "ssl file descriptor failure"); | 183 | tls_set_error(ctx, "ssl file descriptor failure"); |
| 171 | goto err; | 184 | goto err; |
| 172 | } | 185 | } |
