How do I actually select the protocol for ALPN? I have this:
SSL_client_hello_cb_fn set_alpn_cb(SSL* ssl, int* alert, const unsigned char* arg)
{
constexpr int ext_type{ TLSEXT_TYPE_application_layer_protocol_negotiation };
int extensions[1]{ ext_type };
std::size_t extensions_len{ 1u };
int extensions_present{ SSL_client_hello_get1_extensions_present(ssl,
reinterpret_cast<int**>(extensions), &extensions_len) };
const unsigned char** alpn_str;
std::size_t alpn_str_len{};
// 1 means success
if (extensions_present == 1)
{
SSL_client_hello_get0_ext(ssl, ext_type, alpn_str, &alpn_str_len);
std::cout << "alpn_str: " << alpn_str << std::endl;
return reinterpret_cast<SSL_client_hello_cb_fn>(SSL_CLIENT_HELLO_SUCCESS);
}
else if (extensions_present == 0)
{
return reinterpret_cast<SSL_client_hello_cb_fn>(SSL_CLIENT_HELLO_ERROR);
}
return reinterpret_cast<SSL_client_hello_cb_fn>(SSL_CLIENT_HELLO_RETRY);
}
Would I be correct to assume that I have to set
arg to point to "h2" in wire-format? Hopefully someone good at parsing the ClientHello message and who also knows C++ would answer too. Thanks.
I'm thinking it may actually be easier for me to just use SSL_CTX_set_alpn_select_cb since it has those out and in parameters. I do also want to know what I should initialize the SSL* pointer to point to, though, in either case.
Osman
|