Commit ce057297fdab808d9a071c084b7405bc6c8d14c5

Authored by Krzysztof Hałasa
1 parent 627634293a

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>

Showing 1 changed file with 21 additions and 0 deletions Side-by-side Diff

drivers/crypto/ixp4xx_crypto.c
... ... @@ -97,8 +97,13 @@
97 97  
98 98 struct buffer_desc {
99 99 u32 phys_next;
  100 +#ifdef __ARMEB__
100 101 u16 buf_len;
101 102 u16 pkt_len;
  103 +#else
  104 + u16 pkt_len;
  105 + u16 buf_len;
  106 +#endif
102 107 u32 phys_addr;
103 108 u32 __reserved[4];
104 109 struct buffer_desc *next;
105 110  
106 111  
107 112  
... ... @@ -106,17 +111,30 @@
106 111 };
107 112  
108 113 struct crypt_ctl {
  114 +#ifdef __ARMEB__
109 115 u8 mode; /* NPE_OP_* operation mode */
110 116 u8 init_len;
111 117 u16 reserved;
  118 +#else
  119 + u16 reserved;
  120 + u8 init_len;
  121 + u8 mode; /* NPE_OP_* operation mode */
  122 +#endif
112 123 u8 iv[MAX_IVLEN]; /* IV for CBC mode or CTR IV for CTR mode */
113 124 u32 icv_rev_aes; /* icv or rev aes */
114 125 u32 src_buf;
115 126 u32 dst_buf;
  127 +#ifdef __ARMEB__
116 128 u16 auth_offs; /* Authentication start offset */
117 129 u16 auth_len; /* Authentication data length */
118 130 u16 crypt_offs; /* Cryption start offset */
119 131 u16 crypt_len; /* Cryption data length */
  132 +#else
  133 + u16 auth_len; /* Authentication data length */
  134 + u16 auth_offs; /* Authentication start offset */
  135 + u16 crypt_len; /* Cryption data length */
  136 + u16 crypt_offs; /* Cryption start offset */
  137 +#endif
120 138 u32 aadAddr; /* Additional Auth Data Addr for CCM mode */
121 139 u32 crypto_ctx; /* NPE Crypto Param structure address */
122 140  
... ... @@ -652,6 +670,9 @@
652 670  
653 671 /* write cfg word to cryptinfo */
654 672 cfgword = algo->cfgword | ( authsize << 6); /* (authsize/4) << 8 */
  673 +#ifndef __ARMEB__
  674 + cfgword ^= 0xAA000000; /* change the "byte swap" flags */
  675 +#endif
655 676 *(u32*)cinfo = cpu_to_be32(cfgword);
656 677 cinfo += sizeof(cfgword);
657 678