{"record":{"id":"395bf27964853bc1","repo":"tailscale/tailscale","slug":"wrong-length-d-received-for-handshake-response","errorCode":null,"errorMessage":"wrong length %d received for handshake response","messagePattern":"wrong length (.+?) received for handshake response","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"control/controlbase/handshake.go","lineNumber":152,"sourceCode":"\t}\n\n\t// Read in the payload and look for errors/protocol violations from the server.\n\tvar resp responseMessage\n\tif _, err := io.ReadFull(conn, resp.Header()); err != nil {\n\t\treturn nil, fmt.Errorf(\"reading response header: %w\", err)\n\t}\n\tif resp.Type() != msgTypeResponse {\n\t\tif resp.Type() != msgTypeError {\n\t\t\treturn nil, fmt.Errorf(\"unexpected response message type %d\", resp.Type())\n\t\t}\n\t\tmsg := make([]byte, resp.Length())\n\t\tif _, err := io.ReadFull(conn, msg); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, fmt.Errorf(\"server error: %q\", msg)\n\t}\n\tif resp.Length() != len(resp.Payload()) {\n\t\treturn nil, fmt.Errorf(\"wrong length %d received for handshake response\", resp.Length())\n\t}\n\tif _, err := io.ReadFull(conn, resp.Payload()); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// <- e, ee, se\n\tcontrolEphemeralPub := key.MachinePublicFromRaw32(mem.B(resp.EphemeralPub()))\n\ts.MixHash(controlEphemeralPub.UntypedBytes())\n\tif _, err := s.MixDH(machineEphemeral, controlEphemeralPub); err != nil {\n\t\treturn nil, fmt.Errorf(\"computing ee: %w\", err)\n\t}\n\tcipher, err := s.MixDH(machineKey, controlEphemeralPub)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"computing se: %w\", err)\n\t}\n\tif err := s.DecryptAndHash(cipher, nil, resp.Tag()); err != nil {\n\t\treturn nil, fmt.Errorf(\"decrypting payload: %w\", err)\n\t}","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/control/controlbase/handshake.go#L134-L170","documentation":"Raised by continueClientHandshake when the length field in the server's handshake response does not match the fixed response payload size. The peer sent a malformed response, indicating a protocol mismatch or corruption.","triggerScenarios":"Thrown at control/controlbase/handshake.go:152 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reconnect and retry","Verify client and server protocol versions match"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}