/* returns data_size or a negative number on failure
 */
static int
_gnutls_signature_algorithm_send_params (gnutls_session_t session,
                                         gnutls_buffer_st* extdata)
{
  int ret;
  size_t init_length = extdata->length;
  gnutls_protocol_t ver = gnutls_protocol_get_version (session);

  /* this function sends the client extension data */
  if (session->security_parameters.entity == GNUTLS_CLIENT
      && _gnutls_version_has_selectable_sighash (ver))
    {
      if (session->internals.priorities.sign_algo.algorithms > 0)
        {
          uint8_t p[MAX_SIGN_ALGO_SIZE];

          ret =
            _gnutls_sign_algorithm_write_params (session, p, sizeof(p));
          if (ret < 0)
            return gnutls_assert_val(ret);

          ret = _gnutls_buffer_append_data(extdata, p, ret);
          if (ret < 0)
            return gnutls_assert_val(ret);
            
          return extdata->length - init_length;
        }
    }

  /* if we are here it means we don't send the extension */
  return 0;
}
/* returns data_size or a negative number on failure
 */
int
_gnutls_signature_algorithm_send_params (gnutls_session_t session,
					 opaque * data, size_t data_size)
{
  int ret;
  gnutls_protocol_t ver = gnutls_protocol_get_version (session);

  /* this function sends the client extension data */
  if (session->security_parameters.entity == GNUTLS_CLIENT
      && _gnutls_version_has_selectable_sighash (ver))
    {
      if (session->internals.priorities.sign_algo.algorithms > 0)
	{
	  ret =
	    _gnutls_sign_algorithm_write_params (session, data, data_size);
	  if (ret < 0)
	    {
	      gnutls_assert ();
	      return ret;
	    }
	  return ret;
	}
    }

  /* if we are here it means we don't send the extension */
  return 0;
}