diff options
| author | Krzysztof Hałasa <khc@pm.waw.pl> | 2010-01-10 14:20:10 +0100 | 
|---|---|---|
| committer | Krzysztof Hałasa <khc@pm.waw.pl> | 2010-05-27 13:02:42 +0200 | 
| commit | ce057297fdab808d9a071c084b7405bc6c8d14c5 (patch) | |
| tree | 2cd70e246e45408454107e3d73658683331532f7 | |
| parent | 627634293ae7f4ec864cecd4282650ceae7a5067 (diff) | |
| download | olio-linux-3.10-ce057297fdab808d9a071c084b7405bc6c8d14c5.tar.xz olio-linux-3.10-ce057297fdab808d9a071c084b7405bc6c8d14c5.zip  | |
IXP4xx: Fix ixp4xx_crypto little-endian operation.
Fixes the following on IXP425 little-endian:
NPE-C: firmware functionality 0x5, revision 0x2:1
alg: skcipher: Test 1 failed on encryption for ecb(des)-ixp4xx
00000000: 01 23 45 67 89 ab cd e7
alg: skcipher: Test 1 failed on encryption for ecb(des3_ede)-ixp4xx
00000000: 73 6f 6d 65 64 61 74 61
alg: skcipher: Test 1 failed on encryption for ecb(aes)-ixp4xx
00000000: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
Acked-by: Christian Hohnstaedt <chohnstaedt@innominate.com>
| -rw-r--r-- | drivers/crypto/ixp4xx_crypto.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c index f17ddf37a1e..0d662213c06 100644 --- a/drivers/crypto/ixp4xx_crypto.c +++ b/drivers/crypto/ixp4xx_crypto.c @@ -97,8 +97,13 @@  struct buffer_desc {  	u32 phys_next; +#ifdef __ARMEB__  	u16 buf_len;  	u16 pkt_len; +#else +	u16 pkt_len; +	u16 buf_len; +#endif  	u32 phys_addr;  	u32 __reserved[4];  	struct buffer_desc *next; @@ -106,17 +111,30 @@ struct buffer_desc {  };  struct crypt_ctl { +#ifdef __ARMEB__  	u8 mode;		/* NPE_OP_*  operation mode */  	u8 init_len;  	u16 reserved; +#else +	u16 reserved; +	u8 init_len; +	u8 mode;		/* NPE_OP_*  operation mode */ +#endif  	u8 iv[MAX_IVLEN];	/* IV for CBC mode or CTR IV for CTR mode */  	u32 icv_rev_aes;	/* icv or rev aes */  	u32 src_buf;  	u32 dst_buf; +#ifdef __ARMEB__  	u16 auth_offs;		/* Authentication start offset */  	u16 auth_len;		/* Authentication data length */  	u16 crypt_offs;		/* Cryption start offset */  	u16 crypt_len;		/* Cryption data length */ +#else +	u16 auth_len;		/* Authentication data length */ +	u16 auth_offs;		/* Authentication start offset */ +	u16 crypt_len;		/* Cryption data length */ +	u16 crypt_offs;		/* Cryption start offset */ +#endif  	u32 aadAddr;		/* Additional Auth Data Addr for CCM mode */  	u32 crypto_ctx;		/* NPE Crypto Param structure address */ @@ -652,6 +670,9 @@ static int setup_auth(struct crypto_tfm *tfm, int encrypt, unsigned authsize,  	/* write cfg word to cryptinfo */  	cfgword = algo->cfgword | ( authsize << 6); /* (authsize/4) << 8 */ +#ifndef __ARMEB__ +	cfgword ^= 0xAA000000; /* change the "byte swap" flags */ +#endif  	*(u32*)cinfo = cpu_to_be32(cfgword);  	cinfo += sizeof(cfgword);  |