golang/go · error

tls: server offered only incompatible point formats

Error message

tls: server offered only incompatible point formats

What it means

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.

Source

Thrown at src/crypto/tls/handshake_client.go:903

		return false, err
	}

	if hs.serverHello.compressionMethod != compressionNone {
		c.sendAlert(alertIllegalParameter)
		return false, errors.New("tls: server selected unsupported compression format")
	}

	supportsPointFormat := false
	offeredNonCompressedFormat := false
	for _, format := range hs.serverHello.supportedPoints {
		if format == pointFormatUncompressed {
			supportsPointFormat = true
		} else {
			offeredNonCompressedFormat = true
		}
	}
	if !supportsPointFormat && offeredNonCompressedFormat {
		return false, errors.New("tls: server offered only incompatible point formats")
	}

	if c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported {
		c.secureRenegotiation = true
		if len(hs.serverHello.secureRenegotiation) != 0 {
			c.sendAlert(alertHandshakeFailure)
			return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
		}
	}

	if c.handshakes > 0 && c.secureRenegotiation {
		var expectedSecureRenegotiation [24]byte
		copy(expectedSecureRenegotiation[:], c.clientFinished[:])
		copy(expectedSecureRenegotiation[12:], c.serverFinished[:])
		if !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) {
			c.sendAlert(alertHandshakeFailure)
			return false, errors.New("tls: incorrect renegotiation extension contents")
		}

View on GitHub (pinned to b6b368adc5)

Solutions

  1. Update the server to advertise uncompressed points (or to RFC 8422 / TLS 1.3, which remove the extension).
  2. Move the connection to TLS 1.3 where ec_point_formats is not negotiated.
Defensive patterns

Strategy: try-catch

Type guard

func isIncompatiblePointFormats(err error) bool {
    return err != nil && strings.Contains(err.Error(), "server offered only incompatible point formats")
}

Try / catch

if _, err := tls.Dial("tcp", addr, cfg); err != nil {
    if isIncompatiblePointFormats(err) {
        // Retry over TLS 1.3 where the extension is absent.
        cfg.MinVersion = tls.VersionTLS13
        _, err = tls.Dial("tcp", addr, cfg)
    }
}

Prevention

When it happens

Trigger: 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.

Common situations: Niche or embedded TLS stacks; rare in mainstream deployments.

Understand the failure class

Related errors


AI-assisted analysis of golang/go@b6b368adc5 (2026-08-12). Data as JSON: /api/errors/469bcdf1c5e7d5d8. Report an issue: GitHub.