#include "hash.h" // Hash a single data void hash_data(pub_data *data, unsigned char *buf) { // All three fields are concatenated into a single buffer int totlen = data->length + 10; unsigned char concat[totlen]; concat_data(data, concat); // The resulting buf is hashed and put into a buffer unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256(concat, totlen, hash); // Put truncated hash into buf hash_trunc(hash, buf); } // Hash every data contained in data_list then return a network hash void hash_network(list *data_list, unsigned char *buf) { // Get list length to initialize concat buffer int concat_len = len_list(data_list) * SHA256_DIGEST_LENGTH; unsigned char *concat = (unsigned char*) malloc(concat_len); unsigned char hash[SHA256_DIGEST_LENGTH]; int totlen = 0; list *tmp = data_list; // Hash every known data and concatenate it to buffer concat while(tmp != NULL) { hash_data((pub_data*) tmp->data, hash); concat_hash(concat, hash, totlen); totlen += 16; tmp = tmp->next; } // Hash all of concat to obtain the network hash SHA256(concat, totlen, hash); // Put truncated hash into buf hash_trunc(hash, buf); // Get rid of concat free(concat); } // Truncate 32 octet hash to 16 octets void hash_trunc(unsigned char *hash32oct, unsigned char *buf) { // Copy the first 16 octets from hash32oct memcpy(buf, hash32oct, 16); } // Concat all fields of data and put them in buf void concat_data(pub_data *data, unsigned char *buf) { memcpy(buf, &(data->id), 8); memcpy(buf+8, &(data->seqno), 2); memcpy(buf+10, data->data, data->length); } // Concat hash2 to hash1 (hash1 is modified) void concat_hash(unsigned char *hash1, unsigned char *hash2, size_t size) { memcpy(hash1+size, hash2, 16); }