{"record":{"id":"469bcdf1c5e7d5d8","repo":"golang/go","slug":"tls-server-offered-only-incompatible-point-format","errorCode":null,"errorMessage":"tls: server offered only incompatible point formats","messagePattern":"tls: server offered only incompatible point formats","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/crypto/tls/handshake_client.go","lineNumber":903,"sourceCode":"\t\treturn false, err\n\t}\n\n\tif hs.serverHello.compressionMethod != compressionNone {\n\t\tc.sendAlert(alertIllegalParameter)\n\t\treturn false, errors.New(\"tls: server selected unsupported compression format\")\n\t}\n\n\tsupportsPointFormat := false\n\tofferedNonCompressedFormat := false\n\tfor _, format := range hs.serverHello.supportedPoints {\n\t\tif format == pointFormatUncompressed {\n\t\t\tsupportsPointFormat = true\n\t\t} else {\n\t\t\tofferedNonCompressedFormat = true\n\t\t}\n\t}\n\tif !supportsPointFormat && offeredNonCompressedFormat {\n\t\treturn false, errors.New(\"tls: server offered only incompatible point formats\")\n\t}\n\n\tif c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported {\n\t\tc.secureRenegotiation = true\n\t\tif len(hs.serverHello.secureRenegotiation) != 0 {\n\t\t\tc.sendAlert(alertHandshakeFailure)\n\t\t\treturn false, errors.New(\"tls: initial handshake had non-empty renegotiation extension\")\n\t\t}\n\t}\n\n\tif c.handshakes > 0 && c.secureRenegotiation {\n\t\tvar expectedSecureRenegotiation [24]byte\n\t\tcopy(expectedSecureRenegotiation[:], c.clientFinished[:])\n\t\tcopy(expectedSecureRenegotiation[12:], c.serverFinished[:])\n\t\tif !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) {\n\t\t\tc.sendAlert(alertHandshakeFailure)\n\t\t\treturn false, errors.New(\"tls: incorrect renegotiation extension contents\")\n\t\t}","sourceCodeStart":885,"sourceCodeEnd":921,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/crypto/tls/handshake_client.go#L885-L921","documentation":"In the ec_point_formats extension, Go only implements pointFormatUncompressed (0). After scanning hs.serverHello.supportedPoints it sets supportsPointFormat if uncompressed is present and offeredNonCompressedFormat if any other format appears. If the server's list is non-empty, contains only non-uncompressed formats, and lacks uncompressed, the ECDHE key exchange cannot proceed.","triggerScenarios":"TLS 1.2 ECDHE server advertising only ANSI X9.62 compressed points in ec_point_formats; server strictly requiring compressed point encoding. RFC 8422 / TLS 1.3 deprecate this extension so modern peers do not hit it.","commonSituations":"Niche or embedded TLS stacks; rare in mainstream deployments.","solutions":["Update the server to advertise uncompressed points (or to RFC 8422 / TLS 1.3, which remove the extension).","Move the connection to TLS 1.3 where ec_point_formats is not negotiated."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"func isIncompatiblePointFormats(err error) bool {\n    return err != nil && strings.Contains(err.Error(), \"server offered only incompatible point formats\")\n}","tryCatchPattern":"if _, err := tls.Dial(\"tcp\", addr, cfg); err != nil {\n    if isIncompatiblePointFormats(err) {\n        // Retry over TLS 1.3 where the extension is absent.\n        cfg.MinVersion = tls.VersionTLS13\n        _, err = tls.Dial(\"tcp\", addr, cfg)\n    }\n}","preventionTips":["Prefer TLS 1.3 to avoid the deprecated ec_point_formats extension.","Patch servers to advertise uncompressed points."],"tags":["tls","ecdhe","protocol","handshake"],"backgroundTag":null,"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}