summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Fedorenko <vadimjunk@gmail.com>2020-11-22 10:02:31 +0000
committerTomas Mraz <tomas@openssl.org>2021-01-20 18:05:41 +0100
commit3aa7212e0a4fd1533c8a28b8587dd8b022f3a66f (patch)
tree6527a5d4aae27f171133a1e5562d274ac2ab2dc8
parent5b57aa24c35f78cc11aa91586bc8e8826c2ece5a (diff)
downloadopenssl-new-3aa7212e0a4fd1533c8a28b8587dd8b022f3a66f.tar.gz
ktls: Initial support for ChaCha20-Poly1305
Linux kernel is going to support ChaCha20-Poly1305 in TLS offload. Add support for this cipher. Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/13475)
-rw-r--r--include/internal/ktls.h8
-rw-r--r--ssl/ktls.c21
2 files changed, 28 insertions, 1 deletions
diff --git a/include/internal/ktls.h b/include/internal/ktls.h
index fd439b5718..cf2c813bbc 100644
--- a/include/internal/ktls.h
+++ b/include/internal/ktls.h
@@ -222,6 +222,11 @@ static ossl_inline ossl_ssize_t ktls_sendfile(int s, int fd, off_t off,
# define OPENSSL_KTLS_TLS13
# if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)
# define OPENSSL_KTLS_AES_CCM_128
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
+# ifndef OPENSSL_NO_CHACHA
+# define OPENSSL_KTLS_CHACHA20_POLY1305
+# endif
+# endif
# endif
# endif
@@ -255,6 +260,9 @@ struct tls_crypto_info_all {
# ifdef OPENSSL_KTLS_AES_CCM_128
struct tls12_crypto_info_aes_ccm_128 ccm128;
# endif
+# ifdef OPENSSL_KTLS_CHACHA20_POLY1305
+ struct tls12_crypto_info_chacha20_poly1305 chacha20poly1305;
+# endif
};
size_t tls_crypto_info_len;
};
diff --git a/ssl/ktls.c b/ssl/ktls.c
index dc5bb2bbc3..da42084928 100644
--- a/ssl/ktls.c
+++ b/ssl/ktls.c
@@ -126,7 +126,9 @@ int ktls_check_supported_cipher(const SSL *s, const EVP_CIPHER *c,
return 0;
}
- /* check that cipher is AES_GCM_128, AES_GCM_256, AES_CCM_128 */
+ /* check that cipher is AES_GCM_128, AES_GCM_256, AES_CCM_128
+ * or Chacha20-Poly1305
+ */
switch (EVP_CIPHER_nid(c))
{
# ifdef OPENSSL_KTLS_AES_CCM_128
@@ -140,6 +142,9 @@ int ktls_check_supported_cipher(const SSL *s, const EVP_CIPHER *c,
# ifdef OPENSSL_KTLS_AES_GCM_256
case NID_aes_256_gcm:
# endif
+# ifdef OPENSSL_KTLS_CHACHA20_POLY1305
+ case NID_chacha20_poly1305:
+# endif
return 1;
default:
return 0;
@@ -213,6 +218,20 @@ int ktls_configure_crypto(const SSL *s, const EVP_CIPHER *c, EVP_CIPHER_CTX *dd,
*rec_seq = crypto_info->ccm128.rec_seq;
return 1;
# endif
+# ifdef OPENSSL_KTLS_CHACHA20_POLY1305
+ case NID_chacha20_poly1305:
+ crypto_info->chacha20poly1305.info.cipher_type = TLS_CIPHER_CHACHA20_POLY1305;
+ crypto_info->chacha20poly1305.info.version = s->version;
+ crypto_info->tls_crypto_info_len = sizeof(crypto_info->chacha20poly1305);
+ memcpy(crypto_info->chacha20poly1305.iv, iiv,
+ TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE);
+ memcpy(crypto_info->chacha20poly1305.key, key, EVP_CIPHER_key_length(c));
+ memcpy(crypto_info->chacha20poly1305.rec_seq, rl_sequence,
+ TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE);
+ if (rec_seq != NULL)
+ *rec_seq = crypto_info->chacha20poly1305.rec_seq;
+ return 1;
+# endif
default:
return 0;
}