提交 9f286132 编写于 作者: R Roberto Sassu 提交者: Zheng Zengkai

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: NRoberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: NTianxing Zhang <zhangtianxing3@huawei.com>
Reviewed-by: NJason Yan <yanaijie@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 dd2fe236
...@@ -90,6 +90,8 @@ enum gcry_mpi_format { ...@@ -90,6 +90,8 @@ enum gcry_mpi_format {
}; };
MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes); 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); MPI mpi_read_from_buffer(const void *buffer, unsigned *ret_nread);
int mpi_fromstr(MPI val, const char *str); int mpi_fromstr(MPI val, const char *str);
MPI mpi_scanval(const char *string); MPI mpi_scanval(const char *string);
......
...@@ -79,22 +79,41 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes) ...@@ -79,22 +79,41 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes)
} }
EXPORT_SYMBOL_GPL(mpi_read_raw_data); 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; const uint8_t *buffer = xbuffer;
unsigned int nbits, nbytes; unsigned int nbits;
MPI val;
if (*ret_nread < 2) if (ret_nread < 2)
return ERR_PTR(-EINVAL); return -EINVAL;
nbits = buffer[0] << 8 | buffer[1]; nbits = buffer[0] << 8 | buffer[1];
if (nbits > MAX_EXTERN_MPI_BITS) { if (nbits > MAX_EXTERN_MPI_BITS) {
pr_info("MPI: mpi too large (%u bits)\n", nbits); 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) { if (nbytes + 2 > *ret_nread) {
pr_info("MPI: mpi larger than buffer nbytes=%u ret_nread=%u\n", pr_info("MPI: mpi larger than buffer nbytes=%u ret_nread=%u\n",
nbytes, *ret_nread); nbytes, *ret_nread);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册