diff options
author | Malfurious <m@lfurio.us> | 2021-11-28 02:06:23 -0500 |
---|---|---|
committer | Malfurious <m@lfurio.us> | 2021-11-28 02:06:23 -0500 |
commit | 6f3856705c226557ff64bf2c24cafad55844c562 (patch) | |
tree | 49386b5c5e3ef2bad118ad05e213454c9880e6ce /templates | |
parent | adeca0ca315928384873c15b25a884065b9cb1cb (diff) | |
download | lib-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.c | 55 |
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; +} |