summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libtls/tls_client.c')
-rw-r--r--src/lib/libtls/tls_client.c76
1 files changed, 56 insertions, 20 deletions
diff --git a/src/lib/libtls/tls_client.c b/src/lib/libtls/tls_client.c
index c360ecad52..f8d35a18c1 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.34 2016/08/15 14:04:23 jsing Exp $ */ 1/* $OpenBSD: tls_client.c,v 1.35 2016/09/04 12:26:43 bcook Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -158,15 +158,8 @@ tls_connect_servername(struct tls *ctx, const char *host, const char *port,
158 return (rv); 158 return (rv);
159} 159}
160 160
161int 161static int
162tls_connect_socket(struct tls *ctx, int s, const char *servername) 162connect_common(struct tls *ctx, const char *servername)
163{
164 return tls_connect_fds(ctx, s, s, servername);
165}
166
167int
168tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
169 const char *servername)
170{ 163{
171 union tls_addr addrbuf; 164 union tls_addr addrbuf;
172 int rv = -1; 165 int rv = -1;
@@ -176,11 +169,6 @@ tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
176 goto err; 169 goto err;
177 } 170 }
178 171
179 if (fd_read < 0 || fd_write < 0) {
180 tls_set_errorx(ctx, "invalid file descriptors");
181 goto err;
182 }
183
184 if (servername != NULL) { 172 if (servername != NULL) {
185 if ((ctx->servername = strdup(servername)) == NULL) { 173 if ((ctx->servername = strdup(servername)) == NULL) {
186 tls_set_errorx(ctx, "out of memory"); 174 tls_set_errorx(ctx, "out of memory");
@@ -195,6 +183,7 @@ tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
195 183
196 if (tls_configure_ssl(ctx, ctx->ssl_ctx) != 0) 184 if (tls_configure_ssl(ctx, ctx->ssl_ctx) != 0)
197 goto err; 185 goto err;
186
198 if (tls_configure_ssl_keypair(ctx, ctx->ssl_ctx, 187 if (tls_configure_ssl_keypair(ctx, ctx->ssl_ctx,
199 ctx->config->keypair, 0) != 0) 188 ctx->config->keypair, 0) != 0)
200 goto err; 189 goto err;
@@ -205,6 +194,7 @@ tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
205 goto err; 194 goto err;
206 } 195 }
207 } 196 }
197
208 if (ctx->config->verify_cert && 198 if (ctx->config->verify_cert &&
209 (tls_configure_ssl_verify(ctx, ctx->ssl_ctx, 199 (tls_configure_ssl_verify(ctx, ctx->ssl_ctx,
210 SSL_VERIFY_PEER) == -1)) 200 SSL_VERIFY_PEER) == -1))
@@ -214,15 +204,11 @@ tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
214 tls_set_errorx(ctx, "ssl connection failure"); 204 tls_set_errorx(ctx, "ssl connection failure");
215 goto err; 205 goto err;
216 } 206 }
207
217 if (SSL_set_app_data(ctx->ssl_conn, ctx) != 1) { 208 if (SSL_set_app_data(ctx->ssl_conn, ctx) != 1) {
218 tls_set_errorx(ctx, "ssl application data failure"); 209 tls_set_errorx(ctx, "ssl application data failure");
219 goto err; 210 goto err;
220 } 211 }
221 if (SSL_set_rfd(ctx->ssl_conn, fd_read) != 1 ||
222 SSL_set_wfd(ctx->ssl_conn, fd_write) != 1) {
223 tls_set_errorx(ctx, "ssl file descriptor failure");
224 goto err;
225 }
226 212
227 /* 213 /*
228 * RFC4366 (SNI): Literal IPv4 and IPv6 addresses are not 214 * RFC4366 (SNI): Literal IPv4 and IPv6 addresses are not
@@ -236,6 +222,56 @@ tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
236 goto err; 222 goto err;
237 } 223 }
238 } 224 }
225 rv = 0;
226
227 err:
228 return (rv);
229}
230
231int
232tls_connect_socket(struct tls *ctx, int s, const char *servername)
233{
234 return tls_connect_fds(ctx, s, s, servername);
235}
236
237int
238tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
239 const char *servername)
240{
241 int rv = -1;
242
243 if (fd_read < 0 || fd_write < 0) {
244 tls_set_errorx(ctx, "invalid file descriptors");
245 goto err;
246 }
247
248 if (connect_common(ctx, servername) != 0)
249 goto err;
250
251 if (SSL_set_rfd(ctx->ssl_conn, fd_read) != 1 ||
252 SSL_set_wfd(ctx->ssl_conn, fd_write) != 1) {
253 tls_set_errorx(ctx, "ssl file descriptor failure");
254 goto err;
255 }
256
257 rv = 0;
258 err:
259 return (rv);
260}
261
262int
263tls_connect_cbs(struct tls *ctx, tls_read_cb read_cb,
264 tls_write_cb write_cb, void *cb_arg, const char *servername)
265{
266 int rv = -1;
267
268 if (connect_common(ctx, servername) != 0)
269 goto err;
270
271 if (tls_set_cbs(ctx, read_cb, write_cb, cb_arg) != 0) {
272 tls_set_errorx(ctx, "callback registration failure");
273 goto err;
274 }
239 275
240 rv = 0; 276 rv = 0;
241 277