summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2016-04-28 17:05:59 +0000
committerjsing <>2016-04-28 17:05:59 +0000
commitf4470c187e09c2ca1bfcf671080ac97b7fc86df2 (patch)
tree046b15c71afb290bae07f4b238cfdc296f78ca6b /src
parent2666540eb58ec0e76b541248bed9d159e6a2ccea (diff)
downloadopenbsd-f4470c187e09c2ca1bfcf671080ac97b7fc86df2.tar.gz
openbsd-f4470c187e09c2ca1bfcf671080ac97b7fc86df2.tar.bz2
openbsd-f4470c187e09c2ca1bfcf671080ac97b7fc86df2.zip
Factor our the keypair handling in libtls. This results in more readable
and self-contained code, while preparing for the ability to handle multiple keypairs. Also provide two additional functions that allow a public certificate and private key to be set with a single function call. ok beck@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libtls/tls.c45
-rw-r--r--src/lib/libtls/tls.h6
-rw-r--r--src/lib/libtls/tls_client.c4
-rw-r--r--src/lib/libtls/tls_config.c114
-rw-r--r--src/lib/libtls/tls_init.320
-rw-r--r--src/lib/libtls/tls_internal.h23
-rw-r--r--src/lib/libtls/tls_server.c4
7 files changed, 164 insertions, 52 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c
index 661aa6ad0a..d067309cd3 100644
--- a/src/lib/libtls/tls.c
+++ b/src/lib/libtls/tls.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls.c,v 1.36 2016/04/28 16:48:44 jsing Exp $ */ 1/* $OpenBSD: tls.c,v 1.37 2016/04/28 17:05:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -179,40 +179,41 @@ tls_configure(struct tls *ctx, struct tls_config *config)
179} 179}
180 180
181int 181int
182tls_configure_keypair(struct tls *ctx, int required) 182tls_configure_keypair(struct tls *ctx, SSL_CTX *ssl_ctx,
183 struct tls_keypair *keypair, int required)
183{ 184{
184 EVP_PKEY *pkey = NULL; 185 EVP_PKEY *pkey = NULL;
185 X509 *cert = NULL; 186 X509 *cert = NULL;
186 BIO *bio = NULL; 187 BIO *bio = NULL;
187 188
188 if (!required && 189 if (!required &&
189 ctx->config->cert_mem == NULL && 190 keypair->cert_mem == NULL &&
190 ctx->config->key_mem == NULL && 191 keypair->key_mem == NULL &&
191 ctx->config->cert_file == NULL && 192 keypair->cert_file == NULL &&
192 ctx->config->key_file == NULL) 193 keypair->key_file == NULL)
193 return(0); 194 return(0);
194 195
195 if (ctx->config->cert_mem != NULL) { 196 if (keypair->cert_mem != NULL) {
196 if (ctx->config->cert_len > INT_MAX) { 197 if (keypair->cert_len > INT_MAX) {
197 tls_set_errorx(ctx, "certificate too long"); 198 tls_set_errorx(ctx, "certificate too long");
198 goto err; 199 goto err;
199 } 200 }
200 201
201 if (SSL_CTX_use_certificate_chain_mem(ctx->ssl_ctx, 202 if (SSL_CTX_use_certificate_chain_mem(ssl_ctx,
202 ctx->config->cert_mem, ctx->config->cert_len) != 1) { 203 keypair->cert_mem, keypair->cert_len) != 1) {
203 tls_set_errorx(ctx, "failed to load certificate"); 204 tls_set_errorx(ctx, "failed to load certificate");
204 goto err; 205 goto err;
205 } 206 }
206 cert = NULL; 207 cert = NULL;
207 } 208 }
208 if (ctx->config->key_mem != NULL) { 209 if (keypair->key_mem != NULL) {
209 if (ctx->config->key_len > INT_MAX) { 210 if (keypair->key_len > INT_MAX) {
210 tls_set_errorx(ctx, "key too long"); 211 tls_set_errorx(ctx, "key too long");
211 goto err; 212 goto err;
212 } 213 }
213 214
214 if ((bio = BIO_new_mem_buf(ctx->config->key_mem, 215 if ((bio = BIO_new_mem_buf(keypair->key_mem,
215 ctx->config->key_len)) == NULL) { 216 keypair->key_len)) == NULL) {
216 tls_set_errorx(ctx, "failed to create buffer"); 217 tls_set_errorx(ctx, "failed to create buffer");
217 goto err; 218 goto err;
218 } 219 }
@@ -221,7 +222,7 @@ tls_configure_keypair(struct tls *ctx, int required)
221 tls_set_errorx(ctx, "failed to read private key"); 222 tls_set_errorx(ctx, "failed to read private key");
222 goto err; 223 goto err;
223 } 224 }
224 if (SSL_CTX_use_PrivateKey(ctx->ssl_ctx, pkey) != 1) { 225 if (SSL_CTX_use_PrivateKey(ssl_ctx, pkey) != 1) {
225 tls_set_errorx(ctx, "failed to load private key"); 226 tls_set_errorx(ctx, "failed to load private key");
226 goto err; 227 goto err;
227 } 228 }
@@ -231,22 +232,22 @@ tls_configure_keypair(struct tls *ctx, int required)
231 pkey = NULL; 232 pkey = NULL;
232 } 233 }
233 234
234 if (ctx->config->cert_file != NULL) { 235 if (keypair->cert_file != NULL) {
235 if (SSL_CTX_use_certificate_chain_file(ctx->ssl_ctx, 236 if (SSL_CTX_use_certificate_chain_file(ssl_ctx,
236 ctx->config->cert_file) != 1) { 237 keypair->cert_file) != 1) {
237 tls_set_errorx(ctx, "failed to load certificate file"); 238 tls_set_errorx(ctx, "failed to load certificate file");
238 goto err; 239 goto err;
239 } 240 }
240 } 241 }
241 if (ctx->config->key_file != NULL) { 242 if (keypair->key_file != NULL) {
242 if (SSL_CTX_use_PrivateKey_file(ctx->ssl_ctx, 243 if (SSL_CTX_use_PrivateKey_file(ssl_ctx,
243 ctx->config->key_file, SSL_FILETYPE_PEM) != 1) { 244 keypair->key_file, SSL_FILETYPE_PEM) != 1) {
244 tls_set_errorx(ctx, "failed to load private key file"); 245 tls_set_errorx(ctx, "failed to load private key file");
245 goto err; 246 goto err;
246 } 247 }
247 } 248 }
248 249
249 if (SSL_CTX_check_private_key(ctx->ssl_ctx) != 1) { 250 if (SSL_CTX_check_private_key(ssl_ctx) != 1) {
250 tls_set_errorx(ctx, "private/public key mismatch"); 251 tls_set_errorx(ctx, "private/public key mismatch");
251 goto err; 252 goto err;
252 } 253 }
diff --git a/src/lib/libtls/tls.h b/src/lib/libtls/tls.h
index da229d1fee..6994f1417b 100644
--- a/src/lib/libtls/tls.h
+++ b/src/lib/libtls/tls.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls.h,v 1.27 2016/04/28 16:48:44 jsing Exp $ */ 1/* $OpenBSD: tls.h,v 1.28 2016/04/28 17:05:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -66,6 +66,10 @@ int tls_config_set_ecdhecurve(struct tls_config *_config, const char *_name);
66int tls_config_set_key_file(struct tls_config *_config, const char *_key_file); 66int tls_config_set_key_file(struct tls_config *_config, const char *_key_file);
67int tls_config_set_key_mem(struct tls_config *_config, const uint8_t *_key, 67int tls_config_set_key_mem(struct tls_config *_config, const uint8_t *_key,
68 size_t _len); 68 size_t _len);
69int tls_config_set_keypair_file(struct tls_config *_config,
70 const char *_cert_file, const char *_key_file);
71int tls_config_set_keypair_mem(struct tls_config *_config, const uint8_t *_cert,
72 size_t _cert_len, const uint8_t *_key, size_t _key_len);
69void tls_config_set_protocols(struct tls_config *_config, uint32_t _protocols); 73void tls_config_set_protocols(struct tls_config *_config, uint32_t _protocols);
70void tls_config_set_verify_depth(struct tls_config *_config, int _verify_depth); 74void tls_config_set_verify_depth(struct tls_config *_config, int _verify_depth);
71 75
diff --git a/src/lib/libtls/tls_client.c b/src/lib/libtls/tls_client.c
index 6bb24cd512..3847f4c46c 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.32 2015/10/09 04:13:34 deraadt Exp $ */ 1/* $OpenBSD: tls_client.c,v 1.33 2016/04/28 17:05:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -195,7 +195,7 @@ tls_connect_fds(struct tls *ctx, int fd_read, int fd_write,
195 195
196 if (tls_configure_ssl(ctx) != 0) 196 if (tls_configure_ssl(ctx) != 0)
197 goto err; 197 goto err;
198 if (tls_configure_keypair(ctx, 0) != 0) 198 if (tls_configure_keypair(ctx, ctx->ssl_ctx, ctx->config->keypair, 0) != 0)
199 goto err; 199 goto err;
200 200
201 if (ctx->config->verify_name) { 201 if (ctx->config->verify_name) {
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c
index 9c2b5810f6..b395337f49 100644
--- a/src/lib/libtls/tls_config.c
+++ b/src/lib/libtls/tls_config.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_config.c,v 1.15 2016/04/28 16:48:44 jsing Exp $ */ 1/* $OpenBSD: tls_config.c,v 1.16 2016/04/28 17:05:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -57,6 +57,63 @@ set_mem(char **dest, size_t *destlen, const void *src, size_t srclen)
57 return 0; 57 return 0;
58} 58}
59 59
60static struct tls_keypair *
61tls_keypair_new()
62{
63 return calloc(1, sizeof(struct tls_keypair));
64}
65
66static int
67tls_keypair_set_cert_file(struct tls_keypair *keypair, const char *cert_file)
68{
69 return set_string(&keypair->cert_file, cert_file);
70}
71
72static int
73tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert,
74 size_t len)
75{
76 return set_mem(&keypair->cert_mem, &keypair->cert_len, cert, len);
77}
78
79static int
80tls_keypair_set_key_file(struct tls_keypair *keypair, const char *key_file)
81{
82 return set_string(&keypair->key_file, key_file);
83}
84
85static int
86tls_keypair_set_key_mem(struct tls_keypair *keypair, const uint8_t *key,
87 size_t len)
88{
89 if (keypair->key_mem != NULL)
90 explicit_bzero(keypair->key_mem, keypair->key_len);
91 return set_mem(&keypair->key_mem, &keypair->key_len, key, len);
92}
93
94static void
95tls_keypair_clear(struct tls_keypair *keypair)
96{
97 tls_keypair_set_cert_mem(keypair, NULL, 0);
98 tls_keypair_set_key_mem(keypair, NULL, 0);
99}
100
101static void
102tls_keypair_free(struct tls_keypair *keypair)
103{
104 if (keypair == NULL)
105 return;
106
107 tls_keypair_clear(keypair);
108
109 free((char *)keypair->cert_file);
110 free(keypair->cert_mem);
111 free((char *)keypair->key_file);
112 free(keypair->key_mem);
113
114 free(keypair);
115}
116
60struct tls_config * 117struct tls_config *
61tls_config_new(void) 118tls_config_new(void)
62{ 119{
@@ -65,6 +122,9 @@ tls_config_new(void)
65 if ((config = calloc(1, sizeof(*config))) == NULL) 122 if ((config = calloc(1, sizeof(*config))) == NULL)
66 return (NULL); 123 return (NULL);
67 124
125 if ((config->keypair = tls_keypair_new()) == NULL)
126 goto err;
127
68 /* 128 /*
69 * Default configuration. 129 * Default configuration.
70 */ 130 */
@@ -94,20 +154,21 @@ tls_config_new(void)
94void 154void
95tls_config_free(struct tls_config *config) 155tls_config_free(struct tls_config *config)
96{ 156{
157 struct tls_keypair *kp, *nkp;
158
97 if (config == NULL) 159 if (config == NULL)
98 return; 160 return;
99 161
100 tls_config_clear_keys(config); 162 for (kp = config->keypair; kp != NULL; kp = nkp) {
163 nkp = kp->next;
164 tls_keypair_free(kp);
165 }
101 166
102 free(config->error.msg); 167 free(config->error.msg);
103 168
104 free((char *)config->ca_file); 169 free((char *)config->ca_file);
105 free((char *)config->ca_path); 170 free((char *)config->ca_path);
106 free((char *)config->cert_file);
107 free(config->cert_mem);
108 free((char *)config->ciphers); 171 free((char *)config->ciphers);
109 free((char *)config->key_file);
110 free(config->key_mem);
111 172
112 free(config); 173 free(config);
113} 174}
@@ -121,9 +182,12 @@ tls_config_error(struct tls_config *config)
121void 182void
122tls_config_clear_keys(struct tls_config *config) 183tls_config_clear_keys(struct tls_config *config)
123{ 184{
185 struct tls_keypair *kp;
186
187 for (kp = config->keypair; kp != NULL; kp = kp->next)
188 tls_keypair_clear(kp);
189
124 tls_config_set_ca_mem(config, NULL, 0); 190 tls_config_set_ca_mem(config, NULL, 0);
125 tls_config_set_cert_mem(config, NULL, 0);
126 tls_config_set_key_mem(config, NULL, 0);
127} 191}
128 192
129int 193int
@@ -205,14 +269,14 @@ tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len)
205int 269int
206tls_config_set_cert_file(struct tls_config *config, const char *cert_file) 270tls_config_set_cert_file(struct tls_config *config, const char *cert_file)
207{ 271{
208 return set_string(&config->cert_file, cert_file); 272 return tls_keypair_set_cert_file(config->keypair, cert_file);
209} 273}
210 274
211int 275int
212tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert, 276tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert,
213 size_t len) 277 size_t len)
214{ 278{
215 return set_mem(&config->cert_mem, &config->cert_len, cert, len); 279 return tls_keypair_set_cert_mem(config->keypair, cert, len);
216} 280}
217 281
218int 282int
@@ -272,16 +336,38 @@ tls_config_set_ecdhecurve(struct tls_config *config, const char *name)
272int 336int
273tls_config_set_key_file(struct tls_config *config, const char *key_file) 337tls_config_set_key_file(struct tls_config *config, const char *key_file)
274{ 338{
275 return set_string(&config->key_file, key_file); 339 return tls_keypair_set_key_file(config->keypair, key_file);
276} 340}
277 341
278int 342int
279tls_config_set_key_mem(struct tls_config *config, const uint8_t *key, 343tls_config_set_key_mem(struct tls_config *config, const uint8_t *key,
280 size_t len) 344 size_t len)
281{ 345{
282 if (config->key_mem) 346 return tls_keypair_set_key_mem(config->keypair, key, len);
283 explicit_bzero(config->key_mem, config->key_len); 347}
284 return set_mem(&config->key_mem, &config->key_len, key, len); 348
349int
350tls_config_set_keypair_file(struct tls_config *config,
351 const char *cert_file, const char *key_file)
352{
353 if (tls_config_set_cert_file(config, cert_file) != 0)
354 return (-1);
355 if (tls_config_set_key_file(config, key_file) != 0)
356 return (-1);
357
358 return (0);
359}
360
361int
362tls_config_set_keypair_mem(struct tls_config *config, const uint8_t *cert,
363 size_t cert_len, const uint8_t *key, size_t key_len)
364{
365 if (tls_config_set_cert_mem(config, cert, cert_len) != 0)
366 return (-1);
367 if (tls_config_set_key_mem(config, key, key_len) != 0)
368 return (-1);
369
370 return (0);
285} 371}
286 372
287void 373void
diff --git a/src/lib/libtls/tls_init.3 b/src/lib/libtls/tls_init.3
index 48662e0868..da8565a248 100644
--- a/src/lib/libtls/tls_init.3
+++ b/src/lib/libtls/tls_init.3
@@ -1,4 +1,4 @@
1.\" $OpenBSD: tls_init.3,v 1.57 2016/04/28 16:48:44 jsing Exp $ 1.\" $OpenBSD: tls_init.3,v 1.58 2016/04/28 17:05:59 jsing Exp $
2.\" 2.\"
3.\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> 3.\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>
4.\" 4.\"
@@ -34,6 +34,8 @@
34.Nm tls_config_set_ecdhecurve , 34.Nm tls_config_set_ecdhecurve ,
35.Nm tls_config_set_key_file , 35.Nm tls_config_set_key_file ,
36.Nm tls_config_set_key_mem , 36.Nm tls_config_set_key_mem ,
37.Nm tls_config_set_keypair_file ,
38.Nm tls_config_set_keypair_mem ,
37.Nm tls_config_set_protocols , 39.Nm tls_config_set_protocols ,
38.Nm tls_config_set_verify_depth , 40.Nm tls_config_set_verify_depth ,
39.Nm tls_config_prefer_ciphers_client , 41.Nm tls_config_prefer_ciphers_client ,
@@ -105,6 +107,10 @@
105.Fn tls_config_set_key_file "struct tls_config *config" "const char *key_file" 107.Fn tls_config_set_key_file "struct tls_config *config" "const char *key_file"
106.Ft "int" 108.Ft "int"
107.Fn tls_config_set_key_mem "struct tls_config *config" "const uint8_t *key" "size_t len" 109.Fn tls_config_set_key_mem "struct tls_config *config" "const uint8_t *key" "size_t len"
110.Ft "int"
111.Fn tls_config_set_keypair_file "struct tls_config *config" "const char *cert_file" "const char *key_file"
112.Ft "int"
113.Fn tls_config_set_keypair_mem "struct tls_config *config" "const uint8_t *cert" "size_t cert_len" "const uint8_t *key" "size_t key_len"
108.Ft "void" 114.Ft "void"
109.Fn tls_config_set_protocols "struct tls_config *config" "uint32_t protocols" 115.Fn tls_config_set_protocols "struct tls_config *config" "uint32_t protocols"
110.Ft "void" 116.Ft "void"
@@ -327,11 +333,19 @@ permitted names are:
327.It 333.It
328.Fn tls_config_set_key_file 334.Fn tls_config_set_key_file
329sets the file from which the private key will be read. 335sets the file from which the private key will be read.
330.Em (Server) 336.Em (Client and server)
331.It 337.It
332.Fn tls_config_set_key_mem 338.Fn tls_config_set_key_mem
333directly sets the private key from memory. 339directly sets the private key from memory.
334.Em (Server) 340.Em (Client and server)
341.It
342.Fn tls_config_set_keypair_file
343sets the files from which the public certificate and private key will be read.
344.Em (Client and server)
345.It
346.Fn tls_config_set_keypair_mem
347directly sets the public certifcate and private key from memory.
348.Em (Client and server)
335.It 349.It
336.Fn tls_config_set_protocols 350.Fn tls_config_set_protocols
337sets which versions of the protocol may be used. 351sets which versions of the protocol may be used.
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h
index 21bf2b4613..cb5d90f542 100644
--- a/src/lib/libtls/tls_internal.h
+++ b/src/lib/libtls/tls_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_internal.h,v 1.27 2016/04/28 16:48:44 jsing Exp $ */ 1/* $OpenBSD: tls_internal.h,v 1.28 2016/04/28 17:05:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> 3 * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org>
4 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 4 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
@@ -39,6 +39,17 @@ struct tls_error {
39 int num; 39 int num;
40}; 40};
41 41
42struct tls_keypair {
43 struct tls_keypair *next;
44
45 const char *cert_file;
46 char *cert_mem;
47 size_t cert_len;
48 const char *key_file;
49 char *key_mem;
50 size_t key_len;
51};
52
42struct tls_config { 53struct tls_config {
43 struct tls_error error; 54 struct tls_error error;
44 55
@@ -46,16 +57,11 @@ struct tls_config {
46 const char *ca_path; 57 const char *ca_path;
47 char *ca_mem; 58 char *ca_mem;
48 size_t ca_len; 59 size_t ca_len;
49 const char *cert_file;
50 char *cert_mem;
51 size_t cert_len;
52 const char *ciphers; 60 const char *ciphers;
53 int ciphers_server; 61 int ciphers_server;
54 int dheparams; 62 int dheparams;
55 int ecdhecurve; 63 int ecdhecurve;
56 const char *key_file; 64 struct tls_keypair *keypair;
57 char *key_mem;
58 size_t key_len;
59 uint32_t protocols; 65 uint32_t protocols;
60 int verify_cert; 66 int verify_cert;
61 int verify_client; 67 int verify_client;
@@ -103,7 +109,8 @@ struct tls *tls_new(void);
103struct tls *tls_server_conn(struct tls *ctx); 109struct tls *tls_server_conn(struct tls *ctx);
104 110
105int tls_check_name(struct tls *ctx, X509 *cert, const char *servername); 111int tls_check_name(struct tls *ctx, X509 *cert, const char *servername);
106int tls_configure_keypair(struct tls *ctx, int); 112int tls_configure_keypair(struct tls *ctx, SSL_CTX *ssl_ctx,
113 struct tls_keypair *keypair, int required);
107int tls_configure_server(struct tls *ctx); 114int tls_configure_server(struct tls *ctx);
108int tls_configure_ssl(struct tls *ctx); 115int tls_configure_ssl(struct tls *ctx);
109int tls_configure_ssl_verify(struct tls *ctx, int verify); 116int tls_configure_ssl_verify(struct tls *ctx, int verify);
diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c
index ad98cf3d7e..1d94c99bc0 100644
--- a/src/lib/libtls/tls_server.c
+++ b/src/lib/libtls/tls_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_server.c,v 1.18 2015/09/29 10:17:04 deraadt Exp $ */ 1/* $OpenBSD: tls_server.c,v 1.19 2016/04/28 17:05:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -61,7 +61,7 @@ tls_configure_server(struct tls *ctx)
61 61
62 if (tls_configure_ssl(ctx) != 0) 62 if (tls_configure_ssl(ctx) != 0)
63 goto err; 63 goto err;
64 if (tls_configure_keypair(ctx, 1) != 0) 64 if (tls_configure_keypair(ctx, ctx->ssl_ctx, ctx->config->keypair, 1) != 0)
65 goto err; 65 goto err;
66 if (ctx->config->verify_client != 0) { 66 if (ctx->config->verify_client != 0) {
67 int verify = SSL_VERIFY_PEER; 67 int verify = SSL_VERIFY_PEER;