mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto update from Herbert Xu: - The crypto API is now documented :) - Disallow arbitrary module loading through crypto API. - Allow get request with empty driver name through crypto_user. - Allow speed testing of arbitrary hash functions. - Add caam support for ctr(aes), gcm(aes) and their derivatives. - nx now supports concurrent hashing properly. - Add sahara support for SHA1/256. - Add ARM64 version of CRC32. - Misc fixes. * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (77 commits) crypto: tcrypt - Allow speed testing of arbitrary hash functions crypto: af_alg - add user space interface for AEAD crypto: qat - fix problem with coalescing enable logic crypto: sahara - add support for SHA1/256 crypto: sahara - replace tasklets with kthread crypto: sahara - add support for i.MX53 crypto: sahara - fix spinlock initialization crypto: arm - replace memset by memzero_explicit crypto: powerpc - replace memset by memzero_explicit crypto: sha - replace memset by memzero_explicit crypto: sparc - replace memset by memzero_explicit crypto: algif_skcipher - initialize upon init request crypto: algif_skcipher - removed unneeded code crypto: algif_skcipher - Fixed blocking recvmsg crypto: drbg - use memzero_explicit() for clearing sensitive data crypto: drbg - use MODULE_ALIAS_CRYPTO crypto: include crypto- module prefix in template crypto: user - add MODULE_ALIAS crypto: sha-mb - remove a bogus NULL check crytpo: qat - Fix 64 bytes requests ...
This commit is contained in:
commit
e3aa91a7cb
167 changed files with 7090 additions and 1068 deletions
|
|
@ -21,13 +21,13 @@
|
|||
#include <linux/scatterlist.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/unaligned/access_ok.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/cryptohash.h>
|
||||
#include <crypto/scatterwalk.h>
|
||||
#include <crypto/algapi.h>
|
||||
#include <crypto/hash.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <asm/dma.h>
|
||||
#include <asm/portmux.h>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -28,6 +28,7 @@
|
|||
#include <crypto/algapi.h>
|
||||
#include <crypto/null.h>
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/ctr.h>
|
||||
#include <crypto/des.h>
|
||||
#include <crypto/sha.h>
|
||||
#include <crypto/md5.h>
|
||||
|
|
|
|||
|
|
@ -192,6 +192,8 @@ static inline void append_##cmd(u32 *desc, unsigned int len, u32 options) \
|
|||
PRINT_POS; \
|
||||
append_cmd(desc, CMD_##op | len | options); \
|
||||
}
|
||||
|
||||
APPEND_CMD_LEN(seq_load, SEQ_LOAD)
|
||||
APPEND_CMD_LEN(seq_store, SEQ_STORE)
|
||||
APPEND_CMD_LEN(seq_fifo_load, SEQ_FIFO_LOAD)
|
||||
APPEND_CMD_LEN(seq_fifo_store, SEQ_FIFO_STORE)
|
||||
|
|
|
|||
|
|
@ -213,27 +213,36 @@ void caam_jr_strstatus(struct device *jrdev, u32 status)
|
|||
void (*report_ssed)(struct device *jrdev, const u32 status,
|
||||
const char *error);
|
||||
const char *error;
|
||||
} status_src[] = {
|
||||
} status_src[16] = {
|
||||
{ NULL, "No error" },
|
||||
{ NULL, NULL },
|
||||
{ report_ccb_status, "CCB" },
|
||||
{ report_jump_status, "Jump" },
|
||||
{ report_deco_status, "DECO" },
|
||||
{ NULL, NULL },
|
||||
{ NULL, "Queue Manager Interface" },
|
||||
{ report_jr_status, "Job Ring" },
|
||||
{ report_cond_code_status, "Condition Code" },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
u32 ssrc = status >> JRSTA_SSRC_SHIFT;
|
||||
const char *error = status_src[ssrc].error;
|
||||
|
||||
/*
|
||||
* If there is no further error handling function, just
|
||||
* print the error code, error string and exit. Otherwise
|
||||
* call the handler function.
|
||||
* If there is an error handling function, call it to report the error.
|
||||
* Otherwise print the error source name.
|
||||
*/
|
||||
if (!status_src[ssrc].report_ssed)
|
||||
dev_err(jrdev, "%08x: %s: \n", status, status_src[ssrc].error);
|
||||
else
|
||||
if (status_src[ssrc].report_ssed)
|
||||
status_src[ssrc].report_ssed(jrdev, status, error);
|
||||
else if (error)
|
||||
dev_err(jrdev, "%d: %s\n", ssrc, error);
|
||||
else
|
||||
dev_err(jrdev, "%d: unknown error source\n", ssrc);
|
||||
}
|
||||
EXPORT_SYMBOL(caam_jr_strstatus);
|
||||
|
|
|
|||
|
|
@ -181,8 +181,6 @@ static void caam_jr_dequeue(unsigned long devarg)
|
|||
for (i = 0; CIRC_CNT(head, tail + i, JOBR_DEPTH) >= 1; i++) {
|
||||
sw_idx = (tail + i) & (JOBR_DEPTH - 1);
|
||||
|
||||
smp_read_barrier_depends();
|
||||
|
||||
if (jrp->outring[hw_idx].desc ==
|
||||
jrp->entinfo[sw_idx].desc_addr_dma)
|
||||
break; /* found */
|
||||
|
|
@ -218,7 +216,6 @@ static void caam_jr_dequeue(unsigned long devarg)
|
|||
if (sw_idx == tail) {
|
||||
do {
|
||||
tail = (tail + 1) & (JOBR_DEPTH - 1);
|
||||
smp_read_barrier_depends();
|
||||
} while (CIRC_CNT(head, tail, JOBR_DEPTH) >= 1 &&
|
||||
jrp->entinfo[tail].desc_addr_dma == 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -72,27 +72,19 @@ static int cbc_aes_nx_crypt(struct blkcipher_desc *desc,
|
|||
struct nx_csbcpb *csbcpb = nx_ctx->csbcpb;
|
||||
unsigned long irq_flags;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
int rc;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (enc)
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_ENDE_ENCRYPT;
|
||||
else
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT;
|
||||
|
||||
do {
|
||||
to_process = min_t(u64, nbytes - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = to_process & ~(AES_BLOCK_SIZE - 1);
|
||||
to_process = nbytes - processed;
|
||||
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, dst, src, to_process,
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, dst, src, &to_process,
|
||||
processed, csbcpb->cpb.aes_cbc.iv);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ static int generate_pat(u8 *iv,
|
|||
unsigned int iauth_len = 0;
|
||||
u8 tmp[16], *b1 = NULL, *b0 = NULL, *result = NULL;
|
||||
int rc;
|
||||
unsigned int max_sg_len;
|
||||
|
||||
/* zero the ctr value */
|
||||
memset(iv + 15 - iv[0], 0, iv[0] + 1);
|
||||
|
|
@ -248,10 +249,19 @@ static int generate_pat(u8 *iv,
|
|||
if (!req->assoclen) {
|
||||
return rc;
|
||||
} else if (req->assoclen <= 14) {
|
||||
nx_insg = nx_build_sg_list(nx_insg, b1, 16, nx_ctx->ap->sglen);
|
||||
nx_outsg = nx_build_sg_list(nx_outsg, tmp, 16,
|
||||
unsigned int len = 16;
|
||||
|
||||
nx_insg = nx_build_sg_list(nx_insg, b1, &len, nx_ctx->ap->sglen);
|
||||
|
||||
if (len != 16)
|
||||
return -EINVAL;
|
||||
|
||||
nx_outsg = nx_build_sg_list(nx_outsg, tmp, &len,
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (len != 16)
|
||||
return -EINVAL;
|
||||
|
||||
/* inlen should be negative, indicating to phyp that its a
|
||||
* pointer to an sg list */
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - nx_insg) *
|
||||
|
|
@ -273,21 +283,24 @@ static int generate_pat(u8 *iv,
|
|||
atomic64_add(req->assoclen, &(nx_ctx->stats->aes_bytes));
|
||||
|
||||
} else {
|
||||
u32 max_sg_len;
|
||||
unsigned int processed = 0, to_process;
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u32,
|
||||
nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
processed += iauth_len;
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u64, nx_ctx->ap->sglen,
|
||||
nx_driver.of.max_sg_len/sizeof(struct nx_sg));
|
||||
max_sg_len = min_t(u64, max_sg_len,
|
||||
nx_ctx->ap->databytelen/NX_PAGE_SIZE);
|
||||
|
||||
do {
|
||||
to_process = min_t(u32, req->assoclen - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
|
||||
nx_insg = nx_walk_and_build(nx_ctx->in_sg,
|
||||
nx_ctx->ap->sglen,
|
||||
req->assoc, processed,
|
||||
&to_process);
|
||||
|
||||
if ((to_process + processed) < req->assoclen) {
|
||||
NX_CPB_FDM(nx_ctx->csbcpb_aead) |=
|
||||
|
|
@ -297,10 +310,6 @@ static int generate_pat(u8 *iv,
|
|||
~NX_FDM_INTERMEDIATE;
|
||||
}
|
||||
|
||||
nx_insg = nx_walk_and_build(nx_ctx->in_sg,
|
||||
nx_ctx->ap->sglen,
|
||||
req->assoc, processed,
|
||||
to_process);
|
||||
|
||||
nx_ctx->op_aead.inlen = (nx_ctx->in_sg - nx_insg) *
|
||||
sizeof(struct nx_sg);
|
||||
|
|
@ -343,7 +352,6 @@ static int ccm_nx_decrypt(struct aead_request *req,
|
|||
struct nx_ccm_priv *priv = &nx_ctx->priv.ccm;
|
||||
unsigned long irq_flags;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
int rc = -1;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
|
@ -360,19 +368,12 @@ static int ccm_nx_decrypt(struct aead_request *req,
|
|||
if (rc)
|
||||
goto out;
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
do {
|
||||
|
||||
/* to_process: the AES_BLOCK_SIZE data chunk to process in this
|
||||
* update. This value is bound by sg list limits.
|
||||
*/
|
||||
to_process = min_t(u64, nbytes - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = nbytes - processed;
|
||||
|
||||
if ((to_process + processed) < nbytes)
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
|
|
@ -382,7 +383,7 @@ static int ccm_nx_decrypt(struct aead_request *req,
|
|||
NX_CPB_FDM(nx_ctx->csbcpb) &= ~NX_FDM_ENDE_ENCRYPT;
|
||||
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, req->dst, req->src,
|
||||
to_process, processed,
|
||||
&to_process, processed,
|
||||
csbcpb->cpb.aes_ccm.iv_or_ctr);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
|
@ -427,7 +428,6 @@ static int ccm_nx_encrypt(struct aead_request *req,
|
|||
unsigned int authsize = crypto_aead_authsize(crypto_aead_reqtfm(req));
|
||||
unsigned long irq_flags;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
int rc = -1;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
|
@ -437,18 +437,11 @@ static int ccm_nx_encrypt(struct aead_request *req,
|
|||
if (rc)
|
||||
goto out;
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
do {
|
||||
/* to process: the AES_BLOCK_SIZE data chunk to process in this
|
||||
* update. This value is bound by sg list limits.
|
||||
*/
|
||||
to_process = min_t(u64, nbytes - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = nbytes - processed;
|
||||
|
||||
if ((to_process + processed) < nbytes)
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
|
|
@ -458,7 +451,7 @@ static int ccm_nx_encrypt(struct aead_request *req,
|
|||
NX_CPB_FDM(csbcpb) |= NX_FDM_ENDE_ENCRYPT;
|
||||
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, req->dst, req->src,
|
||||
to_process, processed,
|
||||
&to_process, processed,
|
||||
csbcpb->cpb.aes_ccm.iv_or_ctr);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -90,22 +90,14 @@ static int ctr_aes_nx_crypt(struct blkcipher_desc *desc,
|
|||
struct nx_csbcpb *csbcpb = nx_ctx->csbcpb;
|
||||
unsigned long irq_flags;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
int rc;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
do {
|
||||
to_process = min_t(u64, nbytes - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = to_process & ~(AES_BLOCK_SIZE - 1);
|
||||
to_process = nbytes - processed;
|
||||
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, dst, src, to_process,
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, dst, src, &to_process,
|
||||
processed, csbcpb->cpb.aes_ctr.iv);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
|
@ -143,6 +135,7 @@ static int ctr3686_aes_nx_crypt(struct blkcipher_desc *desc,
|
|||
|
||||
memcpy(iv + CTR_RFC3686_NONCE_SIZE,
|
||||
desc->info, CTR_RFC3686_IV_SIZE);
|
||||
iv[12] = iv[13] = iv[14] = 0;
|
||||
iv[15] = 1;
|
||||
|
||||
desc->info = nx_ctx->priv.ctr.iv;
|
||||
|
|
|
|||
|
|
@ -72,27 +72,19 @@ static int ecb_aes_nx_crypt(struct blkcipher_desc *desc,
|
|||
struct nx_csbcpb *csbcpb = nx_ctx->csbcpb;
|
||||
unsigned long irq_flags;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
int rc;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (enc)
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_ENDE_ENCRYPT;
|
||||
else
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT;
|
||||
|
||||
do {
|
||||
to_process = min_t(u64, nbytes - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = to_process & ~(AES_BLOCK_SIZE - 1);
|
||||
to_process = nbytes - processed;
|
||||
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, dst, src, to_process,
|
||||
rc = nx_build_sg_lists(nx_ctx, desc, dst, src, &to_process,
|
||||
processed, NULL);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ static int nx_gca(struct nx_crypto_ctx *nx_ctx,
|
|||
struct nx_sg *nx_sg = nx_ctx->in_sg;
|
||||
unsigned int nbytes = req->assoclen;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
unsigned int max_sg_len;
|
||||
|
||||
if (nbytes <= AES_BLOCK_SIZE) {
|
||||
scatterwalk_start(&walk, req->assoc);
|
||||
|
|
@ -143,8 +143,10 @@ static int nx_gca(struct nx_crypto_ctx *nx_ctx,
|
|||
NX_CPB_FDM(csbcpb_aead) &= ~NX_FDM_CONTINUATION;
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
max_sg_len = min_t(u64, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
max_sg_len = min_t(u64, max_sg_len,
|
||||
nx_ctx->ap->databytelen/NX_PAGE_SIZE);
|
||||
|
||||
do {
|
||||
/*
|
||||
|
|
@ -156,13 +158,14 @@ static int nx_gca(struct nx_crypto_ctx *nx_ctx,
|
|||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
|
||||
nx_sg = nx_walk_and_build(nx_ctx->in_sg, max_sg_len,
|
||||
req->assoc, processed, &to_process);
|
||||
|
||||
if ((to_process + processed) < nbytes)
|
||||
NX_CPB_FDM(csbcpb_aead) |= NX_FDM_INTERMEDIATE;
|
||||
else
|
||||
NX_CPB_FDM(csbcpb_aead) &= ~NX_FDM_INTERMEDIATE;
|
||||
|
||||
nx_sg = nx_walk_and_build(nx_ctx->in_sg, nx_ctx->ap->sglen,
|
||||
req->assoc, processed, to_process);
|
||||
nx_ctx->op_aead.inlen = (nx_ctx->in_sg - nx_sg)
|
||||
* sizeof(struct nx_sg);
|
||||
|
||||
|
|
@ -195,7 +198,7 @@ static int gmac(struct aead_request *req, struct blkcipher_desc *desc)
|
|||
struct nx_sg *nx_sg;
|
||||
unsigned int nbytes = req->assoclen;
|
||||
unsigned int processed = 0, to_process;
|
||||
u32 max_sg_len;
|
||||
unsigned int max_sg_len;
|
||||
|
||||
/* Set GMAC mode */
|
||||
csbcpb->cpb.hdr.mode = NX_MODE_AES_GMAC;
|
||||
|
|
@ -203,8 +206,10 @@ static int gmac(struct aead_request *req, struct blkcipher_desc *desc)
|
|||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_CONTINUATION;
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
max_sg_len = min_t(u64, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
max_sg_len = min_t(u64, max_sg_len,
|
||||
nx_ctx->ap->databytelen/NX_PAGE_SIZE);
|
||||
|
||||
/* Copy IV */
|
||||
memcpy(csbcpb->cpb.aes_gcm.iv_or_cnt, desc->info, AES_BLOCK_SIZE);
|
||||
|
|
@ -219,13 +224,14 @@ static int gmac(struct aead_request *req, struct blkcipher_desc *desc)
|
|||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
|
||||
nx_sg = nx_walk_and_build(nx_ctx->in_sg, max_sg_len,
|
||||
req->assoc, processed, &to_process);
|
||||
|
||||
if ((to_process + processed) < nbytes)
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
else
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
|
||||
nx_sg = nx_walk_and_build(nx_ctx->in_sg, nx_ctx->ap->sglen,
|
||||
req->assoc, processed, to_process);
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - nx_sg)
|
||||
* sizeof(struct nx_sg);
|
||||
|
||||
|
|
@ -264,6 +270,7 @@ static int gcm_empty(struct aead_request *req, struct blkcipher_desc *desc,
|
|||
struct nx_csbcpb *csbcpb = nx_ctx->csbcpb;
|
||||
char out[AES_BLOCK_SIZE];
|
||||
struct nx_sg *in_sg, *out_sg;
|
||||
int len;
|
||||
|
||||
/* For scenarios where the input message is zero length, AES CTR mode
|
||||
* may be used. Set the source data to be a single block (16B) of all
|
||||
|
|
@ -279,11 +286,22 @@ static int gcm_empty(struct aead_request *req, struct blkcipher_desc *desc,
|
|||
else
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_ENDE_ENCRYPT;
|
||||
|
||||
len = AES_BLOCK_SIZE;
|
||||
|
||||
/* Encrypt the counter/IV */
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *) desc->info,
|
||||
AES_BLOCK_SIZE, nx_ctx->ap->sglen);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *) out, sizeof(out),
|
||||
&len, nx_ctx->ap->sglen);
|
||||
|
||||
if (len != AES_BLOCK_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
len = sizeof(out);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *) out, &len,
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (len != sizeof(out))
|
||||
return -EINVAL;
|
||||
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
|
|
@ -317,7 +335,6 @@ static int gcm_aes_nx_crypt(struct aead_request *req, int enc)
|
|||
unsigned int nbytes = req->cryptlen;
|
||||
unsigned int processed = 0, to_process;
|
||||
unsigned long irq_flags;
|
||||
u32 max_sg_len;
|
||||
int rc = -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
|
@ -354,32 +371,23 @@ static int gcm_aes_nx_crypt(struct aead_request *req, int enc)
|
|||
nbytes -= crypto_aead_authsize(crypto_aead_reqtfm(req));
|
||||
}
|
||||
|
||||
/* page_limit: number of sg entries that fit on one page */
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
do {
|
||||
/*
|
||||
* to_process: the data chunk to process in this update.
|
||||
* This value is bound by sg list limits.
|
||||
*/
|
||||
to_process = min_t(u64, nbytes - processed,
|
||||
nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = nbytes - processed;
|
||||
|
||||
csbcpb->cpb.aes_gcm.bit_length_data = nbytes * 8;
|
||||
desc.tfm = (struct crypto_blkcipher *) req->base.tfm;
|
||||
rc = nx_build_sg_lists(nx_ctx, &desc, req->dst,
|
||||
req->src, &to_process, processed,
|
||||
csbcpb->cpb.aes_gcm.iv_or_cnt);
|
||||
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if ((to_process + processed) < nbytes)
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
else
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
|
||||
csbcpb->cpb.aes_gcm.bit_length_data = nbytes * 8;
|
||||
desc.tfm = (struct crypto_blkcipher *) req->base.tfm;
|
||||
rc = nx_build_sg_lists(nx_ctx, &desc, req->dst,
|
||||
req->src, to_process, processed,
|
||||
csbcpb->cpb.aes_gcm.iv_or_cnt);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
rc = nx_hcall_sync(nx_ctx, &nx_ctx->op,
|
||||
req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP);
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ static int nx_xcbc_empty(struct shash_desc *desc, u8 *out)
|
|||
u8 keys[2][AES_BLOCK_SIZE];
|
||||
u8 key[32];
|
||||
int rc = 0;
|
||||
int len;
|
||||
|
||||
/* Change to ECB mode */
|
||||
csbcpb->cpb.hdr.mode = NX_MODE_AES_ECB;
|
||||
|
|
@ -86,11 +87,20 @@ static int nx_xcbc_empty(struct shash_desc *desc, u8 *out)
|
|||
memset(keys[0], 0x01, sizeof(keys[0]));
|
||||
memset(keys[1], 0x03, sizeof(keys[1]));
|
||||
|
||||
len = sizeof(keys);
|
||||
/* Generate K1 and K3 encrypting the patterns */
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *) keys, sizeof(keys),
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *) keys, &len,
|
||||
nx_ctx->ap->sglen);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *) keys, sizeof(keys),
|
||||
|
||||
if (len != sizeof(keys))
|
||||
return -EINVAL;
|
||||
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *) keys, &len,
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (len != sizeof(keys))
|
||||
return -EINVAL;
|
||||
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
|
|
@ -103,12 +113,23 @@ static int nx_xcbc_empty(struct shash_desc *desc, u8 *out)
|
|||
/* XOr K3 with the padding for a 0 length message */
|
||||
keys[1][0] ^= 0x80;
|
||||
|
||||
len = sizeof(keys[1]);
|
||||
|
||||
/* Encrypt the final result */
|
||||
memcpy(csbcpb->cpb.aes_ecb.key, keys[0], AES_BLOCK_SIZE);
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *) keys[1], sizeof(keys[1]),
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *) keys[1], &len,
|
||||
nx_ctx->ap->sglen);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, out, AES_BLOCK_SIZE,
|
||||
|
||||
if (len != sizeof(keys[1]))
|
||||
return -EINVAL;
|
||||
|
||||
len = AES_BLOCK_SIZE;
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, out, &len,
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (len != AES_BLOCK_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
|
|
@ -133,6 +154,7 @@ static int nx_xcbc_init(struct shash_desc *desc)
|
|||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = nx_ctx->csbcpb;
|
||||
struct nx_sg *out_sg;
|
||||
int len;
|
||||
|
||||
nx_ctx_init(nx_ctx, HCOP_FC_AES);
|
||||
|
||||
|
|
@ -144,8 +166,13 @@ static int nx_xcbc_init(struct shash_desc *desc)
|
|||
memcpy(csbcpb->cpb.aes_xcbc.key, nx_ctx->priv.xcbc.key, AES_BLOCK_SIZE);
|
||||
memset(nx_ctx->priv.xcbc.key, 0, sizeof *nx_ctx->priv.xcbc.key);
|
||||
|
||||
len = AES_BLOCK_SIZE;
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state,
|
||||
AES_BLOCK_SIZE, nx_ctx->ap->sglen);
|
||||
&len, nx_ctx->ap->sglen);
|
||||
|
||||
if (len != AES_BLOCK_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
return 0;
|
||||
|
|
@ -159,10 +186,11 @@ static int nx_xcbc_update(struct shash_desc *desc,
|
|||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = nx_ctx->csbcpb;
|
||||
struct nx_sg *in_sg;
|
||||
u32 to_process, leftover, total;
|
||||
u32 max_sg_len;
|
||||
u32 to_process = 0, leftover, total;
|
||||
unsigned int max_sg_len;
|
||||
unsigned long irq_flags;
|
||||
int rc = 0;
|
||||
int data_len;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
|
|
@ -180,17 +208,15 @@ static int nx_xcbc_update(struct shash_desc *desc,
|
|||
}
|
||||
|
||||
in_sg = nx_ctx->in_sg;
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
max_sg_len = min_t(u64, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
max_sg_len = min_t(u64, max_sg_len,
|
||||
nx_ctx->ap->databytelen/NX_PAGE_SIZE);
|
||||
|
||||
do {
|
||||
|
||||
/* to_process: the AES_BLOCK_SIZE data chunk to process in this
|
||||
* update */
|
||||
to_process = min_t(u64, total, nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = total - to_process;
|
||||
to_process = to_process & ~(AES_BLOCK_SIZE - 1);
|
||||
|
||||
leftover = total - to_process;
|
||||
|
||||
/* the hardware will not accept a 0 byte operation for this
|
||||
|
|
@ -204,15 +230,24 @@ static int nx_xcbc_update(struct shash_desc *desc,
|
|||
}
|
||||
|
||||
if (sctx->count) {
|
||||
data_len = sctx->count;
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg,
|
||||
(u8 *) sctx->buffer,
|
||||
sctx->count,
|
||||
&data_len,
|
||||
max_sg_len);
|
||||
if (data_len != sctx->count)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data_len = to_process - sctx->count;
|
||||
in_sg = nx_build_sg_list(in_sg,
|
||||
(u8 *) data,
|
||||
to_process - sctx->count,
|
||||
&data_len,
|
||||
max_sg_len);
|
||||
|
||||
if (data_len != to_process - sctx->count)
|
||||
return -EINVAL;
|
||||
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) *
|
||||
sizeof(struct nx_sg);
|
||||
|
||||
|
|
@ -263,6 +298,7 @@ static int nx_xcbc_final(struct shash_desc *desc, u8 *out)
|
|||
struct nx_sg *in_sg, *out_sg;
|
||||
unsigned long irq_flags;
|
||||
int rc = 0;
|
||||
int len;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
|
|
@ -285,11 +321,20 @@ static int nx_xcbc_final(struct shash_desc *desc, u8 *out)
|
|||
* this is not an intermediate operation */
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
|
||||
len = sctx->count;
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *)sctx->buffer,
|
||||
sctx->count, nx_ctx->ap->sglen);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, out, AES_BLOCK_SIZE,
|
||||
&len, nx_ctx->ap->sglen);
|
||||
|
||||
if (len != sctx->count)
|
||||
return -EINVAL;
|
||||
|
||||
len = AES_BLOCK_SIZE;
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, out, &len,
|
||||
nx_ctx->ap->sglen);
|
||||
|
||||
if (len != AES_BLOCK_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <crypto/sha.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/vio.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include "nx_csbcpb.h"
|
||||
#include "nx.h"
|
||||
|
|
@ -32,7 +33,8 @@ static int nx_sha256_init(struct shash_desc *desc)
|
|||
{
|
||||
struct sha256_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_sg *out_sg;
|
||||
int len;
|
||||
int rc;
|
||||
|
||||
nx_ctx_init(nx_ctx, HCOP_FC_SHA);
|
||||
|
||||
|
|
@ -41,10 +43,28 @@ static int nx_sha256_init(struct shash_desc *desc)
|
|||
nx_ctx->ap = &nx_ctx->props[NX_PROPS_SHA256];
|
||||
|
||||
NX_CPB_SET_DIGEST_SIZE(nx_ctx->csbcpb, NX_DS_SHA256);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state,
|
||||
SHA256_DIGEST_SIZE, nx_ctx->ap->sglen);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
len = SHA256_DIGEST_SIZE;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->out_sg,
|
||||
&nx_ctx->op.outlen,
|
||||
&len,
|
||||
(u8 *) sctx->state,
|
||||
NX_DS_SHA256);
|
||||
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
sctx->state[0] = __cpu_to_be32(SHA256_H0);
|
||||
sctx->state[1] = __cpu_to_be32(SHA256_H1);
|
||||
sctx->state[2] = __cpu_to_be32(SHA256_H2);
|
||||
sctx->state[3] = __cpu_to_be32(SHA256_H3);
|
||||
sctx->state[4] = __cpu_to_be32(SHA256_H4);
|
||||
sctx->state[5] = __cpu_to_be32(SHA256_H5);
|
||||
sctx->state[6] = __cpu_to_be32(SHA256_H6);
|
||||
sctx->state[7] = __cpu_to_be32(SHA256_H7);
|
||||
sctx->count = 0;
|
||||
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -54,11 +74,11 @@ static int nx_sha256_update(struct shash_desc *desc, const u8 *data,
|
|||
struct sha256_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
struct nx_sg *in_sg;
|
||||
u64 to_process, leftover, total;
|
||||
u32 max_sg_len;
|
||||
u64 to_process = 0, leftover, total;
|
||||
unsigned long irq_flags;
|
||||
int rc = 0;
|
||||
int data_len;
|
||||
u64 buf_len = (sctx->count % SHA256_BLOCK_SIZE);
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
|
|
@ -66,16 +86,16 @@ static int nx_sha256_update(struct shash_desc *desc, const u8 *data,
|
|||
* 1: < SHA256_BLOCK_SIZE: copy into state, return 0
|
||||
* 2: >= SHA256_BLOCK_SIZE: process X blocks, copy in leftover
|
||||
*/
|
||||
total = sctx->count + len;
|
||||
total = (sctx->count % SHA256_BLOCK_SIZE) + len;
|
||||
if (total < SHA256_BLOCK_SIZE) {
|
||||
memcpy(sctx->buf + sctx->count, data, len);
|
||||
memcpy(sctx->buf + buf_len, data, len);
|
||||
sctx->count += len;
|
||||
goto out;
|
||||
}
|
||||
|
||||
in_sg = nx_ctx->in_sg;
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
memcpy(csbcpb->cpb.sha256.message_digest, sctx->state, SHA256_DIGEST_SIZE);
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
|
||||
do {
|
||||
/*
|
||||
|
|
@ -83,34 +103,42 @@ static int nx_sha256_update(struct shash_desc *desc, const u8 *data,
|
|||
* this update. This value is also restricted by the sg list
|
||||
* limits.
|
||||
*/
|
||||
to_process = min_t(u64, total, nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = total - to_process;
|
||||
to_process = to_process & ~(SHA256_BLOCK_SIZE - 1);
|
||||
|
||||
if (buf_len) {
|
||||
data_len = buf_len;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->in_sg,
|
||||
&nx_ctx->op.inlen,
|
||||
&data_len,
|
||||
(u8 *) sctx->buf,
|
||||
NX_DS_SHA256);
|
||||
|
||||
if (rc || data_len != buf_len)
|
||||
goto out;
|
||||
}
|
||||
|
||||
data_len = to_process - buf_len;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->in_sg,
|
||||
&nx_ctx->op.inlen,
|
||||
&data_len,
|
||||
(u8 *) data,
|
||||
NX_DS_SHA256);
|
||||
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
to_process = (data_len + buf_len);
|
||||
leftover = total - to_process;
|
||||
|
||||
if (sctx->count) {
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg,
|
||||
(u8 *) sctx->buf,
|
||||
sctx->count, max_sg_len);
|
||||
}
|
||||
in_sg = nx_build_sg_list(in_sg, (u8 *) data,
|
||||
to_process - sctx->count,
|
||||
max_sg_len);
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) *
|
||||
sizeof(struct nx_sg);
|
||||
|
||||
if (NX_CPB_FDM(csbcpb) & NX_FDM_CONTINUATION) {
|
||||
/*
|
||||
* we've hit the nx chip previously and we're updating
|
||||
* again, so copy over the partial digest.
|
||||
*/
|
||||
memcpy(csbcpb->cpb.sha256.input_partial_digest,
|
||||
/*
|
||||
* we've hit the nx chip previously and we're updating
|
||||
* again, so copy over the partial digest.
|
||||
*/
|
||||
memcpy(csbcpb->cpb.sha256.input_partial_digest,
|
||||
csbcpb->cpb.sha256.message_digest,
|
||||
SHA256_DIGEST_SIZE);
|
||||
}
|
||||
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
if (!nx_ctx->op.inlen || !nx_ctx->op.outlen) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
|
|
@ -122,22 +150,19 @@ static int nx_sha256_update(struct shash_desc *desc, const u8 *data,
|
|||
goto out;
|
||||
|
||||
atomic_inc(&(nx_ctx->stats->sha256_ops));
|
||||
csbcpb->cpb.sha256.message_bit_length += (u64)
|
||||
(csbcpb->cpb.sha256.spbc * 8);
|
||||
|
||||
/* everything after the first update is continuation */
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
|
||||
total -= to_process;
|
||||
data += to_process - sctx->count;
|
||||
sctx->count = 0;
|
||||
in_sg = nx_ctx->in_sg;
|
||||
data += to_process - buf_len;
|
||||
buf_len = 0;
|
||||
|
||||
} while (leftover >= SHA256_BLOCK_SIZE);
|
||||
|
||||
/* copy the leftover back into the state struct */
|
||||
if (leftover)
|
||||
memcpy(sctx->buf, data, leftover);
|
||||
sctx->count = leftover;
|
||||
|
||||
sctx->count += len;
|
||||
memcpy(sctx->state, csbcpb->cpb.sha256.message_digest, SHA256_DIGEST_SIZE);
|
||||
out:
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
return rc;
|
||||
|
|
@ -148,34 +173,46 @@ static int nx_sha256_final(struct shash_desc *desc, u8 *out)
|
|||
struct sha256_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
struct nx_sg *in_sg, *out_sg;
|
||||
u32 max_sg_len;
|
||||
unsigned long irq_flags;
|
||||
int rc;
|
||||
int len;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len, nx_ctx->ap->sglen);
|
||||
|
||||
if (NX_CPB_FDM(csbcpb) & NX_FDM_CONTINUATION) {
|
||||
/* we've hit the nx chip previously, now we're finalizing,
|
||||
* so copy over the partial digest */
|
||||
memcpy(csbcpb->cpb.sha256.input_partial_digest,
|
||||
csbcpb->cpb.sha256.message_digest, SHA256_DIGEST_SIZE);
|
||||
}
|
||||
|
||||
/* final is represented by continuing the operation and indicating that
|
||||
* this is not an intermediate operation */
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
if (sctx->count >= SHA256_BLOCK_SIZE) {
|
||||
/* we've hit the nx chip previously, now we're finalizing,
|
||||
* so copy over the partial digest */
|
||||
memcpy(csbcpb->cpb.sha256.input_partial_digest, sctx->state, SHA256_DIGEST_SIZE);
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
} else {
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_CONTINUATION;
|
||||
}
|
||||
|
||||
csbcpb->cpb.sha256.message_bit_length += (u64)(sctx->count * 8);
|
||||
csbcpb->cpb.sha256.message_bit_length = (u64) (sctx->count * 8);
|
||||
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, (u8 *)sctx->buf,
|
||||
sctx->count, max_sg_len);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, out, SHA256_DIGEST_SIZE,
|
||||
max_sg_len);
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
len = sctx->count & (SHA256_BLOCK_SIZE - 1);
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->in_sg,
|
||||
&nx_ctx->op.inlen,
|
||||
&len,
|
||||
(u8 *) sctx->buf,
|
||||
NX_DS_SHA256);
|
||||
|
||||
if (rc || len != (sctx->count & (SHA256_BLOCK_SIZE - 1)))
|
||||
goto out;
|
||||
|
||||
len = SHA256_DIGEST_SIZE;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->out_sg,
|
||||
&nx_ctx->op.outlen,
|
||||
&len,
|
||||
out,
|
||||
NX_DS_SHA256);
|
||||
|
||||
if (rc || len != SHA256_DIGEST_SIZE)
|
||||
goto out;
|
||||
|
||||
if (!nx_ctx->op.outlen) {
|
||||
rc = -EINVAL;
|
||||
|
|
@ -189,8 +226,7 @@ static int nx_sha256_final(struct shash_desc *desc, u8 *out)
|
|||
|
||||
atomic_inc(&(nx_ctx->stats->sha256_ops));
|
||||
|
||||
atomic64_add(csbcpb->cpb.sha256.message_bit_length / 8,
|
||||
&(nx_ctx->stats->sha256_bytes));
|
||||
atomic64_add(sctx->count, &(nx_ctx->stats->sha256_bytes));
|
||||
memcpy(out, csbcpb->cpb.sha256.message_digest, SHA256_DIGEST_SIZE);
|
||||
out:
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
|
|
@ -200,62 +236,18 @@ out:
|
|||
static int nx_sha256_export(struct shash_desc *desc, void *out)
|
||||
{
|
||||
struct sha256_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
struct sha256_state *octx = out;
|
||||
unsigned long irq_flags;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
memcpy(out, sctx, sizeof(*sctx));
|
||||
|
||||
octx->count = sctx->count +
|
||||
(csbcpb->cpb.sha256.message_bit_length / 8);
|
||||
memcpy(octx->buf, sctx->buf, sizeof(octx->buf));
|
||||
|
||||
/* if no data has been processed yet, we need to export SHA256's
|
||||
* initial data, in case this context gets imported into a software
|
||||
* context */
|
||||
if (csbcpb->cpb.sha256.message_bit_length)
|
||||
memcpy(octx->state, csbcpb->cpb.sha256.message_digest,
|
||||
SHA256_DIGEST_SIZE);
|
||||
else {
|
||||
octx->state[0] = SHA256_H0;
|
||||
octx->state[1] = SHA256_H1;
|
||||
octx->state[2] = SHA256_H2;
|
||||
octx->state[3] = SHA256_H3;
|
||||
octx->state[4] = SHA256_H4;
|
||||
octx->state[5] = SHA256_H5;
|
||||
octx->state[6] = SHA256_H6;
|
||||
octx->state[7] = SHA256_H7;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nx_sha256_import(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
struct sha256_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
const struct sha256_state *ictx = in;
|
||||
unsigned long irq_flags;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
memcpy(sctx, in, sizeof(*sctx));
|
||||
|
||||
memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf));
|
||||
|
||||
sctx->count = ictx->count & 0x3f;
|
||||
csbcpb->cpb.sha256.message_bit_length = (ictx->count & ~0x3f) * 8;
|
||||
|
||||
if (csbcpb->cpb.sha256.message_bit_length) {
|
||||
memcpy(csbcpb->cpb.sha256.message_digest, ictx->state,
|
||||
SHA256_DIGEST_SIZE);
|
||||
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@ static int nx_sha512_init(struct shash_desc *desc)
|
|||
{
|
||||
struct sha512_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_sg *out_sg;
|
||||
int len;
|
||||
int rc;
|
||||
|
||||
nx_ctx_init(nx_ctx, HCOP_FC_SHA);
|
||||
|
||||
|
|
@ -41,10 +42,28 @@ static int nx_sha512_init(struct shash_desc *desc)
|
|||
nx_ctx->ap = &nx_ctx->props[NX_PROPS_SHA512];
|
||||
|
||||
NX_CPB_SET_DIGEST_SIZE(nx_ctx->csbcpb, NX_DS_SHA512);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, (u8 *)sctx->state,
|
||||
SHA512_DIGEST_SIZE, nx_ctx->ap->sglen);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
|
||||
len = SHA512_DIGEST_SIZE;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->out_sg,
|
||||
&nx_ctx->op.outlen,
|
||||
&len,
|
||||
(u8 *)sctx->state,
|
||||
NX_DS_SHA512);
|
||||
|
||||
if (rc || len != SHA512_DIGEST_SIZE)
|
||||
goto out;
|
||||
|
||||
sctx->state[0] = __cpu_to_be64(SHA512_H0);
|
||||
sctx->state[1] = __cpu_to_be64(SHA512_H1);
|
||||
sctx->state[2] = __cpu_to_be64(SHA512_H2);
|
||||
sctx->state[3] = __cpu_to_be64(SHA512_H3);
|
||||
sctx->state[4] = __cpu_to_be64(SHA512_H4);
|
||||
sctx->state[5] = __cpu_to_be64(SHA512_H5);
|
||||
sctx->state[6] = __cpu_to_be64(SHA512_H6);
|
||||
sctx->state[7] = __cpu_to_be64(SHA512_H7);
|
||||
sctx->count[0] = 0;
|
||||
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -54,11 +73,11 @@ static int nx_sha512_update(struct shash_desc *desc, const u8 *data,
|
|||
struct sha512_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
struct nx_sg *in_sg;
|
||||
u64 to_process, leftover, total, spbc_bits;
|
||||
u32 max_sg_len;
|
||||
u64 to_process, leftover = 0, total;
|
||||
unsigned long irq_flags;
|
||||
int rc = 0;
|
||||
int data_len;
|
||||
u64 buf_len = (sctx->count[0] % SHA512_BLOCK_SIZE);
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
|
|
@ -66,16 +85,16 @@ static int nx_sha512_update(struct shash_desc *desc, const u8 *data,
|
|||
* 1: < SHA512_BLOCK_SIZE: copy into state, return 0
|
||||
* 2: >= SHA512_BLOCK_SIZE: process X blocks, copy in leftover
|
||||
*/
|
||||
total = sctx->count[0] + len;
|
||||
total = (sctx->count[0] % SHA512_BLOCK_SIZE) + len;
|
||||
if (total < SHA512_BLOCK_SIZE) {
|
||||
memcpy(sctx->buf + sctx->count[0], data, len);
|
||||
memcpy(sctx->buf + buf_len, data, len);
|
||||
sctx->count[0] += len;
|
||||
goto out;
|
||||
}
|
||||
|
||||
in_sg = nx_ctx->in_sg;
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len/sizeof(struct nx_sg),
|
||||
nx_ctx->ap->sglen);
|
||||
memcpy(csbcpb->cpb.sha512.message_digest, sctx->state, SHA512_DIGEST_SIZE);
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
|
||||
do {
|
||||
/*
|
||||
|
|
@ -83,34 +102,43 @@ static int nx_sha512_update(struct shash_desc *desc, const u8 *data,
|
|||
* this update. This value is also restricted by the sg list
|
||||
* limits.
|
||||
*/
|
||||
to_process = min_t(u64, total, nx_ctx->ap->databytelen);
|
||||
to_process = min_t(u64, to_process,
|
||||
NX_PAGE_SIZE * (max_sg_len - 1));
|
||||
to_process = total - leftover;
|
||||
to_process = to_process & ~(SHA512_BLOCK_SIZE - 1);
|
||||
leftover = total - to_process;
|
||||
|
||||
if (sctx->count[0]) {
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg,
|
||||
(u8 *) sctx->buf,
|
||||
sctx->count[0], max_sg_len);
|
||||
}
|
||||
in_sg = nx_build_sg_list(in_sg, (u8 *) data,
|
||||
to_process - sctx->count[0],
|
||||
max_sg_len);
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) *
|
||||
sizeof(struct nx_sg);
|
||||
if (buf_len) {
|
||||
data_len = buf_len;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->in_sg,
|
||||
&nx_ctx->op.inlen,
|
||||
&data_len,
|
||||
(u8 *) sctx->buf,
|
||||
NX_DS_SHA512);
|
||||
|
||||
if (NX_CPB_FDM(csbcpb) & NX_FDM_CONTINUATION) {
|
||||
/*
|
||||
* we've hit the nx chip previously and we're updating
|
||||
* again, so copy over the partial digest.
|
||||
*/
|
||||
memcpy(csbcpb->cpb.sha512.input_partial_digest,
|
||||
if (rc || data_len != buf_len)
|
||||
goto out;
|
||||
}
|
||||
|
||||
data_len = to_process - buf_len;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->in_sg,
|
||||
&nx_ctx->op.inlen,
|
||||
&data_len,
|
||||
(u8 *) data,
|
||||
NX_DS_SHA512);
|
||||
|
||||
if (rc || data_len != (to_process - buf_len))
|
||||
goto out;
|
||||
|
||||
to_process = (data_len + buf_len);
|
||||
leftover = total - to_process;
|
||||
|
||||
/*
|
||||
* we've hit the nx chip previously and we're updating
|
||||
* again, so copy over the partial digest.
|
||||
*/
|
||||
memcpy(csbcpb->cpb.sha512.input_partial_digest,
|
||||
csbcpb->cpb.sha512.message_digest,
|
||||
SHA512_DIGEST_SIZE);
|
||||
}
|
||||
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
if (!nx_ctx->op.inlen || !nx_ctx->op.outlen) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
|
|
@ -122,24 +150,18 @@ static int nx_sha512_update(struct shash_desc *desc, const u8 *data,
|
|||
goto out;
|
||||
|
||||
atomic_inc(&(nx_ctx->stats->sha512_ops));
|
||||
spbc_bits = csbcpb->cpb.sha512.spbc * 8;
|
||||
csbcpb->cpb.sha512.message_bit_length_lo += spbc_bits;
|
||||
if (csbcpb->cpb.sha512.message_bit_length_lo < spbc_bits)
|
||||
csbcpb->cpb.sha512.message_bit_length_hi++;
|
||||
|
||||
/* everything after the first update is continuation */
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
|
||||
total -= to_process;
|
||||
data += to_process - sctx->count[0];
|
||||
sctx->count[0] = 0;
|
||||
in_sg = nx_ctx->in_sg;
|
||||
data += to_process - buf_len;
|
||||
buf_len = 0;
|
||||
|
||||
} while (leftover >= SHA512_BLOCK_SIZE);
|
||||
|
||||
/* copy the leftover back into the state struct */
|
||||
if (leftover)
|
||||
memcpy(sctx->buf, data, leftover);
|
||||
sctx->count[0] = leftover;
|
||||
sctx->count[0] += len;
|
||||
memcpy(sctx->state, csbcpb->cpb.sha512.message_digest, SHA512_DIGEST_SIZE);
|
||||
out:
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
return rc;
|
||||
|
|
@ -150,39 +172,52 @@ static int nx_sha512_final(struct shash_desc *desc, u8 *out)
|
|||
struct sha512_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
struct nx_sg *in_sg, *out_sg;
|
||||
u32 max_sg_len;
|
||||
u64 count0;
|
||||
unsigned long irq_flags;
|
||||
int rc;
|
||||
int len;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
|
||||
max_sg_len = min_t(u32, nx_driver.of.max_sg_len, nx_ctx->ap->sglen);
|
||||
|
||||
if (NX_CPB_FDM(csbcpb) & NX_FDM_CONTINUATION) {
|
||||
/* we've hit the nx chip previously, now we're finalizing,
|
||||
* so copy over the partial digest */
|
||||
memcpy(csbcpb->cpb.sha512.input_partial_digest,
|
||||
csbcpb->cpb.sha512.message_digest, SHA512_DIGEST_SIZE);
|
||||
}
|
||||
|
||||
/* final is represented by continuing the operation and indicating that
|
||||
* this is not an intermediate operation */
|
||||
if (sctx->count[0] >= SHA512_BLOCK_SIZE) {
|
||||
/* we've hit the nx chip previously, now we're finalizing,
|
||||
* so copy over the partial digest */
|
||||
memcpy(csbcpb->cpb.sha512.input_partial_digest, sctx->state,
|
||||
SHA512_DIGEST_SIZE);
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
} else {
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_CONTINUATION;
|
||||
}
|
||||
|
||||
NX_CPB_FDM(csbcpb) &= ~NX_FDM_INTERMEDIATE;
|
||||
|
||||
count0 = sctx->count[0] * 8;
|
||||
|
||||
csbcpb->cpb.sha512.message_bit_length_lo += count0;
|
||||
if (csbcpb->cpb.sha512.message_bit_length_lo < count0)
|
||||
csbcpb->cpb.sha512.message_bit_length_hi++;
|
||||
csbcpb->cpb.sha512.message_bit_length_lo = count0;
|
||||
|
||||
in_sg = nx_build_sg_list(nx_ctx->in_sg, sctx->buf, sctx->count[0],
|
||||
max_sg_len);
|
||||
out_sg = nx_build_sg_list(nx_ctx->out_sg, out, SHA512_DIGEST_SIZE,
|
||||
max_sg_len);
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - in_sg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - out_sg) * sizeof(struct nx_sg);
|
||||
len = sctx->count[0] & (SHA512_BLOCK_SIZE - 1);
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->in_sg,
|
||||
&nx_ctx->op.inlen,
|
||||
&len,
|
||||
(u8 *)sctx->buf,
|
||||
NX_DS_SHA512);
|
||||
|
||||
if (rc || len != (sctx->count[0] & (SHA512_BLOCK_SIZE - 1)))
|
||||
goto out;
|
||||
|
||||
len = SHA512_DIGEST_SIZE;
|
||||
rc = nx_sha_build_sg_list(nx_ctx, nx_ctx->out_sg,
|
||||
&nx_ctx->op.outlen,
|
||||
&len,
|
||||
out,
|
||||
NX_DS_SHA512);
|
||||
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (!nx_ctx->op.outlen) {
|
||||
rc = -EINVAL;
|
||||
|
|
@ -195,8 +230,7 @@ static int nx_sha512_final(struct shash_desc *desc, u8 *out)
|
|||
goto out;
|
||||
|
||||
atomic_inc(&(nx_ctx->stats->sha512_ops));
|
||||
atomic64_add(csbcpb->cpb.sha512.message_bit_length_lo / 8,
|
||||
&(nx_ctx->stats->sha512_bytes));
|
||||
atomic64_add(sctx->count[0], &(nx_ctx->stats->sha512_bytes));
|
||||
|
||||
memcpy(out, csbcpb->cpb.sha512.message_digest, SHA512_DIGEST_SIZE);
|
||||
out:
|
||||
|
|
@ -207,74 +241,18 @@ out:
|
|||
static int nx_sha512_export(struct shash_desc *desc, void *out)
|
||||
{
|
||||
struct sha512_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
struct sha512_state *octx = out;
|
||||
unsigned long irq_flags;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
memcpy(out, sctx, sizeof(*sctx));
|
||||
|
||||
/* move message_bit_length (128 bits) into count and convert its value
|
||||
* to bytes */
|
||||
octx->count[0] = csbcpb->cpb.sha512.message_bit_length_lo >> 3 |
|
||||
((csbcpb->cpb.sha512.message_bit_length_hi & 7) << 61);
|
||||
octx->count[1] = csbcpb->cpb.sha512.message_bit_length_hi >> 3;
|
||||
|
||||
octx->count[0] += sctx->count[0];
|
||||
if (octx->count[0] < sctx->count[0])
|
||||
octx->count[1]++;
|
||||
|
||||
memcpy(octx->buf, sctx->buf, sizeof(octx->buf));
|
||||
|
||||
/* if no data has been processed yet, we need to export SHA512's
|
||||
* initial data, in case this context gets imported into a software
|
||||
* context */
|
||||
if (csbcpb->cpb.sha512.message_bit_length_hi ||
|
||||
csbcpb->cpb.sha512.message_bit_length_lo)
|
||||
memcpy(octx->state, csbcpb->cpb.sha512.message_digest,
|
||||
SHA512_DIGEST_SIZE);
|
||||
else {
|
||||
octx->state[0] = SHA512_H0;
|
||||
octx->state[1] = SHA512_H1;
|
||||
octx->state[2] = SHA512_H2;
|
||||
octx->state[3] = SHA512_H3;
|
||||
octx->state[4] = SHA512_H4;
|
||||
octx->state[5] = SHA512_H5;
|
||||
octx->state[6] = SHA512_H6;
|
||||
octx->state[7] = SHA512_H7;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nx_sha512_import(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
struct sha512_state *sctx = shash_desc_ctx(desc);
|
||||
struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(&desc->tfm->base);
|
||||
struct nx_csbcpb *csbcpb = (struct nx_csbcpb *)nx_ctx->csbcpb;
|
||||
const struct sha512_state *ictx = in;
|
||||
unsigned long irq_flags;
|
||||
|
||||
spin_lock_irqsave(&nx_ctx->lock, irq_flags);
|
||||
memcpy(sctx, in, sizeof(*sctx));
|
||||
|
||||
memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf));
|
||||
sctx->count[0] = ictx->count[0] & 0x3f;
|
||||
csbcpb->cpb.sha512.message_bit_length_lo = (ictx->count[0] & ~0x3f)
|
||||
<< 3;
|
||||
csbcpb->cpb.sha512.message_bit_length_hi = ictx->count[1] << 3 |
|
||||
ictx->count[0] >> 61;
|
||||
|
||||
if (csbcpb->cpb.sha512.message_bit_length_hi ||
|
||||
csbcpb->cpb.sha512.message_bit_length_lo) {
|
||||
memcpy(csbcpb->cpb.sha512.message_digest, ictx->state,
|
||||
SHA512_DIGEST_SIZE);
|
||||
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_CONTINUATION;
|
||||
NX_CPB_FDM(csbcpb) |= NX_FDM_INTERMEDIATE;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&nx_ctx->lock, irq_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ int nx_hcall_sync(struct nx_crypto_ctx *nx_ctx,
|
|||
*/
|
||||
struct nx_sg *nx_build_sg_list(struct nx_sg *sg_head,
|
||||
u8 *start_addr,
|
||||
unsigned int len,
|
||||
unsigned int *len,
|
||||
u32 sgmax)
|
||||
{
|
||||
unsigned int sg_len = 0;
|
||||
|
|
@ -106,7 +106,7 @@ struct nx_sg *nx_build_sg_list(struct nx_sg *sg_head,
|
|||
else
|
||||
sg_addr = __pa(sg_addr);
|
||||
|
||||
end_addr = sg_addr + len;
|
||||
end_addr = sg_addr + *len;
|
||||
|
||||
/* each iteration will write one struct nx_sg element and add the
|
||||
* length of data described by that element to sg_len. Once @len bytes
|
||||
|
|
@ -118,7 +118,7 @@ struct nx_sg *nx_build_sg_list(struct nx_sg *sg_head,
|
|||
* Also when using vmalloc'ed data, every time that a system page
|
||||
* boundary is crossed the physical address needs to be re-calculated.
|
||||
*/
|
||||
for (sg = sg_head; sg_len < len; sg++) {
|
||||
for (sg = sg_head; sg_len < *len; sg++) {
|
||||
u64 next_page;
|
||||
|
||||
sg->addr = sg_addr;
|
||||
|
|
@ -133,15 +133,17 @@ struct nx_sg *nx_build_sg_list(struct nx_sg *sg_head,
|
|||
is_vmalloc_addr(start_addr + sg_len)) {
|
||||
sg_addr = page_to_phys(vmalloc_to_page(
|
||||
start_addr + sg_len));
|
||||
end_addr = sg_addr + len - sg_len;
|
||||
end_addr = sg_addr + *len - sg_len;
|
||||
}
|
||||
|
||||
if ((sg - sg_head) == sgmax) {
|
||||
pr_err("nx: scatter/gather list overflow, pid: %d\n",
|
||||
current->pid);
|
||||
return NULL;
|
||||
sg++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*len = sg_len;
|
||||
|
||||
/* return the moved sg_head pointer */
|
||||
return sg;
|
||||
|
|
@ -160,11 +162,11 @@ struct nx_sg *nx_walk_and_build(struct nx_sg *nx_dst,
|
|||
unsigned int sglen,
|
||||
struct scatterlist *sg_src,
|
||||
unsigned int start,
|
||||
unsigned int src_len)
|
||||
unsigned int *src_len)
|
||||
{
|
||||
struct scatter_walk walk;
|
||||
struct nx_sg *nx_sg = nx_dst;
|
||||
unsigned int n, offset = 0, len = src_len;
|
||||
unsigned int n, offset = 0, len = *src_len;
|
||||
char *dst;
|
||||
|
||||
/* we need to fast forward through @start bytes first */
|
||||
|
|
@ -182,26 +184,100 @@ struct nx_sg *nx_walk_and_build(struct nx_sg *nx_dst,
|
|||
* element we're currently looking at */
|
||||
scatterwalk_advance(&walk, start - offset);
|
||||
|
||||
while (len && nx_sg) {
|
||||
while (len && (nx_sg - nx_dst) < sglen) {
|
||||
n = scatterwalk_clamp(&walk, len);
|
||||
if (!n) {
|
||||
scatterwalk_start(&walk, sg_next(walk.sg));
|
||||
/* In cases where we have scatterlist chain scatterwalk_sg_next
|
||||
* handles with it properly */
|
||||
scatterwalk_start(&walk, scatterwalk_sg_next(walk.sg));
|
||||
n = scatterwalk_clamp(&walk, len);
|
||||
}
|
||||
dst = scatterwalk_map(&walk);
|
||||
|
||||
nx_sg = nx_build_sg_list(nx_sg, dst, n, sglen);
|
||||
nx_sg = nx_build_sg_list(nx_sg, dst, &n, sglen - (nx_sg - nx_dst));
|
||||
len -= n;
|
||||
|
||||
scatterwalk_unmap(dst);
|
||||
scatterwalk_advance(&walk, n);
|
||||
scatterwalk_done(&walk, SCATTERWALK_FROM_SG, len);
|
||||
}
|
||||
/* update to_process */
|
||||
*src_len -= len;
|
||||
|
||||
/* return the moved destination pointer */
|
||||
return nx_sg;
|
||||
}
|
||||
|
||||
/**
|
||||
* trim_sg_list - ensures the bound in sg list.
|
||||
* @sg: sg list head
|
||||
* @end: sg lisg end
|
||||
* @delta: is the amount we need to crop in order to bound the list.
|
||||
*
|
||||
*/
|
||||
static long int trim_sg_list(struct nx_sg *sg, struct nx_sg *end, unsigned int delta)
|
||||
{
|
||||
while (delta && end > sg) {
|
||||
struct nx_sg *last = end - 1;
|
||||
|
||||
if (last->len > delta) {
|
||||
last->len -= delta;
|
||||
delta = 0;
|
||||
} else {
|
||||
end--;
|
||||
delta -= last->len;
|
||||
}
|
||||
}
|
||||
return (sg - end) * sizeof(struct nx_sg);
|
||||
}
|
||||
|
||||
/**
|
||||
* nx_sha_build_sg_list - walk and build sg list to sha modes
|
||||
* using right bounds and limits.
|
||||
* @nx_ctx: NX crypto context for the lists we're building
|
||||
* @nx_sg: current sg list in or out list
|
||||
* @op_len: current op_len to be used in order to build a sg list
|
||||
* @nbytes: number or bytes to be processed
|
||||
* @offset: buf offset
|
||||
* @mode: SHA256 or SHA512
|
||||
*/
|
||||
int nx_sha_build_sg_list(struct nx_crypto_ctx *nx_ctx,
|
||||
struct nx_sg *nx_in_outsg,
|
||||
s64 *op_len,
|
||||
unsigned int *nbytes,
|
||||
u8 *offset,
|
||||
u32 mode)
|
||||
{
|
||||
unsigned int delta = 0;
|
||||
unsigned int total = *nbytes;
|
||||
struct nx_sg *nx_insg = nx_in_outsg;
|
||||
unsigned int max_sg_len;
|
||||
|
||||
max_sg_len = min_t(u64, nx_ctx->ap->sglen,
|
||||
nx_driver.of.max_sg_len/sizeof(struct nx_sg));
|
||||
max_sg_len = min_t(u64, max_sg_len,
|
||||
nx_ctx->ap->databytelen/NX_PAGE_SIZE);
|
||||
|
||||
*nbytes = min_t(u64, *nbytes, nx_ctx->ap->databytelen);
|
||||
nx_insg = nx_build_sg_list(nx_insg, offset, nbytes, max_sg_len);
|
||||
|
||||
switch (mode) {
|
||||
case NX_DS_SHA256:
|
||||
if (*nbytes < total)
|
||||
delta = *nbytes - (*nbytes & ~(SHA256_BLOCK_SIZE - 1));
|
||||
break;
|
||||
case NX_DS_SHA512:
|
||||
if (*nbytes < total)
|
||||
delta = *nbytes - (*nbytes & ~(SHA512_BLOCK_SIZE - 1));
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
*op_len = trim_sg_list(nx_in_outsg, nx_insg, delta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* nx_build_sg_lists - walk the input scatterlists and build arrays of NX
|
||||
* scatterlists based on them.
|
||||
|
|
@ -223,26 +299,39 @@ int nx_build_sg_lists(struct nx_crypto_ctx *nx_ctx,
|
|||
struct blkcipher_desc *desc,
|
||||
struct scatterlist *dst,
|
||||
struct scatterlist *src,
|
||||
unsigned int nbytes,
|
||||
unsigned int *nbytes,
|
||||
unsigned int offset,
|
||||
u8 *iv)
|
||||
{
|
||||
unsigned int delta = 0;
|
||||
unsigned int total = *nbytes;
|
||||
struct nx_sg *nx_insg = nx_ctx->in_sg;
|
||||
struct nx_sg *nx_outsg = nx_ctx->out_sg;
|
||||
unsigned int max_sg_len;
|
||||
|
||||
max_sg_len = min_t(u64, nx_ctx->ap->sglen,
|
||||
nx_driver.of.max_sg_len/sizeof(struct nx_sg));
|
||||
max_sg_len = min_t(u64, max_sg_len,
|
||||
nx_ctx->ap->databytelen/NX_PAGE_SIZE);
|
||||
|
||||
if (iv)
|
||||
memcpy(iv, desc->info, AES_BLOCK_SIZE);
|
||||
|
||||
nx_insg = nx_walk_and_build(nx_insg, nx_ctx->ap->sglen, src,
|
||||
offset, nbytes);
|
||||
nx_outsg = nx_walk_and_build(nx_outsg, nx_ctx->ap->sglen, dst,
|
||||
offset, nbytes);
|
||||
*nbytes = min_t(u64, *nbytes, nx_ctx->ap->databytelen);
|
||||
|
||||
nx_outsg = nx_walk_and_build(nx_outsg, max_sg_len, dst,
|
||||
offset, nbytes);
|
||||
nx_insg = nx_walk_and_build(nx_insg, max_sg_len, src,
|
||||
offset, nbytes);
|
||||
|
||||
if (*nbytes < total)
|
||||
delta = *nbytes - (*nbytes & ~(AES_BLOCK_SIZE - 1));
|
||||
|
||||
/* these lengths should be negative, which will indicate to phyp that
|
||||
* the input and output parameters are scatterlists, not linear
|
||||
* buffers */
|
||||
nx_ctx->op.inlen = (nx_ctx->in_sg - nx_insg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.outlen = (nx_ctx->out_sg - nx_outsg) * sizeof(struct nx_sg);
|
||||
nx_ctx->op.inlen = trim_sg_list(nx_ctx->in_sg, nx_insg, delta);
|
||||
nx_ctx->op.outlen = trim_sg_list(nx_ctx->out_sg, nx_outsg, delta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -540,10 +629,10 @@ static int nx_crypto_ctx_init(struct nx_crypto_ctx *nx_ctx, u32 fc, u32 mode)
|
|||
|
||||
/* we need an extra page for csbcpb_aead for these modes */
|
||||
if (mode == NX_MODE_AES_GCM || mode == NX_MODE_AES_CCM)
|
||||
nx_ctx->kmem_len = (4 * NX_PAGE_SIZE) +
|
||||
nx_ctx->kmem_len = (5 * NX_PAGE_SIZE) +
|
||||
sizeof(struct nx_csbcpb);
|
||||
else
|
||||
nx_ctx->kmem_len = (3 * NX_PAGE_SIZE) +
|
||||
nx_ctx->kmem_len = (4 * NX_PAGE_SIZE) +
|
||||
sizeof(struct nx_csbcpb);
|
||||
|
||||
nx_ctx->kmem = kmalloc(nx_ctx->kmem_len, GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -153,13 +153,15 @@ void nx_crypto_ctx_exit(struct crypto_tfm *tfm);
|
|||
void nx_ctx_init(struct nx_crypto_ctx *nx_ctx, unsigned int function);
|
||||
int nx_hcall_sync(struct nx_crypto_ctx *ctx, struct vio_pfo_op *op,
|
||||
u32 may_sleep);
|
||||
struct nx_sg *nx_build_sg_list(struct nx_sg *, u8 *, unsigned int, u32);
|
||||
int nx_sha_build_sg_list(struct nx_crypto_ctx *, struct nx_sg *,
|
||||
s64 *, unsigned int *, u8 *, u32);
|
||||
struct nx_sg *nx_build_sg_list(struct nx_sg *, u8 *, unsigned int *, u32);
|
||||
int nx_build_sg_lists(struct nx_crypto_ctx *, struct blkcipher_desc *,
|
||||
struct scatterlist *, struct scatterlist *, unsigned int,
|
||||
struct scatterlist *, struct scatterlist *, unsigned int *,
|
||||
unsigned int, u8 *);
|
||||
struct nx_sg *nx_walk_and_build(struct nx_sg *, unsigned int,
|
||||
struct scatterlist *, unsigned int,
|
||||
unsigned int);
|
||||
unsigned int *);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
#define NX_DEBUGFS_INIT(drv) nx_debugfs_init(drv)
|
||||
|
|
|
|||
|
|
@ -563,4 +563,4 @@ MODULE_DESCRIPTION("VIA PadLock AES algorithm support");
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Michal Ludvig");
|
||||
|
||||
MODULE_ALIAS("aes");
|
||||
MODULE_ALIAS_CRYPTO("aes");
|
||||
|
|
|
|||
|
|
@ -593,7 +593,7 @@ MODULE_DESCRIPTION("VIA PadLock SHA1/SHA256 algorithms support.");
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Michal Ludvig");
|
||||
|
||||
MODULE_ALIAS("sha1-all");
|
||||
MODULE_ALIAS("sha256-all");
|
||||
MODULE_ALIAS("sha1-padlock");
|
||||
MODULE_ALIAS("sha256-padlock");
|
||||
MODULE_ALIAS_CRYPTO("sha1-all");
|
||||
MODULE_ALIAS_CRYPTO("sha256-all");
|
||||
MODULE_ALIAS_CRYPTO("sha1-padlock");
|
||||
MODULE_ALIAS_CRYPTO("sha256-padlock");
|
||||
|
|
|
|||
|
|
@ -56,8 +56,6 @@
|
|||
#define PCI_VENDOR_ID_INTEL 0x8086
|
||||
#define ADF_DH895XCC_DEVICE_NAME "dh895xcc"
|
||||
#define ADF_DH895XCC_PCI_DEVICE_ID 0x435
|
||||
#define ADF_DH895XCC_PMISC_BAR 1
|
||||
#define ADF_DH895XCC_ETR_BAR 2
|
||||
#define ADF_PCI_MAX_BARS 3
|
||||
#define ADF_DEVICE_NAME_LENGTH 32
|
||||
#define ADF_ETR_MAX_RINGS_PER_BANK 16
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ static void adf_dev_restore(struct adf_accel_dev *accel_dev)
|
|||
uint16_t ppdstat = 0, bridge_ctl = 0;
|
||||
int pending = 0;
|
||||
|
||||
pr_info("QAT: Reseting device qat_dev%d\n", accel_dev->accel_id);
|
||||
pr_info("QAT: Resetting device qat_dev%d\n", accel_dev->accel_id);
|
||||
pci_read_config_word(pdev, PPDSTAT_OFFSET, &ppdstat);
|
||||
pending = ppdstat & PCI_EXP_DEVSTA_TRPND;
|
||||
if (pending) {
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/crypto.h>
|
||||
|
||||
#include "adf_accel_devices.h"
|
||||
#include "adf_common_drv.h"
|
||||
|
|
@ -487,4 +488,4 @@ module_exit(adf_unregister_ctl_device_driver);
|
|||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Intel");
|
||||
MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");
|
||||
MODULE_ALIAS("intel_qat");
|
||||
MODULE_ALIAS_CRYPTO("intel_qat");
|
||||
|
|
|
|||
|
|
@ -129,12 +129,13 @@ struct adf_accel_dev *adf_devmgr_get_first(void)
|
|||
* Function returns acceleration device associated with the given pci device.
|
||||
* To be used by QAT device specific drivers.
|
||||
*
|
||||
* Return: pinter to accel_dev or NULL if not found.
|
||||
* Return: pointer to accel_dev or NULL if not found.
|
||||
*/
|
||||
struct adf_accel_dev *adf_devmgr_pci_to_accel_dev(struct pci_dev *pci_dev)
|
||||
{
|
||||
struct list_head *itr;
|
||||
|
||||
mutex_lock(&table_lock);
|
||||
list_for_each(itr, &accel_table) {
|
||||
struct adf_accel_dev *ptr =
|
||||
list_entry(itr, struct adf_accel_dev, list);
|
||||
|
|
@ -144,6 +145,7 @@ struct adf_accel_dev *adf_devmgr_pci_to_accel_dev(struct pci_dev *pci_dev)
|
|||
return ptr;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&table_lock);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_devmgr_pci_to_accel_dev);
|
||||
|
|
@ -152,6 +154,7 @@ struct adf_accel_dev *adf_devmgr_get_dev_by_id(uint32_t id)
|
|||
{
|
||||
struct list_head *itr;
|
||||
|
||||
mutex_lock(&table_lock);
|
||||
list_for_each(itr, &accel_table) {
|
||||
struct adf_accel_dev *ptr =
|
||||
list_entry(itr, struct adf_accel_dev, list);
|
||||
|
|
@ -161,6 +164,7 @@ struct adf_accel_dev *adf_devmgr_get_dev_by_id(uint32_t id)
|
|||
return ptr;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&table_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -376,8 +376,9 @@ static inline int adf_get_cfg_int(struct adf_accel_dev *accel_dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void adf_enable_coalesc(struct adf_etr_bank_data *bank,
|
||||
const char *section, uint32_t bank_num_in_accel)
|
||||
static void adf_get_coalesc_timer(struct adf_etr_bank_data *bank,
|
||||
const char *section,
|
||||
uint32_t bank_num_in_accel)
|
||||
{
|
||||
if (adf_get_cfg_int(bank->accel_dev, section,
|
||||
ADF_ETRMGR_COALESCE_TIMER_FORMAT,
|
||||
|
|
@ -396,7 +397,7 @@ static int adf_init_bank(struct adf_accel_dev *accel_dev,
|
|||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
struct adf_etr_ring_data *ring;
|
||||
struct adf_etr_ring_data *tx_ring;
|
||||
uint32_t i, coalesc_enabled;
|
||||
uint32_t i, coalesc_enabled = 0;
|
||||
|
||||
memset(bank, 0, sizeof(*bank));
|
||||
bank->bank_number = bank_num;
|
||||
|
|
@ -407,10 +408,10 @@ static int adf_init_bank(struct adf_accel_dev *accel_dev,
|
|||
/* Enable IRQ coalescing always. This will allow to use
|
||||
* the optimised flag and coalesc register.
|
||||
* If it is disabled in the config file just use min time value */
|
||||
if (adf_get_cfg_int(accel_dev, "Accelerator0",
|
||||
ADF_ETRMGR_COALESCING_ENABLED_FORMAT,
|
||||
bank_num, &coalesc_enabled) && coalesc_enabled)
|
||||
adf_enable_coalesc(bank, "Accelerator0", bank_num);
|
||||
if ((adf_get_cfg_int(accel_dev, "Accelerator0",
|
||||
ADF_ETRMGR_COALESCING_ENABLED_FORMAT, bank_num,
|
||||
&coalesc_enabled) == 0) && coalesc_enabled)
|
||||
adf_get_coalesc_timer(bank, "Accelerator0", bank_num);
|
||||
else
|
||||
bank->irq_coalesc_timer = ADF_COALESCING_MIN_TIME;
|
||||
|
||||
|
|
|
|||
|
|
@ -83,14 +83,14 @@
|
|||
#define ADF_MAX_RING_SIZE ADF_RING_SIZE_4M
|
||||
#define ADF_DEFAULT_RING_SIZE ADF_RING_SIZE_16K
|
||||
|
||||
/* Valid internal msg size values internal */
|
||||
/* Valid internal msg size values */
|
||||
#define ADF_MSG_SIZE_32 0x01
|
||||
#define ADF_MSG_SIZE_64 0x02
|
||||
#define ADF_MSG_SIZE_128 0x04
|
||||
#define ADF_MIN_MSG_SIZE ADF_MSG_SIZE_32
|
||||
#define ADF_MAX_MSG_SIZE ADF_MSG_SIZE_128
|
||||
|
||||
/* Size to bytes conversion macros for ring and msg values */
|
||||
/* Size to bytes conversion macros for ring and msg size values */
|
||||
#define ADF_MSG_SIZE_TO_BYTES(SIZE) (SIZE << 5)
|
||||
#define ADF_BYTES_TO_MSG_SIZE(SIZE) (SIZE >> 5)
|
||||
#define ADF_SIZE_TO_RING_SIZE_IN_BYTES(SIZE) ((1 << (SIZE - 1)) << 7)
|
||||
|
|
@ -100,8 +100,11 @@
|
|||
#define ADF_RING_SIZE_BYTES_MIN(SIZE) ((SIZE < ADF_RING_SIZE_4K) ? \
|
||||
ADF_RING_SIZE_4K : SIZE)
|
||||
#define ADF_RING_SIZE_MODULO(SIZE) (SIZE + 0x6)
|
||||
#define ADF_SIZE_TO_POW(SIZE) ((((SIZE & 0x4) >> 1) | ((SIZE & 0x4) >> 2) | \
|
||||
SIZE) & ~0x4)
|
||||
/* Max outstanding requests */
|
||||
#define ADF_MAX_INFLIGHTS(RING_SIZE, MSG_SIZE) \
|
||||
((((1 << (RING_SIZE - 1)) << 4) >> MSG_SIZE) - 1)
|
||||
((((1 << (RING_SIZE - 1)) << 3) >> ADF_SIZE_TO_POW(MSG_SIZE)) - 1)
|
||||
#define BUILD_RING_CONFIG(size) \
|
||||
((ADF_RING_NEAR_WATERMARK_0 << ADF_RING_CONFIG_NEAR_FULL_WM) \
|
||||
| (ADF_RING_NEAR_WATERMARK_0 << ADF_RING_CONFIG_NEAR_EMPTY_WM) \
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash,
|
|||
__be64 *hash512_state_out;
|
||||
int i, offset;
|
||||
|
||||
memset(auth_state.data, '\0', MAX_AUTH_STATE_SIZE + 64);
|
||||
memzero_explicit(auth_state.data, MAX_AUTH_STATE_SIZE + 64);
|
||||
shash->tfm = ctx->hash_tfm;
|
||||
shash->flags = 0x0;
|
||||
|
||||
|
|
@ -174,13 +174,13 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash,
|
|||
|
||||
memcpy(ipad, buff, digest_size);
|
||||
memcpy(opad, buff, digest_size);
|
||||
memset(ipad + digest_size, 0, block_size - digest_size);
|
||||
memset(opad + digest_size, 0, block_size - digest_size);
|
||||
memzero_explicit(ipad + digest_size, block_size - digest_size);
|
||||
memzero_explicit(opad + digest_size, block_size - digest_size);
|
||||
} else {
|
||||
memcpy(ipad, auth_key, auth_keylen);
|
||||
memcpy(opad, auth_key, auth_keylen);
|
||||
memset(ipad + auth_keylen, 0, block_size - auth_keylen);
|
||||
memset(opad + auth_keylen, 0, block_size - auth_keylen);
|
||||
memzero_explicit(ipad + auth_keylen, block_size - auth_keylen);
|
||||
memzero_explicit(opad + auth_keylen, block_size - auth_keylen);
|
||||
}
|
||||
|
||||
for (i = 0; i < block_size; i++) {
|
||||
|
|
@ -254,6 +254,8 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash,
|
|||
default:
|
||||
return -EFAULT;
|
||||
}
|
||||
memzero_explicit(ipad, block_size);
|
||||
memzero_explicit(opad, block_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -466,7 +468,6 @@ static int qat_alg_init_sessions(struct qat_alg_session_ctx *ctx,
|
|||
break;
|
||||
default:
|
||||
goto bad_key;
|
||||
break;
|
||||
}
|
||||
|
||||
if (qat_alg_init_enc_session(ctx, alg, &keys))
|
||||
|
|
@ -493,12 +494,12 @@ static int qat_alg_setkey(struct crypto_aead *tfm, const uint8_t *key,
|
|||
if (ctx->enc_cd) {
|
||||
/* rekeying */
|
||||
dev = &GET_DEV(ctx->inst->accel_dev);
|
||||
memset(ctx->enc_cd, 0, sizeof(struct qat_alg_cd));
|
||||
memset(ctx->dec_cd, 0, sizeof(struct qat_alg_cd));
|
||||
memset(&ctx->enc_fw_req_tmpl, 0,
|
||||
sizeof(struct icp_qat_fw_la_bulk_req));
|
||||
memset(&ctx->dec_fw_req_tmpl, 0,
|
||||
sizeof(struct icp_qat_fw_la_bulk_req));
|
||||
memzero_explicit(ctx->enc_cd, sizeof(struct qat_alg_cd));
|
||||
memzero_explicit(ctx->dec_cd, sizeof(struct qat_alg_cd));
|
||||
memzero_explicit(&ctx->enc_fw_req_tmpl,
|
||||
sizeof(struct icp_qat_fw_la_bulk_req));
|
||||
memzero_explicit(&ctx->dec_fw_req_tmpl,
|
||||
sizeof(struct icp_qat_fw_la_bulk_req));
|
||||
} else {
|
||||
/* new key */
|
||||
int node = get_current_node();
|
||||
|
|
@ -535,10 +536,12 @@ static int qat_alg_setkey(struct crypto_aead *tfm, const uint8_t *key,
|
|||
return 0;
|
||||
|
||||
out_free_all:
|
||||
memzero_explicit(ctx->dec_cd, sizeof(struct qat_alg_cd));
|
||||
dma_free_coherent(dev, sizeof(struct qat_alg_cd),
|
||||
ctx->dec_cd, ctx->dec_cd_paddr);
|
||||
ctx->dec_cd = NULL;
|
||||
out_free_enc:
|
||||
memzero_explicit(ctx->enc_cd, sizeof(struct qat_alg_cd));
|
||||
dma_free_coherent(dev, sizeof(struct qat_alg_cd),
|
||||
ctx->enc_cd, ctx->enc_cd_paddr);
|
||||
ctx->enc_cd = NULL;
|
||||
|
|
@ -836,7 +839,7 @@ static int qat_alg_init(struct crypto_tfm *tfm,
|
|||
{
|
||||
struct qat_alg_session_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
memset(ctx, '\0', sizeof(*ctx));
|
||||
memzero_explicit(ctx, sizeof(*ctx));
|
||||
ctx->hash_tfm = crypto_alloc_shash(hash_name, 0, 0);
|
||||
if (IS_ERR(ctx->hash_tfm))
|
||||
return -EFAULT;
|
||||
|
|
@ -876,12 +879,16 @@ static void qat_alg_exit(struct crypto_tfm *tfm)
|
|||
return;
|
||||
|
||||
dev = &GET_DEV(inst->accel_dev);
|
||||
if (ctx->enc_cd)
|
||||
if (ctx->enc_cd) {
|
||||
memzero_explicit(ctx->enc_cd, sizeof(struct qat_alg_cd));
|
||||
dma_free_coherent(dev, sizeof(struct qat_alg_cd),
|
||||
ctx->enc_cd, ctx->enc_cd_paddr);
|
||||
if (ctx->dec_cd)
|
||||
}
|
||||
if (ctx->dec_cd) {
|
||||
memzero_explicit(ctx->dec_cd, sizeof(struct qat_alg_cd));
|
||||
dma_free_coherent(dev, sizeof(struct qat_alg_cd),
|
||||
ctx->dec_cd, ctx->dec_cd_paddr);
|
||||
}
|
||||
qat_crypto_put_instance(inst);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -679,7 +679,8 @@ int qat_hal_init(struct adf_accel_dev *accel_dev)
|
|||
struct icp_qat_fw_loader_handle *handle;
|
||||
struct adf_accel_pci *pci_info = &accel_dev->accel_pci_dev;
|
||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
struct adf_bar *bar = &pci_info->pci_bars[ADF_DH895XCC_PMISC_BAR];
|
||||
struct adf_bar *bar =
|
||||
&pci_info->pci_bars[hw_data->get_misc_bar_id(hw_data)];
|
||||
|
||||
handle = kzalloc(sizeof(*handle), GFP_KERNEL);
|
||||
if (!handle)
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@
|
|||
#define ADF_DH895x_HW_DATA_H_
|
||||
|
||||
/* PCIe configuration space */
|
||||
#define ADF_DH895XCC_PMISC_BAR 1
|
||||
#define ADF_DH895XCC_ETR_BAR 2
|
||||
#define ADF_DH895XCC_RX_RINGS_OFFSET 8
|
||||
#define ADF_DH895XCC_TX_RINGS_MASK 0xFF
|
||||
#define ADF_DH895XCC_FUSECTL_OFFSET 0x40
|
||||
|
|
|
|||
|
|
@ -186,10 +186,8 @@ static int adf_isr_alloc_msix_entry_table(struct adf_accel_dev *accel_dev)
|
|||
accel_dev->accel_pci_dev.msix_entries.names = names;
|
||||
return 0;
|
||||
err:
|
||||
for (i = 0; i < msix_num_entries; i++) {
|
||||
if (*(names + i))
|
||||
kfree(*(names + i));
|
||||
}
|
||||
for (i = 0; i < msix_num_entries; i++)
|
||||
kfree(*(names + i));
|
||||
kfree(entries);
|
||||
kfree(names);
|
||||
return -ENOMEM;
|
||||
|
|
@ -203,10 +201,8 @@ static void adf_isr_free_msix_entry_table(struct adf_accel_dev *accel_dev)
|
|||
int i;
|
||||
|
||||
kfree(accel_dev->accel_pci_dev.msix_entries.entries);
|
||||
for (i = 0; i < msix_num_entries; i++) {
|
||||
if (*(names + i))
|
||||
kfree(*(names + i));
|
||||
}
|
||||
for (i = 0; i < msix_num_entries; i++)
|
||||
kfree(*(names + i));
|
||||
kfree(names);
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1688,6 +1688,7 @@ static void ux500_cryp_shutdown(struct platform_device *pdev)
|
|||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int ux500_cryp_suspend(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -1768,6 +1769,7 @@ static int ux500_cryp_resume(struct device *dev)
|
|||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(ux500_cryp_pm, ux500_cryp_suspend, ux500_cryp_resume);
|
||||
|
||||
|
|
@ -1810,7 +1812,7 @@ module_exit(ux500_cryp_mod_fini);
|
|||
module_param(cryp_mode, int, 0);
|
||||
|
||||
MODULE_DESCRIPTION("Driver for ST-Ericsson UX500 CRYP crypto engine.");
|
||||
MODULE_ALIAS("aes-all");
|
||||
MODULE_ALIAS("des-all");
|
||||
MODULE_ALIAS_CRYPTO("aes-all");
|
||||
MODULE_ALIAS_CRYPTO("des-all");
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
|||
|
|
@ -1881,6 +1881,7 @@ static void ux500_hash_shutdown(struct platform_device *pdev)
|
|||
__func__);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
/**
|
||||
* ux500_hash_suspend - Function that suspends the hash device.
|
||||
* @dev: Device to suspend.
|
||||
|
|
@ -1949,6 +1950,7 @@ static int ux500_hash_resume(struct device *dev)
|
|||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(ux500_hash_pm, ux500_hash_suspend, ux500_hash_resume);
|
||||
|
||||
|
|
@ -1995,7 +1997,7 @@ module_exit(ux500_hash_mod_fini);
|
|||
MODULE_DESCRIPTION("Driver for ST-Ericsson UX500 HASH engine.");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
MODULE_ALIAS("sha1-all");
|
||||
MODULE_ALIAS("sha256-all");
|
||||
MODULE_ALIAS("hmac-sha1-all");
|
||||
MODULE_ALIAS("hmac-sha256-all");
|
||||
MODULE_ALIAS_CRYPTO("sha1-all");
|
||||
MODULE_ALIAS_CRYPTO("sha256-all");
|
||||
MODULE_ALIAS_CRYPTO("hmac-sha1-all");
|
||||
MODULE_ALIAS_CRYPTO("hmac-sha256-all");
|
||||
|
|
|
|||
Loading…
Reference in a new issue