Re: [PATCH] kernel crypto API interface specification

2014-10-30 Thread Marek Vasut
On Thursday, October 16, 2014 at 03:10:07 PM, Herbert Xu wrote:
> On Tue, Oct 14, 2014 at 09:46:50PM +0200, Stephan Mueller wrote:
> > The update adds a complete interface documentation of the kernel crypto
> > API. All cipher types supported by the kernel crypto API are documented.
> > 
> > In addition, kernel and user space example code is provided. The sample
> > code covers synchronous and asynchronous cipher operation, random
> > number generation and performing hashing as well as encryption and
> > decryption in user space.
> > 
> > Signed-off-by: Stephan Mueller 
> 
> Thanks for the patch Stephan!
> 
> Marek Vasut  has also been working on a set of
> documentation for the crypto API so he might have some comments
> on this.

Sorry for the late reply, thanks for keeping me in the loop.

I can share the last state of the document I wrote. Currently,
it is not possible for me to keep up with my workload and do
anything else, so that's all I can do.

Apologies.

Best regards,
Marek Vasut
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v5 4/4] crypto: Add Allwinner Security System crypto accelerator

2014-10-30 Thread Maxime Ripard
On Fri, Oct 24, 2014 at 08:52:26PM +0200, Corentin LABBE wrote:
> On 10/21/14 21:11, Maxime Ripard wrote:
> > Hi Corentin,
> > 
> > Thanks for resending it.
> > 
> > On Sun, Oct 19, 2014 at 04:16:22PM +0200, LABBE Corentin wrote:
> >> Add support for the Security System included in Allwinner SoC A20.
> >> The Security System is a hardware cryptographic accelerator that support 
> >> AES/MD5/SHA1/DES/3DES/PRNG algorithms.
> >>
> >> Signed-off-by: LABBE Corentin 
> >> ---
> >>  drivers/crypto/Kconfig|  17 ++
> >> +static int sunxi_ss_aes_poll_atomic(struct ablkcipher_request *areq)
> >> +{
> >> +  u32 spaces;
> >> +  struct scatterlist *in_sg = areq->src;
> >> +  struct scatterlist *out_sg = areq->dst;
> >> +  void *src_addr;
> >> +  void *dst_addr;
> >> +  unsigned int ileft = areq->nbytes;
> >> +  unsigned int oleft = areq->nbytes;
> >> +  unsigned int todo;
> >> +  u32 *src32;
> >> +  u32 *dst32;
> >> +  u32 rx_cnt = 32;
> >> +  u32 tx_cnt = 0;
> >> +  int i;
> >> +
> >> +  src_addr = kmap_atomic(sg_page(in_sg)) + in_sg->offset;
> > 
> > Where does this scatter_list is coming from? Can it even be allocated
> > in highmem?
> > 
> 
> With AF_ALG and cryptodev, the SG is in highmem. Verified with some
> PageHighMem().

Then fix AF_ALG and cryptodev, because all of the other drivers might
be affected.

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com


signature.asc
Description: Digital signature


[PATCH] crypto: caam - add support for rfc4543(gcm(aes))

2014-10-30 Thread Tudor Ambarus
Add AES-GMAC as an IPSec ESP mechanism to provide
data origin authentication, but not confidentiality.
This method is referred as ENCR_NULL_AUTH_AES_GMAC.

Signed-off-by: Tudor Ambarus 
---
removed a blank line introduced in aead_encrypt function.

 drivers/crypto/caam/caamalg.c | 458 +-
 1 file changed, 457 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c
index c17154c..50c526c 100644
--- a/drivers/crypto/caam/caamalg.c
+++ b/drivers/crypto/caam/caamalg.c
@@ -83,13 +83,18 @@
 #define DESC_RFC4106_DEC_LEN   (DESC_RFC4106_BASE + 14 * CAAM_CMD_SZ)
 #define DESC_RFC4106_GIVENC_LEN(DESC_RFC4106_BASE + 21 * 
CAAM_CMD_SZ)
 
