Ejemplo n.º 1
0
/* returns data_size or a negative number on failure
 */
static int
_gnutls_cert_type_send_params(gnutls_session_t session,
			      gnutls_buffer_st * extdata)
{
	unsigned len, i;
	int ret;
	uint8_t p;

	/* this function sends the client extension data (dnsname) */
	if (session->security_parameters.entity == GNUTLS_CLIENT) {

		if (session->internals.priorities.cert_type.algorithms > 0) {

			len =
			    session->internals.priorities.cert_type.
			    algorithms;

			if (len == 1 &&
			    session->internals.priorities.cert_type.
			    priority[0] == GNUTLS_CRT_X509) {
				/* We don't use this extension if X.509 certificates
				 * are used.
				 */
				return 0;
			}

			/* this is a vector!
			 */
			p = (uint8_t) len;
			ret = _gnutls_buffer_append_data(extdata, &p, 1);
			if (ret < 0)
				return gnutls_assert_val(ret);

			for (i = 0; i < len; i++) {
				p = _gnutls_cert_type2num(session->
							  internals.
							  priorities.cert_type.
							  priority[i]);
				ret =
				    _gnutls_buffer_append_data(extdata, &p,
							       1);
				if (ret < 0)
					return gnutls_assert_val(ret);
			}
			return len + 1;
		}

	} else {		/* server side */
		if (session->security_parameters.cert_type !=
		    DEFAULT_CERT_TYPE) {
			len = 1;

			p = _gnutls_cert_type2num(session->
						  security_parameters.
						  cert_type);
			ret = _gnutls_buffer_append_data(extdata, &p, 1);
			if (ret < 0)
				return gnutls_assert_val(ret);

			return len;
		}


	}

	return 0;
}
Ejemplo n.º 2
0
/* returns data_size or a negative number on failure
 */
int
_gnutls_cert_type_send_params (gnutls_session_t session, opaque * data,
			       size_t data_size)
{
  unsigned len, i;

  /* this function sends the client extension data (dnsname) */
  if (session->security_parameters.entity == GNUTLS_CLIENT)
    {

      if (session->internals.cert_type_priority.algorithms > 0)
	{

	  len = session->internals.cert_type_priority.algorithms;

	  if (len == 1 &&
	      session->internals.cert_type_priority.priority[0] ==
	      GNUTLS_CRT_X509)
	    {
	      /* We don't use this extension if X.509 certificates
	       * are used.
	       */
	      return 0;
	    }

	  if (data_size < len + 1)
	    {
	      gnutls_assert ();
	      return GNUTLS_E_SHORT_MEMORY_BUFFER;
	    }

	  /* this is a vector!
	   */
	  data[0] = (uint8_t) len;

	  for (i = 0; i < len; i++)
	    {
	      data[i + 1] = _gnutls_cert_type2num (session->internals.
						   cert_type_priority.
						   priority[i]);
	    }
	  return len + 1;
	}

    }
  else
    {				/* server side */
      if (session->security_parameters.cert_type != DEFAULT_CERT_TYPE)
	{
	  len = 1;
	  if (data_size < len)
	    {
	      gnutls_assert ();
	      return GNUTLS_E_SHORT_MEMORY_BUFFER;
	    }

	  data[0] =
	    _gnutls_cert_type2num (session->security_parameters.cert_type);
	  return len;
	}


    }

  return 0;
}