MCPcopy
hub / github.com/grpc/grpc-go / DoHandshake

Method DoHandshake

credentials/alts/internal/testutil/testutil.go:153–214  ·  view source on GitHub ↗

DoHandshake performs a fake ALTS handshake.

(stream altsgrpc.HandshakerService_DoHandshakeServer)

Source from the content-addressed store, hash-verified

151
152// DoHandshake performs a fake ALTS handshake.
153func (h *FakeHandshaker) DoHandshake(stream altsgrpc.HandshakerService_DoHandshakeServer) error {
154 var isAssistingClient bool
155 var handshakeFramesReceivedSoFar []byte
156 for {
157 req, err := stream.Recv()
158 if err != nil {
159 if err == io.EOF {
160 return nil
161 }
162 return fmt.Errorf("stream recv failure: %v", err)
163 }
164 var resp *altspb.HandshakerResp
165 switch req := req.ReqOneof.(type) {
166 case *altspb.HandshakerReq_ClientStart:
167 isAssistingClient = true
168 resp, err = h.processStartClient(req.ClientStart)
169 if err != nil {
170 return fmt.Errorf("processStartClient failure: %v", err)
171 }
172 case *altspb.HandshakerReq_ServerStart:
173 // If we have received the full ClientInit, send the ServerInit and
174 // ServerFinished. Otherwise, wait for more bytes to arrive from the client.
175 isAssistingClient = false
176 handshakeFramesReceivedSoFar = append(handshakeFramesReceivedSoFar, req.ServerStart.InBytes...)
177 sendHandshakeFrame := bytes.Equal(handshakeFramesReceivedSoFar, []byte("ClientInit"))
178 resp, err = h.processServerStart(req.ServerStart, sendHandshakeFrame)
179 if err != nil {
180 return fmt.Errorf("processServerStart failure: %v", err)
181 }
182 case *altspb.HandshakerReq_Next:
183 // If we have received all handshake frames, send the handshake result.
184 // Otherwise, wait for more bytes to arrive from the peer.
185 oldHandshakesBytes := len(handshakeFramesReceivedSoFar)
186 handshakeFramesReceivedSoFar = append(handshakeFramesReceivedSoFar, req.Next.InBytes...)
187 isHandshakeComplete := false
188 if isAssistingClient {
189 isHandshakeComplete = bytes.HasPrefix(handshakeFramesReceivedSoFar, []byte("ServerInitServerFinished"))
190 } else {
191 isHandshakeComplete = bytes.HasPrefix(handshakeFramesReceivedSoFar, []byte("ClientInitClientFinished"))
192 }
193 if !isHandshakeComplete {
194 resp = &altspb.HandshakerResp{
195 BytesConsumed: uint32(len(handshakeFramesReceivedSoFar) - oldHandshakesBytes),
196 Status: &altspb.HandshakerStatus{
197 Code: uint32(codes.OK),
198 },
199 }
200 break
201 }
202 resp, err = h.getHandshakeResult(isAssistingClient)
203 if err != nil {
204 return fmt.Errorf("getHandshakeResult failure: %v", err)
205 }
206 default:
207 return fmt.Errorf("handshake request has unexpected type: %v", req)
208 }
209
210 if err = stream.Send(resp); err != nil {

Callers

nothing calls this directly

Calls 7

processStartClientMethod · 0.95
processServerStartMethod · 0.95
getHandshakeResultMethod · 0.95
RecvMethod · 0.65
ErrorfMethod · 0.65
EqualMethod · 0.65
SendMethod · 0.65

Tested by

no test coverage detected