Commit 94479061 authored by Roberto Sassu's avatar Roberto Sassu Committed by Zheng Zengkai
Browse files

mpi: introduce mpi_key_length()



hulk inclusion
category: feature
feature: IMA Digest Lists extension
bugzilla: 46797

-------------------------------------------------

Introduce the new function to get the number of bits and bytes from an MPI.

Signed-off-by: default avatarRoberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: default avatarTianxing Zhang <zhangtianxing3@huawei.com>
Reviewed-by: default avatarJason Yan <yanaijie@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 9ce5f5ac
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -90,6 +90,8 @@ enum gcry_mpi_format {
};

MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes);
int mpi_key_length(const void *xbuffer, unsigned int ret_nread,
		   unsigned int *nbits_arg, unsigned int *nbytes_arg);
MPI mpi_read_from_buffer(const void *buffer, unsigned *ret_nread);
int mpi_fromstr(MPI val, const char *str);
MPI mpi_scanval(const char *string);
+26 −7
Original line number Diff line number Diff line
@@ -79,22 +79,41 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes)
}
EXPORT_SYMBOL_GPL(mpi_read_raw_data);

MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
int mpi_key_length(const void *xbuffer, unsigned int ret_nread,
		   unsigned int *nbits_arg, unsigned int *nbytes_arg)
{
	const uint8_t *buffer = xbuffer;
	unsigned int nbits, nbytes;
	MPI val;
	unsigned int nbits;

	if (*ret_nread < 2)
		return ERR_PTR(-EINVAL);
	if (ret_nread < 2)
		return -EINVAL;
	nbits = buffer[0] << 8 | buffer[1];

	if (nbits > MAX_EXTERN_MPI_BITS) {
		pr_info("MPI: mpi too large (%u bits)\n", nbits);
		return ERR_PTR(-EINVAL);
		return -EINVAL;
	}

	nbytes = DIV_ROUND_UP(nbits, 8);
	if (nbits_arg)
		*nbits_arg = nbits;
	if (nbytes_arg)
		*nbytes_arg = DIV_ROUND_UP(nbits, 8);

	return 0;
}
EXPORT_SYMBOL_GPL(mpi_key_length);

MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread)
{
	const uint8_t *buffer = xbuffer;
	unsigned int nbytes;
	MPI val;
	int ret;

	ret = mpi_key_length(xbuffer, *ret_nread, NULL, &nbytes);
	if (ret < 0)
		return ERR_PTR(ret);

	if (nbytes + 2 > *ret_nread) {
		pr_info("MPI: mpi larger than buffer nbytes=%u ret_nread=%u\n",
				nbytes, *ret_nread);