LCOV - code coverage report
Current view: top level - source/extensions/transport_sockets/alts - tsi_frame_protector.cc (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 0 74 0.0 %
Date: 2024-01-05 06:35:25 Functions: 0 5 0.0 %

          Line data    Source code
       1             : #include "source/extensions/transport_sockets/alts/tsi_frame_protector.h"
       2             : 
       3             : #include "source/common/buffer/buffer_impl.h"
       4             : #include "source/common/common/assert.h"
       5             : 
       6             : #include "src/core/lib/iomgr/exec_ctx.h"
       7             : #include "src/core/tsi/transport_security_grpc.h"
       8             : #include "src/core/tsi/transport_security_interface.h"
       9             : 
      10             : namespace Envoy {
      11             : namespace Extensions {
      12             : namespace TransportSockets {
      13             : namespace Alts {
      14             : 
      15             : TsiFrameProtector::TsiFrameProtector(CFrameProtectorPtr&& frame_protector)
      16           0 :     : frame_protector_(std::move(frame_protector)) {}
      17             : 
      18           0 : tsi_result TsiFrameProtector::protect(const grpc_slice& input_slice, Buffer::Instance& output) {
      19           0 :   ASSERT(frame_protector_);
      20             : 
      21           0 :   if (GRPC_SLICE_LENGTH(input_slice) == 0) {
      22           0 :     return TSI_OK;
      23           0 :   }
      24             : 
      25           0 :   grpc_core::ExecCtx exec_ctx;
      26             : 
      27           0 :   grpc_slice_buffer message_buffer;
      28           0 :   grpc_slice_buffer_init(&message_buffer);
      29           0 :   grpc_slice_buffer_add(&message_buffer, input_slice);
      30             : 
      31           0 :   grpc_slice_buffer protected_buffer;
      32           0 :   grpc_slice_buffer_init(&protected_buffer);
      33             : 
      34           0 :   tsi_result result = tsi_zero_copy_grpc_protector_protect(frame_protector_.get(), &message_buffer,
      35           0 :                                                            &protected_buffer);
      36             : 
      37           0 :   if (result != TSI_OK) {
      38           0 :     ASSERT(result != TSI_INVALID_ARGUMENT && result != TSI_UNIMPLEMENTED);
      39           0 :     grpc_slice_buffer_destroy(&message_buffer);
      40           0 :     grpc_slice_buffer_destroy(&protected_buffer);
      41           0 :     return result;
      42           0 :   }
      43             : 
      44           0 :   const size_t protected_data_length = protected_buffer.length;
      45           0 :   char* protected_data = new char[protected_data_length];
      46             : 
      47           0 :   grpc_slice_buffer_move_first_into_buffer(&protected_buffer, protected_data_length,
      48           0 :                                            protected_data);
      49             : 
      50           0 :   auto fragment = new Buffer::BufferFragmentImpl(
      51           0 :       protected_data, protected_data_length,
      52           0 :       [protected_data](const void*, size_t,
      53           0 :                        const Envoy::Buffer::BufferFragmentImpl* this_fragment) {
      54           0 :         delete[] protected_data;
      55           0 :         delete this_fragment;
      56           0 :       });
      57             : 
      58           0 :   output.addBufferFragment(*fragment);
      59             : 
      60           0 :   grpc_slice_buffer_destroy(&message_buffer);
      61           0 :   grpc_slice_buffer_destroy(&protected_buffer);
      62             : 
      63           0 :   return TSI_OK;
      64           0 : }
      65             : 
      66           0 : tsi_result TsiFrameProtector::unprotect(Buffer::Instance& input, Buffer::Instance& output) {
      67           0 :   ASSERT(frame_protector_);
      68             : 
      69           0 :   if (input.length() == 0) {
      70           0 :     return TSI_OK;
      71           0 :   }
      72             : 
      73           0 :   grpc_core::ExecCtx exec_ctx;
      74           0 :   grpc_slice input_slice = grpc_slice_from_copied_buffer(
      75           0 :       reinterpret_cast<char*>(input.linearize(input.length())), input.length());
      76             : 
      77           0 :   grpc_slice_buffer protected_buffer;
      78           0 :   grpc_slice_buffer_init(&protected_buffer);
      79           0 :   grpc_slice_buffer_add(&protected_buffer, input_slice);
      80             : 
      81           0 :   grpc_slice_buffer unprotected_buffer;
      82           0 :   grpc_slice_buffer_init(&unprotected_buffer);
      83             : 
      84           0 :   tsi_result result = tsi_zero_copy_grpc_protector_unprotect(
      85           0 :       frame_protector_.get(), &protected_buffer, &unprotected_buffer, nullptr);
      86             : 
      87           0 :   if (result != TSI_OK) {
      88           0 :     ASSERT(result != TSI_INVALID_ARGUMENT && result != TSI_UNIMPLEMENTED);
      89           0 :     grpc_slice_buffer_destroy(&protected_buffer);
      90           0 :     grpc_slice_buffer_destroy(&unprotected_buffer);
      91           0 :     return result;
      92           0 :   }
      93             : 
      94           0 :   const size_t unprotected_data_length = unprotected_buffer.length;
      95           0 :   char* unprotected_data = new char[unprotected_data_length];
      96             : 
      97           0 :   grpc_slice_buffer_move_first_into_buffer(&unprotected_buffer, unprotected_data_length,
      98           0 :                                            unprotected_data);
      99             : 
     100           0 :   auto fragment = new Buffer::BufferFragmentImpl(
     101           0 :       unprotected_data, unprotected_data_length,
     102           0 :       [unprotected_data](const void*, size_t,
     103           0 :                          const Envoy::Buffer::BufferFragmentImpl* this_fragment) {
     104           0 :         delete[] unprotected_data;
     105           0 :         delete this_fragment;
     106           0 :       });
     107             : 
     108           0 :   output.addBufferFragment(*fragment);
     109           0 :   input.drain(input.length());
     110             : 
     111           0 :   grpc_slice_buffer_destroy(&protected_buffer);
     112           0 :   grpc_slice_buffer_destroy(&unprotected_buffer);
     113             : 
     114           0 :   return TSI_OK;
     115           0 : }
     116             : 
     117             : } // namespace Alts
     118             : } // namespace TransportSockets
     119             : } // namespace Extensions
     120             : } // namespace Envoy

Generated by: LCOV version 1.15