static int verify_alpn(SSL *client, SSL *server)
{
    const unsigned char *client_proto, *server_proto;
    unsigned int client_proto_len = 0, server_proto_len = 0;
    SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);
    SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);
    OPENSSL_free(alpn_selected);
    alpn_selected = NULL;
    if (client_proto_len != server_proto_len) {
        BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
        goto err;
    }
    if (client_proto != NULL &&
        memcmp(client_proto, server_proto, client_proto_len) != 0) {
        BIO_printf(bio_stdout, "ALPN selected protocols differ!\n");
        goto err;
    }
    if (client_proto_len > 0 && alpn_expected == NULL) {
        BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\n");
        goto err;
    }
    if (alpn_expected != NULL &&
        (client_proto_len != strlen(alpn_expected) ||
         memcmp(client_proto, alpn_expected, client_proto_len) != 0)) {
        BIO_printf(bio_stdout,
                   "ALPN selected protocols not equal to expected protocol: %s\n",
                   alpn_expected);
        goto err;
    }
    return 0;
 err:
    BIO_printf(bio_stdout, "ALPN results: client: '");
    BIO_write(bio_stdout, client_proto, client_proto_len);
    BIO_printf(bio_stdout, "', server: '");
    BIO_write(bio_stdout, server_proto, server_proto_len);
    BIO_printf(bio_stdout, "'\n");
    BIO_printf(bio_stdout, "ALPN configured: client: '%s', server: '%s'\n",
               alpn_client, alpn_server);
    return -1;
}
['static int verify_alpn(SSL *client, SSL *server)\n{\n    const unsigned char *client_proto, *server_proto;\n    unsigned int client_proto_len = 0, server_proto_len = 0;\n    SSL_get0_alpn_selected(client, &client_proto, &client_proto_len);\n    SSL_get0_alpn_selected(server, &server_proto, &server_proto_len);\n    OPENSSL_free(alpn_selected);\n    alpn_selected = NULL;\n    if (client_proto_len != server_proto_len) {\n        BIO_printf(bio_stdout, "ALPN selected protocols differ!\\n");\n        goto err;\n    }\n    if (client_proto != NULL &&\n        memcmp(client_proto, server_proto, client_proto_len) != 0) {\n        BIO_printf(bio_stdout, "ALPN selected protocols differ!\\n");\n        goto err;\n    }\n    if (client_proto_len > 0 && alpn_expected == NULL) {\n        BIO_printf(bio_stdout, "ALPN unexpectedly negotiated\\n");\n        goto err;\n    }\n    if (alpn_expected != NULL &&\n        (client_proto_len != strlen(alpn_expected) ||\n         memcmp(client_proto, alpn_expected, client_proto_len) != 0)) {\n        BIO_printf(bio_stdout,\n                   "ALPN selected protocols not equal to expected protocol: %s\\n",\n                   alpn_expected);\n        goto err;\n    }\n    return 0;\n err:\n    BIO_printf(bio_stdout, "ALPN results: client: \'");\n    BIO_write(bio_stdout, client_proto, client_proto_len);\n    BIO_printf(bio_stdout, "\', server: \'");\n    BIO_write(bio_stdout, server_proto, server_proto_len);\n    BIO_printf(bio_stdout, "\'\\n");\n    BIO_printf(bio_stdout, "ALPN configured: client: \'%s\', server: \'%s\'\\n",\n               alpn_client, alpn_server);\n    return -1;\n}', 'void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data,\n                            unsigned *len)\n{\n    *data = NULL;\n    if (ssl->s3)\n        *data = ssl->s3->alpn_selected;\n    if (*data == NULL)\n        *len = 0;\n    else\n        *len = ssl->s3->alpn_selected_len;\n}', 'void CRYPTO_free(void *str)\n{\n    if (free_debug_func != NULL)\n        free_debug_func(str, 0);\n    free_func(str);\n    if (free_debug_func != NULL)\n        free_debug_func(NULL, 1);\n}']