+#define DESC_RFC4543_BASE  (3 * CAAM_CMD_SZ)
+#define DESC_RFC4543_ENC_LEN   (DESC_RFC4543_BASE + 25 * CAAM_CMD_SZ)
+#define DESC_RFC4543_DEC_LEN   (DESC_RFC4543_BASE + 27 * CAAM_CMD_SZ)
+#define DESC_RFC4543_GIVENC_LEN(DESC_RFC4543_BASE + 30 * 
CAAM_CMD_SZ)
+
 #define DESC_ABLKCIPHER_BASE   (3 * CAAM_CMD_SZ)
 #define DESC_ABLKCIPHER_ENC_LEN(DESC_ABLKCIPHER_BASE + \
 20 * CAAM_CMD_SZ)
 #define DESC_ABLKCIPHER_DEC_LEN(DESC_ABLKCIPHER_BASE + \
 15 * CAAM_CMD_SZ)
 
-#define DESC_MAX_USED_BYTES(DESC_AEAD_GIVENC_LEN + \
+#define DESC_MAX_USED_BYTES(DESC_RFC4543_GIVENC_LEN + \
 CAAM_MAX_KEY_SIZE)
 #define DESC_MAX_USED_LEN  (DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
 
@@ -1150,6 +1155,401 @@ static int rfc4106_setauthsize(struct crypto_aead 
*authenc,
return 0;
 }
 
+static int rfc4543_set_sh_desc(struct crypto_aead *aead)
+{
+   struct aead_tfm *tfm = &aead->base.crt_aead;
+   struct caam_ctx *ctx = crypto_aead_ctx(aead);
+   struct device *jrdev = ctx->jrdev;
+   bool keys_fit_inline = false;
+   u32 *key_jump_cmd, *write_iv_cmd, *write_aad_cmd;
+   u32 *read_move_cmd, *write_move_cmd;
+   u32 *desc;
+   u32 geniv;
+
+   if (!ctx->enckeylen || !ctx->authsize)
+   return 0;
+
+   /*
+* RFC4543 encrypt shared descriptor
+* Job Descriptor and Shared Descriptor
+* must fit into the 64-word Descriptor h/w Buffer
+*/
+   if (DESC_RFC4543_ENC_LEN + DESC_JOB_IO_LEN +
+   ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
+   keys_fit_inline = true;
+
+   desc = ctx->sh_desc_enc;
+
+   init_sh_desc(desc, HDR_SHARE_SERIAL);
+
+   /* Skip key loading if it is loaded due to sharing */
+   key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
+  JUMP_COND_SHRD);
+   if (keys_fit_inline)
+   append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
+ ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
+   else
+   append_key(desc, ctx->key_dma, ctx->enckeylen,
+  CLASS_1 | KEY_DEST_CLASS_REG);
+   set_jump_tgt_here(desc, key_jump_cmd);
+
+   /* Class 1 operation */
+   append_operation(desc, ctx->class1_alg_type |
+OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
+
+   /* Load AES-GMAC ESP IV into Math1 register */
+   append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_WORD_DECO_MATH1 |
+  LDST_CLASS_DECO | tfm->ivsize);
+
+   /* Wait the DMA transaction to finish */
+   append_jump(desc, JUMP_TEST_ALL | JUMP_COND_CALM |
+   (1 << JUMP_OFFSET_SHIFT));
+
+   /* Overwrite blank immediate AES-GMAC ESP IV data */
+   write_iv_cmd = append_move(desc, MOVE_SRC_MATH1 | MOVE_DEST_DESCBUF |
+  (tfm->ivsize << MOVE_LEN_SHIFT));
+
+   /* Overwrite blank immediate AAD data */
+   write_aad_cmd = append_move(desc, MOVE_SRC_MATH1 | MOVE_DEST_DESCBUF |
+   (tfm->ivsize << MOVE_LEN_SHIFT));
+
+   /* cryptlen = seqoutlen - authsize */
+   append_math_sub_imm_u32(desc, REG3, SEQOUTLEN, IMM, ctx->authsize);
+
+   /* assoclen = (seqinlen - ivsize) - cryptlen */
+   append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
+
+   /* Read Salt and AES-GMAC ESP IV */
+   append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE |
+  FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | (4 + tfm->ivsize));
+   /* Append Salt */
+   append_data(desc, (void *)(ctx->key + ctx->enckeylen), 4);
+   set_move_tgt_here(desc, write_iv_cmd);
+   /* Blank commands. Will be overwritten by AES-GMAC ESP IV. */
+   append_cmd(desc, 0x);
+   append_cmd(desc, 0x);
+   /* End of blank commands */
+
+   /* Read assoc data */
+   append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
+FIFOLD_TYPE_AA

[PATCH] crypto: caam - add support for rfc4543(gcm(aes))

