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; } }
/* 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; }