#include #include #include #include int main() { size_t PUZZLE_SIZE = 8; //puzzle input is 8 characters with no ending newline character //load input string FILE *file = fopen("input", "r"); if (file == NULL) { perror("main: error opening file."); return -1; } char input[256]; while (fgets(input, sizeof(input), file)); if (strlen(input) != PUZZLE_SIZE) { perror("main: error reading file."); return -1; } printf("puzzle input: %s\n", input); //initialize MD5 context //note: ignore gcc's warnings that MD5 is depreciated MD5_CTX md5_context; uint8_t md5_hash[MD5_DIGEST_LENGTH]; char md5_string[MD5_DIGEST_LENGTH * 2 + 1]; //32 hexadecimal digits //each byte needs two characters in hex, plus one for '\0' char *md5_string_ptr = md5_string; int32_t chars_written; int32_t available_space; int32_t count = -1; //initialize count at -1 so that the first count++ sets it to 0 while (strncmp(md5_string, "00000", 5) != 0) { count++; chars_written = snprintf(input + PUZZLE_SIZE, sizeof(input) - strlen(input), "%i", count); available_space = sizeof(input) - strlen(input); if (chars_written >= available_space) { perror("main: buffer overflow."); return -1; } //initialize MD5 context MD5_Init(&md5_context); //update context with input (+ count) data MD5_Update(&md5_context, input, strlen(input)); //finalize MD5 hash MD5_Final(md5_hash, &md5_context); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) { md5_string_ptr += sprintf(md5_string_ptr, "%02x", md5_hash[i]); } md5_string_ptr = md5_string; //reset pointer } printf("count %i: %s\n", count, md5_string); return 0; }