57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
// Copyright 2020 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "net/ssl/cert_compression.h"
|
|
|
|
#include <cstdint>
|
|
|
|
#include "third_party/boringssl/src/include/openssl/ssl.h"
|
|
|
|
#if !defined(NET_DISABLE_BROTLI)
|
|
#include "third_party/brotli/include/brotli/decode.h"
|
|
#endif
|
|
|
|
namespace net {
|
|
namespace {
|
|
|
|
#if !defined(NET_DISABLE_BROTLI)
|
|
int DecompressBrotliCert(SSL* ssl,
|
|
CRYPTO_BUFFER** out,
|
|
size_t uncompressed_len,
|
|
const uint8_t* in,
|
|
size_t in_len) {
|
|
uint8_t* data;
|
|
bssl::UniquePtr<CRYPTO_BUFFER> decompressed(
|
|
CRYPTO_BUFFER_alloc(&data, uncompressed_len));
|
|
if (!decompressed) {
|
|
return 0;
|
|
}
|
|
|
|
size_t output_size = uncompressed_len;
|
|
if (BrotliDecoderDecompress(in_len, in, &output_size, data) !=
|
|
BROTLI_DECODER_RESULT_SUCCESS ||
|
|
output_size != uncompressed_len) {
|
|
return 0;
|
|
}
|
|
|
|
*out = decompressed.release();
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
} // namespace
|
|
|
|
void ConfigureCertificateCompression(SSL_CTX* ctx) {
|
|
#if !defined(NET_DISABLE_BROTLI)
|
|
SSL_CTX_add_cert_compression_alg(ctx, TLSEXT_cert_compression_brotli,
|
|
nullptr /* compression not supported */,
|
|
DecompressBrotliCert);
|
|
#endif
|
|
|
|
// Avoid "unused argument" errors in case no algorithms are supported.
|
|
(void)(ctx);
|
|
}
|
|
|
|
} // namespace net
|