Blame lib/x509_b64.c

Packit 549fdc
/*
Packit 549fdc
 * Copyright (C) 2000-2012 Free Software Foundation, Inc.
Packit 549fdc
 * Copyright (C) 2017 Red Hat, Inc.
Packit 549fdc
 *
Packit 549fdc
 * Author: Nikos Mavrogiannopoulos
Packit 549fdc
 *
Packit 549fdc
 * This file is part of GnuTLS.
Packit 549fdc
 *
Packit 549fdc
 * The GnuTLS is free software; you can redistribute it and/or
Packit 549fdc
 * modify it under the terms of the GNU Lesser General Public License
Packit 549fdc
 * as published by the Free Software Foundation; either version 2.1 of
Packit 549fdc
 * the License, or (at your option) any later version.
Packit 549fdc
 *
Packit 549fdc
 * This library is distributed in the hope that it will be useful, but
Packit 549fdc
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 549fdc
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 549fdc
 * Lesser General Public License for more details.
Packit 549fdc
 *
Packit 549fdc
 * You should have received a copy of the GNU Lesser General Public License
Packit 549fdc
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
Packit 549fdc
 *
Packit 549fdc
 */
Packit 549fdc
Packit 549fdc
/* Functions that relate to base64 encoding and decoding.
Packit 549fdc
 */
Packit 549fdc
Packit 549fdc
#include "gnutls_int.h"
Packit 549fdc
#include "errors.h"
Packit 549fdc
#include <datum.h>
Packit 549fdc
#include <x509_b64.h>
Packit 549fdc
#include <nettle/base64.h>
Packit 549fdc
Packit 549fdc
#define INCR(what, size, max_len) \
Packit 549fdc
	do { \
Packit 549fdc
	what+=size; \
Packit 549fdc
	if (what > max_len) { \
Packit 549fdc
		gnutls_assert(); \
Packit 549fdc
		gnutls_free( result->data); result->data = NULL; \
Packit 549fdc
		return GNUTLS_E_INTERNAL_ERROR; \
Packit 549fdc
	} \
Packit 549fdc
	} while(0)
Packit 549fdc
Packit 549fdc
/* encodes data and puts the result into result (locally allocated)
Packit 549fdc
 * The result_size (including the null terminator) is the return value.
Packit 549fdc
 */
Packit 549fdc
int
Packit 549fdc
_gnutls_fbase64_encode(const char *msg, const uint8_t * data,
Packit 549fdc
		       size_t data_size, gnutls_datum_t * result)
