summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2020-03-10 19:15:12 +0300
committerSergey Kandaurov <pluknet@nginx.com>2020-03-10 19:15:12 +0300
commitdf544ee47d3fe3590e5d37ef399332b74166c9b7 (patch)
tree393145ff36ea2d4138e14d1494d01dfa2fb98d9a /src
parent7e417544bbffdb05e3ef097fe7b7d49e5d85d1d8 (diff)
downloadnginx-df544ee47d3fe3590e5d37ef399332b74166c9b7.tar.gz
nginx-df544ee47d3fe3590e5d37ef399332b74166c9b7.tar.bz2
Chacha20 header protection support with BoringSSL.
BoringSSL lacks EVP for Chacha20. Here we use CRYPTO_chacha_20() instead.
Diffstat (limited to 'src')
-rw-r--r--src/event/ngx_event_openssl.h1
-rw-r--r--src/event/ngx_event_quic.c15
2 files changed, 15 insertions, 1 deletions
diff --git a/src/event/ngx_event_openssl.h b/src/event/ngx_event_openssl.h
index b562f0f17..620a216ef 100644
--- a/src/event/ngx_event_openssl.h
+++ b/src/event/ngx_event_openssl.h
@@ -25,6 +25,7 @@
#include <openssl/evp.h>
#ifdef OPENSSL_IS_BORINGSSL
#include <openssl/hkdf.h>
+#include <openssl/chacha.h>
#else
#include <openssl/kdf.h>
#endif
diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c
index b7595e8bf..c4012687e 100644
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -2053,6 +2053,17 @@ ngx_quic_tls_hp(ngx_connection_t *c, const EVP_CIPHER *cipher,
EVP_CIPHER_CTX *ctx;
u_char zero[5] = {0};
+#ifdef OPENSSL_IS_BORINGSSL
+ uint32_t counter;
+
+ ngx_memcpy(&counter, in, sizeof(uint32_t));
+
+ if (cipher == (const EVP_CIPHER *) EVP_aead_chacha20_poly1305()) {
+ CRYPTO_chacha_20(out, zero, 5, s->hp.data, &in[4], counter);
+ return NGX_OK;
+ }
+#endif
+
ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL) {
return NGX_ERROR;
@@ -2129,7 +2140,9 @@ ngx_quic_ciphers(ngx_connection_t *c, ngx_quic_ciphers_t *ciphers,
#else
ciphers->c = EVP_chacha20_poly1305();
#endif
-#ifndef OPENSSL_IS_BORINGSSL
+#ifdef OPENSSL_IS_BORINGSSL
+ ciphers->hp = (const EVP_CIPHER *) EVP_aead_chacha20_poly1305();
+#else
ciphers->hp = EVP_chacha20();
#endif
ciphers->d = EVP_sha256();