Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto update from Herbert Xu: "API: - Crypto self tests can now be disabled at boot/run time. - Add async support to algif_aead. Algorithms: - A large number of fixes to MPI from Nicolai Stange. - Performance improvement for HMAC DRBG. Drivers: - Use generic crypto engine in omap-des. - Merge ppc4xx-rng and crypto4xx drivers. - Fix lockups in sun4i-ss driver by disabling IRQs. - Add DMA engine support to ccp. - Reenable talitos hash algorithms. - Add support for Hisilicon SoC RNG. - Add basic crypto driver for the MXC SCC. Others: - Do not allocate crypto hash tfm in NORECLAIM context in ecryptfs" * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (77 commits) crypto: qat - change the adf_ctl_stop_devices to void crypto: caam - fix caam_jr_alloc() ret code crypto: vmx - comply with ABIs that specify vrsave as reserved. crypto: testmgr - Add a flag allowing the self-tests to be disabled at runtime. crypto: ccp - constify ccp_actions structure crypto: marvell/cesa - Use dma_pool_zalloc crypto: qat - make adf_vf_isr.c dependant on IOV config crypto: qat - Fix typo in comments lib: asn1_decoder - add MODULE_LICENSE("GPL") crypto: omap-sham - Use dma_request_chan() for requesting DMA channel crypto: omap-des - Use dma_request_chan() for requesting DMA channel crypto: omap-aes - Use dma_request_chan() for requesting DMA channel crypto: omap-des - Integrate with the crypto engine framework crypto: s5p-sss - fix incorrect usage of scatterlists api crypto: s5p-sss - Fix missed interrupts when working with 8 kB blocks crypto: s5p-sss - Use common BIT macro crypto: mxc-scc - fix unwinding in mxc_scc_crypto_register() crypto: mxc-scc - signedness bugs in mxc_scc_ablkcipher_req_init() crypto: talitos - fix ahash algorithms registration crypto: ccp - Ensure all dependencies are specified ...
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/asn1_decoder.h>
|
||||
#include <linux/asn1_ber_bytecode.h>
|
||||
|
||||
@@ -506,3 +507,5 @@ error:
|
||||
return -EBADMSG;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(asn1_ber_decoder);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@@ -20,6 +20,8 @@
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/count_zeros.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/string.h>
|
||||
#include "mpi-internal.h"
|
||||
|
||||
#define MAX_EXTERN_MPI_BITS 16384
|
||||
@@ -163,7 +165,13 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
|
||||
int *sign)
|
||||
{
|
||||
uint8_t *p;
|
||||
mpi_limb_t alimb;
|
||||
#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;
|
||||
|
||||
@@ -183,38 +191,19 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
|
||||
p = buf;
|
||||
*nbytes = n - lzeros;
|
||||
|
||||
for (i = a->nlimbs - 1; i >= 0; i--) {
|
||||
alimb = a->d[i];
|
||||
for (i = a->nlimbs - 1 - lzeros / BYTES_PER_MPI_LIMB,
|
||||
lzeros %= BYTES_PER_MPI_LIMB;
|
||||
i >= 0; i--) {
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
*p++ = alimb >> 24;
|
||||
*p++ = alimb >> 16;
|
||||
*p++ = alimb >> 8;
|
||||
*p++ = alimb;
|
||||
alimb = cpu_to_be32(a->d[i]);
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
*p++ = alimb >> 56;
|
||||
*p++ = alimb >> 48;
|
||||
*p++ = alimb >> 40;
|
||||
*p++ = alimb >> 32;
|
||||
*p++ = alimb >> 24;
|
||||
*p++ = alimb >> 16;
|
||||
*p++ = alimb >> 8;
|
||||
*p++ = alimb;
|
||||
alimb = cpu_to_be64(a->d[i]);
|
||||
#else
|
||||
#error please implement for this limb size.
|
||||
#endif
|
||||
|
||||
if (lzeros > 0) {
|
||||
if (lzeros >= sizeof(alimb)) {
|
||||
p -= sizeof(alimb);
|
||||
} else {
|
||||
mpi_limb_t *limb1 = (void *)p - sizeof(alimb);
|
||||
mpi_limb_t *limb2 = (void *)p - sizeof(alimb)
|
||||
+ lzeros;
|
||||
*limb1 = *limb2;
|
||||
p -= lzeros;
|
||||
}
|
||||
lzeros -= sizeof(alimb);
|
||||
}
|
||||
memcpy(p, (u8 *)&alimb + lzeros, BYTES_PER_MPI_LIMB - lzeros);
|
||||
p += BYTES_PER_MPI_LIMB - lzeros;
|
||||
lzeros = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -359,7 +348,13 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
|
||||
int *sign)
|
||||
{
|
||||
u8 *p, *p2;
|
||||
mpi_limb_t alimb, alimb2;
|
||||
#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, x, y = 0, lzeros, buf_len;
|
||||
|
||||
@@ -380,42 +375,22 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
|
||||
buf_len = sgl->length;
|
||||
p2 = sg_virt(sgl);
|
||||
|
||||
for (i = a->nlimbs - 1; i >= 0; i--) {
|
||||
alimb = a->d[i];
|
||||
p = (u8 *)&alimb2;
|
||||
for (i = a->nlimbs - 1 - lzeros / BYTES_PER_MPI_LIMB,
|
||||
lzeros %= BYTES_PER_MPI_LIMB;
|
||||
i >= 0; i--) {
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
*p++ = alimb >> 24;
|
||||
*p++ = alimb >> 16;
|
||||
*p++ = alimb >> 8;
|
||||
*p++ = alimb;
|
||||
alimb = cpu_to_be32(a->d[i]);
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
*p++ = alimb >> 56;
|
||||
*p++ = alimb >> 48;
|
||||
*p++ = alimb >> 40;
|
||||
*p++ = alimb >> 32;
|
||||
*p++ = alimb >> 24;
|
||||
*p++ = alimb >> 16;
|
||||
*p++ = alimb >> 8;
|
||||
*p++ = alimb;
|
||||
alimb = cpu_to_be64(a->d[i]);
|
||||
#else
|
||||
#error please implement for this limb size.
|
||||
#endif
|
||||
if (lzeros > 0) {
|
||||
if (lzeros >= sizeof(alimb)) {
|
||||
p -= sizeof(alimb);
|
||||
continue;
|
||||
} else {
|
||||
mpi_limb_t *limb1 = (void *)p - sizeof(alimb);
|
||||
mpi_limb_t *limb2 = (void *)p - sizeof(alimb)
|
||||
+ lzeros;
|
||||
*limb1 = *limb2;
|
||||
p -= lzeros;
|
||||
y = lzeros;
|
||||
}
|
||||
lzeros -= sizeof(alimb);
|
||||
if (lzeros) {
|
||||
y = lzeros;
|
||||
lzeros = 0;
|
||||
}
|
||||
|
||||
p = p - (sizeof(alimb) - y);
|
||||
p = (u8 *)&alimb + y;
|
||||
|
||||
for (x = 0; x < sizeof(alimb) - y; x++) {
|
||||
if (!buf_len) {
|
||||
@@ -443,15 +418,15 @@ EXPORT_SYMBOL_GPL(mpi_write_to_sgl);
|
||||
* a new MPI and reads the content of the sgl to the MPI.
|
||||
*
|
||||
* @sgl: scatterlist to read from
|
||||
* @len: number of bytes to read
|
||||
* @nbytes: number of bytes to read
|
||||
*
|
||||
* Return: Pointer to a new MPI or NULL on error
|
||||
*/
|
||||
MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int len)
|
||||
MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
|
||||
{
|
||||
struct scatterlist *sg;
|
||||
int x, i, j, z, lzeros, ents;
|
||||
unsigned int nbits, nlimbs, nbytes;
|
||||
unsigned int nbits, nlimbs;
|
||||
mpi_limb_t a;
|
||||
MPI val = NULL;
|
||||
|
||||
@@ -472,16 +447,12 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int len)
|
||||
break;
|
||||
|
||||
ents--;
|
||||
nbytes -= lzeros;
|
||||
lzeros = 0;
|
||||
}
|
||||
|
||||
sgl = sg;
|
||||
|
||||
if (!ents)
|
||||
nbytes = 0;
|
||||
else
|
||||
nbytes = len - lzeros;
|
||||
|
||||
nbytes -= lzeros;
|
||||
nbits = nbytes * 8;
|
||||
if (nbits > MAX_EXTERN_MPI_BITS) {
|
||||
pr_info("MPI: mpi too large (%u bits)\n", nbits);
|
||||
@@ -489,9 +460,8 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int len)
|
||||
}
|
||||
|
||||
if (nbytes > 0)
|
||||
nbits -= count_leading_zeros(*(u8 *)(sg_virt(sgl) + lzeros));
|
||||
else
|
||||
nbits = 0;
|
||||
nbits -= count_leading_zeros(*(u8 *)(sg_virt(sgl) + lzeros)) -
|
||||
(BITS_PER_LONG - 8);
|
||||
|
||||
nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB);
|
||||
val = mpi_alloc(nlimbs);
|
||||
@@ -507,19 +477,14 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int len)
|
||||
|
||||
j = nlimbs - 1;
|
||||
a = 0;
|
||||
z = 0;
|
||||
x = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
|
||||
x %= BYTES_PER_MPI_LIMB;
|
||||
z = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
|
||||
z %= BYTES_PER_MPI_LIMB;
|
||||
|
||||
for_each_sg(sgl, sg, ents, i) {
|
||||
const u8 *buffer = sg_virt(sg) + lzeros;
|
||||
int len = sg->length - lzeros;
|
||||
int buf_shift = x;
|
||||
|
||||
if (sg_is_last(sg) && (len % BYTES_PER_MPI_LIMB))
|
||||
len += BYTES_PER_MPI_LIMB - (len % BYTES_PER_MPI_LIMB);
|
||||
|
||||
for (; x < len + buf_shift; x++) {
|
||||
for (x = 0; x < len; x++) {
|
||||
a <<= 8;
|
||||
a |= *buffer++;
|
||||
if (((z + x + 1) % BYTES_PER_MPI_LIMB) == 0) {
|
||||
@@ -528,7 +493,6 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int len)
|
||||
}
|
||||
}
|
||||
z += x;
|
||||
x = 0;
|
||||
lzeros = 0;
|
||||
}
|
||||
return val;
|
||||
|
Reference in New Issue
Block a user