OSDN Git Service

net/tls: getsockopt supports complete algorithm list
authorTianjia Zhang <tianjia.zhang@linux.alibaba.com>
Mon, 25 Oct 2021 13:05:00 +0000 (21:05 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Oct 2021 14:55:30 +0000 (15:55 +0100)
AES_CCM_128 and CHACHA20_POLY1305 are already supported by tls,
similar to setsockopt, getsockopt also needs to support these
two algorithms.

Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tls/tls_main.c

index d44399e..278192e 100644 (file)
@@ -421,6 +421,48 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
                        rc = -EFAULT;
                break;
        }
+       case TLS_CIPHER_AES_CCM_128: {
+               struct tls12_crypto_info_aes_ccm_128 *aes_ccm_128 =
+                       container_of(crypto_info,
+                               struct tls12_crypto_info_aes_ccm_128, info);
+
+               if (len != sizeof(*aes_ccm_128)) {
+                       rc = -EINVAL;
+                       goto out;
+               }
+               lock_sock(sk);
+               memcpy(aes_ccm_128->iv,
+                      cctx->iv + TLS_CIPHER_AES_CCM_128_SALT_SIZE,
+                      TLS_CIPHER_AES_CCM_128_IV_SIZE);
+               memcpy(aes_ccm_128->rec_seq, cctx->rec_seq,
+                      TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE);
+               release_sock(sk);
+               if (copy_to_user(optval, aes_ccm_128, sizeof(*aes_ccm_128)))
+                       rc = -EFAULT;
+               break;
+       }
+       case TLS_CIPHER_CHACHA20_POLY1305: {
+               struct tls12_crypto_info_chacha20_poly1305 *chacha20_poly1305 =
+                       container_of(crypto_info,
+                               struct tls12_crypto_info_chacha20_poly1305,
+                               info);
+
+               if (len != sizeof(*chacha20_poly1305)) {
+                       rc = -EINVAL;
+                       goto out;
+               }
+               lock_sock(sk);
+               memcpy(chacha20_poly1305->iv,
+                      cctx->iv + TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE,
+                      TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE);
+               memcpy(chacha20_poly1305->rec_seq, cctx->rec_seq,
+                      TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE);
+               release_sock(sk);
+               if (copy_to_user(optval, chacha20_poly1305,
+                               sizeof(*chacha20_poly1305)))
+                       rc = -EFAULT;
+               break;
+       }
        case TLS_CIPHER_SM4_GCM: {
                struct tls12_crypto_info_sm4_gcm *sm4_gcm_info =
                        container_of(crypto_info,