diff options
| author | jsing <> | 2016-08-12 15:10:59 +0000 |
|---|---|---|
| committer | jsing <> | 2016-08-12 15:10:59 +0000 |
| commit | 44fbf17ee14f8f80ea4423599fb99870d3a2c66b (patch) | |
| tree | d8583e29e61fe2f66ce3df1e84e0afbe16a98d6b /src/lib/libtls/tls_config.c | |
| parent | eee442162472389c3e39a2befb8db01a027c3fa4 (diff) | |
| download | openbsd-44fbf17ee14f8f80ea4423599fb99870d3a2c66b.tar.gz openbsd-44fbf17ee14f8f80ea4423599fb99870d3a2c66b.tar.bz2 openbsd-44fbf17ee14f8f80ea4423599fb99870d3a2c66b.zip | |
Add ALPN support to libtls.
ok beck@ doug@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libtls/tls_config.c | 69 |
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 | ||
| 253 | static int | ||
| 254 | tls_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 | |||
| 312 | int | ||
| 313 | tls_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 | |||
| 252 | int | 319 | int |
| 253 | tls_config_set_ca_file(struct tls_config *config, const char *ca_file) | 320 | tls_config_set_ca_file(struct tls_config *config, const char *ca_file) |
| 254 | { | 321 | { |