2014-10-30 Thread Tudor Ambarus
Add AES-GMAC as an IPSec ESP mechanism to provide
data origin authentication, but not confidentiality.
This method is referred as ENCR_NULL_AUTH_AES_GMAC.

Signed-off-by: Tudor Ambarus 
---
 drivers/crypto/caam/caamalg.c | 459 +-
 1 file changed, 458 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c
index c17154c..02b417f 100644
--- a/drivers/crypto/caam/caamalg.c
+++ b/drivers/crypto/caam/caamalg.c
@@ -83,13 +83,18 @@
 #define DESC_RFC4106_DEC_LEN   (DESC_RFC4106_BASE + 14 * CAAM_CMD_SZ)
 #define DESC_RFC4106_GIVENC_LEN(DESC_RFC4106_BASE + 21 * 
CAAM_CMD_SZ)
 
+#define DESC_RFC4543_BASE  (3 * CAAM_CMD_SZ)
+#define DESC_RFC4543_ENC_LEN   (DESC_RFC4543_BASE + 25 * CAAM_CMD_SZ)
+#define DESC_RFC4543_DEC_LEN   (DESC_RFC4543_BASE + 27 * CAAM_CMD_SZ)
+#define DESC_RFC4543_GIVENC_LEN(DESC_RFC4543_BASE + 30 * 
CAAM_CMD_SZ)
+
 #define DESC_ABLKCIPHER_BASE   (3 * CAAM_CMD_SZ)
 #define DESC_ABLKCIPHER_ENC_LEN(DESC_ABLKCIPHER_BASE + \
 20 * CAAM_CMD_SZ)
 #define DESC_ABLKCIPHER_DEC_LEN(DESC_ABLKCIPHER_BASE + \
 15 * CAAM_CMD_SZ)
 
-#define DESC_MAX_USED_BYTES(DESC_AEAD_GIVENC_LEN + \
+#define DESC_MAX_USED_BYTES(DESC_RFC4543_GIVENC_LEN + \
 CAAM_MAX_KEY_SIZE)
 #define DESC_MAX_USED_LEN  (DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
 
@@ -1150,6 +1155,401 @@ static int rfc4106_setauthsize(struct crypto_aead 
*authenc,
return 0;
 }
 
+static int rfc4543_set_sh_desc(struct crypto_aead *aead)
+{
+   struct aead_tfm *tfm = &aead->base.crt_aead;
+   struct caam_ctx *ctx = crypto_aead_ctx(aead);
+   struct device *jrdev = ctx->jrdev;
+   bool keys_fit_inline = false;
+   u32 *key_jump_cmd, *write_iv_cmd, *write_aad_cmd;
+   u32 *read_move_cmd, *write_move_cmd;
+   u32 *desc;
+   u32 geniv;
+
+   if (!ctx->enckeylen || !ctx->authsize)
+   return 0;
+
+   /*
+* RFC4543 encrypt shared descriptor
+* Job Descriptor and Shared Descriptor
+* must fit into the 64-word Descriptor h/w Buffer
+*/
+   if (DESC_RFC4543_ENC_LEN + DESC_JOB_IO_LEN +
+   ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
+   keys_fit_inline = true;
+
+   desc = ctx->sh_desc_enc;
+
+   init_sh_desc(desc, HDR_SHARE_SERIAL);
+
+   /* Skip key loading if it is loaded due to sharing */
+   key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
+  JUMP_COND_SHRD);
+   if (keys_fit_inline)
+   append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
+ ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
+   else
+   append_key(desc, ctx->key_dma, ctx->enckeylen,
+  CLASS_1 | KEY_DEST_CLASS_REG);
+   set_jump_tgt_here(desc, key_jump_cmd);
+
+   /* Class 1 operation */
+   append_operation(desc, ctx->class1_alg_type |
+OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
+
+   /* Load AES-GMAC ESP IV into Math1 register */
+   append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_WORD_DECO_MATH1 |
+  LDST_CLASS_DECO | tfm->ivsize);
+
+   /* Wait the DMA transaction to finish */
+   append_jump(desc, JUMP_TEST_ALL | JUMP_COND_CALM |
+   (1 << JUMP_OFFSET_SHIFT));
+
+   /* Overwrite blank immediate AES-GMAC ESP IV data */
+   write_iv_cmd = append_move(desc, MOVE_SRC_MATH1 | MOVE_DEST_DESCBUF |
+  (tfm->ivsize << MOVE_LEN_SHIFT));
+
+   /* Overwrite blank immediate AAD data */
+   write_aad_cmd = append_move(desc, MOVE_SRC_MATH1 | MOVE_DEST_DESCBUF |
+   (tfm->ivsize << MOVE_LEN_SHIFT));
+
+   /* cryptlen = seqoutlen - authsize */
+   append_math_sub_imm_u32(desc, REG3, SEQOUTLEN, IMM, ctx->authsize);
+
+   /* assoclen = (seqinlen - ivsize) - cryptlen */
+   append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
+
+   /* Read Salt and AES-GMAC ESP IV */
+   append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE |
+  FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | (4 + tfm->ivsize));
+   /* Append Salt */
+   append_data(desc, (void *)(ctx->key + ctx->enckeylen), 4);
+   set_move_tgt_here(desc, write_iv_cmd);
+   /* Blank commands. Will be overwritten by AES-GMAC ESP IV. */
+   append_cmd(desc, 0x);
+   append_cmd(desc, 0x);
+   /* End of blank commands */
+
+   /* Read assoc data */
+   append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
+FIFOLD_TYPE_AAD);
+
+   /* Will read cryptlen bytes */
+   append

