1 /* 2 * 3 * Copyright 2018 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_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_UTIL_H 20 #define GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_UTIL_H 21 22 #include <grpc/support/port_platform.h> 23 24 #include "pb_decode.h" 25 #include "pb_encode.h" 26 27 #include <grpc/slice.h> 28 #include <grpc/slice_buffer.h> 29 #include <grpc/support/alloc.h> 30 #include <grpc/support/log.h> 31 32 #include "src/core/tsi/alts/handshaker/handshaker.pb.h" 33 34 /** 35 * An implementation of utility functions used to serialize/ 36 * de-serialize ALTS handshake requests/responses. All APIs in the header 37 * are thread-compatible. 38 */ 39 40 /* Renaming of message/field structs generated by nanopb compiler. */ 41 typedef grpc_gcp_HandshakeProtocol grpc_gcp_handshake_protocol; 42 typedef grpc_gcp_NetworkProtocol grpc_gcp_network_protocol; 43 typedef grpc_gcp_Identity grpc_gcp_identity; 44 typedef grpc_gcp_NextHandshakeMessageReq grpc_gcp_next_handshake_message_req; 45 typedef grpc_gcp_ServerHandshakeParameters grpc_gcp_server_handshake_parameters; 46 typedef grpc_gcp_Endpoint grpc_gcp_endpoint; 47 typedef grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry 48 grpc_gcp_handshake_parameters_entry; 49 typedef grpc_gcp_StartClientHandshakeReq grpc_gcp_start_client_handshake_req; 50 typedef grpc_gcp_StartServerHandshakeReq grpc_gcp_start_server_handshake_req; 51 typedef grpc_gcp_HandshakerReq grpc_gcp_handshaker_req; 52 typedef grpc_gcp_HandshakerResult grpc_gcp_handshaker_result; 53 typedef grpc_gcp_HandshakerStatus grpc_gcp_handshaker_status; 54 typedef grpc_gcp_HandshakerResp grpc_gcp_handshaker_resp; 55 56 typedef enum { 57 CLIENT_START_REQ = 0, /* StartClientHandshakeReq. */ 58 SERVER_START_REQ = 1, /* StartServerHandshakeReq. */ 59 NEXT_REQ = 2, /* NextHandshakeMessageReq. */ 60 } grpc_gcp_handshaker_req_type; 61 62 /** 63 * A struct representing a repeated field. The struct is used to organize all 64 * instances of a specific repeated field into a linked list, which then will 65 * be used at encode/decode phase. For instance at the encode phase, the encode 66 * function will iterate through the list, encode each field, and then output 67 * the result to the stream. 68 */ 69 typedef struct repeated_field_ { 70 struct repeated_field_* next; 71 const void* data; 72 } repeated_field; 73 74 /** 75 * This method adds a repeated field to the head of repeated field list. 76 * 77 * - head: a head of repeated field list. 78 * - field: a repeated field to be added to the list. 79 */ 80 void add_repeated_field(repeated_field** head, const void* field); 81 82 /** 83 * This method destroys a repeated field list that consists of string type 84 * fields. 85 * 86 * - head: a head of repeated field list. 87 */ 88 void destroy_repeated_field_list_string(repeated_field* head); 89 90 /** 91 * This method destroys a repeated field list that consists of 92 * grpc_gcp_identity type fields. 93 * 94 * - head: a head of repeated field list. 95 */ 96 void destroy_repeated_field_list_identity(repeated_field* head); 97 98 /** 99 * This method creates a grpc_slice instance by copying a data buffer. It is 100 * similar to grpc_slice_from_copied_buffer() except that it returns an instance 101 * allocated from the heap. 102 * 103 * - data: a data buffer to be copied to grpc_slice instance. 104 * - size: size of data buffer. 105 */ 106 grpc_slice* create_slice(const char* data, size_t size); 107 108 /* This method destroys a grpc_slice instance. */ 109 void destroy_slice(grpc_slice* slice); 110 111 /** 112 * The following encode/decode functions will be assigned to encode/decode 113 * function pointers of pb_callback_t struct (defined in 114 * //third_party/nanopb/pb.h), that represent a repeated field with a dynamic 115 * length (e.g., a string type or repeated field). 116 */ 117 118 /* This method is an encode callback function for a string or byte array. */ 119 bool encode_string_or_bytes_cb(pb_ostream_t* stream, const pb_field_t* field, 120 void* const* arg); 121 122 /** 123 * This method is an encode callback function for a repeated grpc_gcp_identity 124 * field. 125 */ 126 bool encode_repeated_identity_cb(pb_ostream_t* stream, const pb_field_t* field, 127 void* const* arg); 128 129 /* This method is an encode callback function for a repeated string field. */ 130 bool encode_repeated_string_cb(pb_ostream_t* stream, const pb_field_t* field, 131 void* const* arg); 132 133 /** 134 * This method is a decode callback function for a string or byte array field. 135 */ 136 bool decode_string_or_bytes_cb(pb_istream_t* stream, const pb_field_t* field, 137 void** arg); 138 /** 139 * This method is a decode callback function for a repeated grpc_gcp_identity 140 * field. 141 */ 142 bool decode_repeated_identity_cb(pb_istream_t* stream, const pb_field_t* field, 143 void** arg); 144 145 /* This method is a decode callback function for a repeated string field. */ 146 bool decode_repeated_string_cb(pb_istream_t* stream, const pb_field_t* field, 147 void** arg); 148 149 #endif /* GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_UTIL_H */ 150