Blame lib/mpi.c

Packit Service 4684c1
/*
Packit Service 4684c1
 * Copyright (C) 2001-2012 Free Software Foundation, Inc.
Packit Service 4684c1
 *
Packit Service 4684c1
 * Author: Nikos Mavrogiannopoulos
Packit Service 4684c1
 *
Packit Service 4684c1
 * This file is part of GnuTLS.
Packit Service 4684c1
 *
Packit Service 4684c1
 * The GnuTLS is free software; you can redistribute it and/or
Packit Service 4684c1
 * modify it under the terms of the GNU Lesser General Public License
Packit Service 4684c1
 * as published by the Free Software Foundation; either version 2.1 of
Packit Service 4684c1
 * the License, or (at your option) any later version.
Packit Service 4684c1
 *
Packit Service 4684c1
 * This library is distributed in the hope that it will be useful, but
Packit Service 4684c1
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 4684c1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 4684c1
 * Lesser General Public License for more details.
Packit Service 4684c1
 *
Packit Service 4684c1
 * You should have received a copy of the GNU Lesser General Public License
Packit Service 4684c1
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
Packit Service 4684c1
 *
Packit Service 4684c1
 */
Packit Service 4684c1
Packit Service 4684c1
/* Here lie everything that has to do with large numbers, libgcrypt and
Packit Service 4684c1
 * other stuff that didn't fit anywhere else.
Packit Service 4684c1
 */
Packit Service 4684c1
Packit Service 4684c1
#include "gnutls_int.h"
Packit Service 4684c1
#include <libtasn1.h>
Packit Service 4684c1
#include "errors.h"
Packit Service 4684c1
#include <num.h>
Packit Service 4684c1
#include <mpi.h>
Packit Service 4684c1
#include <random.h>
Packit Service 4684c1
#include <x509/x509_int.h>
Packit Service 4684c1
Packit Service 4684c1
/* Functions that refer to the mpi library.
Packit Service 4684c1
 */
Packit Service 4684c1
Packit Service 4684c1
/* Returns a random number r, 0 < r < p */
Packit Service 4684c1
bigint_t
Packit Service 4684c1
_gnutls_mpi_random_modp(bigint_t r, bigint_t p,
Packit Service 4684c1
		      gnutls_rnd_level_t level)
Packit Service 4684c1
{
Packit Service 4684c1
	size_t size;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	bigint_t tmp;
Packit Service 4684c1
	uint8_t tmpbuf[512];
Packit Service 4684c1
	uint8_t *buf;
Packit Service 4684c1
	int buf_release = 0;
Packit Service 4684c1
	
Packit Service 4684c1
	size = ((_gnutls_mpi_get_nbits(p)+64)/8) + 1;
Packit Service 4684c1
Packit Service 4684c1
	if (size < sizeof(tmpbuf)) {
Packit Service 4684c1
		buf = tmpbuf;
Packit Service 4684c1
	} else {
Packit Service 4684c1
		buf = gnutls_malloc(size);
Packit Service 4684c1
		if (buf == NULL) {
Packit Service 4684c1
			gnutls_assert();
Packit Service 4684c1
			goto cleanup;
Packit Service 4684c1
		}
Packit Service 4684c1
		buf_release = 1;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_rnd(level, buf, size);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		goto cleanup;
Packit Service 4684c1
	}
Packit Service 4684c1
	
Packit Service 4684c1
	ret = _gnutls_mpi_init_scan(&tmp, buf, size);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		goto cleanup;
Packit Service 4684c1
	}
Packit Service 4684c1
	
