diff options
author | jsing <> | 2017-01-24 09:03:21 +0000 |
---|---|---|
committer | jsing <> | 2017-01-24 09:03:21 +0000 |
commit | 71cc331549d24c7e6a825b6aa26d8c8064dfe01a (patch) | |
tree | b493d9d91e40b334aae5a2cbf99981f9d4916d09 /src/lib | |
parent | 17a2441804c81d4524f94ae1c3fe8adbec4a0236 (diff) | |
download | openbsd-71cc331549d24c7e6a825b6aa26d8c8064dfe01a.tar.gz openbsd-71cc331549d24c7e6a825b6aa26d8c8064dfe01a.tar.bz2 openbsd-71cc331549d24c7e6a825b6aa26d8c8064dfe01a.zip |
Add support for setting the supported EC curves via
SSL{_CTX}_set1_groups{_list}() - also provide defines for the previous
SSL{_CTX}_set1_curves{_list} names.
This also changes the default list of EC curves to be X25519, P-256 and
P-384. If you want others (such a brainpool) you need to configure this
yourself.
Inspired by parts of BoringSSL and OpenSSL.
ok beck@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/Symbols.list | 4 | ||||
-rw-r--r-- | src/lib/libssl/s3_lib.c | 31 | ||||
-rw-r--r-- | src/lib/libssl/ssl.h | 15 | ||||
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 35 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 21 | ||||
-rw-r--r-- | src/lib/libssl/ssl_sess.c | 8 | ||||
-rw-r--r-- | src/lib/libssl/t1_lib.c | 109 |
7 files changed, 197 insertions, 26 deletions
diff --git a/src/lib/libssl/Symbols.list b/src/lib/libssl/Symbols.list index 1938c21509..042f553959 100644 --- a/src/lib/libssl/Symbols.list +++ b/src/lib/libssl/Symbols.list | |||
@@ -78,6 +78,8 @@ SSL_CTX_sess_set_get_cb | |||
78 | SSL_CTX_sess_set_new_cb | 78 | SSL_CTX_sess_set_new_cb |
79 | SSL_CTX_sess_set_remove_cb | 79 | SSL_CTX_sess_set_remove_cb |
80 | SSL_CTX_sessions | 80 | SSL_CTX_sessions |
81 | SSL_CTX_set1_groups | ||
82 | SSL_CTX_set1_groups_list | ||
81 | SSL_CTX_set1_param | 83 | SSL_CTX_set1_param |
82 | SSL_CTX_set_alpn_protos | 84 | SSL_CTX_set_alpn_protos |
83 | SSL_CTX_set_alpn_select_cb | 85 | SSL_CTX_set_alpn_select_cb |
@@ -212,6 +214,8 @@ SSL_renegotiate_pending | |||
212 | SSL_rstate_string | 214 | SSL_rstate_string |
213 | SSL_rstate_string_long | 215 | SSL_rstate_string_long |
214 | SSL_select_next_proto | 216 | SSL_select_next_proto |
217 | SSL_set1_groups | ||
218 | SSL_set1_groups_list | ||
215 | SSL_set1_param | 219 | SSL_set1_param |
216 | SSL_set_SSL_CTX | 220 | SSL_set_SSL_CTX |
217 | SSL_set_accept_state | 221 | SSL_set_accept_state |
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c index 1b0ddc702f..9d0217e95f 100644 --- a/src/lib/libssl/s3_lib.c +++ b/src/lib/libssl/s3_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_lib.c,v 1.129 2017/01/24 03:00:54 jsing Exp $ */ | 1 | /* $OpenBSD: s3_lib.c,v 1.130 2017/01/24 09:03:21 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -2154,9 +2154,24 @@ ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) | |||
2154 | default: | 2154 | default: |
2155 | break; | 2155 | break; |
2156 | } | 2156 | } |
2157 | |||
2157 | return (ret); | 2158 | return (ret); |
2158 | } | 2159 | } |
2159 | 2160 | ||
2161 | int | ||
2162 | SSL_set1_groups(SSL *s, const int *groups, size_t groups_len) | ||
2163 | { | ||
2164 | return tls1_set_groups(&s->internal->tlsext_supportedgroups, | ||
2165 | &s->internal->tlsext_supportedgroups_length, groups, groups_len); | ||
2166 | } | ||
2167 | |||
2168 | int | ||
2169 | SSL_set1_groups_list(SSL *s, const char *groups) | ||
2170 | { | ||
2171 | return tls1_set_groups_list(&s->internal->tlsext_supportedgroups, | ||
2172 | &s->internal->tlsext_supportedgroups_length, groups); | ||
2173 | } | ||
2174 | |||
2160 | long | 2175 | long |
2161 | ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | 2176 | ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) |
2162 | { | 2177 | { |
@@ -2327,6 +2342,20 @@ ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | |||
2327 | return (1); | 2342 | return (1); |
2328 | } | 2343 | } |
2329 | 2344 | ||
2345 | int | ||
2346 | SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len) | ||
2347 | { | ||
2348 | return tls1_set_groups(&ctx->internal->tlsext_supportedgroups, | ||
2349 | &ctx->internal->tlsext_supportedgroups_length, groups, groups_len); | ||
2350 | } | ||
2351 | |||
2352 | int | ||
2353 | SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups) | ||
2354 | { | ||
2355 | return tls1_set_groups_list(&ctx->internal->tlsext_supportedgroups, | ||
2356 | &ctx->internal->tlsext_supportedgroups_length, groups); | ||
2357 | } | ||
2358 | |||
2330 | long | 2359 | long |
2331 | ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | 2360 | ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) |
2332 | { | 2361 | { |
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h index 80e7558a2a..cf75130faf 100644 --- a/src/lib/libssl/ssl.h +++ b/src/lib/libssl/ssl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl.h,v 1.121 2017/01/24 02:56:17 jsing Exp $ */ | 1 | /* $OpenBSD: ssl.h,v 1.122 2017/01/24 09:03:21 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1169,6 +1169,19 @@ int PEM_write_SSL_SESSION(FILE *fp, SSL_SESSION *x); | |||
1169 | #define SSL_set_ecdh_auto(s, onoff) \ | 1169 | #define SSL_set_ecdh_auto(s, onoff) \ |
1170 | SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) | 1170 | SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) |
1171 | 1171 | ||
1172 | int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, size_t groups_len); | ||
1173 | int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups); | ||
1174 | |||
1175 | int SSL_set1_groups(SSL *ssl, const int *groups, size_t groups_len); | ||
1176 | int SSL_set1_groups_list(SSL *ssl, const char *groups); | ||
1177 | |||
1178 | #ifndef LIBRESSL_INTERNAL | ||
1179 | #define SSL_CTX_set1_curves SSL_CTX_set1_groups | ||
1180 | #define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list | ||
1181 | #define SSL_set1_curves SSL_set1_groups | ||
1182 | #define SSL_set1_curves_list SSL_set1_groups_list | ||
1183 | #endif | ||
1184 | |||
1172 | #define SSL_CTX_add_extra_chain_cert(ctx,x509) \ | 1185 | #define SSL_CTX_add_extra_chain_cert(ctx,x509) \ |
1173 | SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) | 1186 | SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509) |
1174 | #define SSL_CTX_get_extra_chain_certs(ctx,px509) \ | 1187 | #define SSL_CTX_get_extra_chain_certs(ctx,px509) \ |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index b9bfd7e24d..bc04ea7f9c 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_lib.c,v 1.144 2017/01/24 01:47:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.145 2017/01/24 09:03:21 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -336,6 +336,34 @@ SSL_new(SSL_CTX *ctx) | |||
336 | s->internal->tlsext_ocsp_resplen = -1; | 336 | s->internal->tlsext_ocsp_resplen = -1; |
337 | CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); | 337 | CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
338 | s->initial_ctx = ctx; | 338 | s->initial_ctx = ctx; |
339 | |||
340 | if (ctx->internal->tlsext_ecpointformatlist != NULL) { | ||
341 | s->internal->tlsext_ecpointformatlist = | ||
342 | calloc(ctx->internal->tlsext_ecpointformatlist_length, | ||
343 | sizeof(ctx->internal->tlsext_ecpointformatlist[0])); | ||
344 | if (s->internal->tlsext_ecpointformatlist == NULL) | ||
345 | goto err; | ||
346 | memcpy(s->internal->tlsext_ecpointformatlist, | ||
347 | ctx->internal->tlsext_ecpointformatlist, | ||
348 | ctx->internal->tlsext_ecpointformatlist_length * | ||
349 | sizeof(ctx->internal->tlsext_ecpointformatlist[0])); | ||
350 | s->internal->tlsext_ecpointformatlist_length = | ||
351 | ctx->internal->tlsext_ecpointformatlist_length; | ||
352 | } | ||
353 | if (ctx->internal->tlsext_supportedgroups != NULL) { | ||
354 | s->internal->tlsext_supportedgroups = | ||
355 | calloc(ctx->internal->tlsext_supportedgroups_length, | ||
356 | sizeof(ctx->internal->tlsext_supportedgroups)); | ||
357 | if (s->internal->tlsext_supportedgroups == NULL) | ||
358 | goto err; | ||
359 | memcpy(s->internal->tlsext_supportedgroups, | ||
360 | ctx->internal->tlsext_supportedgroups, | ||
361 | ctx->internal->tlsext_supportedgroups_length * | ||
362 | sizeof(ctx->internal->tlsext_supportedgroups[0])); | ||
363 | s->internal->tlsext_supportedgroups_length = | ||
364 | ctx->internal->tlsext_supportedgroups_length; | ||
365 | } | ||
366 | |||
339 | s->internal->next_proto_negotiated = NULL; | 367 | s->internal->next_proto_negotiated = NULL; |
340 | 368 | ||
341 | if (s->ctx->internal->alpn_client_proto_list != NULL) { | 369 | if (s->ctx->internal->alpn_client_proto_list != NULL) { |
@@ -534,7 +562,7 @@ SSL_free(SSL *s) | |||
534 | free(s->tlsext_hostname); | 562 | free(s->tlsext_hostname); |
535 | SSL_CTX_free(s->initial_ctx); | 563 | SSL_CTX_free(s->initial_ctx); |
536 | free(s->internal->tlsext_ecpointformatlist); | 564 | free(s->internal->tlsext_ecpointformatlist); |
537 | free(s->internal->tlsext_ellipticcurvelist); | 565 | free(s->internal->tlsext_supportedgroups); |
538 | if (s->internal->tlsext_ocsp_exts) | 566 | if (s->internal->tlsext_ocsp_exts) |
539 | sk_X509_EXTENSION_pop_free(s->internal->tlsext_ocsp_exts, | 567 | sk_X509_EXTENSION_pop_free(s->internal->tlsext_ocsp_exts, |
540 | X509_EXTENSION_free); | 568 | X509_EXTENSION_free); |
@@ -1998,6 +2026,9 @@ SSL_CTX_free(SSL_CTX *a) | |||
1998 | ENGINE_finish(a->internal->client_cert_engine); | 2026 | ENGINE_finish(a->internal->client_cert_engine); |
1999 | #endif | 2027 | #endif |
2000 | 2028 | ||
2029 | free(a->internal->tlsext_ecpointformatlist); | ||
2030 | free(a->internal->tlsext_supportedgroups); | ||
2031 | |||
2001 | free(a->internal->alpn_client_proto_list); | 2032 | free(a->internal->alpn_client_proto_list); |
2002 | 2033 | ||
2003 | free(a->internal); | 2034 | free(a->internal); |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 231e0ba333..0cda709da6 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_locl.h,v 1.163 2017/01/23 22:34:38 beck Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.164 2017/01/24 09:03:21 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -425,8 +425,8 @@ typedef struct ssl_session_internal_st { | |||
425 | 425 | ||
426 | size_t tlsext_ecpointformatlist_length; | 426 | size_t tlsext_ecpointformatlist_length; |
427 | uint8_t *tlsext_ecpointformatlist; /* peer's list */ | 427 | uint8_t *tlsext_ecpointformatlist; /* peer's list */ |
428 | size_t tlsext_ellipticcurvelist_length; | 428 | size_t tlsext_supportedgroups_length; |
429 | uint16_t *tlsext_ellipticcurvelist; /* peer's list */ | 429 | uint16_t *tlsext_supportedgroups; /* peer's list */ |
430 | } SSL_SESSION_INTERNAL; | 430 | } SSL_SESSION_INTERNAL; |
431 | #define SSI(s) (s->session->internal) | 431 | #define SSI(s) (s->session->internal) |
432 | 432 | ||
@@ -603,6 +603,11 @@ typedef struct ssl_ctx_internal_st { | |||
603 | /* Client list of supported protocols in wire format. */ | 603 | /* Client list of supported protocols in wire format. */ |
604 | unsigned char *alpn_client_proto_list; | 604 | unsigned char *alpn_client_proto_list; |
605 | unsigned int alpn_client_proto_list_len; | 605 | unsigned int alpn_client_proto_list_len; |
606 | |||
607 | size_t tlsext_ecpointformatlist_length; | ||
608 | uint8_t *tlsext_ecpointformatlist; /* our list */ | ||
609 | size_t tlsext_supportedgroups_length; | ||
610 | uint16_t *tlsext_supportedgroups; /* our list */ | ||
606 | } SSL_CTX_INTERNAL; | 611 | } SSL_CTX_INTERNAL; |
607 | 612 | ||
608 | typedef struct ssl_internal_st { | 613 | typedef struct ssl_internal_st { |
@@ -745,10 +750,11 @@ typedef struct ssl_internal_st { | |||
745 | 750 | ||
746 | /* RFC4507 session ticket expected to be received or sent */ | 751 | /* RFC4507 session ticket expected to be received or sent */ |
747 | int tlsext_ticket_expected; | 752 | int tlsext_ticket_expected; |
753 | |||
748 | size_t tlsext_ecpointformatlist_length; | 754 | size_t tlsext_ecpointformatlist_length; |
749 | uint8_t *tlsext_ecpointformatlist; /* our list */ | 755 | uint8_t *tlsext_ecpointformatlist; /* our list */ |
750 | size_t tlsext_ellipticcurvelist_length; | 756 | size_t tlsext_supportedgroups_length; |
751 | uint16_t *tlsext_ellipticcurvelist; /* our list */ | 757 | uint16_t *tlsext_supportedgroups; /* our list */ |
752 | 758 | ||
753 | /* TLS Session Ticket extension override */ | 759 | /* TLS Session Ticket extension override */ |
754 | TLS_SESSION_TICKET_EXT *tlsext_session_ticket; | 760 | TLS_SESSION_TICKET_EXT *tlsext_session_ticket; |
@@ -1304,6 +1310,11 @@ int ssl_ok(SSL *s); | |||
1304 | 1310 | ||
1305 | int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s); | 1311 | int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s); |
1306 | 1312 | ||
1313 | int tls1_set_groups(uint16_t **out_group_ids, size_t *out_group_ids_len, | ||
1314 | const int *groups, size_t ngroups); | ||
1315 | int tls1_set_groups_list(uint16_t **out_group_ids, size_t *out_group_ids_len, | ||
1316 | const char *groups); | ||
1317 | |||
1307 | int tls1_ec_curve_id2nid(const uint16_t curve_id); | 1318 | int tls1_ec_curve_id2nid(const uint16_t curve_id); |
1308 | uint16_t tls1_ec_nid2curve_id(const int nid); | 1319 | uint16_t tls1_ec_nid2curve_id(const int nid); |
1309 | int tls1_check_curve(SSL *s, const uint16_t curve_id); | 1320 | int tls1_check_curve(SSL *s, const uint16_t curve_id); |
diff --git a/src/lib/libssl/ssl_sess.c b/src/lib/libssl/ssl_sess.c index 307c730e3f..8c802b170e 100644 --- a/src/lib/libssl/ssl_sess.c +++ b/src/lib/libssl/ssl_sess.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_sess.c,v 1.66 2017/01/24 01:44:00 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_sess.c,v 1.67 2017/01/24 09:03:21 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -219,8 +219,8 @@ SSL_SESSION_new(void) | |||
219 | 219 | ||
220 | ss->internal->tlsext_ecpointformatlist_length = 0; | 220 | ss->internal->tlsext_ecpointformatlist_length = 0; |
221 | ss->internal->tlsext_ecpointformatlist = NULL; | 221 | ss->internal->tlsext_ecpointformatlist = NULL; |
222 | ss->internal->tlsext_ellipticcurvelist_length = 0; | 222 | ss->internal->tlsext_supportedgroups_length = 0; |
223 | ss->internal->tlsext_ellipticcurvelist = NULL; | 223 | ss->internal->tlsext_supportedgroups = NULL; |
224 | 224 | ||
225 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->internal->ex_data); | 225 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->internal->ex_data); |
226 | 226 | ||
@@ -709,7 +709,7 @@ SSL_SESSION_free(SSL_SESSION *ss) | |||
709 | free(ss->tlsext_hostname); | 709 | free(ss->tlsext_hostname); |
710 | free(ss->tlsext_tick); | 710 | free(ss->tlsext_tick); |
711 | free(ss->internal->tlsext_ecpointformatlist); | 711 | free(ss->internal->tlsext_ecpointformatlist); |
712 | free(ss->internal->tlsext_ellipticcurvelist); | 712 | free(ss->internal->tlsext_supportedgroups); |
713 | 713 | ||
714 | explicit_bzero(ss->internal, sizeof(*ss->internal)); | 714 | explicit_bzero(ss->internal, sizeof(*ss->internal)); |
715 | free(ss->internal); | 715 | free(ss->internal); |
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index b69e52a85c..be7c5b72a9 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: t1_lib.c,v 1.108 2017/01/24 08:41:53 jsing Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.109 2017/01/24 09:03:21 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -245,13 +245,17 @@ static int nid_list[] = { | |||
245 | NID_X25519, /* X25519 (29) */ | 245 | NID_X25519, /* X25519 (29) */ |
246 | }; | 246 | }; |
247 | 247 | ||
248 | static const uint8_t ecformats_default[] = { | 248 | static const uint8_t ecformats_list[] = { |
249 | TLSEXT_ECPOINTFORMAT_uncompressed, | 249 | TLSEXT_ECPOINTFORMAT_uncompressed, |
250 | TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime, | 250 | TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime, |
251 | TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 | 251 | TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 |
252 | }; | 252 | }; |
253 | 253 | ||
254 | static const uint16_t eccurves_default[] = { | 254 | static const uint8_t ecformats_default[] = { |
255 | TLSEXT_ECPOINTFORMAT_uncompressed, | ||
256 | }; | ||
257 | |||
258 | static const uint16_t eccurves_list[] = { | ||
255 | 29, /* X25519 (29) */ | 259 | 29, /* X25519 (29) */ |
256 | 14, /* sect571r1 (14) */ | 260 | 14, /* sect571r1 (14) */ |
257 | 13, /* sect571k1 (13) */ | 261 | 13, /* sect571k1 (13) */ |
@@ -283,6 +287,12 @@ static const uint16_t eccurves_default[] = { | |||
283 | 17, /* secp160r2 (17) */ | 287 | 17, /* secp160r2 (17) */ |
284 | }; | 288 | }; |
285 | 289 | ||
290 | static const uint16_t eccurves_default[] = { | ||
291 | 29, /* X25519 (29) */ | ||
292 | 23, /* secp256r1 (23) */ | ||
293 | 24, /* secp384r1 (24) */ | ||
294 | }; | ||
295 | |||
286 | int | 296 | int |
287 | tls1_ec_curve_id2nid(const uint16_t curve_id) | 297 | tls1_ec_curve_id2nid(const uint16_t curve_id) |
288 | { | 298 | { |
@@ -394,19 +404,93 @@ tls1_get_curvelist(SSL *s, int client_curves, const uint16_t **pcurves, | |||
394 | size_t *pcurveslen) | 404 | size_t *pcurveslen) |
395 | { | 405 | { |
396 | if (client_curves != 0) { | 406 | if (client_curves != 0) { |
397 | *pcurves = SSI(s)->tlsext_ellipticcurvelist; | 407 | *pcurves = SSI(s)->tlsext_supportedgroups; |
398 | *pcurveslen = SSI(s)->tlsext_ellipticcurvelist_length; | 408 | *pcurveslen = SSI(s)->tlsext_supportedgroups_length; |
399 | return; | 409 | return; |
400 | } | 410 | } |
401 | 411 | ||
402 | *pcurves = s->internal->tlsext_ellipticcurvelist; | 412 | *pcurves = s->internal->tlsext_supportedgroups; |
403 | *pcurveslen = s->internal->tlsext_ellipticcurvelist_length; | 413 | *pcurveslen = s->internal->tlsext_supportedgroups_length; |
404 | if (*pcurves == NULL) { | 414 | if (*pcurves == NULL) { |
405 | *pcurves = eccurves_default; | 415 | *pcurves = eccurves_default; |
406 | *pcurveslen = sizeof(eccurves_default) / 2; | 416 | *pcurveslen = sizeof(eccurves_default) / 2; |
407 | } | 417 | } |
408 | } | 418 | } |
409 | 419 | ||
420 | int | ||
421 | tls1_set_groups(uint16_t **out_group_ids, size_t *out_group_ids_len, | ||
422 | const int *groups, size_t ngroups) | ||
423 | { | ||
424 | uint16_t *group_ids; | ||
425 | size_t i; | ||
426 | |||
427 | group_ids = calloc(ngroups, sizeof(uint16_t)); | ||
428 | if (group_ids == NULL) | ||
429 | return 0; | ||
430 | |||
431 | for (i = 0; i < ngroups; i++) { | ||
432 | group_ids[i] = tls1_ec_nid2curve_id(groups[i]); | ||
433 | if (group_ids[i] == 0) { | ||
434 | free(group_ids); | ||
435 | return 0; | ||
436 | } | ||
437 | } | ||
438 | |||
439 | free(*out_group_ids); | ||
440 | *out_group_ids = group_ids; | ||
441 | *out_group_ids_len = ngroups; | ||
442 | |||
443 | return 1; | ||
444 | } | ||
445 | |||
446 | int | ||
447 | tls1_set_groups_list(uint16_t **out_group_ids, size_t *out_group_ids_len, | ||
448 | const char *groups) | ||
449 | { | ||
450 | uint16_t *new_group_ids, *group_ids = NULL; | ||
451 | size_t ngroups = 0; | ||
452 | char *gs, *p, *q; | ||
453 | int nid; | ||
454 | |||
455 | if ((gs = strdup(groups)) == NULL) | ||
456 | return 0; | ||
457 | |||
458 | q = gs; | ||
459 | while ((p = strsep(&q, ":")) != NULL) { | ||
460 | nid = OBJ_sn2nid(p); | ||
461 | if (nid == NID_undef) | ||
462 | nid = OBJ_ln2nid(p); | ||
463 | if (nid == NID_undef) | ||
464 | nid = EC_curve_nist2nid(p); | ||
465 | if (nid == NID_undef) | ||
466 | goto err; | ||
467 | |||
468 | if ((new_group_ids = reallocarray(group_ids, ngroups + 1, | ||
469 | sizeof(uint16_t))) == NULL) | ||
470 | goto err; | ||
471 | group_ids = new_group_ids; | ||
472 | |||
473 | group_ids[ngroups] = tls1_ec_nid2curve_id(nid); | ||
474 | if (group_ids[ngroups] == 0) | ||
475 | goto err; | ||
476 | |||
477 | ngroups++; | ||
478 | } | ||
479 | |||
480 | free(gs); | ||
481 | free(*out_group_ids); | ||
482 | *out_group_ids = group_ids; | ||
483 | *out_group_ids_len = ngroups; | ||
484 | |||
485 | return 1; | ||
486 | |||
487 | err: | ||
488 | free(gs); | ||
489 | free(group_ids); | ||
490 | |||
491 | return 0; | ||
492 | } | ||
493 | |||
410 | /* Check that a curve is one of our preferences. */ | 494 | /* Check that a curve is one of our preferences. */ |
411 | int | 495 | int |
412 | tls1_check_curve(SSL *s, const uint16_t curve_id) | 496 | tls1_check_curve(SSL *s, const uint16_t curve_id) |
@@ -1378,11 +1462,11 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1378 | curveslen /= 2; | 1462 | curveslen /= 2; |
1379 | 1463 | ||
1380 | if (!s->internal->hit) { | 1464 | if (!s->internal->hit) { |
1381 | if (SSI(s)->tlsext_ellipticcurvelist) { | 1465 | if (SSI(s)->tlsext_supportedgroups) { |
1382 | *al = TLS1_AD_DECODE_ERROR; | 1466 | *al = TLS1_AD_DECODE_ERROR; |
1383 | return 0; | 1467 | return 0; |
1384 | } | 1468 | } |
1385 | SSI(s)->tlsext_ellipticcurvelist_length = 0; | 1469 | SSI(s)->tlsext_supportedgroups_length = 0; |
1386 | if ((curves = reallocarray(NULL, curveslen, | 1470 | if ((curves = reallocarray(NULL, curveslen, |
1387 | sizeof(uint16_t))) == NULL) { | 1471 | sizeof(uint16_t))) == NULL) { |
1388 | *al = TLS1_AD_INTERNAL_ERROR; | 1472 | *al = TLS1_AD_INTERNAL_ERROR; |
@@ -1390,11 +1474,10 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1390 | } | 1474 | } |
1391 | for (i = 0; i < curveslen; i++) | 1475 | for (i = 0; i < curveslen; i++) |
1392 | n2s(sdata, curves[i]); | 1476 | n2s(sdata, curves[i]); |
1393 | SSI(s)->tlsext_ellipticcurvelist = curves; | 1477 | SSI(s)->tlsext_supportedgroups = curves; |
1394 | SSI(s)->tlsext_ellipticcurvelist_length = curveslen; | 1478 | SSI(s)->tlsext_supportedgroups_length = curveslen; |
1395 | } | 1479 | } |
1396 | } | 1480 | } else if (type == TLSEXT_TYPE_session_ticket) { |
1397 | else if (type == TLSEXT_TYPE_session_ticket) { | ||
1398 | if (s->internal->tls_session_ticket_ext_cb && | 1481 | if (s->internal->tls_session_ticket_ext_cb && |
1399 | !s->internal->tls_session_ticket_ext_cb(s, data, size, s->internal->tls_session_ticket_ext_cb_arg)) { | 1482 | !s->internal->tls_session_ticket_ext_cb(s, data, size, s->internal->tls_session_ticket_ext_cb_arg)) { |
1400 | *al = TLS1_AD_INTERNAL_ERROR; | 1483 | *al = TLS1_AD_INTERNAL_ERROR; |