Skip to contentSkip to conversation

mkimage: Refactor and clean up 32-bit crcs

PATCH Superseded Charles Manning 3 participants 13 messages May 5, 2014 – Jun 5, 2014 Arm i.MX and Layerscape

lore
Share & tools
lore
#0 lore raw

cover mkimage: Refactor and clean up 32-bit crcs

As a step towards adding an image signer for socfpga, this set of patches breaks out the common crc code that is used in both pblimage and mxsimage.

Not that this is NOT the same algorithm as the crc generated by zlib.

The new function has been named pbl_crc32.

Charles Manning (2):
mkimage : Split out and clean pbl_crc32 for use by other image types
mkimage: Refactor mxsimage to use common crc32 code

 tools/Makefile    |    1 +
 tools/mxsimage.c  |   28 +++------------------------
 tools/pbl_crc32.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/pbl_crc32.h |   13 +++++++++++++
 tools/pblimage.c  |   47 +-------------------------------------------
 5 files changed, 74 insertions(+), 71 deletions(-)
 create mode 100644 tools/pbl_crc32.c
 create mode 100644 tools/pbl_crc32.h
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH 1/2 mkimage : Split out and clean pbl_crc32 for use by other image types

The crc32 used by pblimgae is NOT the same as zlib crc32.

The pbl_crc32 is useful for other purposes in mkimage so split it out.

While we are about it, clean up redundant and confusing code.

---
 tools/Makefile    |    1 +
 tools/pbl_crc32.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/pbl_crc32.h |   13 +++++++++++++
 tools/pblimage.c  |   47 +-------------------------------------------
 4 files changed, 71 insertions(+), 46 deletions(-)
 create mode 100644 tools/pbl_crc32.c
 create mode 100644 tools/pbl_crc32.h
tools/Makefile +1 -0
index c34df4f..2f30749 100644
@@ -86,6 +86,7 @@ dumpimage-mkimage-objs := aisimage.o \
 			omapimage.o \
 			os_support.o \
 			pblimage.o \
+			pbl_crc32.o \
 			sha1.o \
 			sha256.o \
 			ublimage.o \
tools/pbl_crc32.c new file +56 -0

56 lines not on this page · raw message

tools/pbl_crc32.h new file +13 -0
new file mode 100644
index 0000000..4ab55ee
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef PBLCRC32_H
+#define PBLCRC32_H
+
+#include <stdint.h>
+uint32_t pbl_crc32(uint32_t in_crc, const char *buf, uint32_t len);
+
+#endif
tools/pblimage.c +1 -46

59 lines not on this page · raw message

Signature · 1 line
1.7.9.5
#2 lore raw

PATCH 1/2 mkimage : Split out and clean pbl_crc32 for use by other image types

Hi Charles,

Quoted 165 lines · Charles Manning

The crc32 used by pblimgae is NOT the same as zlib crc32.

The pbl_crc32 is useful for other purposes in mkimage so split it out.

While we are about it, clean up redundant and confusing code.

---
 tools/Makefile    |    1 +
 tools/pbl_crc32.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/pbl_crc32.h |   13 +++++++++++++
 tools/pblimage.c  |   47 +-------------------------------------------
 4 files changed, 71 insertions(+), 46 deletions(-)
 create mode 100644 tools/pbl_crc32.c
 create mode 100644 tools/pbl_crc32.h
tools/Makefile +1 -0
index c34df4f..2f30749 100644
@@ -86,6 +86,7 @@ dumpimage-mkimage-objs := aisimage.o \
 			omapimage.o \
 			os_support.o \
 			pblimage.o \
+			pbl_crc32.o \
 			sha1.o \
 			sha256.o \
 			ublimage.o \