Packit Service 4684c1
	ret = _gnutls_mpi_modm(tmp, tmp, p);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		goto cleanup;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (_gnutls_mpi_cmp_ui(tmp, 0) == 0) {
Packit Service 4684c1
		ret = _gnutls_mpi_add_ui(tmp, tmp, 1);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			gnutls_assert();
Packit Service 4684c1
			goto cleanup;
Packit Service 4684c1
		}
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (buf_release != 0) {
Packit Service 4684c1
		gnutls_free(buf);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (r != NULL) {
Packit Service 4684c1
		ret = _gnutls_mpi_set(r, tmp);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			goto cleanup;
Packit Service 4684c1
Packit Service 4684c1
		_gnutls_mpi_release(&tmp);
Packit Service 4684c1
		return r;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return tmp;
Packit Service 4684c1
Packit Service 4684c1
      cleanup:
Packit Service 4684c1
	if (buf_release != 0)
Packit Service 4684c1
		gnutls_free(buf);
Packit Service 4684c1
	return NULL;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* returns %GNUTLS_E_SUCCESS (0) on success
Packit Service 4684c1
 */
Packit Service 4684c1
int _gnutls_mpi_init_scan(bigint_t * ret_mpi, const void *buffer, size_t nbytes)
Packit Service 4684c1
{
Packit Service 4684c1
bigint_t r;
Packit Service 4684c1
int ret;
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_init(&r);
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		return gnutls_assert_val(ret);
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    _gnutls_mpi_scan(r, buffer, nbytes);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		_gnutls_mpi_release(&r);
Packit Service 4684c1
		return ret;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	*ret_mpi = r;
Packit Service 4684c1
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* returns %GNUTLS_E_SUCCESS (0) on success. Fails if the number is zero.
Packit Service 4684c1
 */
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_mpi_init_scan_nz(bigint_t * ret_mpi, const void *buffer, size_t nbytes)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_init_scan(ret_mpi, buffer, nbytes);
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		return ret;
Packit Service 4684c1
Packit Service 4684c1
	/* MPIs with 0 bits are illegal
Packit Service 4684c1
	 */
Packit Service 4684c1
	if (_gnutls_mpi_cmp_ui(*ret_mpi, 0) == 0) {
Packit Service 4684c1
		_gnutls_mpi_release(ret_mpi);
Packit Service 4684c1
		return GNUTLS_E_MPI_SCAN_FAILED;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_mpi_init_scan_le(bigint_t * ret_mpi, const void *buffer, size_t nbytes)
Packit Service 4684c1
{
Packit Service 4684c1
	bigint_t r;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_init(&r);
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		return gnutls_assert_val(ret);
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_scan_le(r, buffer, nbytes);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		_gnutls_mpi_release(&r);
Packit Service 4684c1
		return ret;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	*ret_mpi = r;
Packit Service 4684c1
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int _gnutls_mpi_dprint_le(const bigint_t a, gnutls_datum_t * dest)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	uint8_t *buf = NULL;
Packit Service 4684c1
	size_t bytes = 0;
Packit Service 4684c1
Packit Service 4684c1
	if (dest == NULL || a == NULL)
Packit Service 4684c1
		return GNUTLS_E_INVALID_REQUEST;
Packit Service 4684c1
Packit Service 4684c1
	_gnutls_mpi_print_le(a, NULL, &bytes);
Packit Service 4684c1
	if (bytes != 0)
Packit Service 4684c1
		buf = gnutls_malloc(bytes);
Packit Service 4684c1
	if (buf == NULL)
Packit Service 4684c1
		return GNUTLS_E_MEMORY_ERROR;
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_print_le(a, buf, &bytes);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_free(buf);
Packit Service 4684c1
		return ret;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	dest->data = buf;
Packit Service 4684c1
	dest->size = bytes;
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* Always has the first bit zero */
Packit Service 4684c1
int _gnutls_mpi_dprint_lz(const bigint_t a, gnutls_datum_t * dest)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	uint8_t *buf = NULL;
Packit Service 4684c1
	size_t bytes = 0;
Packit Service 4684c1
Packit Service 4684c1
	if (dest == NULL || a == NULL)
Packit Service 4684c1
		return GNUTLS_E_INVALID_REQUEST;
Packit Service 4684c1
Packit Service 4684c1
	_gnutls_mpi_print_lz(a, NULL, &bytes);
Packit Service 4684c1
Packit Service 4684c1
	if (bytes != 0)
Packit Service 4684c1
		buf = gnutls_malloc(bytes);
Packit Service 4684c1
	if (buf == NULL)
Packit Service 4684c1
		return GNUTLS_E_MEMORY_ERROR;
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_print_lz(a, buf, &bytes);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_free(buf);
Packit Service 4684c1
		return ret;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	dest->data = buf;
Packit Service 4684c1
	dest->size = bytes;
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int _gnutls_mpi_dprint(const bigint_t a, gnutls_datum_t * dest)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	uint8_t *buf = NULL;
Packit Service 4684c1
	size_t bytes = 0;
Packit Service 4684c1
Packit Service 4684c1
	if (dest == NULL || a == NULL)
Packit Service 4684c1
		return GNUTLS_E_INVALID_REQUEST;
Packit Service 4684c1
Packit Service 4684c1
	_gnutls_mpi_print(a, NULL, &bytes);
Packit Service 4684c1
	if (bytes != 0)
Packit Service 4684c1
		buf = gnutls_malloc(bytes);
Packit Service 4684c1
	if (buf == NULL)
Packit Service 4684c1
		return GNUTLS_E_MEMORY_ERROR;
Packit Service 4684c1
Packit Service 4684c1
	ret = _gnutls_mpi_print(a, buf, &bytes);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_free(buf);
Packit Service 4684c1
		return ret;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	dest->data = buf;
Packit Service 4684c1
	dest->size = bytes;
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* This function will copy the mpi data into a datum,
Packit Service 4684c1
 * but will set minimum size to 'size'. That means that
Packit Service 4684c1
 * the output value is left padded with zeros.
Packit Service 4684c1
 */
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_mpi_dprint_size(const bigint_t a, gnutls_datum_t * dest,
Packit Service 4684c1
			size_t size)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	uint8_t *buf = NULL;
Packit Service 4684c1
	size_t bytes = 0;
Packit Service 4684c1
	unsigned int i;
Packit Service 4684c1
Packit Service 4684c1
	if (dest == NULL || a == NULL)
Packit Service 4684c1
		return GNUTLS_E_INVALID_REQUEST;
Packit Service 4684c1
Packit Service 4684c1
	_gnutls_mpi_print(a, NULL, &bytes);
Packit Service 4684c1
	if (bytes != 0)
Packit Service 4684c1
		buf = gnutls_malloc(MAX(size, bytes));
Packit Service 4684c1
	if (buf == NULL)
Packit Service 4684c1
		return GNUTLS_E_MEMORY_ERROR;
Packit Service 4684c1
Packit Service 4684c1
	if (bytes <= size) {
Packit Service 4684c1
		size_t diff = size - bytes;
Packit Service 4684c1
		for (i = 0; i < diff; i++)
Packit Service 4684c1
			buf[i] = 0;
Packit Service 4684c1
		ret = _gnutls_mpi_print(a, &buf[diff], &bytes);
Packit Service 4684c1
	} else {
Packit Service 4684c1
		ret = _gnutls_mpi_print(a, buf, &bytes);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		gnutls_free(buf);
Packit Service 4684c1
		return ret;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	dest->data = buf;
Packit Service 4684c1
	dest->size = MAX(size, bytes);
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* like _gnutls_mpi_dprint_size, but prints into preallocated byte buffer */
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_mpi_bprint_size(const bigint_t a, uint8_t *buf, size_t size)
Packit Service 4684c1
{
Packit Service 4684c1
	int result;
Packit Service 4684c1
	size_t bytes = 0;
Packit Service 4684c1
Packit Service 4684c1
	result = _gnutls_mpi_print(a, NULL, &bytes);
Packit Service 4684c1
	if (result != GNUTLS_E_SHORT_MEMORY_BUFFER)
Packit Service 4684c1
		return gnutls_assert_val(result);
Packit Service 4684c1
Packit Service 4684c1
	if (bytes <= size) {
Packit Service 4684c1
		unsigned i;
Packit Service 4684c1
		size_t diff = size - bytes;
Packit Service 4684c1
Packit Service 4684c1
		for (i = 0; i < diff; i++)
Packit Service 4684c1
			buf[i] = 0;
Packit Service 4684c1
		result = _gnutls_mpi_print(a, &buf[diff], &bytes);
Packit Service 4684c1
	} else {
Packit Service 4684c1
		result = _gnutls_mpi_print(a, buf, &bytes);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return result;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* Flags for __gnutls_x509_read_int() and __gnutls_x509_write_int */
Packit Service 4684c1
#define GNUTLS_X509_INT_OVERWRITE	(1 << 0)
Packit Service 4684c1
#define GNUTLS_X509_INT_LE		(1 << 1)
Packit Service 4684c1
#define GNUTLS_X509_INT_LZ		(1 << 2) /* write only */
Packit Service 4684c1
Packit Service 4684c1
/* this function reads an integer
Packit Service 4684c1
 * from asn1 structs. Combines the read and mpi_scan
Packit Service 4684c1
 * steps.
Packit Service 4684c1
 */
Packit Service 4684c1
static int
Packit Service 4684c1
__gnutls_x509_read_int(ASN1_TYPE node, const char *value,
Packit Service 4684c1
		       bigint_t * ret_mpi, unsigned int flags)
Packit Service 4684c1
{
Packit Service 4684c1
	int result;
Packit Service 4684c1
	uint8_t *tmpstr = NULL;
Packit Service 4684c1
	int tmpstr_size;
Packit Service 4684c1
Packit Service 4684c1
	tmpstr_size = 0;
Packit Service 4684c1
	result = asn1_read_value(node, value, NULL, &tmpstr_size);
Packit Service 4684c1
	if (result != ASN1_MEM_ERROR) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		return _gnutls_asn2err(result);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	tmpstr = gnutls_malloc(tmpstr_size);
Packit Service 4684c1
	if (tmpstr == NULL) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		return GNUTLS_E_MEMORY_ERROR;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	result = asn1_read_value(node, value, tmpstr, &tmpstr_size);
Packit Service 4684c1
	if (result != ASN1_SUCCESS) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		gnutls_free(tmpstr);
Packit Service 4684c1
		return _gnutls_asn2err(result);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_X509_INT_LE)
Packit Service 4684c1
		result = _gnutls_mpi_init_scan_le(ret_mpi, tmpstr,
Packit Service 4684c1
						  tmpstr_size);
Packit Service 4684c1
	else
Packit Service 4684c1
		result = _gnutls_mpi_init_scan(ret_mpi, tmpstr,
Packit Service 4684c1
					       tmpstr_size);
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_X509_INT_OVERWRITE)
Packit Service 4684c1
		zeroize_key(tmpstr, tmpstr_size);
Packit Service 4684c1
	gnutls_free(tmpstr);
Packit Service 4684c1
Packit Service 4684c1
	if (result < 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		return result;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_x509_read_int(ASN1_TYPE node, const char *value,
Packit Service 4684c1
		      bigint_t * ret_mpi)
Packit Service 4684c1
{
Packit Service 4684c1
	return __gnutls_x509_read_int(node, value, ret_mpi,
Packit Service 4684c1
				      0);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_x509_read_key_int(ASN1_TYPE node, const char *value,
Packit Service 4684c1
		      bigint_t * ret_mpi)
Packit Service 4684c1
{
Packit Service 4684c1
	return __gnutls_x509_read_int(node, value, ret_mpi,
Packit Service 4684c1
				      GNUTLS_X509_INT_OVERWRITE);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_x509_read_key_int_le(ASN1_TYPE node, const char *value,
Packit Service 4684c1
			     bigint_t * ret_mpi)
Packit Service 4684c1
{
Packit Service 4684c1
	return __gnutls_x509_read_int(node, value, ret_mpi,
Packit Service 4684c1
				      GNUTLS_X509_INT_OVERWRITE |
Packit Service 4684c1
				      GNUTLS_X509_INT_LE);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* Writes the specified integer into the specified node.
Packit Service 4684c1
 */
Packit Service 4684c1
static int
Packit Service 4684c1
__gnutls_x509_write_int(ASN1_TYPE node, const char *value, bigint_t mpi,
Packit Service 4684c1
			unsigned int flags)
Packit Service 4684c1
{
Packit Service 4684c1
	uint8_t *tmpstr;
Packit Service 4684c1
	size_t s_len;
Packit Service 4684c1
	int result;
Packit Service 4684c1
Packit Service 4684c1
	s_len = 0;
Packit Service 4684c1
	if (flags & GNUTLS_X509_INT_LZ)
Packit Service 4684c1
		result = _gnutls_mpi_print_lz(mpi, NULL, &s_len);
Packit Service 4684c1
	else if (GNUTLS_X509_INT_LE)
Packit Service 4684c1
		result = _gnutls_mpi_print_le(mpi, NULL, &s_len);
Packit Service 4684c1
	else
Packit Service 4684c1
		result = _gnutls_mpi_print(mpi, NULL, &s_len);
Packit Service 4684c1
Packit Service 4684c1
	if (result != GNUTLS_E_SHORT_MEMORY_BUFFER) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		return result;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	tmpstr = gnutls_malloc(s_len);
Packit Service 4684c1
	if (tmpstr == NULL) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		return GNUTLS_E_MEMORY_ERROR;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_X509_INT_LZ)
Packit Service 4684c1
		result = _gnutls_mpi_print_lz(mpi, tmpstr, &s_len);
Packit Service 4684c1
	else if (GNUTLS_X509_INT_LE)
Packit Service 4684c1
		result = _gnutls_mpi_print_le(mpi, tmpstr, &s_len);
Packit Service 4684c1
	else
Packit Service 4684c1
		result = _gnutls_mpi_print(mpi, tmpstr, &s_len);
Packit Service 4684c1
Packit Service 4684c1
	if (result != 0) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		gnutls_free(tmpstr);
Packit Service 4684c1
		return GNUTLS_E_MPI_PRINT_FAILED;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	result = asn1_write_value(node, value, tmpstr, s_len);
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_X509_INT_OVERWRITE)
Packit Service 4684c1
		zeroize_key(tmpstr, s_len);
Packit Service 4684c1
Packit Service 4684c1
	gnutls_free(tmpstr);
Packit Service 4684c1
Packit Service 4684c1
	if (result != ASN1_SUCCESS) {
Packit Service 4684c1
		gnutls_assert();
Packit Service 4684c1
		return _gnutls_asn2err(result);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return 0;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_x509_write_int(ASN1_TYPE node, const char *value, bigint_t mpi,
Packit Service 4684c1
		       int lz)
Packit Service 4684c1
{
Packit Service 4684c1
	return __gnutls_x509_write_int(node, value, mpi,
Packit Service 4684c1
				       lz ? GNUTLS_X509_INT_LZ : 0);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_x509_write_key_int(ASN1_TYPE node, const char *value, bigint_t mpi,
Packit Service 4684c1
		       int lz)
Packit Service 4684c1
{
Packit Service 4684c1
	return __gnutls_x509_write_int(node, value, mpi,
Packit Service 4684c1
				       (lz ? GNUTLS_X509_INT_LZ : 0) |
Packit Service 4684c1
				       GNUTLS_X509_INT_OVERWRITE);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int
Packit Service 4684c1
_gnutls_x509_write_key_int_le(ASN1_TYPE node, const char *value, bigint_t mpi)
Packit Service 4684c1
{
Packit Service 4684c1
	return __gnutls_x509_write_int(node, value, mpi,
Packit Service 4684c1
				       GNUTLS_X509_INT_OVERWRITE |
Packit Service 4684c1
				       GNUTLS_X509_INT_LE);
Packit Service 4684c1
}