[PATCH] crypto: caam: fix missing dma unmap on error path

2014-10-30 Thread Cristian Stoica
If dma mapping for dma_addr_out fails, the descriptor memory is freed
but the previous dma mapping for dma_addr_in remains.
This patch resolves the missing dma unmap and groups resource
allocations at function start.

Cc:  # 3.13+
Signed-off-by: Cristian Stoica 
---
 drivers/crypto/caam/key_gen.c | 29 ++---
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/crypto/caam/key_gen.c b/drivers/crypto/caam/key_gen.c
index 871703c..e1eaf4f 100644
--- a/drivers/crypto/caam/key_gen.c
+++ b/drivers/crypto/caam/key_gen.c
@@ -48,23 +48,29 @@ int gen_split_key(struct device *jrdev, u8 *key_out, int 
split_key_len,
u32 *desc;
struct split_key_result result;
dma_addr_t dma_addr_in, dma_addr_out;
-   int ret = 0;
+   int ret = -ENOMEM;
 
desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
if (!desc) {
dev_err(jrdev, "unable to allocate key input memory\n");
-   return -ENOMEM;
+   return ret;
}
 
-   init_job_desc(desc, 0);
-
dma_addr_in = dma_map_single(jrdev, (void *)key_in, keylen,
 DMA_TO_DEVICE);
if (dma_mapping_error(jrdev, dma_addr_in)) {
dev_err(jrdev, "unable to map key input memory\n");
-   kfree(desc);
-   return -ENOMEM;
+   goto out_free;
}
+
+   dma_addr_out = dma_map_single(jrdev, key_out, split_key_pad_len,
+ DMA_FROM_DEVICE);
+   if (dma_mapping_error(jrdev, dma_addr_out)) {
+   dev_err(jrdev, "unable to map key output memory\n");
+   goto out_unmap_in;
+   }
+
+   init_job_desc(desc, 0);
append_key(desc, dma_addr_in, keylen, CLASS_2 | KEY_DEST_CLASS_REG);
 
/* Sets MDHA up into an HMAC-INIT */
@@ -81,13 +87,6 @@ int gen_split_key(struct device *jrdev, u8 *key_out, int 
split_key_len,
 * FIFO_STORE with the explicit split-key content store
 * (0x26 output type)
 */
-   dma_addr_out = dma_map_single(jrdev, key_out, split_key_pad_len,
- DMA_FROM_DEVICE);
-   if (dma_mapping_error(jrdev, dma_addr_out)) {
-   dev_err(jrdev, "unable to map key output memory\n");
-   kfree(desc);
-   return -ENOMEM;
-   }
append_fifo_store(desc, dma_addr_out, split_key_len,
  LDST_CLASS_2_CCB | FIFOST_TYPE_SPLIT_KEK);
 
@@ -115,10 +114,10 @@ int gen_split_key(struct device *jrdev, u8 *key_out, int 
split_key_len,
 
dma_unmap_single(jrdev, dma_addr_out, split_key_pad_len,
 DMA_FROM_DEVICE);
+out_unmap_in:
dma_unmap_single(jrdev, dma_addr_in, keylen, DMA_TO_DEVICE);
-
+out_free:
kfree(desc);
-
return ret;
 }
 EXPORT_SYMBOL(gen_split_key);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html