lib/crypto/mpi/mpicoder.c
Source file repositories/reference/linux-study-clean/lib/crypto/mpi/mpicoder.c
File Facts
- System
- Linux kernel
- Corpus path
lib/crypto/mpi/mpicoder.c- Extension
.c- Size
- 9315 bytes
- Lines
- 418
- Domain
- Kernel Services
- Bucket
- lib
- Inferred role
- Kernel Services: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bitops.hlinux/byteorder/generic.hlinux/count_zeros.hlinux/export.hlinux/scatterlist.hlinux/string.hmpi-internal.h
Detected Declarations
function mpi_read_raw_datafunction mpi_read_from_bufferfunction count_lzerosfunction mpi_read_bufferfunction mpi_get_bufferfunction mpi_write_to_sglfunction mpi_read_raw_from_sglexport mpi_read_raw_dataexport mpi_read_from_bufferexport mpi_read_bufferexport mpi_get_bufferexport mpi_write_to_sglexport mpi_read_raw_from_sgl
Annotated Snippet
if (alimb == 0) {
lzeros += sizeof(mpi_limb_t);
} else {
lzeros += count_leading_zeros(alimb) / 8;
break;
}
}
return lzeros;
}
/**
* mpi_read_buffer() - read MPI to a buffer provided by user (msb first)
*
* @a: a multi precision integer
* @buf: buffer to which the output will be written to. Needs to be at
* least mpi_get_size(a) long.
* @buf_len: size of the buf.
* @nbytes: receives the actual length of the data written on success and
* the data to-be-written on -EOVERFLOW in case buf_len was too
* small.
* @sign: if not NULL, it will be set to the sign of a.
*
* Return: 0 on success or error code in case of error
*/
int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
int *sign)
{
uint8_t *p;
#if BYTES_PER_MPI_LIMB == 4
__be32 alimb;
#elif BYTES_PER_MPI_LIMB == 8
__be64 alimb;
#else
#error please implement for this limb size.
#endif
unsigned int n = mpi_get_size(a);
int i, lzeros;
if (!buf || !nbytes)
return -EINVAL;
if (sign)
*sign = a->sign;
lzeros = count_lzeros(a);
if (buf_len < n - lzeros) {
*nbytes = n - lzeros;
return -EOVERFLOW;
}
p = buf;
*nbytes = n - lzeros;
for (i = a->nlimbs - 1 - lzeros / BYTES_PER_MPI_LIMB,
lzeros %= BYTES_PER_MPI_LIMB;
i >= 0; i--) {
#if BYTES_PER_MPI_LIMB == 4
alimb = cpu_to_be32(a->d[i]);
#elif BYTES_PER_MPI_LIMB == 8
alimb = cpu_to_be64(a->d[i]);
#else
#error please implement for this limb size.
#endif
memcpy(p, (u8 *)&alimb + lzeros, BYTES_PER_MPI_LIMB - lzeros);
p += BYTES_PER_MPI_LIMB - lzeros;
lzeros = 0;
}
return 0;
}
EXPORT_SYMBOL_GPL(mpi_read_buffer);
/*
* mpi_get_buffer() - Returns an allocated buffer with the MPI (msb first).
* Caller must free the return string.
* This function does return a 0 byte buffer with nbytes set to zero if the
* value of A is zero.
*
* @a: a multi precision integer.
* @nbytes: receives the length of this buffer.
* @sign: if not NULL, it will be set to the sign of the a.
*
* Return: Pointer to MPI buffer or NULL on error
*/
void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign)
{
uint8_t *buf;
unsigned int n;
int ret;
Annotation
- Immediate include surface: `linux/bitops.h`, `linux/byteorder/generic.h`, `linux/count_zeros.h`, `linux/export.h`, `linux/scatterlist.h`, `linux/string.h`, `mpi-internal.h`.
- Detected declarations: `function mpi_read_raw_data`, `function mpi_read_from_buffer`, `function count_lzeros`, `function mpi_read_buffer`, `function mpi_get_buffer`, `function mpi_write_to_sgl`, `function mpi_read_raw_from_sgl`, `export mpi_read_raw_data`, `export mpi_read_from_buffer`, `export mpi_read_buffer`.
- Atlas domain: Kernel Services / lib.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.