Beispiel #1
0
int
_gnutls_raw_cert_to_gcert (gnutls_cert * gcert,
			   gnutls_certificate_type_t type,
			   const gnutls_datum_t * raw_cert,
			   int flags /* OR of ConvFlags */ )
{
  switch (type)
    {
    case GNUTLS_CRT_X509:
      return _gnutls_x509_raw_cert_to_gcert (gcert, raw_cert, flags);
    case GNUTLS_CRT_OPENPGP:
      if (_E_gnutls_openpgp_raw_key_to_gcert == NULL)
	{
	  gnutls_assert ();
	  return GNUTLS_E_INIT_LIBEXTRA;
	}
      return _E_gnutls_openpgp_raw_key_to_gcert (gcert, raw_cert);
    default:
      gnutls_assert ();
      return GNUTLS_E_INTERNAL_ERROR;
    }
}
Beispiel #2
0
/* Reads a base64 encoded certificate list from memory and stores it to
 * a gnutls_cert structure. Returns the number of certificate parsed.
 */
static int
parse_pem_cert_mem (gnutls_cert ** cert_list, unsigned *ncerts,
		    const char *input_cert, int input_cert_size)
{
  int size, siz2, i;
  const char *ptr;
  opaque *ptr2;
  gnutls_datum_t tmp;
  int ret, count;

  /* move to the certificate
   */
  ptr = memmem (input_cert, input_cert_size,
		PEM_CERT_SEP, sizeof (PEM_CERT_SEP) - 1);
  if (ptr == NULL)
    ptr = memmem (input_cert, input_cert_size,
		  PEM_CERT_SEP2, sizeof (PEM_CERT_SEP2) - 1);

  if (ptr == NULL)
    {
      gnutls_assert ();
      return GNUTLS_E_BASE64_DECODING_ERROR;
    }
  size = input_cert_size - (ptr - input_cert);

  i = *ncerts + 1;
  count = 0;

  do
    {

      siz2 = _gnutls_fbase64_decode (NULL, ptr, size, &ptr2);

      if (siz2 < 0)
	{
	  gnutls_assert ();
	  return GNUTLS_E_BASE64_DECODING_ERROR;
	}

      *cert_list =
	(gnutls_cert *) gnutls_realloc_fast (*cert_list,
					     i * sizeof (gnutls_cert));

      if (*cert_list == NULL)
	{
	  gnutls_assert ();
	  return GNUTLS_E_MEMORY_ERROR;
	}

      tmp.data = ptr2;
      tmp.size = siz2;

      ret = _gnutls_x509_raw_cert_to_gcert (&cert_list[0][i - 1], &tmp, 0);
      if (ret < 0)
	{
	  gnutls_assert ();
	  return ret;
	}
      _gnutls_free_datum (&tmp);	/* free ptr2 */

      /* now we move ptr after the pem header 
       */
      ptr++;
      /* find the next certificate (if any)
       */
      size = input_cert_size - (ptr - input_cert);

      if (size > 0)
	{
	  char *ptr3;

	  ptr3 = memmem (ptr, size, PEM_CERT_SEP, sizeof (PEM_CERT_SEP) - 1);
	  if (ptr3 == NULL)
	    ptr3 = memmem (ptr, size, PEM_CERT_SEP2,
			   sizeof (PEM_CERT_SEP2) - 1);

	  ptr = ptr3;
	}
      else
	ptr = NULL;

      i++;
      count++;

    }
  while (ptr != NULL);

  *ncerts = i - 1;

  return count;
}