1 //
2 //
3 // Copyright 2017 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
19 #ifndef GRPC_SRC_CORE_TSI_TRANSPORT_SECURITY_GRPC_H
20 #define GRPC_SRC_CORE_TSI_TRANSPORT_SECURITY_GRPC_H
21 
22 #include <grpc/support/port_platform.h>
23 
24 #include <grpc/slice_buffer.h>
25 
26 #include "src/core/tsi/transport_security.h"
27 
28 // This method creates a tsi_zero_copy_grpc_protector object. It return TSI_OK
29 // assuming there is no fatal error.
30 // The caller is responsible for destroying the protector.
31 tsi_result tsi_handshaker_result_create_zero_copy_grpc_protector(
32     const tsi_handshaker_result* self, size_t* max_output_protected_frame_size,
33     tsi_zero_copy_grpc_protector** protector);
34 
35 // -- tsi_zero_copy_grpc_protector object --
36 
37 // Outputs protected frames.
38 // - unprotected_slices is the unprotected data to be protected.
39 // - protected_slices is the protected output frames. One or more frames
40 //   may be produced in this protect function.
41 // - This method returns TSI_OK in case of success or a specific error code in
42 //   case of failure.
43 tsi_result tsi_zero_copy_grpc_protector_protect(
44     tsi_zero_copy_grpc_protector* self, grpc_slice_buffer* unprotected_slices,
45     grpc_slice_buffer* protected_slices);
46 
47 // Outputs unprotected bytes.
48 // - protected_slices is the bytes of protected frames.
49 // - unprotected_slices is the unprotected output data.
50 // - if min_progress_size is not null, it returns the size of the last
51 //   incomplete frame which could not be fully unprotected.
52 // - This method returns TSI_OK in case of success. Success includes cases where
53 //   there is not enough data to output in which case unprotected_slices has 0
54 //   bytes.
55 tsi_result tsi_zero_copy_grpc_protector_unprotect(
56     tsi_zero_copy_grpc_protector* self, grpc_slice_buffer* protected_slices,
57     grpc_slice_buffer* unprotected_slices, int* min_progress_size);
58 
59 // Destroys the tsi_zero_copy_grpc_protector object.
60 void tsi_zero_copy_grpc_protector_destroy(tsi_zero_copy_grpc_protector* self);
61 
62 // Returns value of max protected frame size. Useful for testing.
63 tsi_result tsi_zero_copy_grpc_protector_max_frame_size(
64     tsi_zero_copy_grpc_protector* self, size_t* max_frame_size);
65 
66 // Base for tsi_zero_copy_grpc_protector implementations.
67 struct tsi_zero_copy_grpc_protector_vtable {
68   tsi_result (*protect)(tsi_zero_copy_grpc_protector* self,
69                         grpc_slice_buffer* unprotected_slices,
70                         grpc_slice_buffer* protected_slices);
71   tsi_result (*unprotect)(tsi_zero_copy_grpc_protector* self,
72                           grpc_slice_buffer* protected_slices,
73                           grpc_slice_buffer* unprotected_slices,
74                           int* min_progress_size);
75   void (*destroy)(tsi_zero_copy_grpc_protector* self);
76   tsi_result (*max_frame_size)(tsi_zero_copy_grpc_protector* self,
77                                size_t* max_frame_size);
78 };
79 struct tsi_zero_copy_grpc_protector {
80   const tsi_zero_copy_grpc_protector_vtable* vtable;
81 };
82 
83 #endif  // GRPC_SRC_CORE_TSI_TRANSPORT_SECURITY_GRPC_H
84