static const unsigned char auth_ext_data[]={TLSEXT_AUTHZDATAFORMAT_dtcp};
-static const unsigned char *most_recent_supplemental_data;
-static size_t most_recent_supplemental_data_length;
+static unsigned char *generated_supp_data = NULL;
+
+static unsigned char *most_recent_supplemental_data = NULL;
+static size_t most_recent_supplemental_data_length = 0;
static int client_provided_server_authz = 0;
static int client_provided_client_authz = 0;
EVP_PKEY *s_key = NULL, *s_dkey = NULL;
int no_cache = 0, ext_cache = 0;
int rev = 0, naccept = -1;
- int c_no_resumption_on_reneg = 0;
+ int c_no_resumption_on_reneg = 0;
#ifndef OPENSSL_NO_TLSEXT
EVP_PKEY *s_key2 = NULL;
X509 *s_cert2 = NULL;
}
#endif
- if (c_no_resumption_on_reneg)
- {
- SSL_CTX_set_options(ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
- }
+ if (c_no_resumption_on_reneg)
+ SSL_CTX_set_options(ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
if (!set_cert_key_stuff(ctx, s_cert, s_key, s_chain, build_chain))
goto end;
#ifndef OPENSSL_NO_TLSEXT
i=SSL_accept(con);
}
#endif
+ /*handshake is complete - free the generated supp data allocated in the callback */
+ if (generated_supp_data)
+ {
+ OPENSSL_free(generated_supp_data);
+ generated_supp_data = NULL;
+ }
+
if (i <= 0)
{
if (BIO_sock_should_retry(i))
void *arg)
{
if (TLSEXT_TYPE_server_authz == ext_type)
- {
- client_provided_server_authz = (memchr(in,
- TLSEXT_AUTHZDATAFORMAT_dtcp,
- inlen) != NULL);
- }
+ client_provided_server_authz
+ = memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL;
if (TLSEXT_TYPE_client_authz == ext_type)
- {
- client_provided_client_authz = (memchr(in,
- TLSEXT_AUTHZDATAFORMAT_dtcp,
- inlen) != NULL);
- }
+ client_provided_client_authz
+ = memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL;
return 1;
}
{
if (c_auth && client_provided_client_authz && client_provided_server_authz)
{
- if (!c_auth_require_reneg || (c_auth_require_reneg && SSL_num_renegotiations(s)))
+ /*if auth_require_reneg flag is set, only send extensions if
+ renegotiation has occurred */
+ if (!c_auth_require_reneg
+ || (c_auth_require_reneg && SSL_num_renegotiations(s)))
{
*out = auth_ext_data;
*outlen = 1;
return 1;
}
}
- //no auth extension to send
+ /* no auth extension to send */
return -1;
}
const unsigned char **out,
unsigned short *outlen, void *arg)
{
- unsigned char *result;
if (c_auth && client_provided_client_authz && client_provided_server_authz)
{
- if (!c_auth_require_reneg || (c_auth_require_reneg && SSL_num_renegotiations(s)))
+ /*if auth_require_reneg flag is set, only send supplemental data if
+ renegotiation has occurred */
+ if (!c_auth_require_reneg
+ || (c_auth_require_reneg && SSL_num_renegotiations(s)))
{
- result = OPENSSL_malloc(10);
- memcpy(result, "1234512345", 10);
- *out = result;
+ generated_supp_data = OPENSSL_malloc(10);
+ memcpy(generated_supp_data, "1234512345", 10);
+ *out = generated_supp_data;
*outlen = 10;
return 1;
}
}
- //no supplemental data to send
+ /* no supplemental data to send */
return -1;
}
#endif