cert_compression.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/ssl/cert_compression.h"
  5. #include <cstdint>
  6. #include "third_party/boringssl/src/include/openssl/ssl.h"
  7. #if !defined(NET_DISABLE_BROTLI)
  8. #include "third_party/brotli/include/brotli/decode.h"
  9. #endif
  10. namespace net {
  11. namespace {
  12. #if !defined(NET_DISABLE_BROTLI)
  13. int DecompressBrotliCert(SSL* ssl,
  14. CRYPTO_BUFFER** out,
  15. size_t uncompressed_len,
  16. const uint8_t* in,
  17. size_t in_len) {
  18. uint8_t* data;
  19. bssl::UniquePtr<CRYPTO_BUFFER> decompressed(
  20. CRYPTO_BUFFER_alloc(&data, uncompressed_len));
  21. if (!decompressed) {
  22. return 0;
  23. }
  24. size_t output_size = uncompressed_len;
  25. if (BrotliDecoderDecompress(in_len, in, &output_size, data) !=
  26. BROTLI_DECODER_RESULT_SUCCESS ||
  27. output_size != uncompressed_len) {
  28. return 0;
  29. }
  30. *out = decompressed.release();
  31. return 1;
  32. }
  33. #endif
  34. } // namespace
  35. void ConfigureCertificateCompression(SSL_CTX* ctx) {
  36. #if !defined(NET_DISABLE_BROTLI)
  37. SSL_CTX_add_cert_compression_alg(ctx, TLSEXT_cert_compression_brotli,
  38. nullptr /* compression not supported */,
  39. DecompressBrotliCert);
  40. #endif
  41. // Avoid "unused argument" errors in case no algorithms are supported.
  42. (void)(ctx);
  43. }
  44. } // namespace net