aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/apm821xx/patches-4.14/020-0018-crypto-crypto4xx-use-the-correct-LE32-format-for-IV-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/apm821xx/patches-4.14/020-0018-crypto-crypto4xx-use-the-correct-LE32-format-for-IV-.patch')
-rw-r--r--target/linux/apm821xx/patches-4.14/020-0018-crypto-crypto4xx-use-the-correct-LE32-format-for-IV-.patch236
1 files changed, 0 insertions, 236 deletions
diff --git a/target/linux/apm821xx/patches-4.14/020-0018-crypto-crypto4xx-use-the-correct-LE32-format-for-IV-.patch b/target/linux/apm821xx/patches-4.14/020-0018-crypto-crypto4xx-use-the-correct-LE32-format-for-IV-.patch
deleted file mode 100644
index c3b58f78bd..0000000000
--- a/target/linux/apm821xx/patches-4.14/020-0018-crypto-crypto4xx-use-the-correct-LE32-format-for-IV-.patch
+++ /dev/null
@@ -1,236 +0,0 @@
-From 4865b122d4aff5151c88d2f7442d5a87f7e795ae Mon Sep 17 00:00:00 2001
-From: Christian Lamparter <chunkeey@gmail.com>
-Date: Wed, 4 Oct 2017 01:00:10 +0200
-Subject: [PATCH 18/25] crypto: crypto4xx - use the correct LE32 format for IV
- and key defs
-
-The hardware expects that the keys, IVs (and inner/outer hashes)
-are in the le32 format.
-
-This patch changes all hardware interface declarations to use
-the correct LE32 data format for each field.
-
-In order to pass __CHECK_ENDIAN__ checks, crypto4xx_memcpy_le
-has to be honest about the endianness of its parameters.
-The function was split and moved to the common crypto4xx_core.h
-header. This allows the compiler to generate better code if the
-sizes/len is a constant (various *_IV_LEN).
-
-Please note that the hardware isn't consistent with the endiannes
-of the save_digest field in the state record struct though.
-The hashes produced by GHASH and CBC (for CCM) will be in LE32.
-Whereas md5 and sha{1/,256,...} do not need any conversion.
-
-Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
----
- drivers/crypto/amcc/crypto4xx_alg.c | 4 +--
- drivers/crypto/amcc/crypto4xx_core.c | 40 ++----------------------------
- drivers/crypto/amcc/crypto4xx_core.h | 47 +++++++++++++++++++++++++++++++++---
- drivers/crypto/amcc/crypto4xx_sa.h | 29 ++++++++++++----------
- 4 files changed, 64 insertions(+), 56 deletions(-)
-
---- a/drivers/crypto/amcc/crypto4xx_alg.c
-+++ b/drivers/crypto/amcc/crypto4xx_alg.c
-@@ -150,8 +150,8 @@ static int crypto4xx_setkey_aes(struct c
- SA_SEQ_MASK_OFF, SA_MC_ENABLE,
- SA_NOT_COPY_PAD, SA_NOT_COPY_PAYLOAD,
- SA_NOT_COPY_HDR);
-- crypto4xx_memcpy_le(get_dynamic_sa_key_field(sa),
-- key, keylen);
-+ crypto4xx_memcpy_to_le32(get_dynamic_sa_key_field(sa),
-+ key, keylen);
- sa->sa_contents.w = SA_AES_CONTENTS | (keylen << 2);
- sa->sa_command_1.bf.key_len = keylen >> 3;
- ctx->is_hash = 0;
---- a/drivers/crypto/amcc/crypto4xx_core.c
-+++ b/drivers/crypto/amcc/crypto4xx_core.c
-@@ -619,42 +619,6 @@ static u32 crypto4xx_pd_done(struct cryp
- return crypto4xx_ahash_done(dev, pd_uinfo);
- }
-
--/**
-- * Note: Only use this function to copy items that is word aligned.
-- */
--void crypto4xx_memcpy_le(unsigned int *dst,
-- const unsigned char *buf,
-- int len)
--{
-- u8 *tmp;
-- for (; len >= 4; buf += 4, len -= 4)
-- *dst++ = cpu_to_le32(*(unsigned int *) buf);
--
-- tmp = (u8 *)dst;
-- switch (len) {
-- case 3:
-- *tmp++ = 0;
-- *tmp++ = *(buf+2);
-- *tmp++ = *(buf+1);
-- *tmp++ = *buf;
-- break;
-- case 2:
-- *tmp++ = 0;
-- *tmp++ = 0;
-- *tmp++ = *(buf+1);
-- *tmp++ = *buf;
-- break;
-- case 1:
-- *tmp++ = 0;
-- *tmp++ = 0;
-- *tmp++ = 0;
-- *tmp++ = *buf;
-- break;
-- default:
-- break;
-- }
--}
--
- static void crypto4xx_stop_all(struct crypto4xx_core_device *core_dev)
- {
- crypto4xx_destroy_pdr(core_dev->dev);
-@@ -814,8 +778,8 @@ u32 crypto4xx_build_pd(struct crypto_asy
- &pd_uinfo->sr_pa, 4);
-
- if (iv_len)
-- crypto4xx_memcpy_le(pd_uinfo->sr_va->save_iv,
-- iv, iv_len);
-+ crypto4xx_memcpy_to_le32(pd_uinfo->sr_va->save_iv,
-+ iv, iv_len);
- } else {
- if (ctx->direction == DIR_INBOUND) {
- pd->sa = ctx->sa_in_dma_addr;
---- a/drivers/crypto/amcc/crypto4xx_core.h
-+++ b/drivers/crypto/amcc/crypto4xx_core.h
-@@ -166,9 +166,7 @@ int crypto4xx_alloc_sa(struct crypto4xx_
- void crypto4xx_free_sa(struct crypto4xx_ctx *ctx);
- void crypto4xx_free_ctx(struct crypto4xx_ctx *ctx);
- u32 crypto4xx_alloc_state_record(struct crypto4xx_ctx *ctx);
--void crypto4xx_memcpy_le(unsigned int *dst,
-- const unsigned char *buf, int len);
--u32 crypto4xx_build_pd(struct crypto_async_request *req,
-+int crypto4xx_build_pd(struct crypto_async_request *req,
- struct crypto4xx_ctx *ctx,
- struct scatterlist *src,
- struct scatterlist *dst,
-@@ -193,4 +191,47 @@ int crypto4xx_hash_digest(struct ahash_r
- int crypto4xx_hash_final(struct ahash_request *req);
- int crypto4xx_hash_update(struct ahash_request *req);
- int crypto4xx_hash_init(struct ahash_request *req);
-+
-+/**
-+ * Note: Only use this function to copy items that is word aligned.
-+ */
-+static inline void crypto4xx_memcpy_swab32(u32 *dst, const void *buf,
-+ size_t len)
-+{
-+ for (; len >= 4; buf += 4, len -= 4)
-+ *dst++ = __swab32p((u32 *) buf);
-+
-+ if (len) {
-+ const u8 *tmp = (u8 *)buf;
-+
-+ switch (len) {
-+ case 3:
-+ *dst = (tmp[2] << 16) |
-+ (tmp[1] << 8) |
-+ tmp[0];
-+ break;
-+ case 2:
-+ *dst = (tmp[1] << 8) |
-+ tmp[0];
-+ break;
-+ case 1:
-+ *dst = tmp[0];
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-+}
-+
-+static inline void crypto4xx_memcpy_from_le32(u32 *dst, const void *buf,
-+ size_t len)
-+{
-+ crypto4xx_memcpy_swab32(dst, buf, len);
-+}
-+
-+static inline void crypto4xx_memcpy_to_le32(__le32 *dst, const void *buf,
-+ size_t len)
-+{
-+ crypto4xx_memcpy_swab32((u32 *)dst, buf, len);
-+}
- #endif
---- a/drivers/crypto/amcc/crypto4xx_sa.h
-+++ b/drivers/crypto/amcc/crypto4xx_sa.h
-@@ -181,9 +181,12 @@ struct dynamic_sa_ctl {
- * State Record for Security Association (SA)
- */
- struct sa_state_record {
-- u32 save_iv[4];
-- u32 save_hash_byte_cnt[2];
-- u32 save_digest[16];
-+ __le32 save_iv[4];
-+ __le32 save_hash_byte_cnt[2];
-+ union {
-+ u32 save_digest[16]; /* for MD5/SHA */
-+ __le32 save_digest_le32[16]; /* GHASH / CBC */
-+ };
- } __attribute__((packed));
-
- /**
-@@ -192,8 +195,8 @@ struct sa_state_record {
- */
- struct dynamic_sa_aes128 {
- struct dynamic_sa_ctl ctrl;
-- u32 key[4];
-- u32 iv[4]; /* for CBC, OFC, and CFB mode */
-+ __le32 key[4];
-+ __le32 iv[4]; /* for CBC, OFC, and CFB mode */
- u32 state_ptr;
- u32 reserved;
- } __attribute__((packed));
-@@ -206,8 +209,8 @@ struct dynamic_sa_aes128 {
- */
- struct dynamic_sa_aes192 {
- struct dynamic_sa_ctl ctrl;
-- u32 key[6];
-- u32 iv[4]; /* for CBC, OFC, and CFB mode */
-+ __le32 key[6];
-+ __le32 iv[4]; /* for CBC, OFC, and CFB mode */
- u32 state_ptr;
- u32 reserved;
- } __attribute__((packed));
-@@ -220,8 +223,8 @@ struct dynamic_sa_aes192 {
- */
- struct dynamic_sa_aes256 {
- struct dynamic_sa_ctl ctrl;
-- u32 key[8];
-- u32 iv[4]; /* for CBC, OFC, and CFB mode */
-+ __le32 key[8];
-+ __le32 iv[4]; /* for CBC, OFC, and CFB mode */
- u32 state_ptr;
- u32 reserved;
- } __attribute__((packed));
-@@ -235,8 +238,8 @@ struct dynamic_sa_aes256 {
- */
- struct dynamic_sa_hash160 {
- struct dynamic_sa_ctl ctrl;
-- u32 inner_digest[5];
-- u32 outer_digest[5];
-+ __le32 inner_digest[5];
-+ __le32 outer_digest[5];
- u32 state_ptr;
- u32 reserved;
- } __attribute__((packed));
-@@ -266,9 +269,9 @@ get_dynamic_sa_offset_state_ptr_field(st
- return sizeof(struct dynamic_sa_ctl) + offset * 4;
- }
-
--static inline u32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
-+static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
- {
-- return (u32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
-+ return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
- }
-
- #endif