crypto: caam - ahash hmac support
caam supports ahash hmac with sha algorithms and md5. Signed-off-by: Yuan Kang <Yuan.Kang@freescale.com> Signed-off-by: Kim Phillips <kim.phillips@freescale.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
a299c83704
commit
045e36780f
|
@ -70,3 +70,15 @@ config CRYPTO_DEV_FSL_CAAM_CRYPTO_API
|
||||||
|
|
||||||
To compile this as a module, choose M here: the module
|
To compile this as a module, choose M here: the module
|
||||||
will be called caamalg.
|
will be called caamalg.
|
||||||
|
|
||||||
|
config CRYPTO_DEV_FSL_CAAM_AHASH_API
|
||||||
|
tristate "Register hash algorithm implementations with Crypto API"
|
||||||
|
depends on CRYPTO_DEV_FSL_CAAM
|
||||||
|
default y
|
||||||
|
select CRYPTO_AHASH
|
||||||
|
help
|
||||||
|
Selecting this will offload ahash for users of the
|
||||||
|
scatterlist crypto API to the SEC4 via job ring.
|
||||||
|
|
||||||
|
To compile this as a module, choose M here: the module
|
||||||
|
will be called caamhash.
|
||||||
|
|
|
@ -4,5 +4,6 @@
|
||||||
|
|
||||||
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM) += caam.o
|
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM) += caam.o
|
||||||
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API) += caamalg.o
|
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API) += caamalg.o
|
||||||
|
obj-$(CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API) += caamhash.o
|
||||||
|
|
||||||
caam-objs := ctrl.o jr.o error.o key_gen.o
|
caam-objs := ctrl.o jr.o error.o key_gen.o
|
||||||
|
|
1814
drivers/crypto/caam/caamhash.c
Normal file
1814
drivers/crypto/caam/caamhash.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/crypto.h>
|
#include <linux/crypto.h>
|
||||||
|
#include <linux/hash.h>
|
||||||
#include <linux/hw_random.h>
|
#include <linux/hw_random.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
@ -33,5 +34,6 @@
|
||||||
#include <crypto/authenc.h>
|
#include <crypto/authenc.h>
|
||||||
#include <crypto/scatterwalk.h>
|
#include <crypto/scatterwalk.h>
|
||||||
#include <crypto/internal/skcipher.h>
|
#include <crypto/internal/skcipher.h>
|
||||||
|
#include <crypto/internal/hash.h>
|
||||||
|
|
||||||
#endif /* !defined(CAAM_COMPAT_H) */
|
#endif /* !defined(CAAM_COMPAT_H) */
|
||||||
|
|
|
@ -88,6 +88,8 @@ struct caam_drv_private {
|
||||||
atomic_t tfm_count ____cacheline_aligned;
|
atomic_t tfm_count ____cacheline_aligned;
|
||||||
/* list of registered crypto algorithms (mk generic context handle?) */
|
/* list of registered crypto algorithms (mk generic context handle?) */
|
||||||
struct list_head alg_list;
|
struct list_head alg_list;
|
||||||
|
/* list of registered hash algorithms (mk generic context handle?) */
|
||||||
|
struct list_head hash_list;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debugfs entries for developer view into driver/device
|
* debugfs entries for developer view into driver/device
|
||||||
|
|
|
@ -82,3 +82,41 @@ static inline int sg_count(struct scatterlist *sg_list, int nbytes)
|
||||||
|
|
||||||
return sg_nents;
|
return sg_nents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy from len bytes of sg to dest, starting from beginning */
|
||||||
|
static inline void sg_copy(u8 *dest, struct scatterlist *sg, unsigned int len)
|
||||||
|
{
|
||||||
|
struct scatterlist *current_sg = sg;
|
||||||
|
int cpy_index = 0, next_cpy_index = current_sg->length;
|
||||||
|
|
||||||
|
while (next_cpy_index < len) {
|
||||||
|
memcpy(dest + cpy_index, (u8 *) sg_virt(current_sg),
|
||||||
|
current_sg->length);
|
||||||
|
current_sg = scatterwalk_sg_next(current_sg);
|
||||||
|
cpy_index = next_cpy_index;
|
||||||
|
next_cpy_index += current_sg->length;
|
||||||
|
}
|
||||||
|
if (cpy_index < len)
|
||||||
|
memcpy(dest + cpy_index, (u8 *) sg_virt(current_sg),
|
||||||
|
len - cpy_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy sg data, from to_skip to end, to dest */
|
||||||
|
static inline void sg_copy_part(u8 *dest, struct scatterlist *sg,
|
||||||
|
int to_skip, unsigned int end)
|
||||||
|
{
|
||||||
|
struct scatterlist *current_sg = sg;
|
||||||
|
int sg_index, cpy_index;
|
||||||
|
|
||||||
|
sg_index = current_sg->length;
|
||||||
|
while (sg_index <= to_skip) {
|
||||||
|
current_sg = scatterwalk_sg_next(current_sg);
|
||||||
|
sg_index += current_sg->length;
|
||||||
|
}
|
||||||
|
cpy_index = sg_index - to_skip;
|
||||||
|
memcpy(dest, (u8 *) sg_virt(current_sg) +
|
||||||
|
current_sg->length - cpy_index, cpy_index);
|
||||||
|
current_sg = scatterwalk_sg_next(current_sg);
|
||||||
|
if (end - sg_index)
|
||||||
|
sg_copy(dest + cpy_index, current_sg, end - sg_index);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue