diff options
author | jsing <> | 2015-09-10 09:10:42 +0000 |
---|---|---|
committer | jsing <> | 2015-09-10 09:10:42 +0000 |
commit | bb55b96be5873414f5139ee6f86706b2f219123a (patch) | |
tree | 7e607278f29d9ff6cd6a4157a2b2362498680e58 | |
parent | f4a4d0ccce6152a6e48d345c33b3db9dbdaad529 (diff) | |
download | openbsd-bb55b96be5873414f5139ee6f86706b2f219123a.tar.gz openbsd-bb55b96be5873414f5139ee6f86706b2f219123a.tar.bz2 openbsd-bb55b96be5873414f5139ee6f86706b2f219123a.zip |
Add support for preferring the server's cipher list or the client's cipher
list. Prefer the server's cipher list by default.
Based on a diff from Kyle Thompson <jmp at giga dot moe>.
ok beck@ bcook@
-rw-r--r-- | src/lib/libtls/tls.h | 9 | ||||
-rw-r--r-- | src/lib/libtls/tls_config.c | 16 | ||||
-rw-r--r-- | src/lib/libtls/tls_init.3 | 21 | ||||
-rw-r--r-- | src/lib/libtls/tls_internal.h | 3 | ||||
-rw-r--r-- | src/lib/libtls/tls_server.c | 6 |
5 files changed, 47 insertions, 8 deletions
diff --git a/src/lib/libtls/tls.h b/src/lib/libtls/tls.h index 1a6257232c..579a97798e 100644 --- a/src/lib/libtls/tls.h +++ b/src/lib/libtls/tls.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls.h,v 1.14 2015/09/09 19:23:04 beck Exp $ */ | 1 | /* $OpenBSD: tls.h,v 1.15 2015/09/10 09:10:42 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,8 +66,8 @@ int tls_config_set_key_mem(struct tls_config *_config, const uint8_t *_key, | |||
66 | void tls_config_set_protocols(struct tls_config *_config, uint32_t _protocols); | 66 | void tls_config_set_protocols(struct tls_config *_config, uint32_t _protocols); |
67 | void tls_config_set_verify_depth(struct tls_config *_config, int _verify_depth); | 67 | void tls_config_set_verify_depth(struct tls_config *_config, int _verify_depth); |
68 | 68 | ||
69 | void tls_config_clear_keys(struct tls_config *_config); | 69 | void tls_config_prefer_ciphers_client(struct tls_config *_config); |
70 | int tls_config_parse_protocols(uint32_t *_protocols, const char *_protostr); | 70 | void tls_config_prefer_ciphers_server(struct tls_config *_config); |
71 | 71 | ||
72 | void tls_config_insecure_noverifycert(struct tls_config *_config); | 72 | void tls_config_insecure_noverifycert(struct tls_config *_config); |
73 | void tls_config_insecure_noverifyname(struct tls_config *_config); | 73 | void tls_config_insecure_noverifyname(struct tls_config *_config); |
@@ -76,6 +76,9 @@ void tls_config_verify(struct tls_config *_config); | |||
76 | void tls_config_verify_client(struct tls_config *_config); | 76 | void tls_config_verify_client(struct tls_config *_config); |
77 | void tls_config_verify_client_optional(struct tls_config *_config); | 77 | void tls_config_verify_client_optional(struct tls_config *_config); |
78 | 78 | ||
79 | void tls_config_clear_keys(struct tls_config *_config); | ||
80 | int tls_config_parse_protocols(uint32_t *_protocols, const char *_protostr); | ||
81 | |||
79 | struct tls *tls_client(void); | 82 | struct tls *tls_client(void); |
80 | struct tls *tls_server(void); | 83 | struct tls *tls_server(void); |
81 | int tls_configure(struct tls *_ctx, struct tls_config *_config); | 84 | int tls_configure(struct tls *_ctx, struct tls_config *_config); |
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c index 2a0033b3bd..4d536853c8 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.11 2015/09/09 19:49:07 jsing Exp $ */ | 1 | /* $OpenBSD: tls_config.c,v 1.12 2015/09/10 09:10:42 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -80,6 +80,8 @@ tls_config_new(void) | |||
80 | tls_config_set_protocols(config, TLS_PROTOCOLS_DEFAULT); | 80 | tls_config_set_protocols(config, TLS_PROTOCOLS_DEFAULT); |
81 | tls_config_set_verify_depth(config, 6); | 81 | tls_config_set_verify_depth(config, 6); |
82 | 82 | ||
83 | tls_config_prefer_ciphers_server(config); | ||
84 | |||
83 | tls_config_verify(config); | 85 | tls_config_verify(config); |
84 | 86 | ||
85 | return (config); | 87 | return (config); |
@@ -283,6 +285,18 @@ tls_config_set_verify_depth(struct tls_config *config, int verify_depth) | |||
283 | } | 285 | } |
284 | 286 | ||
285 | void | 287 | void |
288 | tls_config_prefer_ciphers_client(struct tls_config *config) | ||
289 | { | ||
290 | config->ciphers_server = 0; | ||
291 | } | ||
292 | |||
293 | void | ||
294 | tls_config_prefer_ciphers_server(struct tls_config *config) | ||
295 | { | ||
296 | config->ciphers_server = 1; | ||
297 | } | ||
298 | |||
299 | void | ||
286 | tls_config_insecure_noverifycert(struct tls_config *config) | 300 | tls_config_insecure_noverifycert(struct tls_config *config) |
287 | { | 301 | { |
288 | config->verify_cert = 0; | 302 | config->verify_cert = 0; |
diff --git a/src/lib/libtls/tls_init.3 b/src/lib/libtls/tls_init.3 index 16495112ff..17822d444d 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.25 2015/07/19 17:10:23 jmc Exp $ | 1 | .\" $OpenBSD: tls_init.3,v 1.26 2015/09/10 09:10:42 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 19 2015 $ | 17 | .Dd $Mdocdate: September 10 2015 $ |
18 | .Dt TLS_INIT 3 | 18 | .Dt TLS_INIT 3 |
19 | .Os | 19 | .Os |
20 | .Sh NAME | 20 | .Sh NAME |
@@ -35,6 +35,8 @@ | |||
35 | .Nm tls_config_set_key_mem , | 35 | .Nm tls_config_set_key_mem , |
36 | .Nm tls_config_set_protocols , | 36 | .Nm tls_config_set_protocols , |
37 | .Nm tls_config_set_verify_depth , | 37 | .Nm tls_config_set_verify_depth , |
38 | .Nm tls_config_prefer_ciphers_client , | ||
39 | .Nm tls_config_prefer_ciphers_server , | ||
38 | .Nm tls_config_clear_keys , | 40 | .Nm tls_config_clear_keys , |
39 | .Nm tls_config_insecure_noverifycert , | 41 | .Nm tls_config_insecure_noverifycert , |
40 | .Nm tls_config_insecure_noverifyname , | 42 | .Nm tls_config_insecure_noverifyname , |
@@ -92,6 +94,10 @@ | |||
92 | .Ft "void" | 94 | .Ft "void" |
93 | .Fn tls_config_set_verify_depth "struct tls_config *config" "int verify_depth" | 95 | .Fn tls_config_set_verify_depth "struct tls_config *config" "int verify_depth" |
94 | .Ft "void" | 96 | .Ft "void" |
97 | .Fn tls_config_prefer_ciphers_client "struct tls_config *config" | ||
98 | .Ft "void" | ||
99 | .Fn tls_config_prefer_ciphers_server "struct tls_config *config" | ||
100 | .Ft "void" | ||
95 | .Fn tls_config_clear_keys "struct tls_config *config" | 101 | .Fn tls_config_clear_keys "struct tls_config *config" |
96 | .Ft "void" | 102 | .Ft "void" |
97 | .Fn tls_config_insecure_noverifycert "struct tls_config *config" | 103 | .Fn tls_config_insecure_noverifycert "struct tls_config *config" |
@@ -291,6 +297,17 @@ Additionally, the values | |||
291 | (TLSv1.2 only) may be used. | 297 | (TLSv1.2 only) may be used. |
292 | .Em (Client and server) | 298 | .Em (Client and server) |
293 | .It | 299 | .It |
300 | .Fn tls_config_prefer_ciphers_client | ||
301 | prefers ciphers in the client's cipher list when selecting a cipher suite. | ||
302 | This is considered to be less secure than preferring the server's list. | ||
303 | .Em (Server) | ||
304 | .It | ||
305 | .Fn tls_config_prefer_ciphers_server | ||
306 | prefers ciphers in the server's cipher list when selecting a cipher suite. | ||
307 | This is considered to be more secure than preferring the client's list and is | ||
308 | the default. | ||
309 | .Em (Server) | ||
310 | .It | ||
294 | .Fn tls_config_clear_keys | 311 | .Fn tls_config_clear_keys |
295 | clears any secret keys from memory. | 312 | clears any secret keys from memory. |
296 | .Em (Server) | 313 | .Em (Server) |
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h index 58834c999f..78ae542cb6 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.16 2015/09/09 19:23:04 beck Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.17 2015/09/10 09:10:42 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> |
@@ -35,6 +35,7 @@ struct tls_config { | |||
35 | char *cert_mem; | 35 | char *cert_mem; |
36 | size_t cert_len; | 36 | size_t cert_len; |
37 | const char *ciphers; | 37 | const char *ciphers; |
38 | int ciphers_server; | ||
38 | int dheparams; | 39 | int dheparams; |
39 | int ecdhecurve; | 40 | int ecdhecurve; |
40 | const char *key_file; | 41 | const char *key_file; |
diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c index 8fa876c6fd..a3cee09596 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.13 2015/09/09 19:49:07 jsing Exp $ */ | 1 | /* $OpenBSD: tls_server.c,v 1.14 2015/09/10 09:10:42 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -88,6 +88,10 @@ tls_configure_server(struct tls *ctx) | |||
88 | EC_KEY_free(ecdh_key); | 88 | EC_KEY_free(ecdh_key); |
89 | } | 89 | } |
90 | 90 | ||
91 | if (ctx->config->ciphers_server == 1) | ||
92 | SSL_CTX_set_options(ctx->ssl_ctx, | ||
93 | SSL_OP_CIPHER_SERVER_PREFERENCE); | ||
94 | |||
91 | /* | 95 | /* |
92 | * Set session ID context to a random value. We don't support | 96 | * Set session ID context to a random value. We don't support |
93 | * persistent caching of sessions so it is OK to set a temporary | 97 | * persistent caching of sessions so it is OK to set a temporary |