Packit 549fdc
{
Packit 549fdc
	int tmp;
Packit 549fdc
	unsigned int i;
Packit 549fdc
	uint8_t tmpres[66];
Packit 549fdc
	uint8_t *ptr;
Packit 549fdc
	char top[80];
Packit 549fdc
	char bottom[80];
Packit 549fdc
	size_t size, max, bytes;
Packit 549fdc
	int pos, top_len = 0, bottom_len = 0;
Packit 549fdc
	unsigned raw_encoding = 0;
Packit 549fdc
Packit 549fdc
	if (msg == NULL || msg[0] == 0)
Packit 549fdc
		raw_encoding = 1;
Packit 549fdc
Packit 549fdc
	if (!raw_encoding) {
Packit 549fdc
		if (strlen(msg) > 50) {
Packit 549fdc
			gnutls_assert();
Packit 549fdc
			return GNUTLS_E_BASE64_ENCODING_ERROR;
Packit 549fdc
		}
Packit 549fdc
Packit 549fdc
		_gnutls_str_cpy(top, sizeof(top), "-----BEGIN ");
Packit 549fdc
		_gnutls_str_cat(top, sizeof(top), msg);
Packit 549fdc
		_gnutls_str_cat(top, sizeof(top), "-----\n");
Packit 549fdc
Packit 549fdc
		_gnutls_str_cpy(bottom, sizeof(bottom), "-----END ");
Packit 549fdc
		_gnutls_str_cat(bottom, sizeof(bottom), msg);
Packit 549fdc
		_gnutls_str_cat(bottom, sizeof(bottom), "-----\n");
Packit 549fdc
Packit 549fdc
		top_len = strlen(top);
Packit 549fdc
		bottom_len = strlen(bottom);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	max = B64FSIZE(top_len + bottom_len, data_size);
Packit 549fdc
Packit 549fdc
	result->data = gnutls_malloc(max + 1);
Packit 549fdc
	if (result->data == NULL) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		return GNUTLS_E_MEMORY_ERROR;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	bytes = pos = 0;
Packit 549fdc
	INCR(bytes, top_len, max);
Packit 549fdc
	pos = top_len;
Packit 549fdc
Packit 549fdc
	memcpy(result->data, top, top_len);
Packit 549fdc
Packit 549fdc
	for (i = 0; i < data_size; i += 48) {
Packit 549fdc
		if (data_size - i < 48)
Packit 549fdc
			tmp = data_size - i;
Packit 549fdc
		else
Packit 549fdc
			tmp = 48;
Packit 549fdc
Packit 549fdc
		size = BASE64_ENCODE_RAW_LENGTH(tmp);
Packit 549fdc
		if (sizeof(tmpres) < size)
Packit 549fdc
			return gnutls_assert_val(GNUTLS_E_BASE64_ENCODING_ERROR);
Packit 549fdc
Packit 549fdc
		base64_encode_raw((void*)tmpres, tmp, &data[i]);
Packit 549fdc
Packit 549fdc
		INCR(bytes, size + 1, max);
Packit 549fdc
		ptr = &result->data[pos];
Packit 549fdc
Packit 549fdc
		memcpy(ptr, tmpres, size);
Packit 549fdc
		ptr += size;
Packit 549fdc
		pos += size;
Packit 549fdc
		if (!raw_encoding) {
Packit 549fdc
			*ptr++ = '\n';
Packit 549fdc
			pos++;
Packit 549fdc
		} else {
Packit 549fdc
			bytes--;
Packit 549fdc
		}
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	INCR(bytes, bottom_len, max);
Packit 549fdc
Packit 549fdc
	memcpy(&result->data[bytes - bottom_len], bottom, bottom_len);
Packit 549fdc
	result->data[bytes] = 0;
Packit 549fdc
	result->size = bytes;
Packit 549fdc
Packit 549fdc
	return max + 1;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/**
Packit 549fdc
 * gnutls_pem_base64_encode:
Packit 549fdc
 * @msg: is a message to be put in the header (may be %NULL)
Packit 549fdc
 * @data: contain the raw data
Packit 549fdc
 * @result: the place where base64 data will be copied
Packit 549fdc
 * @result_size: holds the size of the result
Packit 549fdc
 *
Packit 549fdc
 * This function will convert the given data to printable data, using
Packit 549fdc
 * the base64 encoding. This is the encoding used in PEM messages.
Packit 549fdc
 *
Packit 549fdc
 * The output string will be null terminated, although the output size will
Packit 549fdc
 * not include the terminating null.
Packit 549fdc
 *
Packit 549fdc
 * Returns: On success %GNUTLS_E_SUCCESS (0) is returned,
Packit 549fdc
 *   %GNUTLS_E_SHORT_MEMORY_BUFFER is returned if the buffer given is
Packit 549fdc
 *   not long enough, or 0 on success.
Packit 549fdc
 **/
Packit 549fdc
int
Packit 549fdc
gnutls_pem_base64_encode(const char *msg, const gnutls_datum_t * data,
Packit 549fdc
			 char *result, size_t * result_size)
Packit 549fdc
{
Packit 549fdc
	gnutls_datum_t res;
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	ret = _gnutls_fbase64_encode(msg, data->data, data->size, &res;;
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		return ret;
Packit 549fdc
Packit 549fdc
	if (result == NULL || *result_size < (unsigned) res.size) {
Packit 549fdc
		gnutls_free(res.data);
Packit 549fdc
		*result_size = res.size + 1;
Packit 549fdc
		return GNUTLS_E_SHORT_MEMORY_BUFFER;
Packit 549fdc
	} else {
Packit 549fdc
		memcpy(result, res.data, res.size);
Packit 549fdc
		gnutls_free(res.data);
Packit 549fdc
		*result_size = res.size;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/**
Packit 549fdc
 * gnutls_pem_base64_encode2:
Packit 549fdc
 * @header: is a message to be put in the encoded header (may be %NULL)
Packit 549fdc
 * @data: contains the raw data
Packit 549fdc
 * @result: will hold the newly allocated encoded data
Packit 549fdc
 *
Packit 549fdc
 * This function will convert the given data to printable data, using
Packit 549fdc
 * the base64 encoding.  This is the encoding used in PEM messages.
Packit 549fdc
 * This function will allocate the required memory to hold the encoded
Packit 549fdc
 * data.
Packit 549fdc
 *
Packit 549fdc
 * You should use gnutls_free() to free the returned data.
Packit 549fdc
 *
Packit 549fdc
 * Note, that prior to GnuTLS 3.4.0 this function was available
Packit 549fdc
 * under the name gnutls_pem_base64_encode_alloc(). There is
Packit 549fdc
 * compatibility macro pointing to this function.
Packit 549fdc
 *
Packit 549fdc
 * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
Packit 549fdc
 *   an error code is returned.
Packit 549fdc
 *
Packit 549fdc
 * Since: 3.4.0
Packit 549fdc
 **/
Packit 549fdc
int
Packit 549fdc
gnutls_pem_base64_encode2(const char *header,
Packit 549fdc
			       const gnutls_datum_t * data,
Packit 549fdc
			       gnutls_datum_t * result)
Packit 549fdc
{
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	if (result == NULL)
Packit 549fdc
		return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
Packit 549fdc
Packit 549fdc
	ret = _gnutls_fbase64_encode(header, data->data, data->size, result);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		return gnutls_assert_val(ret);
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/* copies data to result but removes newlines and <CR>
Packit 549fdc
 * returns the size of the data copied.
Packit 549fdc
 *
Packit 549fdc
 * It will fail with GNUTLS_E_BASE64_DECODING_ERROR if the
Packit 549fdc
 * end-result is the empty string.
Packit 549fdc
 */
Packit 549fdc
inline static int
Packit 549fdc
cpydata(const uint8_t * data, int data_size, gnutls_datum_t * result)
Packit 549fdc
{
Packit 549fdc
	int i, j;
Packit 549fdc
Packit 549fdc
	result->data = gnutls_malloc(data_size + 1);
Packit 549fdc
	if (result->data == NULL)
Packit 549fdc
		return GNUTLS_E_MEMORY_ERROR;
Packit 549fdc
Packit 549fdc
	for (j = i = 0; i < data_size; i++) {
Packit 549fdc
		if (data[i] == '\n' || data[i] == '\r' || data[i] == ' '
Packit 549fdc
		    || data[i] == '\t')
Packit 549fdc
			continue;
Packit 549fdc
		else if (data[i] == '-')
Packit 549fdc
			break;
Packit 549fdc
		result->data[j] = data[i];
Packit 549fdc
		j++;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	result->size = j;
Packit 549fdc
	result->data[j] = 0;
Packit 549fdc
Packit 549fdc
	if (j==0) {
Packit 549fdc
		gnutls_free(result->data);
Packit 549fdc
		return gnutls_assert_val(GNUTLS_E_BASE64_DECODING_ERROR);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return j;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/* decodes data and puts the result into result (locally allocated).
Packit 549fdc
 * Note that encodings of zero-length strings are being rejected
Packit 549fdc
 * with GNUTLS_E_BASE64_DECODING_ERROR.
Packit 549fdc
 *
Packit 549fdc
 * The result_size is the return value.
Packit 549fdc
 */
Packit 549fdc
int
Packit 549fdc
_gnutls_base64_decode(const uint8_t * data, size_t data_size,
Packit 549fdc
		      gnutls_datum_t * result)
Packit 549fdc
{
Packit 549fdc
	int ret;
Packit 549fdc
	size_t size;
Packit 549fdc
	gnutls_datum_t pdata;
Packit 549fdc
	struct base64_decode_ctx ctx;
Packit 549fdc
Packit 549fdc
	if (data_size == 0)
Packit 549fdc
		return gnutls_assert_val(GNUTLS_E_BASE64_DECODING_ERROR);
Packit 549fdc
Packit 549fdc
	ret = cpydata(data, data_size, &pdata);
Packit 549fdc
	if (ret < 0) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		return ret;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	base64_decode_init(&ctx;;
Packit 549fdc
Packit 549fdc
	size = BASE64_DECODE_LENGTH(pdata.size);
Packit 549fdc
	if (size == 0) {
Packit 549fdc
		ret = gnutls_assert_val(GNUTLS_E_BASE64_DECODING_ERROR);
Packit 549fdc
		goto cleanup;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	result->data = gnutls_malloc(size);
Packit 549fdc
	if (result->data == NULL) {
Packit 549fdc
		ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
Packit 549fdc
		goto cleanup;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	ret = base64_decode_update(&ctx, &size, result->data,
Packit 549fdc
				   pdata.size, (void*)pdata.data);
Packit 549fdc
	if (ret == 0 || size == 0) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		ret = GNUTLS_E_BASE64_DECODING_ERROR;
Packit 549fdc
		goto fail;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	ret = base64_decode_final(&ctx;;
Packit 549fdc
	if (ret != 1) {
Packit 549fdc
		ret = gnutls_assert_val(GNUTLS_E_BASE64_DECODING_ERROR);
Packit 549fdc
		goto fail;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	result->size = size;
Packit 549fdc
Packit 549fdc
	ret = size;
Packit 549fdc
	goto cleanup;
Packit 549fdc
Packit 549fdc
 fail:
Packit 549fdc
	gnutls_free(result->data);
Packit 549fdc
	result->data = NULL;
Packit 549fdc
Packit 549fdc
 cleanup:
Packit 549fdc
	gnutls_free(pdata.data);
Packit 549fdc
	return ret;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
Packit 549fdc
/* Searches the given string for ONE PEM encoded certificate, and
Packit 549fdc
 * stores it in the result.
Packit 549fdc
 *
Packit 549fdc
 * The result_size (always non-zero) is the return value,
Packit 549fdc
 * or a negative error code.
Packit 549fdc
 */
Packit 549fdc
#define ENDSTR "-----"
Packit 549fdc
int
Packit 549fdc
_gnutls_fbase64_decode(const char *header, const uint8_t * data,
Packit 549fdc
		       size_t data_size, gnutls_datum_t * result)
Packit 549fdc
{
Packit 549fdc
	int ret;
Packit 549fdc
	static const char top[] = "-----BEGIN ";
Packit 549fdc
	static const char bottom[] = "-----END ";
Packit 549fdc
	uint8_t *rdata, *kdata;
Packit 549fdc
	int rdata_size;
Packit 549fdc
	char pem_header[128];
Packit 549fdc
Packit 549fdc
	_gnutls_str_cpy(pem_header, sizeof(pem_header), top);
Packit 549fdc
	if (header != NULL)
Packit 549fdc
		_gnutls_str_cat(pem_header, sizeof(pem_header), header);
Packit 549fdc
Packit 549fdc
	rdata = memmem(data, data_size, pem_header, strlen(pem_header));
Packit 549fdc
	if (rdata == NULL) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		_gnutls_hard_log("Could not find '%s'\n", pem_header);
Packit 549fdc
		return GNUTLS_E_BASE64_UNEXPECTED_HEADER_ERROR;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	data_size -= MEMSUB(rdata, data);
Packit 549fdc
Packit 549fdc
	if (data_size < 4 + strlen(bottom)) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		return GNUTLS_E_BASE64_DECODING_ERROR;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	kdata =
Packit 549fdc
	    memmem(rdata + 1, data_size - 1, ENDSTR, sizeof(ENDSTR) - 1);
Packit 549fdc
	/* allow CR as well.
Packit 549fdc
	 */
Packit 549fdc
	if (kdata == NULL) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		_gnutls_hard_log("Could not find '%s'\n", ENDSTR);
Packit 549fdc
		return GNUTLS_E_BASE64_DECODING_ERROR;
Packit 549fdc
	}
Packit 549fdc
	data_size -= strlen(ENDSTR);
Packit 549fdc
	data_size -= MEMSUB(kdata, rdata);
Packit 549fdc
Packit 549fdc
	rdata = kdata + strlen(ENDSTR);
Packit 549fdc
Packit 549fdc
	/* position is now after the ---BEGIN--- headers */
Packit 549fdc
Packit 549fdc
	kdata = memmem(rdata, data_size, bottom, strlen(bottom));
Packit 549fdc
	if (kdata == NULL) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		return GNUTLS_E_BASE64_DECODING_ERROR;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	/* position of kdata is before the ----END--- footer 
Packit 549fdc
	 */
Packit 549fdc
	rdata_size = MEMSUB(kdata, rdata);
Packit 549fdc
Packit 549fdc
	if (rdata_size < 4) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		return GNUTLS_E_BASE64_DECODING_ERROR;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	if ((ret = _gnutls_base64_decode(rdata, rdata_size, result)) < 0) {
Packit 549fdc
		gnutls_assert();
Packit 549fdc
		return GNUTLS_E_BASE64_DECODING_ERROR;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return ret;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/**
Packit 549fdc
 * gnutls_pem_base64_decode:
Packit 549fdc
 * @header: A null terminated string with the PEM header (eg. CERTIFICATE)
Packit 549fdc
 * @b64_data: contain the encoded data
Packit 549fdc
 * @result: the place where decoded data will be copied
Packit 549fdc
 * @result_size: holds the size of the result
Packit 549fdc
 *
Packit 549fdc
 * This function will decode the given encoded data.  If the header
Packit 549fdc
 * given is non %NULL this function will search for "-----BEGIN header"
Packit 549fdc
 * and decode only this part.  Otherwise it will decode the first PEM
Packit 549fdc
 * packet found.
Packit 549fdc
 *
Packit 549fdc
 * Returns: On success %GNUTLS_E_SUCCESS (0) is returned,
Packit 549fdc
 *   %GNUTLS_E_SHORT_MEMORY_BUFFER is returned if the buffer given is
Packit 549fdc
 *   not long enough, or 0 on success.
Packit 549fdc
 **/
Packit 549fdc
int
Packit 549fdc
gnutls_pem_base64_decode(const char *header,
Packit 549fdc
			 const gnutls_datum_t * b64_data,
Packit 549fdc
			 unsigned char *result, size_t * result_size)
Packit 549fdc
{
Packit 549fdc
	gnutls_datum_t res;
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	ret =
Packit 549fdc
	    _gnutls_fbase64_decode(header, b64_data->data, b64_data->size,
Packit 549fdc
				   &res;;
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		return gnutls_assert_val(ret);
Packit 549fdc
Packit 549fdc
	if (result == NULL || *result_size < (unsigned) res.size) {
Packit 549fdc
		gnutls_free(res.data);
Packit 549fdc
		*result_size = res.size;
Packit 549fdc
		return GNUTLS_E_SHORT_MEMORY_BUFFER;
Packit 549fdc
	} else {
Packit 549fdc
		memcpy(result, res.data, res.size);
Packit 549fdc
		gnutls_free(res.data);
Packit 549fdc
		*result_size = res.size;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/**
Packit 549fdc
 * gnutls_pem_base64_decode2:
Packit 549fdc
 * @header: The PEM header (eg. CERTIFICATE)
Packit 549fdc
 * @b64_data: contains the encoded data
Packit 549fdc
 * @result: the location of decoded data
Packit 549fdc
 *
Packit 549fdc
 * This function will decode the given encoded data. The decoded data
Packit 549fdc
 * will be allocated, and stored into result.  If the header given is
Packit 549fdc
 * non null this function will search for "-----BEGIN header" and
Packit 549fdc
 * decode only this part. Otherwise it will decode the first PEM
Packit 549fdc
 * packet found.
Packit 549fdc
 *
Packit 549fdc
 * You should use gnutls_free() to free the returned data.
Packit 549fdc
 *
Packit 549fdc
 * Note, that prior to GnuTLS 3.4.0 this function was available
Packit 549fdc
 * under the name gnutls_pem_base64_decode_alloc(). There is
Packit 549fdc
 * compatibility macro pointing to this function.
Packit 549fdc
 *
Packit 549fdc
 * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
Packit 549fdc
 *   an error code is returned.
Packit 549fdc
 *
Packit 549fdc
 * Since: 3.4.0
Packit 549fdc
 **/
Packit 549fdc
int
Packit 549fdc
gnutls_pem_base64_decode2(const char *header,
Packit 549fdc
			       const gnutls_datum_t * b64_data,
Packit 549fdc
			       gnutls_datum_t * result)
Packit 549fdc
{
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	if (result == NULL)
Packit 549fdc
		return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
Packit 549fdc
Packit 549fdc
	ret =
Packit 549fdc
	    _gnutls_fbase64_decode(header, b64_data->data, b64_data->size,
Packit 549fdc
				   result);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		return gnutls_assert_val(ret);
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/**
Packit 549fdc
 * gnutls_base64_decode2:
Packit 549fdc
 * @base64: contains the encoded data
Packit 549fdc
 * @result: the location of decoded data
Packit 549fdc
 *
Packit 549fdc
 * This function will decode the given base64 encoded data. The decoded data
Packit 549fdc
 * will be allocated, and stored into result.
Packit 549fdc
 *
Packit 549fdc
 * You should use gnutls_free() to free the returned data.
Packit 549fdc
 *
Packit 549fdc
 * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
Packit 549fdc
 *   an error code is returned.
Packit 549fdc
 *
Packit 549fdc
 * Since: 3.6.0
Packit 549fdc
 **/
Packit 549fdc
int
Packit 549fdc
gnutls_base64_decode2(const gnutls_datum_t *base64,
Packit 549fdc
		      gnutls_datum_t *result)
Packit 549fdc
{
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	ret = _gnutls_base64_decode(base64->data, base64->size, result);
Packit 549fdc
	if (ret < 0) {
Packit 549fdc
		return gnutls_assert_val(ret);
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
/**
Packit 549fdc
 * gnutls_base64_encode2:
Packit 549fdc
 * @data: contains the raw data
Packit 549fdc
 * @result: will hold the newly allocated encoded data
Packit 549fdc
 *
Packit 549fdc
 * This function will convert the given data to printable data, using
Packit 549fdc
 * the base64 encoding. This function will allocate the required
Packit 549fdc
 * memory to hold the encoded data.
Packit 549fdc
 *
Packit 549fdc
 * You should use gnutls_free() to free the returned data.
Packit 549fdc
 *
Packit 549fdc
 * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
Packit 549fdc
 *   an error code is returned.
Packit 549fdc
 *
Packit 549fdc
 * Since: 3.6.0
Packit 549fdc
 **/
Packit 549fdc
int
Packit 549fdc
gnutls_base64_encode2(const gnutls_datum_t *data,
Packit 549fdc
		      gnutls_datum_t *result)
Packit 549fdc
{
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	if (result == NULL)
Packit 549fdc
		return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
Packit 549fdc
Packit 549fdc
	ret = _gnutls_fbase64_encode(NULL, data->data, data->size, result);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		return gnutls_assert_val(ret);
Packit 549fdc
Packit 549fdc
	return 0;
Packit 549fdc
}