diff options
| author | jsing <> | 2016-08-01 17:32:19 +0000 |
|---|---|---|
| committer | jsing <> | 2016-08-01 17:32:19 +0000 |
| commit | c4f6769f250304bbae98bafb6d20e2381b089105 (patch) | |
| tree | e03f60ab444ada6f737a380e17e8eba68f90a817 | |
| parent | 788651fd7e1fab674b111432a653ff513d99b6f2 (diff) | |
| download | openbsd-c4f6769f250304bbae98bafb6d20e2381b089105.tar.gz openbsd-c4f6769f250304bbae98bafb6d20e2381b089105.tar.bz2 openbsd-c4f6769f250304bbae98bafb6d20e2381b089105.zip | |
Add ALPN support to libtls.
ok beck@ doug@
| -rw-r--r-- | src/lib/libtls/tls.c | 10 | ||||
| -rw-r--r-- | src/lib/libtls/tls.h | 6 | ||||
| -rw-r--r-- | src/lib/libtls/tls_config.c | 70 | ||||
| -rw-r--r-- | src/lib/libtls/tls_conninfo.c | 35 | ||||
| -rw-r--r-- | src/lib/libtls/tls_init.3 | 36 | ||||
| -rw-r--r-- | src/lib/libtls/tls_internal.h | 6 | ||||
| -rw-r--r-- | src/lib/libtls/tls_server.c | 20 |
7 files changed, 168 insertions, 15 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index 857b8d0811..2584ceb88b 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls.c,v 1.41 2016/07/07 14:09:03 jsing Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.42 2016/08/01 17:32:19 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -310,6 +310,14 @@ tls_configure_ssl(struct tls *ctx) | |||
| 310 | if ((ctx->config->protocols & TLS_PROTOCOL_TLSv1_2) == 0) | 310 | if ((ctx->config->protocols & TLS_PROTOCOL_TLSv1_2) == 0) |
| 311 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1_2); | 311 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1_2); |
| 312 | 312 | ||
| 313 | if (ctx->config->alpn != NULL) { | ||
| 314 | if (SSL_CTX_set_alpn_protos(ctx->ssl_ctx, ctx->config->alpn, | ||
| 315 | ctx->config->alpn_len) != 0) { | ||
| 316 | tls_set_errorx(ctx, "failed to set alpn"); | ||
| 317 | goto err; | ||
| 318 | } | ||
| 319 | } | ||
| 320 | |||
| 313 | if (ctx->config->ciphers != NULL) { | 321 | if (ctx->config->ciphers != NULL) { |
| 314 | if (SSL_CTX_set_cipher_list(ctx->ssl_ctx, | 322 | if (SSL_CTX_set_cipher_list(ctx->ssl_ctx, |
| 315 | ctx->config->ciphers) != 1) { | 323 | ctx->config->ciphers) != 1) { |
diff --git a/src/lib/libtls/tls.h b/src/lib/libtls/tls.h index 75c46c1a1a..a29030d8d9 100644 --- a/src/lib/libtls/tls.h +++ b/src/lib/libtls/tls.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls.h,v 1.29 2016/05/27 14:21:24 jsing Exp $ */ | 1 | /* $OpenBSD: tls.h,v 1.30 2016/08/01 17:32:19 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -52,6 +52,7 @@ const char *tls_error(struct tls *_ctx); | |||
| 52 | struct tls_config *tls_config_new(void); | 52 | struct tls_config *tls_config_new(void); |
| 53 | void tls_config_free(struct tls_config *_config); | 53 | void tls_config_free(struct tls_config *_config); |
| 54 | 54 | ||
| 55 | int tls_config_set_alpn(struct tls_config *_config, const char *_alpn); | ||
| 55 | int tls_config_set_ca_file(struct tls_config *_config, const char *_ca_file); | 56 | int tls_config_set_ca_file(struct tls_config *_config, const char *_ca_file); |
| 56 | int tls_config_set_ca_path(struct tls_config *_config, const char *_ca_path); | 57 | int tls_config_set_ca_path(struct tls_config *_config, const char *_ca_path); |
| 57 | int tls_config_set_ca_mem(struct tls_config *_config, const uint8_t *_ca, | 58 | int tls_config_set_ca_mem(struct tls_config *_config, const uint8_t *_ca, |
| @@ -116,8 +117,9 @@ const char *tls_peer_cert_subject(struct tls *_ctx); | |||
| 116 | time_t tls_peer_cert_notbefore(struct tls *_ctx); | 117 | time_t tls_peer_cert_notbefore(struct tls *_ctx); |
| 117 | time_t tls_peer_cert_notafter(struct tls *_ctx); | 118 | time_t tls_peer_cert_notafter(struct tls *_ctx); |
| 118 | 119 | ||
| 119 | const char *tls_conn_version(struct tls *_ctx); | 120 | const char *tls_conn_alpn_selected(struct tls *_ctx); |
| 120 | const char *tls_conn_cipher(struct tls *_ctx); | 121 | const char *tls_conn_cipher(struct tls *_ctx); |
| 122 | const char *tls_conn_version(struct tls *_ctx); | ||
| 121 | 123 | ||
| 122 | uint8_t *tls_load_file(const char *_file, size_t *_len, char *_password); | 124 | uint8_t *tls_load_file(const char *_file, size_t *_len, char *_password); |
| 123 | 125 | ||
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c index 43f06b0063..640a69e783 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.22 2016/07/13 16:30:48 jsing Exp $ */ | 1 | /* $OpenBSD: tls_config.c,v 1.23 2016/08/01 17:32:19 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,73 @@ 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 | free(*alpn_data); | ||
| 263 | *alpn_data = NULL; | ||
| 264 | *alpn_len = 0; | ||
| 265 | |||
| 266 | if ((buf_len = strlen(alpn) + 1) > 65535) { | ||
| 267 | tls_config_set_errorx(config, "alpn too large"); | ||
| 268 | goto err; | ||
| 269 | } | ||
| 270 | |||
| 271 | if ((buf = malloc(buf_len)) == NULL) { | ||
| 272 | tls_config_set_errorx(config, "out of memory"); | ||
| 273 | goto err; | ||
| 274 | } | ||
| 275 | |||
| 276 | if ((s = strdup(alpn)) == NULL) { | ||
| 277 | tls_config_set_errorx(config, "out of memory"); | ||
| 278 | goto err; | ||
| 279 | } | ||
| 280 | |||
| 281 | i = 0; | ||
| 282 | q = s; | ||
| 283 | while ((p = strsep(&q, ",")) != NULL) { | ||
| 284 | if ((len = strlen(p)) == 0) { | ||
| 285 | tls_config_set_errorx(config, | ||
| 286 | "alpn protocol with zero length"); | ||
| 287 | goto err; | ||
| 288 | } | ||
| 289 | if (len > 255) { | ||
| 290 | tls_config_set_errorx(config, | ||
| 291 | "alpn protocol too long"); | ||
| 292 | goto err; | ||
| 293 | } | ||
| 294 | buf[i++] = len & 0xff; | ||
| 295 | memcpy(&buf[i], p, len); | ||
| 296 | i += len; | ||
| 297 | } | ||
| 298 | |||
| 299 | free(s); | ||
| 300 | |||
| 301 | *alpn_data = buf; | ||
| 302 | *alpn_len = buf_len; | ||
| 303 | |||
| 304 | return (0); | ||
| 305 | |||
| 306 | err: | ||
| 307 | free(buf); | ||
| 308 | free(s); | ||
| 309 | |||
| 310 | return (-1); | ||
| 311 | } | ||
| 312 | |||
| 313 | int | ||
| 314 | tls_config_set_alpn(struct tls_config *config, const char *alpn) | ||
| 315 | { | ||
| 316 | return tls_config_parse_alpn(config, alpn, &config->alpn, | ||
| 317 | &config->alpn_len); | ||
| 318 | } | ||
| 319 | |||
| 252 | int | 320 | int |
| 253 | tls_config_set_ca_file(struct tls_config *config, const char *ca_file) | 321 | tls_config_set_ca_file(struct tls_config *config, const char *ca_file) |
| 254 | { | 322 | { |
diff --git a/src/lib/libtls/tls_conninfo.c b/src/lib/libtls/tls_conninfo.c index 1e134bfe59..93526fceeb 100644 --- a/src/lib/libtls/tls_conninfo.c +++ b/src/lib/libtls/tls_conninfo.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_conninfo.c,v 1.5 2015/10/07 23:33:38 beck Exp $ */ | 1 | /* $OpenBSD: tls_conninfo.c,v 1.6 2016/08/01 17:32:19 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2015 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2015 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2015 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2015 Bob Beck <beck@openbsd.org> |
| @@ -150,6 +150,26 @@ tls_get_peer_cert_times(struct tls *ctx, time_t *notbefore, time_t *notafter) | |||
| 150 | return (rv); | 150 | return (rv); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | static int | ||
| 154 | tls_conninfo_alpn_proto(struct tls *ctx) | ||
| 155 | { | ||
| 156 | const unsigned char *p; | ||
| 157 | unsigned int len; | ||
| 158 | |||
| 159 | free(ctx->conninfo->alpn); | ||
| 160 | ctx->conninfo->alpn = NULL; | ||
| 161 | |||
| 162 | SSL_get0_alpn_selected(ctx->ssl_conn, &p, &len); | ||
| 163 | if (len > 0) { | ||
| 164 | if ((ctx->conninfo->alpn = malloc(len + 1)) == NULL) | ||
| 165 | return (-1); | ||
| 166 | memcpy(ctx->conninfo->alpn, p, len); | ||
| 167 | ctx->conninfo->alpn[len] = '\0'; | ||
| 168 | } | ||
| 169 | |||
| 170 | return (0); | ||
| 171 | } | ||
| 172 | |||
| 153 | int | 173 | int |
| 154 | tls_get_conninfo(struct tls *ctx) { | 174 | tls_get_conninfo(struct tls *ctx) { |
| 155 | const char * tmp; | 175 | const char * tmp; |
| @@ -175,6 +195,9 @@ tls_get_conninfo(struct tls *ctx) { | |||
| 175 | ctx->conninfo->cipher = strdup(tmp); | 195 | ctx->conninfo->cipher = strdup(tmp); |
| 176 | if (ctx->conninfo->cipher == NULL) | 196 | if (ctx->conninfo->cipher == NULL) |
| 177 | goto err; | 197 | goto err; |
| 198 | if (tls_conninfo_alpn_proto(ctx) == -1) | ||
| 199 | goto err; | ||
| 200 | |||
| 178 | return (0); | 201 | return (0); |
| 179 | err: | 202 | err: |
| 180 | tls_free_conninfo(ctx->conninfo); | 203 | tls_free_conninfo(ctx->conninfo); |
| @@ -184,6 +207,8 @@ err: | |||
| 184 | void | 207 | void |
| 185 | tls_free_conninfo(struct tls_conninfo *conninfo) { | 208 | tls_free_conninfo(struct tls_conninfo *conninfo) { |
| 186 | if (conninfo != NULL) { | 209 | if (conninfo != NULL) { |
| 210 | free(conninfo->alpn); | ||
| 211 | conninfo->alpn = NULL; | ||
| 187 | free(conninfo->hash); | 212 | free(conninfo->hash); |
| 188 | conninfo->hash = NULL; | 213 | conninfo->hash = NULL; |
| 189 | free(conninfo->subject); | 214 | free(conninfo->subject); |
| @@ -198,6 +223,14 @@ tls_free_conninfo(struct tls_conninfo *conninfo) { | |||
| 198 | } | 223 | } |
| 199 | 224 | ||
| 200 | const char * | 225 | const char * |
| 226 | tls_conn_alpn_selected(struct tls *ctx) | ||
| 227 | { | ||
| 228 | if (ctx->conninfo == NULL) | ||
| 229 | return (NULL); | ||
| 230 | return (ctx->conninfo->alpn); | ||
| 231 | } | ||
| 232 | |||
| 233 | const char * | ||
| 201 | tls_conn_cipher(struct tls *ctx) | 234 | tls_conn_cipher(struct tls *ctx) |
| 202 | { | 235 | { |
| 203 | if (ctx->conninfo == NULL) | 236 | if (ctx->conninfo == NULL) |
diff --git a/src/lib/libtls/tls_init.3 b/src/lib/libtls/tls_init.3 index b4c6a7cc3a..0969c093a1 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.62 2016/07/13 16:30:48 jsing Exp $ | 1 | .\" $OpenBSD: tls_init.3,v 1.63 2016/08/01 17:32:19 jsing Exp $ |
| 2 | .\" | 2 | .\" |
| 3 | .\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> | 3 | .\" Copyright (c) 2014 Ted Unangst <tedu@openbsd.org> |
| 4 | .\" | 4 | .\" |
| @@ -14,7 +14,7 @@ | |||
| 14 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 14 | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 15 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 15 | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 16 | .\" | 16 | .\" |
| 17 | .Dd $Mdocdate: July 13 2016 $ | 17 | .Dd $Mdocdate: August 1 2016 $ |
| 18 | .Dt TLS_INIT 3 | 18 | .Dt TLS_INIT 3 |
| 19 | .Os | 19 | .Os |
| 20 | .Sh NAME | 20 | .Sh NAME |
| @@ -24,6 +24,7 @@ | |||
| 24 | .Nm tls_config_new , | 24 | .Nm tls_config_new , |
| 25 | .Nm tls_config_free , | 25 | .Nm tls_config_free , |
| 26 | .Nm tls_config_parse_protocols , | 26 | .Nm tls_config_parse_protocols , |
| 27 | .Nm tls_config_set_alpn , | ||
| 27 | .Nm tls_config_set_ca_file , | 28 | .Nm tls_config_set_ca_file , |
| 28 | .Nm tls_config_set_ca_path , | 29 | .Nm tls_config_set_ca_path , |
| 29 | .Nm tls_config_set_ca_mem , | 30 | .Nm tls_config_set_ca_mem , |
| @@ -54,8 +55,9 @@ | |||
| 54 | .Nm tls_peer_cert_hash , | 55 | .Nm tls_peer_cert_hash , |
| 55 | .Nm tls_peer_cert_notbefore , | 56 | .Nm tls_peer_cert_notbefore , |
| 56 | .Nm tls_peer_cert_notafter , | 57 | .Nm tls_peer_cert_notafter , |
| 57 | .Nm tls_conn_version , | 58 | .Nm tls_conn_alpn_selected , |
| 58 | .Nm tls_conn_cipher , | 59 | .Nm tls_conn_cipher , |
| 60 | .Nm tls_conn_version , | ||
| 59 | .Nm tls_load_file , | 61 | .Nm tls_load_file , |
| 60 | .Nm tls_client , | 62 | .Nm tls_client , |
| 61 | .Nm tls_server , | 63 | .Nm tls_server , |
| @@ -88,6 +90,8 @@ | |||
| 88 | .Ft "int" | 90 | .Ft "int" |
| 89 | .Fn tls_config_parse_protocols "uint32_t *protocols" "const char *protostr" | 91 | .Fn tls_config_parse_protocols "uint32_t *protocols" "const char *protostr" |
| 90 | .Ft "int" | 92 | .Ft "int" |
| 93 | .Fn tls_config_set_alpn "struct tls_config *config" "const char *alpn" | ||
| 94 | .Ft "int" | ||
| 91 | .Fn tls_config_set_ca_file "struct tls_config *config" "const char *ca_file" | 95 | .Fn tls_config_set_ca_file "struct tls_config *config" "const char *ca_file" |
| 92 | .Ft "int" | 96 | .Ft "int" |
| 93 | .Fn tls_config_set_ca_path "struct tls_config *config" "const char *ca_path" | 97 | .Fn tls_config_set_ca_path "struct tls_config *config" "const char *ca_path" |
| @@ -148,9 +152,11 @@ | |||
| 148 | .Ft "time_t" | 152 | .Ft "time_t" |
| 149 | .Fn tls_peer_cert_notafter "struct tls *ctx" | 153 | .Fn tls_peer_cert_notafter "struct tls *ctx" |
| 150 | .Ft "const char *" | 154 | .Ft "const char *" |
| 151 | .Fn tls_conn_version "struct tls *ctx" | 155 | .Fn tls_conn_alpn_selected "struct tls *ctx" |
| 152 | .Ft "const char *" | 156 | .Ft "const char *" |
| 153 | .Fn tls_conn_cipher "struct tls *ctx" | 157 | .Fn tls_conn_cipher "struct tls *ctx" |
| 158 | .Ft "const char *" | ||
| 159 | .Fn tls_conn_version "struct tls *ctx" | ||
| 154 | .Ft "uint8_t *" | 160 | .Ft "uint8_t *" |
| 155 | .Fn tls_load_file "const char *file" "size_t *len" "char *password" | 161 | .Fn tls_load_file "const char *file" "size_t *len" "char *password" |
| 156 | .Ft "struct tls *" | 162 | .Ft "struct tls *" |
| @@ -295,6 +301,11 @@ The following functions modify a configuration by setting parameters. | |||
| 295 | Configuration options may apply to only clients or only servers or both. | 301 | Configuration options may apply to only clients or only servers or both. |
| 296 | .Bl -bullet -offset four | 302 | .Bl -bullet -offset four |
| 297 | .It | 303 | .It |
| 304 | .Fn tls_config_set_alpn | ||
| 305 | sets the ALPN protocols that are supported. | ||
| 306 | The alpn string is a comma separated list of protocols, in order of preference. | ||
| 307 | .Em (Client and Server) | ||
| 308 | .It | ||
| 298 | .Fn tls_config_set_ca_file | 309 | .Fn tls_config_set_ca_file |
| 299 | sets the filename used to load a file | 310 | sets the filename used to load a file |
| 300 | containing the root certificates. | 311 | containing the root certificates. |
| @@ -480,13 +491,14 @@ the peer certificate from | |||
| 480 | will only succeed after the handshake is complete. | 491 | will only succeed after the handshake is complete. |
| 481 | .Em (Server and client) | 492 | .Em (Server and client) |
| 482 | .It | 493 | .It |
| 483 | .Fn tls_conn_version | 494 | .Fn tls_conn_alpn_selected |
| 484 | returns a string | 495 | returns a string that specifies the ALPN protocol selected for use with the peer |
| 485 | corresponding to a TLS version negotiated with the peer | ||
| 486 | connected to | 496 | connected to |
| 487 | .Ar ctx . | 497 | .Ar ctx . |
| 488 | .Fn tls_conn_version | 498 | If no protocol was selected then NULL is returned. |
| 499 | .Fn tls_conn_alpn_selected | ||
| 489 | will only succeed after the handshake is complete. | 500 | will only succeed after the handshake is complete. |
| 501 | .Em (Server and Client) | ||
| 490 | .It | 502 | .It |
| 491 | .Fn tls_conn_cipher | 503 | .Fn tls_conn_cipher |
| 492 | returns a string | 504 | returns a string |
| @@ -497,6 +509,14 @@ connected to | |||
| 497 | will only succeed after the handshake is complete. | 509 | will only succeed after the handshake is complete. |
| 498 | .Em (Server and client) | 510 | .Em (Server and client) |
| 499 | .It | 511 | .It |
| 512 | .Fn tls_conn_version | ||
| 513 | returns a string | ||
| 514 | corresponding to a TLS version negotiated with the peer | ||
| 515 | connected to | ||
| 516 | .Ar ctx . | ||
| 517 | .Fn tls_conn_version | ||
| 518 | will only succeed after the handshake is complete. | ||
| 519 | .It | ||
| 500 | .Fn tls_load_file | 520 | .Fn tls_load_file |
| 501 | loads a certificate or key from disk into memory to be loaded with | 521 | loads a certificate or key from disk into memory to be loaded with |
| 502 | .Fn tls_config_set_ca_mem , | 522 | .Fn tls_config_set_ca_mem , |
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h index 6c56e6fb84..17358429c7 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.32 2016/07/13 16:30:48 jsing Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.33 2016/08/01 17:32:19 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> |
| @@ -55,6 +55,8 @@ struct tls_keypair { | |||
| 55 | struct tls_config { | 55 | struct tls_config { |
| 56 | struct tls_error error; | 56 | struct tls_error error; |
| 57 | 57 | ||
| 58 | char *alpn; | ||
| 59 | size_t alpn_len; | ||
| 58 | const char *ca_file; | 60 | const char *ca_file; |
| 59 | const char *ca_path; | 61 | const char *ca_path; |
| 60 | char *ca_mem; | 62 | char *ca_mem; |
| @@ -73,6 +75,7 @@ struct tls_config { | |||
| 73 | }; | 75 | }; |
| 74 | 76 | ||
| 75 | struct tls_conninfo { | 77 | struct tls_conninfo { |
| 78 | char *alpn; | ||
| 76 | char *issuer; | 79 | char *issuer; |
| 77 | char *subject; | 80 | char *subject; |
| 78 | char *hash; | 81 | char *hash; |
| @@ -104,6 +107,7 @@ struct tls { | |||
| 104 | SSL *ssl_conn; | 107 | SSL *ssl_conn; |
| 105 | SSL_CTX *ssl_ctx; | 108 | SSL_CTX *ssl_ctx; |
| 106 | X509 *ssl_peer_cert; | 109 | X509 *ssl_peer_cert; |
| 110 | |||
| 107 | struct tls_conninfo *conninfo; | 111 | struct tls_conninfo *conninfo; |
| 108 | }; | 112 | }; |
| 109 | 113 | ||
diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c index 1d94c99bc0..f13c9db083 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.19 2016/04/28 17:05:59 jsing Exp $ */ | 1 | /* $OpenBSD: tls_server.c,v 1.20 2016/08/01 17:32:19 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -48,6 +48,20 @@ tls_server_conn(struct tls *ctx) | |||
| 48 | return (conn_ctx); | 48 | return (conn_ctx); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static int | ||
| 52 | tls_server_alpn_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen, | ||
| 53 | const unsigned char *in, unsigned int inlen, void *arg) | ||
| 54 | { | ||
| 55 | struct tls *ctx = arg; | ||
| 56 | |||
| 57 | if (SSL_select_next_proto((unsigned char**)out, outlen, | ||
| 58 | ctx->config->alpn, ctx->config->alpn_len, in, inlen) == | ||
| 59 | OPENSSL_NPN_NEGOTIATED) | ||
| 60 | return (SSL_TLSEXT_ERR_OK); | ||
| 61 | |||
| 62 | return (SSL_TLSEXT_ERR_NOACK); | ||
| 63 | } | ||
| 64 | |||
| 51 | int | 65 | int |
| 52 | tls_configure_server(struct tls *ctx) | 66 | tls_configure_server(struct tls *ctx) |
| 53 | { | 67 | { |
| @@ -71,6 +85,10 @@ tls_configure_server(struct tls *ctx) | |||
| 71 | goto err; | 85 | goto err; |
| 72 | } | 86 | } |
| 73 | 87 | ||
| 88 | if (ctx->config->alpn != NULL) | ||
| 89 | SSL_CTX_set_alpn_select_cb(ctx->ssl_ctx, tls_server_alpn_cb, | ||
| 90 | ctx); | ||
| 91 | |||
| 74 | if (ctx->config->dheparams == -1) | 92 | if (ctx->config->dheparams == -1) |
| 75 | SSL_CTX_set_dh_auto(ctx->ssl_ctx, 1); | 93 | SSL_CTX_set_dh_auto(ctx->ssl_ctx, 1); |
| 76 | else if (ctx->config->dheparams == 1024) | 94 | else if (ctx->config->dheparams == 1024) |
