commit 2d2cb64b8d25d7b71dbb804c133e91cfcb9b4f52 Author: Dimitri Lozeve Date: Tue Jun 2 20:01:36 2020 +0200 Initial commit: challenge 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9347dd3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*\~ +build/ diff --git a/ex01/main.c b/ex01/main.c new file mode 100644 index 0000000..a02b24c --- /dev/null +++ b/ex01/main.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +size_t hex_to_binary(unsigned char *out, const char hex[static 1]) { + for (size_t i = 0; i < strlen(hex); ++i) { + char c = tolower(hex[i]); + unsigned char value; + if (isdigit(c)) { + value = c - '0'; + } else { + value = 10 + c - 'a'; + } + if (i % 2 == 0) { + value <<= 4; + } + out[i / 2] += value; + } + return strlen(hex) / 2 + strlen(hex) % 2; +} + +unsigned char *binary_to_base64(unsigned char *out, + const unsigned char in[static 1], size_t len) { + static const unsigned char base64_table[65] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + for (size_t i = 0; i < len - 2; i += 3) { + size_t j = i / 3 * 4; + out[j] = base64_table[in[i] >> 2]; + out[j+1] = base64_table[((in[i] & 0x03) << 4) | (in[i+1] >> 4)]; + out[j+2] = base64_table[((in[i+1] & 0x0f) << 2) | (in[i+2] >> 6)]; + out[j+3] = base64_table[in[i+2] & 0x3f]; + } + return out; +} + +int main(int argc, char *argv[argc + 1]) { + if (argc < 2) { + printf("Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + unsigned char buf[512] = {0}; + size_t len = hex_to_binary(buf, argv[1]); + unsigned char out[512] = {'\0'}; + binary_to_base64(out, buf, len); + printf("%s\n", out); + + return EXIT_SUCCESS; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..47e1bca --- /dev/null +++ b/meson.build @@ -0,0 +1,2 @@ +project('cryptopals', 'c') +executable('ex01', 'ex01/main.c')