diff options
| author | jsing <> | 2014-09-29 15:11:29 +0000 |
|---|---|---|
| committer | jsing <> | 2014-09-29 15:11:29 +0000 |
| commit | 605cec093155820780caa252b95043bde782b7d0 (patch) | |
| tree | 50bbaa9e38aefb427b0f0162ccd9eefee6d46b85 | |
| parent | ed345a015da09482b25daba22e3fffaf60583b83 (diff) | |
| download | openbsd-605cec093155820780caa252b95043bde782b7d0.tar.gz openbsd-605cec093155820780caa252b95043bde782b7d0.tar.bz2 openbsd-605cec093155820780caa252b95043bde782b7d0.zip | |
Add an option that allows the enabled SSL protocols to be explicitly
configured.
Discussed with several.
ok bcook@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libressl/ressl.c | 19 | ||||
| -rw-r--r-- | src/lib/libressl/ressl.h | 13 | ||||
| -rw-r--r-- | src/lib/libressl/ressl_client.c | 7 | ||||
| -rw-r--r-- | src/lib/libressl/ressl_config.c | 12 | ||||
| -rw-r--r-- | src/lib/libressl/ressl_internal.h | 4 | ||||
| -rw-r--r-- | src/lib/libressl/ressl_server.c | 5 |
6 files changed, 51 insertions, 9 deletions
diff --git a/src/lib/libressl/ressl.c b/src/lib/libressl/ressl.c index f01448b8f4..516afa53d6 100644 --- a/src/lib/libressl/ressl.c +++ b/src/lib/libressl/ressl.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ressl.c,v 1.14 2014/09/28 14:45:48 reyk Exp $ */ | 1 | /* $OpenBSD: ressl.c,v 1.15 2014/09/29 15:11:29 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -168,6 +168,23 @@ err: | |||
| 168 | return (1); | 168 | return (1); |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | int | ||
| 172 | ressl_configure_ssl(struct ressl *ctx) | ||
| 173 | { | ||
| 174 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv2); | ||
| 175 | |||
| 176 | if ((ctx->config->protocols & RESSL_PROTOCOL_SSLv3) == 0) | ||
| 177 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv3); | ||
| 178 | if ((ctx->config->protocols & RESSL_PROTOCOL_TLSv1_0) == 0) | ||
| 179 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1); | ||
| 180 | if ((ctx->config->protocols & RESSL_PROTOCOL_TLSv1_1) == 0) | ||
| 181 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1_1); | ||
| 182 | if ((ctx->config->protocols & RESSL_PROTOCOL_TLSv1_2) == 0) | ||
| 183 | SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1_2); | ||
| 184 | |||
| 185 | return (0); | ||
| 186 | } | ||
| 187 | |||
| 171 | void | 188 | void |
| 172 | ressl_free(struct ressl *ctx) | 189 | ressl_free(struct ressl *ctx) |
| 173 | { | 190 | { |
diff --git a/src/lib/libressl/ressl.h b/src/lib/libressl/ressl.h index 90b51dc7fc..5d980f1f75 100644 --- a/src/lib/libressl/ressl.h +++ b/src/lib/libressl/ressl.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ressl.h,v 1.16 2014/09/28 15:08:01 jsing Exp $ */ | 1 | /* $OpenBSD: ressl.h,v 1.17 2014/09/29 15:11:29 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -18,6 +18,15 @@ | |||
| 18 | #ifndef HEADER_RESSL_H | 18 | #ifndef HEADER_RESSL_H |
| 19 | #define HEADER_RESSL_H | 19 | #define HEADER_RESSL_H |
| 20 | 20 | ||
| 21 | #define RESSL_PROTOCOL_SSLv3 (1 << 0) | ||
| 22 | #define RESSL_PROTOCOL_TLSv1_0 (1 << 1) | ||
| 23 | #define RESSL_PROTOCOL_TLSv1_1 (1 << 2) | ||
| 24 | #define RESSL_PROTOCOL_TLSv1_2 (1 << 3) | ||
| 25 | #define RESSL_PROTOCOL_TLSv1 \ | ||
| 26 | (RESSL_PROTOCOL_TLSv1_0|RESSL_PROTOCOL_TLSv1_1|RESSL_PROTOCOL_TLSv1_2) | ||
| 27 | #define RESSL_PROTOCOLS_DEFAULT \ | ||
| 28 | (RESSL_PROTOCOL_SSLv3|RESSL_PROTOCOL_TLSv1) | ||
| 29 | |||
| 21 | #define RESSL_READ_AGAIN -2 | 30 | #define RESSL_READ_AGAIN -2 |
| 22 | #define RESSL_WRITE_AGAIN -3 | 31 | #define RESSL_WRITE_AGAIN -3 |
| 23 | 32 | ||
| @@ -43,6 +52,8 @@ int ressl_config_set_key_file(struct ressl_config *config, | |||
| 43 | const char *key_file); | 52 | const char *key_file); |
| 44 | int ressl_config_set_key_mem(struct ressl_config *config, const uint8_t *key, | 53 | int ressl_config_set_key_mem(struct ressl_config *config, const uint8_t *key, |
| 45 | size_t len); | 54 | size_t len); |
| 55 | void ressl_config_set_protocols(struct ressl_config *config, | ||
| 56 | uint32_t protocols); | ||
| 46 | void ressl_config_set_verify_depth(struct ressl_config *config, | 57 | void ressl_config_set_verify_depth(struct ressl_config *config, |
| 47 | int verify_depth); | 58 | int verify_depth); |
| 48 | 59 | ||
diff --git a/src/lib/libressl/ressl_client.c b/src/lib/libressl/ressl_client.c index 5969a104f7..8723a35ae0 100644 --- a/src/lib/libressl/ressl_client.c +++ b/src/lib/libressl/ressl_client.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ressl_client.c,v 1.3 2014/08/05 12:46:16 jsing Exp $ */ | 1 | /* $OpenBSD: ressl_client.c,v 1.4 2014/09/29 15:11:29 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -134,11 +134,14 @@ ressl_connect_socket(struct ressl *ctx, int socket, const char *hostname) | |||
| 134 | 134 | ||
| 135 | ctx->socket = socket; | 135 | ctx->socket = socket; |
| 136 | 136 | ||
| 137 | /* XXX - add a configuration option to control versions. */ | ||
| 138 | if ((ctx->ssl_ctx = SSL_CTX_new(SSLv23_client_method())) == NULL) { | 137 | if ((ctx->ssl_ctx = SSL_CTX_new(SSLv23_client_method())) == NULL) { |
| 139 | ressl_set_error(ctx, "ssl context failure"); | 138 | ressl_set_error(ctx, "ssl context failure"); |
| 140 | goto err; | 139 | goto err; |
| 141 | } | 140 | } |
| 141 | |||
| 142 | if (ressl_configure_ssl(ctx) != 0) | ||
| 143 | goto err; | ||
| 144 | |||
| 142 | if (ctx->config->verify) { | 145 | if (ctx->config->verify) { |
| 143 | if (hostname == NULL) { | 146 | if (hostname == NULL) { |
| 144 | ressl_set_error(ctx, "server name not specified"); | 147 | ressl_set_error(ctx, "server name not specified"); |
diff --git a/src/lib/libressl/ressl_config.c b/src/lib/libressl/ressl_config.c index 106527c109..c92886330e 100644 --- a/src/lib/libressl/ressl_config.c +++ b/src/lib/libressl/ressl_config.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ressl_config.c,v 1.11 2014/09/29 09:30:31 jsing Exp $ */ | 1 | /* $OpenBSD: ressl_config.c,v 1.12 2014/09/29 15:11:29 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -71,11 +71,13 @@ ressl_config_new(void) | |||
| 71 | ressl_config_free(config); | 71 | ressl_config_free(config); |
| 72 | return (NULL); | 72 | return (NULL); |
| 73 | } | 73 | } |
| 74 | ressl_config_verify(config); | 74 | ressl_config_set_protocols(config, RESSL_PROTOCOLS_DEFAULT); |
| 75 | ressl_config_set_verify_depth(config, 6); | 75 | ressl_config_set_verify_depth(config, 6); |
| 76 | /* ? use function ? */ | 76 | /* ? use function ? */ |
| 77 | config->ecdhcurve = NID_X9_62_prime256v1; | 77 | config->ecdhcurve = NID_X9_62_prime256v1; |
| 78 | 78 | ||
| 79 | ressl_config_verify(config); | ||
| 80 | |||
| 79 | return (config); | 81 | return (config); |
| 80 | } | 82 | } |
| 81 | 83 | ||
| @@ -164,6 +166,12 @@ ressl_config_set_key_mem(struct ressl_config *config, const uint8_t *key, | |||
| 164 | } | 166 | } |
| 165 | 167 | ||
| 166 | void | 168 | void |
| 169 | ressl_config_set_protocols(struct ressl_config *config, uint32_t protocols) | ||
| 170 | { | ||
| 171 | config->protocols = protocols; | ||
| 172 | } | ||
| 173 | |||
| 174 | void | ||
| 167 | ressl_config_set_verify_depth(struct ressl_config *config, int verify_depth) | 175 | ressl_config_set_verify_depth(struct ressl_config *config, int verify_depth) |
| 168 | { | 176 | { |
| 169 | config->verify_depth = verify_depth; | 177 | config->verify_depth = verify_depth; |
diff --git a/src/lib/libressl/ressl_internal.h b/src/lib/libressl/ressl_internal.h index 02dded3e7e..f37b5718d9 100644 --- a/src/lib/libressl/ressl_internal.h +++ b/src/lib/libressl/ressl_internal.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ressl_internal.h,v 1.10 2014/08/27 10:46:53 reyk Exp $ */ | 1 | /* $OpenBSD: ressl_internal.h,v 1.11 2014/09/29 15:11:29 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> |
| @@ -36,6 +36,7 @@ struct ressl_config { | |||
| 36 | const char *key_file; | 36 | const char *key_file; |
| 37 | char *key_mem; | 37 | char *key_mem; |
| 38 | size_t key_len; | 38 | size_t key_len; |
| 39 | uint32_t protocols; | ||
| 39 | int verify; | 40 | int verify; |
| 40 | int verify_depth; | 41 | int verify_depth; |
| 41 | }; | 42 | }; |
| @@ -63,6 +64,7 @@ struct ressl *ressl_server_conn(struct ressl *ctx); | |||
| 63 | int ressl_check_hostname(X509 *cert, const char *host); | 64 | int ressl_check_hostname(X509 *cert, const char *host); |
| 64 | int ressl_configure_keypair(struct ressl *ctx); | 65 | int ressl_configure_keypair(struct ressl *ctx); |
| 65 | int ressl_configure_server(struct ressl *ctx); | 66 | int ressl_configure_server(struct ressl *ctx); |
| 67 | int ressl_configure_ssl(struct ressl *ctx); | ||
| 66 | int ressl_host_port(const char *hostport, char **host, char **port); | 68 | int ressl_host_port(const char *hostport, char **host, char **port); |
| 67 | int ressl_set_error(struct ressl *ctx, char *fmt, ...); | 69 | int ressl_set_error(struct ressl *ctx, char *fmt, ...); |
| 68 | 70 | ||
diff --git a/src/lib/libressl/ressl_server.c b/src/lib/libressl/ressl_server.c index 24b54ad0d0..e2dc7cf088 100644 --- a/src/lib/libressl/ressl_server.c +++ b/src/lib/libressl/ressl_server.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ressl_server.c,v 1.7 2014/08/27 10:46:53 reyk Exp $ */ | 1 | /* $OpenBSD: ressl_server.c,v 1.8 2014/09/29 15:11:29 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,12 +52,13 @@ ressl_configure_server(struct ressl *ctx) | |||
| 52 | { | 52 | { |
| 53 | EC_KEY *ecdh_key; | 53 | EC_KEY *ecdh_key; |
| 54 | 54 | ||
| 55 | /* XXX - add a configuration option to control versions. */ | ||
| 56 | if ((ctx->ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { | 55 | if ((ctx->ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { |
| 57 | ressl_set_error(ctx, "ssl context failure"); | 56 | ressl_set_error(ctx, "ssl context failure"); |
| 58 | goto err; | 57 | goto err; |
| 59 | } | 58 | } |
| 60 | 59 | ||
| 60 | if (ressl_configure_ssl(ctx) != 0) | ||
| 61 | goto err; | ||
| 61 | if (ressl_configure_keypair(ctx) != 0) | 62 | if (ressl_configure_keypair(ctx) != 0) |
| 62 | goto err; | 63 | goto err; |
| 63 | 64 | ||
