aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@gmail.com>2019-04-22 07:25:58 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-05-03 02:03:28 -0400
commit25baaf8e2c93197d063b372ef7b62f2767c7ac0b (patch)
tree41181dfeafe607d8e251f4a8e7cc979ab57f3b3e
parent1036633e10f86b793e60dd8698c65df6712cad2a (diff)
crypto: crypto4xx - fix ctr-aes missing output IV
Commit 8efd972ef96a ("crypto: testmgr - support checking skcipher output IV") caused the crypto4xx driver to produce the following error: | ctr-aes-ppc4xx encryption test failed (wrong output IV) | on test vector 0, cfg="in-place" This patch fixes this by reworking the crypto4xx_setkey_aes() function to: - not save the iv for ECB (as per 18.2.38 CRYP0_SA_CMD_0: "This bit mut be cleared for DES ECB mode or AES ECB mode, when no IV is used.") - instruct the hardware to save the generated IV for all other modes of operations that have IV and then supply it back to the callee in pretty much the same way as we do it for cbc-aes already. - make it clear that the DIR_(IN|OUT)BOUND is the important bit that tells the hardware to encrypt or decrypt the data. (this is cosmetic - but it hopefully prevents me from getting confused again). - don't load any bogus hash when we don't use any hash operation to begin with. Cc: stable@vger.kernel.org Fixes: f2a13e7cba9e ("crypto: crypto4xx - enable AES RFC3686, ECB, CFB and OFB offloads") Signed-off-by: Christian Lamparter <chunkeey@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/amcc/crypto4xx_alg.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/crypto/amcc/crypto4xx_alg.c b/drivers/crypto/amcc/crypto4xx_alg.c
index 4092c2aad8e2..3458c5a085d9 100644
--- a/drivers/crypto/amcc/crypto4xx_alg.c
+++ b/drivers/crypto/amcc/crypto4xx_alg.c
@@ -141,9 +141,10 @@ static int crypto4xx_setkey_aes(struct crypto_skcipher *cipher,
141 /* Setup SA */ 141 /* Setup SA */
142 sa = ctx->sa_in; 142 sa = ctx->sa_in;
143 143
144 set_dynamic_sa_command_0(sa, SA_NOT_SAVE_HASH, (cm == CRYPTO_MODE_CBC ? 144 set_dynamic_sa_command_0(sa, SA_NOT_SAVE_HASH, (cm == CRYPTO_MODE_ECB ?
145 SA_SAVE_IV : SA_NOT_SAVE_IV), 145 SA_NOT_SAVE_IV : SA_SAVE_IV),
146 SA_LOAD_HASH_FROM_SA, SA_LOAD_IV_FROM_STATE, 146 SA_NOT_LOAD_HASH, (cm == CRYPTO_MODE_ECB ?
147 SA_LOAD_IV_FROM_SA : SA_LOAD_IV_FROM_STATE),
147 SA_NO_HEADER_PROC, SA_HASH_ALG_NULL, 148 SA_NO_HEADER_PROC, SA_HASH_ALG_NULL,
148 SA_CIPHER_ALG_AES, SA_PAD_TYPE_ZERO, 149 SA_CIPHER_ALG_AES, SA_PAD_TYPE_ZERO,
149 SA_OP_GROUP_BASIC, SA_OPCODE_DECRYPT, 150 SA_OP_GROUP_BASIC, SA_OPCODE_DECRYPT,
@@ -162,6 +163,11 @@ static int crypto4xx_setkey_aes(struct crypto_skcipher *cipher,
162 memcpy(ctx->sa_out, ctx->sa_in, ctx->sa_len * 4); 163 memcpy(ctx->sa_out, ctx->sa_in, ctx->sa_len * 4);
163 sa = ctx->sa_out; 164 sa = ctx->sa_out;
164 sa->sa_command_0.bf.dir = DIR_OUTBOUND; 165 sa->sa_command_0.bf.dir = DIR_OUTBOUND;
166 /*
167 * SA_OPCODE_ENCRYPT is the same value as SA_OPCODE_DECRYPT.
168 * it's the DIR_(IN|OUT)BOUND that matters
169 */
170 sa->sa_command_0.bf.opcode = SA_OPCODE_ENCRYPT;
165 171
166 return 0; 172 return 0;
167} 173}