tools/pbl_crc32.c new file +56 -0
new file mode 100644
index 0000000..6e6735a
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
+ * Cleaned up and refactored by Charles Manning.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+#include "pblimage.h"
+
+static uint32_t crc_table[256];
+static int crc_table_valid;
+
+static void make_crc_table(void)
+{
+	uint32_t mask;
+	int i, j;
+	uint32_t poly; /* polynomial exclusive-or pattern */
+
+	if (crc_table_valid)
+		return;
+
+	/*
+	 * the polynomial used by PBL is 1 + x1 + x2 + x4 + x5 + x7 + x8 + x10
+	 * + x11 + x12 + x16 + x22 + x23 + x26 + x32.
+	 */
+	poly = 0x04c11db7;
+
+	for (i = 0; i < 256; i++) {
+		mask = i << 24;
+		for (j = 0; j < 8; j++) {
+			if (mask & 0x80000000)
+				mask = (mask << 1) ^ poly;
+			else
+				mask <<= 1;
+		}
+		crc_table[i] = mask;
+	}
+
+	crc_table_valid = 1;
+}
+
+uint32_t pbl_crc32(uint32_t in_crc, const char *buf, uint32_t len)
+{
+	uint32_t crc32_val;
+	int i;
+
+	make_crc_table();
+
+	crc32_val = ~in_crc;
+
+	for (i = 0; i < len; i++)
+		crc32_val = (crc32_val << 8) ^
+			crc_table[(crc32_val >> 24) ^ (*buf++ & 0xff)];
+
+	return crc32_val;
+}
tools/pbl_crc32.h new file +13 -0
new file mode 100644
index 0000000..4ab55ee
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef PBLCRC32_H
+#define PBLCRC32_H
+
+#include <stdint.h>
+uint32_t pbl_crc32(uint32_t in_crc, const char *buf, uint32_t len);
+
+#endif
tools/pblimage.c +1 -39
index ef3d7f6..6e6e801 100644
@@ -6,6 +6,7 @@
 #include "imagetool.h"
 #include <image.h>
 #include "pblimage.h"
+#include "pbl_crc32.h"
 
 /*
  * Initialize to an invalid value.
@@ -137,52 +138,6 @@ static void pbl_parser(char *name)
 	fclose(fd);
 }
 
-static uint32_t crc_table[256];
-
-static void make_crc_table(void)
-{
-	uint32_t mask;
-	int i, j;
-	uint32_t poly; /* polynomial exclusive-or pattern */
-
-	/*
-	 * the polynomial used by PBL is 1 + x1 + x2 + x4 + x5 + x7 + x8 + x10
-	 * + x11 + x12 + x16 + x22 + x23 + x26 + x32.
-	 */
-	poly = 0x04c11db7;
-
-	for (i = 0; i < 256; i++) {
-		mask = i << 24;
-		for (j = 0; j < 8; j++) {
-			if (mask & 0x80000000)
-				mask = (mask << 1) ^ poly;
-			else
-				mask <<= 1;
-		}
-		crc_table[i] = mask;
-	}
-}
-
-unsigned long pbl_crc32(unsigned long crc, const char *buf, uint32_t len)
-{
-	uint32_t crc32_val = 0xffffffff;
-	uint32_t xor = 0x0;
-	int i;
-
-	make_crc_table();
-
-	for (i = 0; i < len; i++)
-		crc32_val = (crc32_val << 8) ^
-			crc_table[(crc32_val >> 24) ^ (*buf++ & 0xff)];
-
-	crc32_val = crc32_val ^ xor;

tools/pblimage.c static void pbl_parser(char *name) · line 143

Quoted 10 lines
tools/pblimage.c +0 -7
-	if (crc32_val < 0) {
-		crc32_val += 0xffffffff;
-		crc32_val += 1;
-	}
-	return crc32_val;
-}
-
 static uint32_t reverse_byte(uint32_t val)
 {
 	uint32_t temp;

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#3 lore raw

PATCH 2/2 mkimage: Refactor mxsimage to use common crc32 code

In reply to Charles Manning

mxsimage uses the same crc32 function as pblimage.

---
 tools/mxsimage.c |   28 +++-------------------------
 1 file changed, 3 insertions(+), 25 deletions(-)
tools/mxsimage.c +3 -25
index 045b35a..0c4348c 100644
@@ -19,6 +19,7 @@
 
 #include "imagetool.h"
 #include "mxsimage.h"
+#include "pbl_crc32.h"
 #include <image.h>
 
 
@@ -231,29 +232,6 @@ static int sb_aes_reinit(struct sb_image_ctx *ictx, int enc)
 }
 
 /*
- * CRC32
- */
-static uint32_t crc32(uint8_t *data, uint32_t len)
-{
-	const uint32_t poly = 0x04c11db7;
-	uint32_t crc32 = 0xffffffff;
-	unsigned int byte, bit;
-
-	for (byte = 0; byte < len; byte++) {
-		crc32 ^= data[byte] << 24;
-
-		for (bit = 8; bit > 0; bit--) {
-			if (crc32 & (1UL << 31))
-				crc32 = (crc32 << 1) ^ poly;
-			else
-				crc32 = (crc32 << 1);
-		}
-	}
-
-	return crc32;
-}
-
-/*
  * Debug
  */
 static void soprintf(struct sb_image_ctx *ictx, const char *fmt, ...)
