__owur long ssl_get_algorithm2(SSL_CONNECTION *s);
__owur int tls12_copy_sigalgs(SSL_CONNECTION *s, WPACKET *pkt,
const uint16_t *psig, size_t psiglen);
-__owur int tls1_save_u16(PACKET *pkt, uint16_t **pdest, size_t *pdestlen);
+__owur int tls1_save_u16(PACKET *pkt, uint16_t **pdest, size_t *pdestlen, size_t maxnum);
__owur int tls1_save_sigalgs(SSL_CONNECTION *s, PACKET *pkt, int cert);
__owur int tls1_process_sigalgs(SSL_CONNECTION *s);
__owur int tls1_set_peer_legacy_sigalg(SSL_CONNECTION *s, const EVP_PKEY *pkey);
#define COOKIE_STATE_FORMAT_VERSION 1
+#define MAX_SUPPORTED_GROUPS 128
#define MAX_KEY_SHARES 16
/*
OPENSSL_free(s->ext.peer_supportedgroups);
s->ext.peer_supportedgroups = NULL;
s->ext.peer_supportedgroups_len = 0;
+ /*
+ * We only pay attention to the first 128 supported groups and ignore
+ * any beyond that limit. Theoretically this could cause problems if
+ * the client also uses one of these groups (say in a key share extension)
+ * - but why would any valid client be sending such a huge supported
+ * groups list?
+ */
if (!tls1_save_u16(&supported_groups_list,
&s->ext.peer_supportedgroups,
- &s->ext.peer_supportedgroups_len)) {
+ &s->ext.peer_supportedgroups_len, MAX_SUPPORTED_GROUPS)) {
SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
return 0;
}
#include "quic/quic_local.h"
#include <openssl/ct.h>
+#define MAX_SIGALGS 128
+
static const SIGALG_LOOKUP *find_sig_alg(SSL_CONNECTION *s, X509 *x, EVP_PKEY *pkey);
static int tls12_sigalg_allowed(const SSL_CONNECTION *s, int op, const SIGALG_LOOKUP *lu);
return 1;
}
-int tls1_save_u16(PACKET *pkt, uint16_t **pdest, size_t *pdestlen)
+int tls1_save_u16(PACKET *pkt, uint16_t **pdest, size_t *pdestlen, size_t maxnum)
{
unsigned int stmp;
size_t size, i;
size >>= 1;
+ /*
+ * We ignore any entries in the list larger than the maximum number we
+ * will accept.
+ */
+ if (size > maxnum)
+ size = maxnum;
+
if ((buf = OPENSSL_malloc_array(size, sizeof(*buf))) == NULL)
return 0;
for (i = 0; i < size && PACKET_get_net_2(pkt, &stmp); i++)
if (s->cert == NULL)
return 0;
+ /*
+ * We restrict the number of signature algorithms we are willing to process
+ * to 128. Any beyond this number are simply ignored.
+ */
if (cert)
return tls1_save_u16(pkt, &s->s3.tmp.peer_cert_sigalgs,
- &s->s3.tmp.peer_cert_sigalgslen);
+ &s->s3.tmp.peer_cert_sigalgslen, MAX_SIGALGS);
else
return tls1_save_u16(pkt, &s->s3.tmp.peer_sigalgs,
- &s->s3.tmp.peer_sigalgslen);
+ &s->s3.tmp.peer_sigalgslen, MAX_SIGALGS);
}
/* Set preferred digest for each key type */