summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_lib.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libssl/t1_lib.c109
1 files changed, 96 insertions, 13 deletions
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
248static const uint8_t ecformats_default[] = { 248static 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
254static const uint16_t eccurves_default[] = { 254static const uint8_t ecformats_default[] = {
255 TLSEXT_ECPOINTFORMAT_uncompressed,
256};
257
258static 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
290static const uint16_t eccurves_default[] = {
291 29, /* X25519 (29) */
292 23, /* secp256r1 (23) */
293 24, /* secp384r1 (24) */
294};
295
286int 296int
287tls1_ec_curve_id2nid(const uint16_t curve_id) 297tls1_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
420int
421tls1_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
446int
447tls1_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. */
411int 495int
412tls1_check_curve(SSL *s, const uint16_t curve_id) 496tls1_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;