+static int authz_tlsext_cb(SSL *s, unsigned short ext_type,
+ const unsigned char *in,
+ unsigned short inlen, int *al,
+ void *arg)
+ {
+ if (TLSEXT_TYPE_server_authz == ext_type)
+ server_provided_server_authz
+ = (memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL);
+
+ if (TLSEXT_TYPE_client_authz == ext_type)
+ server_provided_client_authz
+ = (memchr(in, TLSEXT_AUTHZDATAFORMAT_dtcp, inlen) != NULL);
+
+ return 1;
+ }
+
+static int authz_tlsext_generate_cb(SSL *s, unsigned short ext_type,
+ const unsigned char **out, unsigned short *outlen,
+ int *al, void *arg)
+ {
+ if (c_auth)
+ {
+ /*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 */
+ return -1;
+ }
+
+static int suppdata_cb(SSL *s, unsigned short supp_data_type,
+ const unsigned char *in,
+ unsigned short inlen, int *al,
+ void *arg)
+ {
+ if (supp_data_type == TLSEXT_SUPPLEMENTALDATATYPE_authz_data)
+ {
+ most_recent_supplemental_data = in;
+ most_recent_supplemental_data_length = inlen;
+ }
+ return 1;
+ }
+
+static int auth_suppdata_generate_cb(SSL *s, unsigned short supp_data_type,
+ const unsigned char **out,
+ unsigned short *outlen, int *al, void *arg)
+ {
+ if (c_auth && server_provided_client_authz && server_provided_server_authz)
+ {
+ /*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)))
+ {
+ generated_supp_data = OPENSSL_malloc(10);
+ memcpy(generated_supp_data, "5432154321", 10);
+ *out = generated_supp_data;
+ *outlen = 10;
+ return 1;
+ }
+ }
+ /* no supplemental data to send */
+ return -1;
+ }
+