diff options
| author | jsing <> | 2016-08-22 14:55:59 +0000 |
|---|---|---|
| committer | jsing <> | 2016-08-22 14:55:59 +0000 |
| commit | 5284e711492ecb32c4ee446a1f7360c24afb8e09 (patch) | |
| tree | b381f554fd76ea61d743e75d83ea05d769d71108 | |
| parent | e68f71711c5f122d18a4b455025a760f17f103b0 (diff) | |
| download | openbsd-5284e711492ecb32c4ee446a1f7360c24afb8e09.tar.gz openbsd-5284e711492ecb32c4ee446a1f7360c24afb8e09.tar.bz2 openbsd-5284e711492ecb32c4ee446a1f7360c24afb8e09.zip | |
Provide an API that enables server side SNI support - add the ability to
provide additional keypairs (via tls_config_add_keypair_{file,mem}()) and
allow the server to determine what servername the client requested (via
tls_conn_servername()).
ok beck@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libtls/tls.h | 8 | ||||
| -rw-r--r-- | src/lib/libtls/tls_config.c | 58 | ||||
| -rw-r--r-- | src/lib/libtls/tls_conninfo.c | 15 | ||||
| -rw-r--r-- | src/lib/libtls/tls_init.3 | 29 | ||||
| -rw-r--r-- | src/lib/libtls/tls_internal.h | 3 |
5 files changed, 107 insertions, 6 deletions
diff --git a/src/lib/libtls/tls.h b/src/lib/libtls/tls.h index 13df43f046..7a68c3d0d3 100644 --- a/src/lib/libtls/tls.h +++ b/src/lib/libtls/tls.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls.h,v 1.33 2016/08/12 15:10:59 jsing Exp $ */ | 1 | /* $OpenBSD: tls.h,v 1.34 2016/08/22 14:55: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 | * |
| @@ -52,6 +52,11 @@ 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_add_keypair_file(struct tls_config *_config, | ||
| 56 | const char *_cert_file, const char *_key_file); | ||
| 57 | int tls_config_add_keypair_mem(struct tls_config *_config, const uint8_t *_cert, | ||
| 58 | size_t _cert_len, const uint8_t *_key, size_t _key_len); | ||
| 59 | |||
| 55 | int tls_config_set_alpn(struct tls_config *_config, const char *_alpn); | 60 | int tls_config_set_alpn(struct tls_config *_config, const char *_alpn); |
| 56 | int tls_config_set_ca_file(struct tls_config *_config, const char *_ca_file); | 61 | int tls_config_set_ca_file(struct tls_config *_config, const char *_ca_file); |
| 57 | int tls_config_set_ca_path(struct tls_config *_config, const char *_ca_path); | 62 | int tls_config_set_ca_path(struct tls_config *_config, const char *_ca_path); |
| @@ -119,6 +124,7 @@ time_t tls_peer_cert_notafter(struct tls *_ctx); | |||
| 119 | 124 | ||
| 120 | const char *tls_conn_alpn_selected(struct tls *_ctx); | 125 | const char *tls_conn_alpn_selected(struct tls *_ctx); |
| 121 | const char *tls_conn_cipher(struct tls *_ctx); | 126 | const char *tls_conn_cipher(struct tls *_ctx); |
| 127 | const char *tls_conn_servername(struct tls *_ctx); | ||
| 122 | const char *tls_conn_version(struct tls *_ctx); | 128 | const char *tls_conn_version(struct tls *_ctx); |
| 123 | 129 | ||
| 124 | uint8_t *tls_load_file(const char *_file, size_t *_len, char *_password); | 130 | uint8_t *tls_load_file(const char *_file, size_t *_len, char *_password); |
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c index 0d52704aa8..c07621acaf 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.27 2016/08/13 13:15:53 jsing Exp $ */ | 1 | /* $OpenBSD: tls_config.c,v 1.28 2016/08/22 14:55: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 | * |
| @@ -227,6 +227,18 @@ tls_config_free(struct tls_config *config) | |||
| 227 | free(config); | 227 | free(config); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | static void | ||
| 231 | tls_config_keypair_add(struct tls_config *config, struct tls_keypair *keypair) | ||
| 232 | { | ||
| 233 | struct tls_keypair *kp; | ||
| 234 | |||
| 235 | kp = config->keypair; | ||
| 236 | while (kp->next != NULL) | ||
| 237 | kp = kp->next; | ||
| 238 | |||
| 239 | kp->next = keypair; | ||
| 240 | } | ||
| 241 | |||
| 230 | const char * | 242 | const char * |
| 231 | tls_config_error(struct tls_config *config) | 243 | tls_config_error(struct tls_config *config) |
| 232 | { | 244 | { |
| @@ -370,6 +382,50 @@ tls_config_set_alpn(struct tls_config *config, const char *alpn) | |||
| 370 | } | 382 | } |
| 371 | 383 | ||
| 372 | int | 384 | int |
| 385 | tls_config_add_keypair_file(struct tls_config *config, | ||
| 386 | const char *cert_file, const char *key_file) | ||
| 387 | { | ||
| 388 | struct tls_keypair *keypair; | ||
| 389 | |||
| 390 | if ((keypair = tls_keypair_new()) == NULL) | ||
| 391 | return (-1); | ||
| 392 | if (tls_keypair_set_cert_file(keypair, &config->error, cert_file) != 0) | ||
| 393 | goto err; | ||
| 394 | if (tls_keypair_set_key_file(keypair, &config->error, key_file) != 0) | ||
| 395 | goto err; | ||
| 396 | |||
| 397 | tls_config_keypair_add(config, keypair); | ||
| 398 | |||
| 399 | return (0); | ||
| 400 | |||
| 401 | err: | ||
| 402 | tls_keypair_free(keypair); | ||
| 403 | return (-1); | ||
| 404 | } | ||
| 405 | |||
| 406 | int | ||
| 407 | tls_config_add_keypair_mem(struct tls_config *config, const uint8_t *cert, | ||
| 408 | size_t cert_len, const uint8_t *key, size_t key_len) | ||
| 409 | { | ||
| 410 | struct tls_keypair *keypair; | ||
| 411 | |||
| 412 | if ((keypair = tls_keypair_new()) == NULL) | ||
| 413 | return (-1); | ||
| 414 | if (tls_keypair_set_cert_mem(keypair, cert, cert_len) != 0) | ||
| 415 | goto err; | ||
| 416 | if (tls_keypair_set_key_mem(keypair, key, key_len) != 0) | ||
| 417 | goto err; | ||
| 418 | |||
| 419 | tls_config_keypair_add(config, keypair); | ||
| 420 | |||
| 421 | return (0); | ||
| 422 | |||
| 423 | err: | ||
| 424 | tls_keypair_free(keypair); | ||
| 425 | return (-1); | ||
| 426 | } | ||
| 427 | |||
| 428 | int | ||
| 373 | tls_config_set_ca_file(struct tls_config *config, const char *ca_file) | 429 | tls_config_set_ca_file(struct tls_config *config, const char *ca_file) |
| 374 | { | 430 | { |
| 375 | return tls_config_load_file(&config->error, "CA", ca_file, | 431 | return tls_config_load_file(&config->error, "CA", ca_file, |
diff --git a/src/lib/libtls/tls_conninfo.c b/src/lib/libtls/tls_conninfo.c index 523b2798d3..281af79866 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.9 2016/08/15 14:47:41 jsing Exp $ */ | 1 | /* $OpenBSD: tls_conninfo.c,v 1.10 2016/08/22 14:55:59 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> |
| @@ -199,6 +199,11 @@ tls_get_conninfo(struct tls *ctx) | |||
| 199 | goto err; | 199 | goto err; |
| 200 | if (tls_conninfo_alpn_proto(ctx) == -1) | 200 | if (tls_conninfo_alpn_proto(ctx) == -1) |
| 201 | goto err; | 201 | goto err; |
| 202 | if (ctx->servername != NULL) { | ||
| 203 | if ((ctx->conninfo->servername = | ||
| 204 | strdup(ctx->servername)) == NULL) | ||
| 205 | goto err; | ||
| 206 | } | ||
| 202 | 207 | ||
| 203 | return (0); | 208 | return (0); |
| 204 | err: | 209 | err: |
| @@ -242,6 +247,14 @@ tls_conn_cipher(struct tls *ctx) | |||
| 242 | } | 247 | } |
| 243 | 248 | ||
| 244 | const char * | 249 | const char * |
| 250 | tls_conn_servername(struct tls *ctx) | ||
| 251 | { | ||
| 252 | if (ctx->conninfo == NULL) | ||
| 253 | return (NULL); | ||
| 254 | return (ctx->conninfo->servername); | ||
| 255 | } | ||
| 256 | |||
| 257 | const char * | ||
| 245 | tls_conn_version(struct tls *ctx) | 258 | tls_conn_version(struct tls *ctx) |
| 246 | { | 259 | { |
| 247 | if (ctx->conninfo == NULL) | 260 | if (ctx->conninfo == NULL) |
diff --git a/src/lib/libtls/tls_init.3 b/src/lib/libtls/tls_init.3 index cd98450035..4d7367408b 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.66 2016/08/18 15:43:12 jsing Exp $ | 1 | .\" $OpenBSD: tls_init.3,v 1.67 2016/08/22 14:55: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 | .\" |
| @@ -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: August 18 2016 $ | 17 | .Dd $Mdocdate: August 22 2016 $ |
| 18 | .Dt TLS_INIT 3 | 18 | .Dt TLS_INIT 3 |
| 19 | .Os | 19 | .Os |
| 20 | .Sh NAME | 20 | .Sh NAME |
| @@ -24,6 +24,8 @@ | |||
| 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_add_keypair_file , | ||
| 28 | .Nm tls_config_add_keypair_mem , | ||
| 27 | .Nm tls_config_set_alpn , | 29 | .Nm tls_config_set_alpn , |
| 28 | .Nm tls_config_set_ca_file , | 30 | .Nm tls_config_set_ca_file , |
| 29 | .Nm tls_config_set_ca_path , | 31 | .Nm tls_config_set_ca_path , |
| @@ -57,6 +59,7 @@ | |||
| 57 | .Nm tls_peer_cert_notafter , | 59 | .Nm tls_peer_cert_notafter , |
| 58 | .Nm tls_conn_alpn_selected , | 60 | .Nm tls_conn_alpn_selected , |
| 59 | .Nm tls_conn_cipher , | 61 | .Nm tls_conn_cipher , |
| 62 | .Nm tls_conn_servername , | ||
| 60 | .Nm tls_conn_version , | 63 | .Nm tls_conn_version , |
| 61 | .Nm tls_load_file , | 64 | .Nm tls_load_file , |
| 62 | .Nm tls_client , | 65 | .Nm tls_client , |
| @@ -90,6 +93,10 @@ | |||
| 90 | .Ft "int" | 93 | .Ft "int" |
| 91 | .Fn tls_config_parse_protocols "uint32_t *protocols" "const char *protostr" | 94 | .Fn tls_config_parse_protocols "uint32_t *protocols" "const char *protostr" |
| 92 | .Ft "int" | 95 | .Ft "int" |
| 96 | .Fn tls_config_add_keypair_file "struct tls_config *config" "const char *cert_file" "const char *key_file" | ||
| 97 | .Ft "int" | ||
| 98 | .Fn tls_config_add_keypair_mem "struct tls_config *config" "const uint8_t *cert" "size_t cert_len" "const uint8_t *key" "size_t key_len" | ||
| 99 | .Ft "int" | ||
| 93 | .Fn tls_config_set_alpn "struct tls_config *config" "const char *alpn" | 100 | .Fn tls_config_set_alpn "struct tls_config *config" "const char *alpn" |
| 94 | .Ft "int" | 101 | .Ft "int" |
| 95 | .Fn tls_config_set_ca_file "struct tls_config *config" "const char *ca_file" | 102 | .Fn tls_config_set_ca_file "struct tls_config *config" "const char *ca_file" |
| @@ -156,6 +163,8 @@ | |||
| 156 | .Ft "const char *" | 163 | .Ft "const char *" |
| 157 | .Fn tls_conn_cipher "struct tls *ctx" | 164 | .Fn tls_conn_cipher "struct tls *ctx" |
| 158 | .Ft "const char *" | 165 | .Ft "const char *" |
| 166 | .Fn tls_conn_servername "struct tls *ctx" | ||
| 167 | .Ft "const char *" | ||
| 159 | .Fn tls_conn_version "struct tls *ctx" | 168 | .Fn tls_conn_version "struct tls *ctx" |
| 160 | .Ft "uint8_t *" | 169 | .Ft "uint8_t *" |
| 161 | .Fn tls_load_file "const char *file" "size_t *len" "char *password" | 170 | .Fn tls_load_file "const char *file" "size_t *len" "char *password" |
| @@ -301,6 +310,16 @@ The following functions modify a configuration by setting parameters (the | |||
| 301 | configuration options may only apply to clients, to servers or to both): | 310 | configuration options may only apply to clients, to servers or to both): |
| 302 | .Bl -bullet -offset four | 311 | .Bl -bullet -offset four |
| 303 | .It | 312 | .It |
| 313 | .Fn tls_config_add_keypair_file | ||
| 314 | adds an additional public certificate and private key from the specified files, | ||
| 315 | used as an alternative certificate for Server Name Indication. | ||
| 316 | .Em (Server) | ||
| 317 | .It | ||
| 318 | .Fn tls_config_set_keypair_mem | ||
| 319 | adds an additional public certificate and private key from memory, | ||
| 320 | used as an alternative certificate for Server Name Indication. | ||
| 321 | .Em (Server) | ||
| 322 | .It | ||
| 304 | .Fn tls_config_set_alpn | 323 | .Fn tls_config_set_alpn |
| 305 | sets the ALPN protocols that are supported. | 324 | sets the ALPN protocols that are supported. |
| 306 | The alpn string is a comma separated list of protocols, in order of preference. | 325 | The alpn string is a comma separated list of protocols, in order of preference. |
| @@ -445,6 +464,12 @@ connected to | |||
| 445 | .Ar ctx . | 464 | .Ar ctx . |
| 446 | .Em (Server and client) | 465 | .Em (Server and client) |
| 447 | .It | 466 | .It |
| 467 | .Fn tls_conn_servername | ||
| 468 | returns a string corresponding to the servername that the client connected to | ||
| 469 | .Ar ctx | ||
| 470 | requested by sending a TLS Server Name Indication extension. | ||
| 471 | .Em (Server) | ||
| 472 | .It | ||
| 448 | .Fn tls_conn_version | 473 | .Fn tls_conn_version |
| 449 | returns a string corresponding to a TLS version negotiated with the peer | 474 | returns a string corresponding to a TLS version negotiated with the peer |
| 450 | connected to | 475 | connected to |
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h index 428e29c857..3fcc7a021f 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.40 2016/08/22 14:51:37 jsing Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.41 2016/08/22 14:55: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> |
| @@ -74,6 +74,7 @@ struct tls_config { | |||
| 74 | struct tls_conninfo { | 74 | struct tls_conninfo { |
| 75 | char *alpn; | 75 | char *alpn; |
| 76 | char *cipher; | 76 | char *cipher; |
| 77 | char *servername; | ||
| 77 | char *version; | 78 | char *version; |
| 78 | 79 | ||
| 79 | char *hash; | 80 | char *hash; |
