libcrc32c: keep intermediate crc state in cpu order
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 libcrc32c: keep intermediate crc state in cpu order
crypto/crc32.c:chksum_final() is computing the digest as *(__le32 *)out = ~cpu_to_le32(mctx->crc);
so the low-level crc32c_le routines should just keep the crc in cpu order, otherwise it is getting swabbed one too many times on big-endian machines.
--- lib/libcrc32c.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)
lib/libcrc32c.c +2 -5
@@ -33,7 +33,6 @@#include <linux/crc32c.h> #include <linux/compiler.h> #include <linux/module.h> -#include <asm/byteorder.h> MODULE_AUTHOR ("Clay Haapala <[email protected]>" );MODULE_DESCRIPTION ("CRC32c (Castagnoli) calculations" );
@@ -161,15 +160,13 @@ static const u32 crc32c_table[256] = {*/ u32 __pure -crc32c_le (u32 seed,unsigned char const *data,size_t length) +crc32c_le (u32 crc,unsigned char const *data,size_t length) { -u32 crc =__cpu_to_le32 (seed); -while (length--) crc = crc32c_table[(crc ^ *data++) &0xFFL ] ^ (crc >>8 ); -return __le32_to_cpu (crc); +return crc; }#endif /* CRC_LE_BITS == 8 */
Signature · 1 line
1.5.3.3
Herbert Xu
maintainerQuoted 7 lines · Benny Halevy
crypto/crc32.c:chksum_final() is computing the digest as *(__le32 *)out = ~cpu_to_le32(mctx->crc);
so the low-levelcrc32c_leroutines should just keep the crc in cpu order, otherwise it is getting swabbed one too many times on big-endian machines.Signed-off-by Benny Halevy <[email protected]>
Patch applied. Thanks!
I'll send this to stable too.
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtResolved my issue with BE open-iscsi initiator and LE IET target. Thanks!
Quoted 41 lines · Benny Halevy
crypto/crc32.c:chksum_final() is computing the digest as *(__le32 *)out = ~cpu_to_le32(mctx->crc);
so the low-levelcrc32c_leroutines should just keep the crc in cpu order, otherwise it is getting swabbed one too many times on big-endian machines.Signed-off-by Benny Halevy <[email protected]>--- lib/libcrc32c.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)lib/libcrc32c.c +2
-5@@ -33,7 +33,6 @@#include <linux/crc32c.h> #include <linux/compiler.h> #include <linux/module.h> -#include <asm/byteorder.h> MODULE_AUTHOR ("Clay Haapala <[email protected]>" );MODULE_DESCRIPTION ("CRC32c (Castagnoli) calculations" );@@ -161,15 +160,13 @@ static const u32 crc32c_table[256] = {*/ u32 __pure -crc32c_le (u32 seed,unsigned char const *data,size_t length) +crc32c_le (u32 crc,unsigned char const *data,size_t length) { -u32 crc =__cpu_to_le32 (seed); -while (length--) crc = crc32c_table[(crc ^ *data++) &0xFFL ] ^ (crc >>8 ); -return __le32_to_cpu (crc); +return crc; }#endif /* CRC_LE_BITS == 8 */
Signature · 6 lines
------------------------------------------------------ Dave Jiang Software Engineer MontaVista Software, Inc. http://www.mvista.com ------------------------------------------------------
Quoted 1 line · Dave Jiang
Resolved my issue with BE open-iscsi initiator and LE IET target. Thanks!
Super! Thanks for testing!
And many thanks to Tomo for identifying the byte-order problem in the crypto code.
Benny
Quoted 45 lines
Quoted 41 lines · Benny Halevy
crypto/crc32.c:chksum_final() is computing the digest as *(__le32 *)out = ~cpu_to_le32(mctx->crc);
so the low-levelcrc32c_leroutines should just keep the crc in cpu order, otherwise it is getting swabbed one too many times on big-endian machines.Signed-off-by Benny Halevy <[email protected]>--- lib/libcrc32c.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)lib/libcrc32c.c +2
-5@@ -33,7 +33,6 @@#include <linux/crc32c.h> #include <linux/compiler.h> #include <linux/module.h> -#include <asm/byteorder.h> MODULE_AUTHOR ("Clay Haapala <[email protected]>" );MODULE_DESCRIPTION ("CRC32c (Castagnoli) calculations" );@@ -161,15 +160,13 @@ static const u32 crc32c_table[256] = {*/ u32 __pure -crc32c_le (u32 seed,unsigned char const *data,size_t length) +crc32c_le (u32 crc,unsigned char const *data,size_t length) { -u32 crc =__cpu_to_le32 (seed); -while (length--) crc = crc32c_table[(crc ^ *data++) &0xFFL ] ^ (crc >>8 ); -return __le32_to_cpu (crc); +return crc; }#endif /* CRC_LE_BITS == 8 */