int md5_sum(FILE *input, char output_string[BASE16_ENCODE_LENGTH(MD5_DIGEST_SIZE)]) { unsigned char bytes[BUFFER_SIZE]; size_t bytes_read; struct md5_ctx md5; uint8_t digest[MD5_DIGEST_SIZE]; md5_init(&md5); while((bytes_read = fread(bytes, sizeof(unsigned char), BUFFER_SIZE, input)) > 0) { md5_update(&md5, bytes_read, bytes); } if(ferror(input) != 0) { fprintf(stderr, "Error reading input file: %s.\n", strerror(errno)); return -1; } md5_digest(&md5, MD5_DIGEST_SIZE, digest); // And build the hex checksum the nettle way ;) base16_encode_update((uint8_t *)output_string, MD5_DIGEST_SIZE, digest); return 0; }
static size_t base16_encode_length(size_t length) { return BASE16_ENCODE_LENGTH(length); }