Calculate message hash and use it.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Wed, 12 Jun 2013 23:17:16 +0000 (20:17 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Wed, 12 Jun 2013 23:17:16 +0000 (20:17 -0300)
Use gcrypt to calculate stripped file MD5 hash and add it to the
key/value message.

configure.ac
decfile.c
decfile.h
rnet_encode.c

index 40dc358..847d13c 100644 (file)
@@ -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)
index edd0937..001541d 100644 (file)
--- a/decfile.c
+++ b/decfile.c
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>
+#include <gcrypt.h>
 #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;
+}
index d303a3f..523362d 100644 (file)
--- 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
index 9800ec6..3f75a13 100644 (file)
@@ -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;