return ret;
}
+ if ((session->internals.resumed == RESUME_FALSE
+ && session->security_parameters.entity == GNUTLS_CLIENT)
+ || (session->internals.resumed == RESUME_TRUE
+ && session->security_parameters.entity == GNUTLS_SERVER))
+ {
+ /* if we are a client not resuming - or we are a server resuming */
+ _gnutls_handshake_log ("HSK[%p]: recording tls-unique CB (send)\n",
+ session);
+ memcpy (session->internals.cb_tls_unique, data, vdata_size);
+ session->internals.cb_tls_unique_len = vdata_size;
+ }
+
ret =
_gnutls_send_handshake (session, bufel, GNUTLS_HANDSHAKE_FINISHED);
}
return ret;
}
+ if ((session->internals.resumed == RESUME_TRUE
+ && session->security_parameters.entity == GNUTLS_CLIENT)
+ || (session->internals.resumed == RESUME_FALSE
+ && session->security_parameters.entity == GNUTLS_SERVER))
+ {
+ /* if we are a client resuming - or we are a server not resuming */
+ _gnutls_handshake_log ("HSK[%p]: recording tls-unique CB (recv)\n",
+ session);
+ memcpy (session->internals.cb_tls_unique, data, data_size);
+ session->internals.cb_tls_unique_len = data_size;
+ }
+
session->internals.initial_negotiation_completed = 1;
return ret;
int set:1;
} resumed_extension_int_data[MAX_EXT_TYPES];
+ unsigned int cb_tls_unique_len;
+ unsigned char cb_tls_unique[MAX_VERIFY_DATA_SIZE];
+
/* If you add anything here, check _gnutls_handshake_internal_state_clear().
*/
} internals_st;
* @cbtype: an #gnutls_channel_binding_t enumeration type
* @cb: output buffer array with data
*
- * Extract given channel binding data of the @cbtype type.
+ * Extract given channel binding data of the @cbtype (e.g.,
+ * %GNUTLS_CB_TLS_UNIQUE) type.
*
* Returns: %GNUTLS_E_SUCCESS on success,
* %GNUTLS_E_UNIMPLEMENTED_FEATURE if the @cbtype is unsupported,
gnutls_channel_binding_t cbtype,
gnutls_datum_t *cb)
{
- return GNUTLS_E_UNIMPLEMENTED_FEATURE;
+ if (cbtype != GNUTLS_CB_TLS_UNIQUE)
+ return GNUTLS_E_UNIMPLEMENTED_FEATURE;
+
+ if (!session->internals.initial_negotiation_completed)
+ return GNUTLS_E_CHANNEL_BINDING_NOT_AVAILABLE;
+
+ cb->size = session->internals.cb_tls_unique_len;
+ cb->data = gnutls_malloc (cb->size);
+ if (cb->data == NULL)
+ return GNUTLS_E_MEMORY_ERROR;
+
+ memcpy (cb->data, session->internals.cb_tls_unique, cb->size);
+
+ return 0;
}
printf ("- Session ID: %s\n", raw_to_string (id, id_size));
}
+ {
+ gnutls_datum cb;
+ int rc;
+
+ rc = gnutls_session_channel_binding (session, GNUTLS_CB_TLS_UNIQUE, &cb);
+ if (rc)
+ fprintf (stderr, "Channel binding error: %s\n", gnutls_strerror (rc));
+ else
+ {
+ size_t i;
+
+ printf ("- Channel binding 'tls-unique': ");
+ for (i = 0; i < cb.size; i++)
+ printf ("%02x", cb.data[i]);
+ printf ("\n");
+ }
+ }
fflush (stdout);