# `SSL.Protocol.ClientOffer`
[🔗](https://github.com/gsmlg-dev/http_fetch/blob/v0.16.7/apps/ex_ssl/lib/ssl/protocol/client_offer.ex#L1)

Bounded extraction of negotiation inputs from one exact ClientHello message.

The original bytes remain authoritative for transcript hashing. Unknown
extensions are retained as opaque payloads and do not affect parsing.

# `key_share`

```elixir
@type key_share() :: %{group: 0..65535, key_exchange: binary()}
```

# `t`

```elixir
@type t() :: %SSL.Protocol.ClientOffer{
  alpn_protocols: [binary()],
  certificate_signature_schemes: [0..65535] | nil,
  cipher_suites: [0..65535],
  encoded: binary(),
  extension_ids: [0..65535],
  extensions: [{0..65535, binary()}],
  key_shares: [key_share()],
  legacy_session_id: binary(),
  offered_versions: [0..65535],
  psk_count: non_neg_integer(),
  psk_key_exchange_modes: [byte()],
  signature_schemes: [0..65535],
  supported_groups: [0..65535]
}
```

# `from_client_hello`

```elixir
@spec from_client_hello(term()) :: {:ok, t()} | {:error, term()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
