From affb7a58954d3c0047e22a6c4220cef2a164571e Mon Sep 17 00:00:00 2001 From: Zachary Vance Date: Sat, 13 May 2017 19:09:49 -0700 Subject: [PATCH] Initial commit --- .gitignore | 2 + Makefile | 14 +++++++ io.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ io.h | 4 ++ io.test.c | 43 +++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 io.c create mode 100644 io.h create mode 100644 io.test.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a8be9d5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +*.test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..637f5c5 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +CC=gcc +ODIR=obj +CFLAGS= + +all: io.o io.test.o +%.test: %.o %.test.c + $(CC) -o $@ $? $(CFLAGS) +test: io.test + ./io.test +clean: + rm -f *.o a.out *.test + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) diff --git a/io.c b/io.c new file mode 100644 index 0000000..4650ff0 --- /dev/null +++ b/io.c @@ -0,0 +1,120 @@ +#include +#include +#include + +int decode_hex(char* src, char* dest, int *destlen) { + // Returns 1 for success, 0 for failure + const char valid_chars[] ="0123456789aAbBcCdDeEfF"; + const char values[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15}; + const char ILLEGAL_CHAR = 255; + int i; + char conversion[256] = { ILLEGAL_CHAR }; + for (i=0; i> 4); + return 1; + } else if (*(src+3) == padding) { + // 1 padding character + if(*(src+4) != 0) return 0; + if (conversion[*src] == ILLEGAL_CHAR || + conversion[*(src+1)] == ILLEGAL_CHAR || + conversion[*(src+2)] == ILLEGAL_CHAR) return 0; + if (conversion[*(src+2)] & 0x03 != 0) return 0; + + *dest++ = conversion[*src] + (conversion[*(src+1)] & 0x30 >> 4); + *dest++ = (conversion[*(src+1)] & 0x0F) + (conversion[*(src+2)] & 0x3C >> 2); + return 1; + } else { + // 0 padding characters + *dest++ = conversion[*src] + (conversion[*(src+1)] & 0x30 >> 4); + *dest++ = (conversion[*(src+1)] & 0x0F) + (conversion[*(src+2)] & 0x3C >> 2); + *dest++ = (conversion[*(src+2)] & 0x03) + conversion[*(src+3)]; + *destlen+=3; + } + } + *dest=0; + return 1; +} + +void encode_base64(const char* src_bytes, int src_size, char* dest) { + const char conversion[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + const char padding = ' '; + const char* srcp = src_bytes; + while(src_size > 3) { // 3 bytes = 24 bits = 4 output + *dest++ = conversion[src_bytes[0] & 0xFC]; + *dest++ = conversion[(src_bytes[0] << 6) + src_bytes[1] & 0xF0]; + *dest++ = conversion[(src_bytes[1] << 4) + src_bytes[2] & 0xC0]; + *dest++ = conversion[(src_bytes[2] << 2)]; + src_bytes+=3; + src_size-=3; + } + if (src_size == 2) { + *dest++ = conversion[src_bytes[0] & 0xFC]; + *dest++ = conversion[(src_bytes[0] << 6) + src_bytes[1] & 0xF0]; + *dest++ = conversion[(src_bytes[1] << 4)]; + *dest++ = padding; + } else if (src_size == 1) { + *dest++ = conversion[src_bytes[0] & 0xFC]; + *dest++ = conversion[(src_bytes[0] << 6)]; + *dest++ = padding; + *dest++ = padding; + } + *dest = 0; +} + +void encode_hex(const char* src_bytes, int src_size, char* dest) { + char hex[17] = "0123456789ABCDEF"; + int i; + for (i=0; i +#include +#include +#include "io.h" + +int main() { + char sample_hex[] = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; + char reencoded_hex[sizeof(sample_hex)*2]; + char bytes[sizeof(sample_hex)], decoded_bytes[sizeof(sample_hex)]; + int bytes_size, decoded_bytes_size; + if (!decode_hex(sample_hex, bytes, &bytes_size)) { + printf("Decode hex failed"); + exit(1); + } + encode_hex(bytes, bytes_size, reencoded_hex); + if (strcmp(sample_hex, reencoded_hex) == 0) { + printf("hex decode/encode: success"); + } else { + printf("Expected %s\n Got: %s", sample_hex, reencoded_hex); + } + + char expected_base64[] = "SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t"; + char base64[sizeof(sample_hex)*4/3+5]; + encode_base64(bytes, bytes_size, base64); + if (strcmp(base64,expected_base64)) { + printf("Base64 encode: success"); + } else { + printf("Expected: %s\n Got: %s", expected_base64, base64); + exit(1); + } + + if (!decode_base64(base64, decoded_bytes, &decoded_bytes_size)) { + printf("Decode base64 failed"); + exit(1); + } + if (bytes_size == decoded_bytes_size && memcmp(bytes, decoded_bytes, bytes_size) == 0) { + printf("Base64 decode: success"); + } else { + printf("Base64 decode is wrong"); + exit(1); + } + +} -- 2.47.3