@@ -998,7 +976,7 @@ static int sb_build_command_load(struct sb_image_ctx *ictx,
 
 	ccmd->load.address	= dest;
 	ccmd->load.count	= cctx->length;
-	ccmd->load.crc32	= crc32(cctx->data, cctx->length);
+	ccmd->load.crc32	= pbl_crc32(0, cctx->data, cctx->length);
 
 	cctx->size = sizeof(*ccmd) + cctx->length;
 
@@ -1834,7 +1812,7 @@ static int sb_verify_command(struct sb_image_ctx *ictx,
 		EVP_DigestUpdate(&ictx->md_ctx, cctx->data, asize);
 		sb_aes_crypt(ictx, cctx->data, cctx->data, asize);
 
-		if (ccmd->load.crc32 != crc32(cctx->data, asize)) {
+		if (ccmd->load.crc32 != pbl_crc32(0, cctx->data, asize)) {
 			fprintf(stderr,
 				"ERR: SB LOAD command payload CRC32 invalid!\n");
 			return -EINVAL;
Signature · 1 line
1.7.9.5
#4 lore raw

PATCH 2/2 mkimage: Refactor mxsimage to use common crc32 code

Hi Charles,

Quoted 60 lines · Charles Manning

mxsimage uses the same crc32 function as pblimage.

---
 tools/mxsimage.c |   28 +++-------------------------
 1 file changed, 3 insertions(+), 25 deletions(-)
tools/mxsimage.c +2 -24
index 045b35a..0c4348c 100644
@@ -19,6 +19,7 @@
 
 #include "imagetool.h"
 #include "mxsimage.h"
+#include "pbl_crc32.h"
 #include <image.h>
 
 
@@ -231,29 +232,6 @@ static int sb_aes_reinit(struct sb_image_ctx *ictx, int enc)
 }
 
 /*
- * CRC32
- */
-static uint32_t crc32(uint8_t *data, uint32_t len)
-{
-	const uint32_t poly = 0x04c11db7;
-	uint32_t crc32 = 0xffffffff;
-	unsigned int byte, bit;
-
-	for (byte = 0; byte < len; byte++) {
-		crc32 ^= data[byte] << 24;
-
-		for (bit = 8; bit > 0; bit--) {
-			if (crc32 & (1UL << 31))
-				crc32 = (crc32 << 1) ^ poly;
-			else
-				crc32 = (crc32 << 1);
-		}
-	}
-
-	return crc32;
-}
-
-/*
  * Debug
  */
 static void soprintf(struct sb_image_ctx *ictx, const char *fmt, ...)
@@ -998,7 +976,7 @@ static int sb_build_command_load(struct sb_image_ctx *ictx,
 
 	ccmd->load.address	= dest;
 	ccmd->load.count	= cctx->length;
-	ccmd->load.crc32	= crc32(cctx->data, cctx->length);
+	ccmd->load.crc32	= pbl_crc32(0, cctx->data, cctx->length);
 
 	cctx->size = sizeof(*ccmd) + cctx->length;
 

tools/mxsimage.c static int sb_verify_command(struct sb_image_ctx *ictx, · line 1818

Quoted 8 lines
tools/mxsimage.c +1 -1
@@ -1834,7 +1812,7 @@ static int sb_verify_command(struct sb_image_ctx *ictx,
 		EVP_DigestUpdate(&ictx->md_ctx, cctx->data, asize);
 		sb_aes_crypt(ictx, cctx->data, cctx->data, asize);
 
-		if (ccmd->load.crc32 != crc32(cctx->data, asize)) {
+		if (ccmd->load.crc32 != pbl_crc32(0, cctx->data, asize)) {
 			fprintf(stderr,
 				"ERR: SB LOAD command payload CRC32 invalid!\n");
 			return -EINVAL;

Good idea to factorize these functions, thanks !

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#5 lore raw

PATCH 2/2 mkimage: Refactor mxsimage to use common crc32 code

In reply to Charles Manning
Quoted 4 lines · Charles Manning

mxsimage uses the same crc32 function as pblimage.

This introduces warnings:
tools/mxsimage.c: In function ?sb_build_command_load?:
tools/mxsimage.c:979:2: warning: pointer targets in passing argument 2 of ?pbl_crc32? differ in signedness [-Wpointer-sign] tools/pbl_crc32.h:11:10: note: expected ?const char *? but argument is of type ?uint8_t *? u-boot/tools/mxsimage.c: In function ?sb_verify_command?:
tools/mxsimage.c:1815:3: warning: pointer targets in passing argument 2 of ?pbl_crc32? differ in signedness [-Wpointer-sign] tools/pbl_crc32.h:11:10: note: expected ?const char *? but argument is of type ?uint8_t *?

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140512/a6caceff/attachment.pgp>
#6 lore raw

PATCH 2/2 mkimage: Refactor mxsimage to use common crc32 code

Quoted 6 lines · On Tuesday 13 May 2014 08:26:44 Tom Rini wrote:
Quoted 4 lines · Charles Manning

mxsimage uses the same crc32 function as pblimage.

Quoted 9 lines

This introduces warnings:
tools/mxsimage.c: In function ?sb_build_command_load?:
tools/mxsimage.c:979:2: warning: pointer targets in passing argument 2 of ?pbl_crc32? differ in signedness [-Wpointer-sign] tools/pbl_crc32.h:11:10:
note: expected ?const char *? but argument is of type ?uint8_t *? u-boot/tools/mxsimage.c: In function ?sb_verify_command?:
tools/mxsimage.c:1815:3: warning: pointer targets in passing argument 2 of ?pbl_crc32? differ in signedness [-Wpointer-sign] tools/pbl_crc32.h:11:10:
note: expected ?const char *? but argument is of type ?uint8_t *?

Thanks for the feedback.

Will it be acceptable to do the following:

*Change the called function from uint8_t * to const uint8_t *Cast the const char * pointer to const uint8_t *.

Thanks

Charles

#7 lore raw

PATCH 2/2 mkimage: Refactor mxsimage to use common crc32 code

Quoted 17 lines · Charles Manning
Quoted 6 lines · On Tuesday 13 May 2014 08:26:44 Tom Rini wrote:
Quoted 4 lines · Charles Manning

mxsimage uses the same crc32 function as pblimage.

Quoted 9 lines

This introduces warnings:
tools/mxsimage.c: In function ?sb_build_command_load?:
tools/mxsimage.c:979:2: warning: pointer targets in passing argument 2 of ?pbl_crc32? differ in signedness [-Wpointer-sign] tools/pbl_crc32.h:11:10:
note: expected ?const char *? but argument is of type ?uint8_t *? u-boot/tools/mxsimage.c: In function ?sb_verify_command?:
tools/mxsimage.c:1815:3: warning: pointer targets in passing argument 2 of ?pbl_crc32? differ in signedness [-Wpointer-sign] tools/pbl_crc32.h:11:10:
note: expected ?const char *? but argument is of type ?uint8_t *?

Quoted 6 lines

Thanks for the feedback.

Will it be acceptable to do the following:

*Change the called function from uint8_t * to const uint8_t *Cast the const char * pointer to const uint8_t *.

Sounds right.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140513/5dfa0834/attachment.pgp>
#8 lore raw

v2 cover mkimage: Refactor and clean up 32-bit crcs

In reply to Charles Manning

As a step towards adding an image signer for socfpga, this set of patches breaks out the common crc code that is used in both pblimage and mxsimage.

Not that this is NOT the same algorithm as the crc generated by zlib.

The new function has been named pbl_crc32.

This patch set just changes patch 1/2: casting pointers in mxsimage.c

Charles Manning (2):
mkimage : Split out and clean pbl_crc32 for use by other image types
tools: Refactor mxsimage to use pbl_crc32

 tools/Makefile    |    1 +
 tools/mxsimage.c  |   32 +++++++-----------------------
 tools/pbl_crc32.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/pbl_crc32.h |   13 +++++++++++++
 tools/pblimage.c  |   47 +-------------------------------------------
 5 files changed, 78 insertions(+), 71 deletions(-)
 create mode 100644 tools/pbl_crc32.c
 create mode 100644 tools/pbl_crc32.h
Signature · 1 line
1.7.9.5
#9 lore raw

PATCH v2 1/2 mkimage : Split out and clean pbl_crc32 for use by other image types

The crc32 used by pblimgae is NOT the same as zlib crc32.

The pbl_crc32 is useful for other purposes in mkimage so split it out.

While we are about it, clean up redundant and confusing code.

---

Unchanged from V1.

 tools/Makefile    |    1 +
 tools/pbl_crc32.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/pbl_crc32.h |   13 +++++++++++++
 tools/pblimage.c  |   47 +-------------------------------------------
 4 files changed, 71 insertions(+), 46 deletions(-)
 create mode 100644 tools/pbl_crc32.c
 create mode 100644 tools/pbl_crc32.h
tools/Makefile +1 -0
index c34df4f..2f30749 100644
@@ -86,6 +86,7 @@ dumpimage-mkimage-objs := aisimage.o \
 			omapimage.o \
 			os_support.o \
 			pblimage.o \
+			pbl_crc32.o \
 			sha1.o \
 			sha256.o \
 			ublimage.o \
tools/pbl_crc32.c new file +56 -0

56 lines not on this page · raw message

tools/pbl_crc32.h new file +13 -0
new file mode 100644
index 0000000..4ab55ee
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef PBLCRC32_H
+#define PBLCRC32_H
+
+#include <stdint.h>
+uint32_t pbl_crc32(uint32_t in_crc, const char *buf, uint32_t len);
+
+#endif
tools/pblimage.c +1 -46

59 lines not on this page · raw message

Signature · 1 line
1.7.9.5
#10 lore raw

PATCH v2 1/2 mkimage : Split out and clean pbl_crc32 for use by other image types

Quoted 7 lines · Charles Manning

The crc32 used by pblimgae is NOT the same as zlib crc32.

The pbl_crc32 is useful for other purposes in mkimage so split it out.

While we are about it, clean up redundant and confusing code.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140605/5a828342/attachment.pgp>
#11 lore raw

PATCH v2 2/2 tools: Refactor mxsimage to use pbl_crc32

In reply to Charles Manning

Both pblimage and mxsimage use the same crc algorithm, so refactor.

---
Changes for V2:
- Cast buffer pointers when calling pbl_crc32().

 tools/mxsimage.c |   32 +++++++-------------------------
 1 file changed, 7 insertions(+), 25 deletions(-)
tools/mxsimage.c +7 -25
index 045b35a..81c7f2d 100644
@@ -19,6 +19,7 @@
 
 #include "imagetool.h"
 #include "mxsimage.h"
+#include "pbl_crc32.h"
 #include <image.h>
 
 
@@ -231,29 +232,6 @@ static int sb_aes_reinit(struct sb_image_ctx *ictx, int enc)
 }
 
 /*
- * CRC32
- */
-static uint32_t crc32(uint8_t *data, uint32_t len)
-{
-	const uint32_t poly = 0x04c11db7;
-	uint32_t crc32 = 0xffffffff;
-	unsigned int byte, bit;
-
-	for (byte = 0; byte < len; byte++) {
-		crc32 ^= data[byte] << 24;
-
-		for (bit = 8; bit > 0; bit--) {
-			if (crc32 & (1UL << 31))
-				crc32 = (crc32 << 1) ^ poly;
-			else
-				crc32 = (crc32 << 1);
-		}
-	}
-
-	return crc32;
-}
-
-/*
  * Debug
  */
 static void soprintf(struct sb_image_ctx *ictx, const char *fmt, ...)
@@ -998,7 +976,9 @@ static int sb_build_command_load(struct sb_image_ctx *ictx,
 
 	ccmd->load.address	= dest;
 	ccmd->load.count	= cctx->length;
-	ccmd->load.crc32	= crc32(cctx->data, cctx->length);
+	ccmd->load.crc32	= pbl_crc32(0,
+					    (const char *)cctx->data,
+					    cctx->length);
 
 	cctx->size = sizeof(*ccmd) + cctx->length;
 
@@ -1834,7 +1814,9 @@ static int sb_verify_command(struct sb_image_ctx *ictx,
 		EVP_DigestUpdate(&ictx->md_ctx, cctx->data, asize);
 		sb_aes_crypt(ictx, cctx->data, cctx->data, asize);
 
-		if (ccmd->load.crc32 != crc32(cctx->data, asize)) {
+		if (ccmd->load.crc32 != pbl_crc32(0,
+						  (const char *)cctx->data,
+						  asize)) {
 			fprintf(stderr,
 				"ERR: SB LOAD command payload CRC32 invalid!\n");
 			return -EINVAL;
Signature · 1 line
1.7.9.5
#12 lore raw

PATCH v2 2/2 tools: Refactor mxsimage to use pbl_crc32

Quoted 3 lines · Charles Manning

Both pblimage and mxsimage use the same crc algorithm, so refactor.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140605/93cb317e/attachment.pgp>