Mercurial > hg > nginx
changeset 8203:ec0c44aa2881 quic
Chacha20 header protection support with BoringSSL.
BoringSSL lacks EVP for Chacha20. Here we use CRYPTO_chacha_20() instead.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 10 Mar 2020 19:15:12 +0300 |
parents | a4ed2305ad2c |
children | 9e0c30e1f7fb |
files | src/event/ngx_event_openssl.h src/event/ngx_event_quic.c |
diffstat | 2 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/event/ngx_event_openssl.h Tue Mar 10 19:13:09 2020 +0300 +++ b/src/event/ngx_event_openssl.h Tue Mar 10 19:15:12 2020 +0300 @@ -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
--- a/src/event/ngx_event_quic.c Tue Mar 10 19:13:09 2020 +0300 +++ b/src/event/ngx_event_quic.c Tue Mar 10 19:15:12 2020 +0300 @@ -2053,6 +2053,17 @@ 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 @@ #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();