summaryrefslogtreecommitdiff
path: root/ssl/t1_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'ssl/t1_lib.c')
-rw-r--r--ssl/t1_lib.c96
1 files changed, 56 insertions, 40 deletions
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
index cd471a636db1..ded6a1eadfb8 100644
--- a/ssl/t1_lib.c
+++ b/ssl/t1_lib.c
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -211,7 +211,7 @@ static const uint16_t suiteb_curves[] = {
/* Group list string of the built-in pseudo group DEFAULT_SUITE_B */
#define SUITE_B_GROUP_NAME "DEFAULT_SUITE_B"
-#define SUITE_B_GROUP_LIST "secp256r1:secp384r1",
+#define SUITE_B_GROUP_LIST "?secp256r1:?secp384r1",
struct provider_ctx_data_st {
SSL_CTX *ctx;
@@ -1244,8 +1244,8 @@ typedef struct {
size_t ksidcnt; /* Number of key shares */
uint16_t *ksid_arr; /* The IDs of the key share groups (flat list) */
/* Variable to keep state between execution of callback or helper functions */
- size_t tuple_mode; /* Keeps track whether tuple_cb called from 'the top' or from gid_cb */
- int ignore_unknown_default; /* Flag such that unknown groups for DEFAULT[_XYZ] are ignored */
+ int inner; /* Are we expanding a DEFAULT list */
+ int first; /* First tuple of possibly nested expansion? */
} gid_cb_st;
/* Forward declaration of tuple callback function */
@@ -1264,7 +1264,7 @@ static int gid_cb(const char *elem, int len, void *arg)
int found_group = 0;
char etmp[GROUP_NAME_BUFFER_LENGTH];
int retval = 1; /* We assume success */
- char *current_prefix;
+ const char *current_prefix;
int ignore_unknown = 0;
int add_keyshare = 0;
int remove_group = 0;
@@ -1320,16 +1320,16 @@ static int gid_cb(const char *elem, int len, void *arg)
for (i = 0; i < OSSL_NELEM(default_group_strings); i++) {
if ((size_t)len == (strlen(default_group_strings[i].list_name))
&& OPENSSL_strncasecmp(default_group_strings[i].list_name, elem, len) == 0) {
+ int saved_first;
+
/*
* We're asked to insert an entire list of groups from a
* DEFAULT[_XYZ] 'pseudo group' which we do by
* recursively calling this function (indirectly via
* CONF_parse_list and tuple_cb); essentially, we treat a DEFAULT
* group string like a tuple which is appended to the current tuple
- * rather then starting a new tuple. Variable tuple_mode is the flag which
- * controls append tuple vs start new tuple.
+ * rather then starting a new tuple.
*/
-
if (ignore_unknown || remove_group)
return -1; /* removal or ignore not allowed here -> syntax error */
@@ -1350,15 +1350,17 @@ static int gid_cb(const char *elem, int len, void *arg)
default_group_strings[i].group_string,
strlen(default_group_strings[i].group_string));
restored_default_group_string[strlen(default_group_strings[i].group_string) + restored_prefix_index] = '\0';
- /* We execute the recursive call */
- garg->ignore_unknown_default = 1; /* We ignore unknown groups for DEFAULT_XYZ */
- /* we enforce group mode (= append tuple) for DEFAULT_XYZ group lists */
- garg->tuple_mode = 0;
- /* We use the tuple_cb callback to process the pseudo group tuple */
+ /*
+ * Append first tuple of result to current tuple, and don't
+ * terminate the last tuple until we return to a top-level
+ * tuple_cb.
+ */
+ saved_first = garg->first;
+ garg->inner = garg->first = 1;
retval = CONF_parse_list(restored_default_group_string,
TUPLE_DELIMITER_CHARACTER, 1, tuple_cb, garg);
- garg->tuple_mode = 1; /* next call to tuple_cb will again start new tuple */
- garg->ignore_unknown_default = 0; /* reset to original value */
+ garg->inner = 0;
+ garg->first = saved_first;
/* We don't need the \0-terminated string anymore */
OPENSSL_free(restored_default_group_string);
@@ -1378,9 +1380,6 @@ static int gid_cb(const char *elem, int len, void *arg)
if (len == 0)
return -1; /* Seems we have prefxes without a group name -> syntax error */
- if (garg->ignore_unknown_default == 1) /* Always ignore unknown groups for DEFAULT[_XYZ] */
- ignore_unknown = 1;
-
/* Memory management in case more groups are present compared to initial allocation */
if (garg->gidcnt == garg->gidmax) {
uint16_t *tmp = OPENSSL_realloc(garg->gid_arr,
@@ -1514,7 +1513,7 @@ static int gid_cb(const char *elem, int len, void *arg)
/* and update the book keeping for the number of groups in current tuple */
garg->tuplcnt_arr[garg->tplcnt]++;
- /* We memorize if needed that we want to add a key share for the current group */
+ /* We want to add a key share for the current group */
if (add_keyshare)
garg->ksid_arr[garg->ksidcnt++] = gid;
}
@@ -1523,6 +1522,39 @@ done:
return retval;
}
+static int grow_tuples(gid_cb_st *garg)
+{
+ static size_t max_tplcnt = (~(size_t)0) / sizeof(size_t);
+
+ /* This uses OPENSSL_realloc_array() in newer releases */
+ if (garg->tplcnt == garg->tplmax) {
+ size_t newcnt = garg->tplmax + GROUPLIST_INCREMENT;
+ size_t newsz = newcnt * sizeof(size_t);
+ size_t *tmp;
+
+ if (newsz > max_tplcnt
+ || (tmp = OPENSSL_realloc(garg->tuplcnt_arr, newsz)) == NULL)
+ return 0;
+
+ garg->tplmax = newcnt;
+ garg->tuplcnt_arr = tmp;
+ }
+ return 1;
+}
+
+static int close_tuple(gid_cb_st *garg)
+{
+ size_t gidcnt = garg->tuplcnt_arr[garg->tplcnt];
+
+ if (gidcnt == 0)
+ return 1;
+ if (!grow_tuples(garg))
+ return 0;
+
+ garg->tuplcnt_arr[++garg->tplcnt] = 0;
+ return 1;
+}
+
/* Extract and process a tuple of groups */
static int tuple_cb(const char *tuple, int len, void *arg)
{
@@ -1536,16 +1568,9 @@ static int tuple_cb(const char *tuple, int len, void *arg)
return 0;
}
- /* Memory management for tuples */
- if (garg->tplcnt == garg->tplmax) {
- size_t *tmp = OPENSSL_realloc(garg->tuplcnt_arr,
- (garg->tplmax + GROUPLIST_INCREMENT) * sizeof(*garg->tuplcnt_arr));
-
- if (tmp == NULL)
- return 0;
- garg->tplmax += GROUPLIST_INCREMENT;
- garg->tuplcnt_arr = tmp;
- }
+ if (garg->inner && !garg->first && !close_tuple(garg))
+ return 0;
+ garg->first = 0;
/* Convert to \0-terminated string */
restored_tuple_string = OPENSSL_malloc((len + 1 /* \0 */) * sizeof(char));
@@ -1560,15 +1585,8 @@ static int tuple_cb(const char *tuple, int len, void *arg)
/* We don't need the \o-terminated string anymore */
OPENSSL_free(restored_tuple_string);
- if (garg->tuplcnt_arr[garg->tplcnt] > 0) { /* Some valid groups are present in current tuple... */
- if (garg->tuple_mode) {
- /* We 'close' the tuple */
- garg->tplcnt++;
- garg->tuplcnt_arr[garg->tplcnt] = 0; /* Next tuple is initialized to be empty */
- garg->tuple_mode = 1; /* next call will start a tuple (unless overridden in gid_cb) */
- }
- }
-
+ if (!garg->inner && !close_tuple(garg))
+ return 0;
return retval;
}
@@ -1599,8 +1617,6 @@ int tls1_set_groups_list(SSL_CTX *ctx,
}
memset(&gcb, 0, sizeof(gcb));
- gcb.tuple_mode = 1; /* We prepare to collect the first tuple */
- gcb.ignore_unknown_default = 0;
gcb.gidmax = GROUPLIST_INCREMENT;
gcb.tplmax = GROUPLIST_INCREMENT;
gcb.ksidmax = GROUPLIST_INCREMENT;