selftests: tls: fix chacha+bidir tests
authorJakub Kicinski <kuba@kernel.org>
Fri, 18 Jun 2021 20:25:04 +0000 (13:25 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Jun 2021 19:11:31 +0000 (12:11 -0700)
ChaCha support did not adjust the bidirectional test.
We need to set up KTLS in reverse direction correctly,
otherwise these two cases will fail:

  tls.12_chacha.bidir
  tls.13_chacha.bidir

Fixes: 4f336e88a870 ("selftests/tls: add CHACHA20-POLY1305 to tls selftests")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Vadim Fedorenko <vfedorenko@novek.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/tls.c

index 58fea6e..112d41d 100644 (file)
 #define TLS_PAYLOAD_MAX_LEN 16384
 #define SOL_TLS 282
 
+struct tls_crypto_info_keys {
+       union {
+               struct tls12_crypto_info_aes_gcm_128 aes128;
+               struct tls12_crypto_info_chacha20_poly1305 chacha20;
+       };
+       size_t len;
+};
+
+static void tls_crypto_info_init(uint16_t tls_version, uint16_t cipher_type,
+                                struct tls_crypto_info_keys *tls12)
+{
+       memset(tls12, 0, sizeof(*tls12));
+
+       switch (cipher_type) {
+       case TLS_CIPHER_CHACHA20_POLY1305:
+               tls12->len = sizeof(struct tls12_crypto_info_chacha20_poly1305);
+               tls12->chacha20.info.version = tls_version;
+               tls12->chacha20.info.cipher_type = cipher_type;
+               break;
+       case TLS_CIPHER_AES_GCM_128:
+               tls12->len = sizeof(struct tls12_crypto_info_aes_gcm_128);
+               tls12->aes128.info.version = tls_version;
+               tls12->aes128.info.cipher_type = cipher_type;
+               break;
+       default:
+               break;
+       }
+}
+
 static void memrnd(void *s, size_t n)
 {
        int *dword = s;
@@ -145,33 +174,16 @@ FIXTURE_VARIANT_ADD(tls, 13_chacha)
 
 FIXTURE_SETUP(tls)
 {
-       union {
-               struct tls12_crypto_info_aes_gcm_128 aes128;
-               struct tls12_crypto_info_chacha20_poly1305 chacha20;
-       } tls12;
+       struct tls_crypto_info_keys tls12;
        struct sockaddr_in addr;
        socklen_t len;
        int sfd, ret;
-       size_t tls12_sz;
 
        self->notls = false;
        len = sizeof(addr);
 
-       memset(&tls12, 0, sizeof(tls12));
-       switch (variant->cipher_type) {
-       case TLS_CIPHER_CHACHA20_POLY1305:
-               tls12_sz = sizeof(struct tls12_crypto_info_chacha20_poly1305);
-               tls12.chacha20.info.version = variant->tls_version;
-               tls12.chacha20.info.cipher_type = variant->cipher_type;
-               break;
-       case TLS_CIPHER_AES_GCM_128:
-               tls12_sz = sizeof(struct tls12_crypto_info_aes_gcm_128);
-               tls12.aes128.info.version = variant->tls_version;
-               tls12.aes128.info.cipher_type = variant->cipher_type;
-               break;
-       default:
-               tls12_sz = 0;
-       }
+       tls_crypto_info_init(variant->tls_version, variant->cipher_type,
+                            &tls12);
 
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
@@ -199,7 +211,7 @@ FIXTURE_SETUP(tls)
 
        if (!self->notls) {
                ret = setsockopt(self->fd, SOL_TLS, TLS_TX, &tls12,
-                                tls12_sz);
+                                tls12.len);
                ASSERT_EQ(ret, 0);
        }
 
@@ -212,7 +224,7 @@ FIXTURE_SETUP(tls)
                ASSERT_EQ(ret, 0);
 
                ret = setsockopt(self->cfd, SOL_TLS, TLS_RX, &tls12,
-                                tls12_sz);
+                                tls12.len);
                ASSERT_EQ(ret, 0);
        }
 
@@ -854,18 +866,17 @@ TEST_F(tls, bidir)
        int ret;
 
        if (!self->notls) {
-               struct tls12_crypto_info_aes_gcm_128 tls12;
+               struct tls_crypto_info_keys tls12;
 
-               memset(&tls12, 0, sizeof(tls12));
-               tls12.info.version = variant->tls_version;
-               tls12.info.cipher_type = TLS_CIPHER_AES_GCM_128;
+               tls_crypto_info_init(variant->tls_version, variant->cipher_type,
+                                    &tls12);
 
                ret = setsockopt(self->fd, SOL_TLS, TLS_RX, &tls12,
-                                sizeof(tls12));
+                                tls12.len);
                ASSERT_EQ(ret, 0);
 
                ret = setsockopt(self->cfd, SOL_TLS, TLS_TX, &tls12,
-                                sizeof(tls12));
+                                tls12.len);
                ASSERT_EQ(ret, 0);
        }