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
|
||||
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_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
|
||||
|
|
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/interrupt.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/hash.h>
|
||||
#include <linux/hw_random.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
@ -33,5 +34,6 @@
|
|||
#include <crypto/authenc.h>
|
||||
#include <crypto/scatterwalk.h>
|
||||
#include <crypto/internal/skcipher.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
|
||||
#endif /* !defined(CAAM_COMPAT_H) */
|
||||
|
|
|
@ -88,6 +88,8 @@ struct caam_drv_private {
|
|||
atomic_t tfm_count ____cacheline_aligned;
|
||||
/* list of registered crypto algorithms (mk generic context handle?) */
|
||||
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
|
||||
|
|
|
@ -82,3 +82,41 @@ static inline int sg_count(struct scatterlist *sg_list, int nbytes)
|
|||
|
||||
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