Skip to content

Commit

Permalink
tls: validate crypto_info in a separate helper
Browse files Browse the repository at this point in the history
Simplify do_tls_setsockopt_conf a bit.

Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sabrina Dubroca authored and David S. Miller committed Oct 13, 2023
1 parent 4f48669 commit 1cf7fbc
Showing 1 changed file with 27 additions and 24 deletions.
51 changes: 27 additions & 24 deletions net/tls/tls_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,31 @@ static int tls_getsockopt(struct sock *sk, int level, int optname,
return do_tls_getsockopt(sk, optname, optval, optlen);
}

static int validate_crypto_info(const struct tls_crypto_info *crypto_info,
const struct tls_crypto_info *alt_crypto_info)
{
if (crypto_info->version != TLS_1_2_VERSION &&
crypto_info->version != TLS_1_3_VERSION)
return -EINVAL;

switch (crypto_info->cipher_type) {
case TLS_CIPHER_ARIA_GCM_128:
case TLS_CIPHER_ARIA_GCM_256:
if (crypto_info->version != TLS_1_2_VERSION)
return -EINVAL;
break;
}

/* Ensure that TLS version and ciphers are same in both directions */
if (TLS_CRYPTO_INFO_READY(alt_crypto_info)) {
if (alt_crypto_info->version != crypto_info->version ||
alt_crypto_info->cipher_type != crypto_info->cipher_type)
return -EINVAL;
}

return 0;
}

static int do_tls_setsockopt_conf(struct sock *sk, sockptr_t optval,
unsigned int optlen, int tx)
{
Expand Down Expand Up @@ -611,38 +636,16 @@ static int do_tls_setsockopt_conf(struct sock *sk, sockptr_t optval,
goto err_crypto_info;
}

/* check version */
if (crypto_info->version != TLS_1_2_VERSION &&
crypto_info->version != TLS_1_3_VERSION) {
rc = -EINVAL;
rc = validate_crypto_info(crypto_info, alt_crypto_info);
if (rc)
goto err_crypto_info;
}

/* Ensure that TLS version and ciphers are same in both directions */
if (TLS_CRYPTO_INFO_READY(alt_crypto_info)) {
if (alt_crypto_info->version != crypto_info->version ||
alt_crypto_info->cipher_type != crypto_info->cipher_type) {
rc = -EINVAL;
goto err_crypto_info;
}
}

cipher_desc = get_cipher_desc(crypto_info->cipher_type);
if (!cipher_desc) {
rc = -EINVAL;
goto err_crypto_info;
}

switch (crypto_info->cipher_type) {
case TLS_CIPHER_ARIA_GCM_128:
case TLS_CIPHER_ARIA_GCM_256:
if (crypto_info->version != TLS_1_2_VERSION) {
rc = -EINVAL;
goto err_crypto_info;
}
break;
}

if (optlen != cipher_desc->crypto_info) {
rc = -EINVAL;
goto err_crypto_info;
Expand Down

0 comments on commit 1cf7fbc

Please sign in to comment.