unsigned tls_id;
unsigned min_dh;
unsigned j;
- int serv_ec_idx, serv_dh_idx; /* index in server's priority listing */
- int cli_ec_pos, cli_dh_pos; /* position in listing sent by client */
+ int serv_ec_idx, serv_dh_idx,
+ serv_kem_idx; /* index in server's priority listing */
+ int cli_ec_pos, cli_dh_pos,
+ cli_kem_pos; /* position in listing sent by client */
if (session->security_parameters.entity == GNUTLS_CLIENT) {
/* A client shouldn't receive this extension in TLS1.2. It is
/* we figure what is the minimum DH allowed for this session, if any */
min_dh = get_min_dh(session);
- serv_ec_idx = serv_dh_idx = -1;
- cli_ec_pos = cli_dh_pos = -1;
+ serv_ec_idx = serv_dh_idx = serv_kem_idx = -1;
+ cli_ec_pos = cli_dh_pos = cli_kem_pos = -1;
/* This extension is being processed prior to a ciphersuite being selected,
* so we cannot rely on ciphersuite information. */
break;
serv_ec_idx = j;
cli_ec_pos = i;
+ } else if (IS_KEM(group->pk)) {
+ if (serv_kem_idx !=
+ -1 &&
+ (int)j >
+ serv_kem_idx)
+ break;
+ serv_kem_idx = j;
+ cli_kem_pos = i;
}
} else {
if (group->pk == GNUTLS_PK_DH) {
break;
cli_ec_pos = i;
serv_ec_idx = j;
+ } else if (IS_KEM(group->pk)) {
+ if (cli_kem_pos != -1)
+ break;
+ cli_kem_pos = i;
+ serv_kem_idx = j;
}
}
break;
}
}
- /* serv_dh/ec_pos contain the index of the groups we want to use.
+ /* serv_{dh,ec,kem}_idx contain the index of the groups we want to use.
*/
if (serv_dh_idx != -1) {
session->internals.cand_dh_group =
}
}
+ /* KEM can only be used in TLS 1.3, where no separation from
+ * ECDH and DH, and thus only cand_group is set here.
+ */
+ if (serv_kem_idx != -1) {
+ if (session->internals.cand_group == NULL ||
+ (session->internals.priorities->server_precedence &&
+ serv_kem_idx < MIN(serv_ec_idx, serv_dh_idx)) ||
+ (!session->internals.priorities->server_precedence &&
+ cli_kem_pos < MIN(cli_ec_pos, cli_dh_pos))) {
+ session->internals.cand_group =
+ session->internals.priorities->groups
+ .entry[serv_kem_idx];
+ }
+ }
+
if (session->internals.cand_group)
_gnutls_handshake_log(
"EXT[%p]: Selected group %s\n", session,