22b9f99b87
Drop patch that was superseded upstream: ramips/0036-mtd-fix-cfi-cmdset-0002-erase-status-check.patch Drop upstreamed patches: - apm821xx/020-0001-crypto-crypto4xx-remove-bad-list_del.patch - apm821xx/020-0011-crypto-crypto4xx-fix-crypto4xx_build_pdr-crypto4xx_b.patch - ath79/0011-MIPS-ath79-fix-register-address-in-ath79_ddr_wb_flus.patch - brcm63xx/001-4.15-08-bcm63xx_enet-correct-clock-usage.patch - brcm63xx/001-4.15-09-bcm63xx_enet-do-not-write-to-random-DMA-channel-on-B.patch - generic/backport/080-net-convert-sock.sk_wmem_alloc-from-atomic_t-to-refc.patch - generic/pending/170-usb-dwc2-Fix-DMA-alignment-to-start-at-allocated-boun.patch - generic/pending/900-gen_stats-fix-netlink-stats-padding.patch In 4.14.55, a patch was introduced that breaks ext4 images in some cases. The newly introduced patch backport-4.14/500-ext4-fix-check-to-prevent-initializing-reserved-inod.patch addresses this breakage. Fixes the following CVEs: - CVE-2018-10876 - CVE-2018-10877 - CVE-2018-10879 - CVE-2018-10880 - CVE-2018-10881 - CVE-2018-10882 - CVE-2018-10883 Compile-tested: ath79, octeon, x86/64 Runtime-tested: ath79, octeon, x86/64 Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
248 lines
8.1 KiB
Diff
248 lines
8.1 KiB
Diff
From f2a13e7cba9e2b16f4888fbd9cf2bc25b95945be Mon Sep 17 00:00:00 2001
|
|
From: Christian Lamparter <chunkeey@googlemail.com>
|
|
Date: Fri, 25 Aug 2017 15:47:21 +0200
|
|
Subject: [PATCH 08/25] crypto: crypto4xx - enable AES RFC3686, ECB, CFB and
|
|
OFB offloads
|
|
|
|
The crypto engine supports more than just aes-cbc. This patch
|
|
enables the remaining AES block cipher modes that pass the
|
|
testmanager's test vectors.
|
|
|
|
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
|
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
---
|
|
drivers/crypto/amcc/crypto4xx_alg.c | 66 ++++++++++++++++++++++++
|
|
drivers/crypto/amcc/crypto4xx_core.c | 98 ++++++++++++++++++++++++++++++++++++
|
|
drivers/crypto/amcc/crypto4xx_core.h | 10 ++++
|
|
drivers/crypto/amcc/crypto4xx_sa.h | 3 ++
|
|
4 files changed, 177 insertions(+)
|
|
|
|
--- a/drivers/crypto/amcc/crypto4xx_alg.c
|
|
+++ b/drivers/crypto/amcc/crypto4xx_alg.c
|
|
@@ -28,6 +28,7 @@
|
|
#include <crypto/algapi.h>
|
|
#include <crypto/aes.h>
|
|
#include <crypto/sha.h>
|
|
+#include <crypto/ctr.h>
|
|
#include "crypto4xx_reg_def.h"
|
|
#include "crypto4xx_core.h"
|
|
#include "crypto4xx_sa.h"
|
|
@@ -171,6 +172,71 @@ int crypto4xx_setkey_aes_cbc(struct cryp
|
|
CRYPTO_FEEDBACK_MODE_NO_FB);
|
|
}
|
|
|
|
+int crypto4xx_setkey_aes_cfb(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen)
|
|
+{
|
|
+ return crypto4xx_setkey_aes(cipher, key, keylen, CRYPTO_MODE_CFB,
|
|
+ CRYPTO_FEEDBACK_MODE_128BIT_CFB);
|
|
+}
|
|
+
|
|
+int crypto4xx_setkey_aes_ecb(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen)
|
|
+{
|
|
+ return crypto4xx_setkey_aes(cipher, key, keylen, CRYPTO_MODE_ECB,
|
|
+ CRYPTO_FEEDBACK_MODE_NO_FB);
|
|
+}
|
|
+
|
|
+int crypto4xx_setkey_aes_ofb(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen)
|
|
+{
|
|
+ return crypto4xx_setkey_aes(cipher, key, keylen, CRYPTO_MODE_OFB,
|
|
+ CRYPTO_FEEDBACK_MODE_64BIT_OFB);
|
|
+}
|
|
+
|
|
+int crypto4xx_setkey_rfc3686(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen)
|
|
+{
|
|
+ struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
|
|
+ struct crypto4xx_ctx *ctx = crypto_tfm_ctx(tfm);
|
|
+ int rc;
|
|
+
|
|
+ rc = crypto4xx_setkey_aes(cipher, key, keylen - CTR_RFC3686_NONCE_SIZE,
|
|
+ CRYPTO_MODE_CTR, CRYPTO_FEEDBACK_MODE_NO_FB);
|
|
+ if (rc)
|
|
+ return rc;
|
|
+
|
|
+ memcpy(ctx->state_record,
|
|
+ key + keylen - CTR_RFC3686_NONCE_SIZE, CTR_RFC3686_NONCE_SIZE);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int crypto4xx_rfc3686_encrypt(struct ablkcipher_request *req)
|
|
+{
|
|
+ struct crypto4xx_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
|
|
+ __be32 iv[AES_IV_SIZE / 4] = { *(u32 *)ctx->state_record,
|
|
+ *(u32 *) req->info, *(u32 *) (req->info + 4), cpu_to_be32(1) };
|
|
+
|
|
+ ctx->direction = DIR_OUTBOUND;
|
|
+ ctx->pd_ctl = 1;
|
|
+
|
|
+ return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
|
|
+ req->nbytes, iv, AES_IV_SIZE);
|
|
+}
|
|
+
|
|
+int crypto4xx_rfc3686_decrypt(struct ablkcipher_request *req)
|
|
+{
|
|
+ struct crypto4xx_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
|
|
+ __be32 iv[AES_IV_SIZE / 4] = { *(u32 *)ctx->state_record,
|
|
+ *(u32 *) req->info, *(u32 *) (req->info + 4), cpu_to_be32(1) };
|
|
+
|
|
+ ctx->direction = DIR_INBOUND;
|
|
+ ctx->pd_ctl = 1;
|
|
+
|
|
+ return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
|
|
+ req->nbytes, iv, AES_IV_SIZE);
|
|
+}
|
|
+
|
|
/**
|
|
* HASH SHA1 Functions
|
|
*/
|
|
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
|
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
|
@@ -36,6 +36,7 @@
|
|
#include <asm/dcr-regs.h>
|
|
#include <asm/cacheflush.h>
|
|
#include <crypto/aes.h>
|
|
+#include <crypto/ctr.h>
|
|
#include <crypto/sha.h>
|
|
#include "crypto4xx_reg_def.h"
|
|
#include "crypto4xx_core.h"
|
|
@@ -1135,6 +1136,103 @@ struct crypto4xx_alg_common crypto4xx_al
|
|
}
|
|
}
|
|
}},
|
|
+ { .type = CRYPTO_ALG_TYPE_ABLKCIPHER, .u.cipher = {
|
|
+ .cra_name = "cfb(aes)",
|
|
+ .cra_driver_name = "cfb-aes-ppc4xx",
|
|
+ .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
|
+ .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
|
|
+ CRYPTO_ALG_ASYNC |
|
|
+ CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
+ .cra_blocksize = AES_BLOCK_SIZE,
|
|
+ .cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
|
+ .cra_type = &crypto_ablkcipher_type,
|
|
+ .cra_init = crypto4xx_alg_init,
|
|
+ .cra_exit = crypto4xx_alg_exit,
|
|
+ .cra_module = THIS_MODULE,
|
|
+ .cra_u = {
|
|
+ .ablkcipher = {
|
|
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
+ .ivsize = AES_IV_SIZE,
|
|
+ .setkey = crypto4xx_setkey_aes_cfb,
|
|
+ .encrypt = crypto4xx_encrypt,
|
|
+ .decrypt = crypto4xx_decrypt,
|
|
+ }
|
|
+ }
|
|
+ } },
|
|
+ { .type = CRYPTO_ALG_TYPE_ABLKCIPHER, .u.cipher = {
|
|
+ .cra_name = "rfc3686(ctr(aes))",
|
|
+ .cra_driver_name = "rfc3686-ctr-aes-ppc4xx",
|
|
+ .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
|
+ .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
|
|
+ CRYPTO_ALG_ASYNC |
|
|
+ CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
+ .cra_blocksize = AES_BLOCK_SIZE,
|
|
+ .cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
|
+ .cra_type = &crypto_ablkcipher_type,
|
|
+ .cra_init = crypto4xx_alg_init,
|
|
+ .cra_exit = crypto4xx_alg_exit,
|
|
+ .cra_module = THIS_MODULE,
|
|
+ .cra_u = {
|
|
+ .ablkcipher = {
|
|
+ .min_keysize = AES_MIN_KEY_SIZE +
|
|
+ CTR_RFC3686_NONCE_SIZE,
|
|
+ .max_keysize = AES_MAX_KEY_SIZE +
|
|
+ CTR_RFC3686_NONCE_SIZE,
|
|
+ .ivsize = CTR_RFC3686_IV_SIZE,
|
|
+ .setkey = crypto4xx_setkey_rfc3686,
|
|
+ .encrypt = crypto4xx_rfc3686_encrypt,
|
|
+ .decrypt = crypto4xx_rfc3686_decrypt,
|
|
+ }
|
|
+ }
|
|
+ } },
|
|
+ { .type = CRYPTO_ALG_TYPE_ABLKCIPHER, .u.cipher = {
|
|
+ .cra_name = "ecb(aes)",
|
|
+ .cra_driver_name = "ecb-aes-ppc4xx",
|
|
+ .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
|
+ .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
|
|
+ CRYPTO_ALG_ASYNC |
|
|
+ CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
+ .cra_blocksize = AES_BLOCK_SIZE,
|
|
+ .cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
|
+ .cra_type = &crypto_ablkcipher_type,
|
|
+ .cra_init = crypto4xx_alg_init,
|
|
+ .cra_exit = crypto4xx_alg_exit,
|
|
+ .cra_module = THIS_MODULE,
|
|
+ .cra_u = {
|
|
+ .ablkcipher = {
|
|
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
+ .setkey = crypto4xx_setkey_aes_ecb,
|
|
+ .encrypt = crypto4xx_encrypt,
|
|
+ .decrypt = crypto4xx_decrypt,
|
|
+ }
|
|
+ }
|
|
+ } },
|
|
+ { .type = CRYPTO_ALG_TYPE_ABLKCIPHER, .u.cipher = {
|
|
+ .cra_name = "ofb(aes)",
|
|
+ .cra_driver_name = "ofb-aes-ppc4xx",
|
|
+ .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
|
|
+ .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
|
|
+ CRYPTO_ALG_ASYNC |
|
|
+ CRYPTO_ALG_KERN_DRIVER_ONLY,
|
|
+ .cra_blocksize = AES_BLOCK_SIZE,
|
|
+ .cra_ctxsize = sizeof(struct crypto4xx_ctx),
|
|
+ .cra_type = &crypto_ablkcipher_type,
|
|
+ .cra_init = crypto4xx_alg_init,
|
|
+ .cra_exit = crypto4xx_alg_exit,
|
|
+ .cra_module = THIS_MODULE,
|
|
+ .cra_u = {
|
|
+ .ablkcipher = {
|
|
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
+ .ivsize = AES_IV_SIZE,
|
|
+ .setkey = crypto4xx_setkey_aes_cbc,
|
|
+ .encrypt = crypto4xx_encrypt,
|
|
+ .decrypt = crypto4xx_decrypt,
|
|
+ }
|
|
+ }
|
|
+ } },
|
|
};
|
|
|
|
/**
|
|
--- a/drivers/crypto/amcc/crypto4xx_core.h
|
|
+++ b/drivers/crypto/amcc/crypto4xx_core.h
|
|
@@ -171,8 +171,18 @@ u32 crypto4xx_build_pd(struct crypto_asy
|
|
void *iv, u32 iv_len);
|
|
int crypto4xx_setkey_aes_cbc(struct crypto_ablkcipher *cipher,
|
|
const u8 *key, unsigned int keylen);
|
|
+int crypto4xx_setkey_aes_cfb(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen);
|
|
+int crypto4xx_setkey_aes_ecb(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen);
|
|
+int crypto4xx_setkey_aes_ofb(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen);
|
|
+int crypto4xx_setkey_rfc3686(struct crypto_ablkcipher *cipher,
|
|
+ const u8 *key, unsigned int keylen);
|
|
int crypto4xx_encrypt(struct ablkcipher_request *req);
|
|
int crypto4xx_decrypt(struct ablkcipher_request *req);
|
|
+int crypto4xx_rfc3686_encrypt(struct ablkcipher_request *req);
|
|
+int crypto4xx_rfc3686_decrypt(struct ablkcipher_request *req);
|
|
int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm);
|
|
int crypto4xx_hash_digest(struct ahash_request *req);
|
|
int crypto4xx_hash_final(struct ahash_request *req);
|
|
--- a/drivers/crypto/amcc/crypto4xx_sa.h
|
|
+++ b/drivers/crypto/amcc/crypto4xx_sa.h
|
|
@@ -112,6 +112,9 @@ union sa_command_0 {
|
|
|
|
#define CRYPTO_MODE_ECB 0
|
|
#define CRYPTO_MODE_CBC 1
|
|
+#define CRYPTO_MODE_OFB 2
|
|
+#define CRYPTO_MODE_CFB 3
|
|
+#define CRYPTO_MODE_CTR 4
|
|
|
|
#define CRYPTO_FEEDBACK_MODE_NO_FB 0
|
|
#define CRYPTO_FEEDBACK_MODE_64BIT_OFB 0
|