summaryrefslogtreecommitdiffstats
path: root/templates
diff options
context:
space:
mode:
authorMalfurious <m@lfurio.us>2021-11-28 02:06:23 -0500
committerMalfurious <m@lfurio.us>2021-11-28 02:06:23 -0500
commit6f3856705c226557ff64bf2c24cafad55844c562 (patch)
tree49386b5c5e3ef2bad118ad05e213454c9880e6ce /templates
parentadeca0ca315928384873c15b25a884065b9cb1cb (diff)
downloadlib-des-gnux-6f3856705c226557ff64bf2c24cafad55844c562.tar.gz
lib-des-gnux-6f3856705c226557ff64bf2c24cafad55844c562.zip
Commit notes from Killer Queen CTF 2021
Signed-off-by: Malfurious <m@lfurio.us>
Diffstat (limited to 'templates')
-rw-r--r--templates/image_manip/png_crc.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/templates/image_manip/png_crc.c b/templates/image_manip/png_crc.c
new file mode 100644
index 0000000..dfe9d44
--- /dev/null
+++ b/templates/image_manip/png_crc.c
@@ -0,0 +1,55 @@
+/* PNG Chunk layout:
+ 4-byte: length (of data) // Excluded from CRC
+ 4-byte: type (ASCII alphabetic)
+ ?-byte: chunk data
+ 4-byte: crc (see below...)
+
+ References:
+ http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html
+ http://www.libpng.org/pub/png/spec/1.2/PNG-CRCAppendix.html */
+
+
+/* Table of CRCs of all 8-bit messages. */
+unsigned long crc_table[256];
+int crc_table_computed = 0;
+
+/* Make the table for a fast CRC. */
+void make_crc_table(void)
+{
+ unsigned long c;
+ int n, k;
+
+ for (n = 0; n < 256; n++) {
+ c = (unsigned long) n;
+ for (k = 0; k < 8; k++) {
+ if (c & 1)
+ c = 0xedb88320L ^ (c >> 1);
+ else
+ c = c >> 1;
+ }
+ crc_table[n] = c;
+ }
+ crc_table_computed = 1;
+}
+
+/* Update a running CRC with the bytes buf[0..len-1]--the CRC should be
+ initialized to all 1's, and the transmitted value is the 1's complement of
+ the final running CRC (see the crc() routine below). */
+unsigned long update_crc(unsigned long crc, const unsigned char *buf, int len)
+{
+ unsigned long c = crc;
+ int n;
+
+ if (!crc_table_computed)
+ make_crc_table();
+ for (n = 0; n < len; n++) {
+ c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
+ }
+ return c;
+}
+
+/* Return the CRC of the bytes buf[0..len-1]. */
+unsigned long crc(const unsigned char *buf, int len)
+{
+ return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL;
+}