From 8a8fd11d682ca9a8f6a32105258d38ced19f152f Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Wed, 12 Jun 2013 20:17:16 -0300 Subject: [PATCH] Calculate message hash and use it. Use gcrypt to calculate stripped file MD5 hash and add it to the key/value message. --- configure.ac | 5 +++-- decfile.c | 16 ++++++++++++++++ decfile.h | 1 + rnet_encode.c | 8 ++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 40dc358..847d13c 100644 --- a/configure.ac +++ b/configure.ac @@ -3,6 +3,7 @@ AM_INIT_AUTOMAKE(AC_PACKAGE_NAME,AC_PACKAGE_VERSION) AC_PROG_CC AC_PROG_INSTALL PKG_CHECK_MODULES(GNUTLS, gnutls >= 1.4.0, , AC_MSG_ERROR(Could not find gnutls)) -LIBS="$GNUTLS_LIBS $LIBS -lz" -CFLAGS="$GNUTLS_CFLAGS $CFLAGS" +AM_PATH_LIBGCRYPT(,,AC_MSG_ERROR(Could not find gcrypt)) +LIBS="$LIBGCRYPT_LIBS $GNUTLS_LIBS $LIBS -lz" +CFLAGS="$LIBGCRYPT_CFLAGS $GNUTLS_CFLAGS $CFLAGS" AC_OUTPUT(Makefile) diff --git a/decfile.c b/decfile.c index edd0937..001541d 100644 --- a/decfile.c +++ b/decfile.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "pmhash.h" #include "rnet_message.h" @@ -326,3 +327,18 @@ struct rnet_message * rnet_decfile_get_file(struct rnet_decfile *decfile) { return decfile->message; } + +char * rnet_decfile_get_file_hash(struct rnet_decfile *decfile) +{ + char *hash; + size_t len; + if (gcry_md_test_algo(GCRY_MD_MD5)) + return NULL; + len = gcry_md_get_algo_dlen(GCRY_MD_MD5); + hash = malloc(len); + if (!hash) + return NULL; + gcry_md_hash_buffer(GCRY_MD_MD5, hash, decfile->message->buffer, + decfile->message->len); + return hash; +} diff --git a/decfile.h b/decfile.h index d303a3f..523362d 100644 --- a/decfile.h +++ b/decfile.h @@ -27,5 +27,6 @@ void rnet_decfile_close(struct rnet_decfile *decfile); char *rnet_decfile_get_header_field(struct rnet_decfile *decfile, char *field); struct rnet_message * rnet_decfile_get_file(struct rnet_decfile *decfile); +char * rnet_decfile_get_file_hash(struct rnet_decfile *decfile); #endif diff --git a/rnet_encode.c b/rnet_encode.c index 9800ec6..3f75a13 100644 --- a/rnet_encode.c +++ b/rnet_encode.c @@ -39,6 +39,7 @@ int rnet_encode(struct rnet_decfile *decfile, struct rnet_message **msg) char *uf; uint16_t versao_pgd; uint64_t file_len; + char *hash; *msg = rnet_message_new(); if (*msg == NULL) { @@ -46,6 +47,9 @@ int rnet_encode(struct rnet_decfile *decfile, struct rnet_message **msg) } file_len = rnet_decfile_get_file(decfile)->len; + hash = rnet_decfile_get_file_hash(decfile); + if (!hash) + return -1; codigo_recnet = rnet_decfile_get_header_field(decfile, "codigo_recnet"); tp_arq = strtoul(codigo_recnet, NULL, 10); @@ -63,6 +67,8 @@ int rnet_encode(struct rnet_decfile *decfile, struct rnet_message **msg) r = rnet_message_add_u32(msg, "id_dec", id_dec); r = rnet_message_add_ascii(msg, "exercicio", ano); r = rnet_message_add_ascii(msg, "exercicio_pgd", exerc); + r = rnet_message_add_buffer(msg, "hash_arq", hash, 16); + r = rnet_message_add_buffer(msg, "hash_trans", hash, 16); r = rnet_message_add_ascii(msg, "ni", cpf); r = rnet_message_add_ascii(msg, "tipo_ni", "CPF"); r = rnet_message_add_u8(msg, "num_ass", 0); @@ -84,6 +90,8 @@ int rnet_encode(struct rnet_decfile *decfile, struct rnet_message **msg) r = rnet_message_add_u64(msg, "tam_dados_val_chave", 0); r = rnet_message_add_u32(msg, "arquivos_restantes", 0); + free(hash); + if (r < 0) return r; return 0; -- 2.20.1