From: Zachary Vance Date: Sun, 14 May 2017 04:56:49 +0000 (-0700) Subject: Base64 encode/decode working X-Git-Url: https://git.za3k.com/?a=commitdiff_plain;h=51bb7b50d3a497610805b5bbd6e3e7ddc3815aae;p=cryptopals.git Base64 encode/decode working --- diff --git a/io.c b/io.c index 4650ff0..71438e7 100644 --- a/io.c +++ b/io.c @@ -2,55 +2,98 @@ #include #include +void encode_hex(const char* src_bytes, int src_size, char* dest) { + const char hex[17] = "0123456789abcdef"; + int i; + for (i=0; i> 4]; + *dest++ = hex[src_bytes[i] & 0x0F]; + } + *dest = 0; +} + 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 values[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 255}; const char ILLEGAL_CHAR = 255; int i; - char conversion[256] = { ILLEGAL_CHAR }; - for (i=0; i= 3) { // 3 bytes = 24 bits = 4 output + dest[0] = conversion[(srcp[0] & 0xFC) >> 2]; + dest[1] = conversion[(srcp[0] & 0x03) << 4 | (srcp[1] & 0xF0) >> 4]; + dest[2] = conversion[(srcp[1] & 0x0F) << 2 | (srcp[2] & 0xC0) >> 6]; + dest[3] = conversion[ srcp[2] & 0x3F]; + srcp+=3; + dest+=4; + src_size-=3; + } + if (src_size == 2) { + dest[0] = conversion[(srcp[0] & 0xFC) >> 2]; + dest[1] = conversion[(srcp[0] & 0x03) << 4 | (srcp[1] & 0xF0) >> 4]; + dest[2] = conversion[(srcp[1] & 0x0F) << 2]; + dest[3] = padding; + dest+=4; + } else if (src_size == 1) { + dest[0] = conversion[(srcp[0] & 0xFC) >> 2]; + dest[1] = conversion[(srcp[0] & 0x03) << 4]; + dest[2] = padding; + dest[3] = padding; + dest+=4; + } + *dest = 0; +} + int decode_base64(char* src, char* dest, int* destlen) { char base64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const char ILLEGAL_CHAR = 255; const char padding = '='; int i; - char conversion[256] = {ILLEGAL_CHAR}; - for (i=0; i<64; i++) { + char conversion[256]; + for (i=0; i<256; i++) + conversion[i] = ILLEGAL_CHAR; + for (i=0; i<64; i++) conversion[base64[i]] = i; - } - if (strlen(src)%4) return 0; // We can't deal with strings unless they are padded + if (strlen(src)%4) { printf("Strings must be padded to a multiple of 4 bytes\n"); return 0; } // We can't deal with strings unless they are padded // Decode *destlen=0; while(*src != 0) { if (*(src+1) == 0 || *(src+2) == 0 || - *(src+3) == 0) return 0; + *(src+3) == 0) { printf("Strings must be padded to a multiple of 4 bytes\n"); return 0; } if (*src == padding || *(src+1) == padding) return 0; if (*(src+2) == padding) { + printf("2 padding\n"); // 2 padding characters if(*(src+3) != padding) return 0; if(*(src+4) != 0) return 0; @@ -58,9 +101,11 @@ int decode_base64(char* src, char* dest, int* destlen) { conversion[*(src+1)] == ILLEGAL_CHAR) return 0; if (conversion[*(src+2)] & 0x0F != 0) return 0; - *dest++ = conversion[*src] + (conversion[*(src+1)] & 0x30 >> 4); + dest[0] = (conversion[*src] & 0xFF) << 2 | (conversion[*(src+1)] & 0x30) >> 4; + *destlen+=1; return 1; } else if (*(src+3) == padding) { + printf("1 padding\n"); // 1 padding character if(*(src+4) != 0) return 0; if (conversion[*src] == ILLEGAL_CHAR || @@ -68,53 +113,19 @@ int decode_base64(char* src, char* dest, int* destlen) { 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); + dest[0] = (conversion[*src] & 0xFF) << 2 | (conversion[*(src+1)] & 0x30) >> 4; + dest[1] = (conversion[*(src+1)] & 0x0F) << 4 | (conversion[*(src+2)] & 0x3C) >> 2; + *destlen+=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)]; + dest[0] = (conversion[*src] & 0x3F) << 2 | (conversion[*(src+1)] & 0x30) >> 4; + dest[1] = (conversion[*(src+1)] & 0x0F) << 4 | (conversion[*(src+2)] & 0x3C) >> 2; + dest[2] = (conversion[*(src+2)] & 0x03) << 6 | (conversion[*(src+3)] & 0x3F); + src+=4; + dest+=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