string hex_encode(uint8_t *data, size_t data_len) { uint8_t *ascii_hash = new uint8_t[data_len * 2]; base16_encode_update( ascii_hash, data_len, data ); string hexed{(const char *)ascii_hash, data_len * 2}; delete [] ascii_hash; return hexed; }
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; }