summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls_config.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libtls/tls_config.c69
1 files changed, 68 insertions, 1 deletions
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c
index 63054ab1e9..e690b9ee76 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.24 2016/08/02 07:47:11 jsing Exp $ */ 1/* $OpenBSD: tls_config.c,v 1.25 2016/08/12 15:10: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 *
@@ -166,6 +166,7 @@ tls_config_free(struct tls_config *config)
166 166
167 free(config->error.msg); 167 free(config->error.msg);
168 168
169 free(config->alpn);
169 free((char *)config->ca_file); 170 free((char *)config->ca_file);
170 free((char *)config->ca_mem); 171 free((char *)config->ca_mem);
171 free((char *)config->ca_path); 172 free((char *)config->ca_path);
@@ -249,6 +250,72 @@ tls_config_parse_protocols(uint32_t *protocols, const char *protostr)
249 return (0); 250 return (0);
250} 251}
251 252
253static int
254tls_config_parse_alpn(struct tls_config *config, const char *alpn,
255 char **alpn_data, size_t *alpn_len)
256{
257 size_t buf_len, i, len;
258 char *buf = NULL;
259 char *s = NULL;
260 char *p, *q;
261
262 if ((buf_len = strlen(alpn) + 1) > 65535) {
263 tls_config_set_errorx(config, "alpn too large");
264 goto err;
265 }
266
267 if ((buf = malloc(buf_len)) == NULL) {
268 tls_config_set_errorx(config, "out of memory");
269 goto err;
270 }
271
272 if ((s = strdup(alpn)) == NULL) {
273 tls_config_set_errorx(config, "out of memory");
274 goto err;
275 }
276
277 i = 0;
278 q = s;
279 while ((p = strsep(&q, ",")) != NULL) {
280 if ((len = strlen(p)) == 0) {
281 tls_config_set_errorx(config,
282 "alpn protocol with zero length");
283 goto err;
284 }
285 if (len > 255) {
286 tls_config_set_errorx(config,
287 "alpn protocol too long");
288 goto err;
289 }
290 buf[i++] = len & 0xff;
291 memcpy(&buf[i], p, len);
292 i += len;
293 }
294
295 free(s);
296
297 *alpn_data = buf;
298 *alpn_len = buf_len;
299
300 return (0);
301
302 err:
303 free(buf);
304 free(s);
305
306 *alpn_data = NULL;
307 *alpn_len = 0;
308
309 return (-1);
310}
311
312int
313tls_config_set_alpn(struct tls_config *config, const char *alpn)
314{
315 return tls_config_parse_alpn(config, alpn, &config->alpn,
316 &config->alpn_len);
317}
318
252int 319int
253tls_config_set_ca_file(struct tls_config *config, const char *ca_file) 320tls_config_set_ca_file(struct tls_config *config, const char *ca_file)
254{ 321{