2020-03-31 18:28:12 +02:00
|
|
|
#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);
|
|
|
|
|
2020-04-14 19:32:15 +02:00
|
|
|
// Put truncated hash into buf
|
2020-03-31 18:28:12 +02:00
|
|
|
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) {
|
2020-04-28 17:47:31 +02:00
|
|
|
// Get list length to initialize concat buffer
|
2020-04-28 18:07:06 +02:00
|
|
|
int concat_len = len_list(data_list) * 16;
|
2020-04-28 17:47:31 +02:00
|
|
|
unsigned char *concat = (unsigned char*) malloc(concat_len);
|
|
|
|
|
2020-03-31 18:28:12 +02:00
|
|
|
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);
|
|
|
|
|
2020-04-14 19:32:15 +02:00
|
|
|
// Put truncated hash into buf
|
2020-03-31 18:28:12 +02:00
|
|
|
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);
|
2020-04-14 19:32:15 +02:00
|
|
|
}
|