DoHandshake performs a fake ALTS handshake.
(stream altsgrpc.HandshakerService_DoHandshakeServer)
| 151 | |
| 152 | // DoHandshake performs a fake ALTS handshake. |
| 153 | func (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 { |
nothing calls this directly
no test coverage detected