* is particularly useful for servers that respond to multiple names. */
#define SASL_GSS_LOCAL_NAME 20
+typedef struct sasl_channel_bindings {
+ char *type;
+ unsigned long len;
+ unsigned char *data;
+} sasl_channel_bindings;
+
+#define SASL_CHANNEL_BINDINGS 21
/* set property in SASL connection state
* returns:
/* for additions which don't require a version upgrade; set to 0 */
void *gss_creds;
- void *spare_ptr2;
- void *spare_ptr3;
+ void *chanbindingstype;
+ void *chanbindingsdata;
void *spare_ptr4;
/* Canonicalize a user name from on-wire to internal format
int (*spare_fptr1)();
- int spare_int1;
+ int chanbindingslen;
int spare_int2;
int spare_int3;
/* for additions which don't require a version upgrade; set to 0 */
void *gss_creds;
- void *spare_ptr2;
- void *spare_ptr3;
+ void *chanbindingstype;
+ void *chanbindingsdata;
void *spare_ptr4;
int (*spare_fptr1)();
int (*spare_fptr2)();
- int spare_int1;
+ int chanbindingslen;
int spare_int2;
int spare_int3;
else
((sasl_client_conn_t *)conn)->cparams->gss_creds = (void *)value;
break;
+ case SASL_CHANNEL_BINDINGS: {
+ struct sasl_channel_bindings *cb = (struct sasl_channel_bindings *)value;
+
+ if (conn->type == SASL_CONN_SERVER) {
+ ((sasl_server_conn_t *)conn)->sparams->chanbindingstype = cb->type;
+ ((sasl_server_conn_t *)conn)->sparams->chanbindingsdata = cb->data;
+ ((sasl_server_conn_t *)conn)->sparams->chanbindingslen = cb->len;
+ } else {
+ ((sasl_client_conn_t *)conn)->cparams->chanbindingstype = cb->type;
+ ((sasl_client_conn_t *)conn)->cparams->chanbindingsdata = cb->data;
+ ((sasl_client_conn_t *)conn)->cparams->chanbindingslen = cb->len;
+ }
+ break;
+ }
default:
sasl_seterror(conn, 0, "Unknown parameter type");
result = SASL_BADPARAM;