Add SHA1, RMD160, and MD5 hashes to capinfos.
svn path=/trunk/; revision=31191
This commit is contained in:
parent
f25bb34d81
commit
7c276becfd
|
@ -428,7 +428,8 @@ mergecap_CFLAGS = $(AM_CLEAN_CFLAGS) $(py_dissectors_dir)
|
||||||
capinfos_LDADD = \
|
capinfos_LDADD = \
|
||||||
wiretap/libwiretap.la \
|
wiretap/libwiretap.la \
|
||||||
wsutil/libwsutil.la \
|
wsutil/libwsutil.la \
|
||||||
@GLIB_LIBS@
|
@GLIB_LIBS@ \
|
||||||
|
@LIBGCRYPT_LIBS@
|
||||||
capinfos_CFLAGS = $(AM_CLEAN_CFLAGS) $(py_dissectors_dir)
|
capinfos_CFLAGS = $(AM_CLEAN_CFLAGS) $(py_dissectors_dir)
|
||||||
|
|
||||||
# Libraries with which to link editcap.
|
# Libraries with which to link editcap.
|
||||||
|
|
131
capinfos.c
131
capinfos.c
|
@ -74,6 +74,11 @@
|
||||||
#include "wtap.h"
|
#include "wtap.h"
|
||||||
#include <wsutil/privileges.h>
|
#include <wsutil/privileges.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
#include <gcrypt.h>
|
||||||
|
#include <wsutil/file_util.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#else
|
#else
|
||||||
|
@ -128,12 +133,34 @@ static gboolean cap_data_rate_byte = TRUE; /* Report data rate bytes/sec */
|
||||||
static gboolean cap_data_rate_bit = TRUE; /* Report data rate bites/sec */
|
static gboolean cap_data_rate_bit = TRUE; /* Report data rate bites/sec */
|
||||||
static gboolean cap_packet_size = TRUE; /* Report average packet size */
|
static gboolean cap_packet_size = TRUE; /* Report average packet size */
|
||||||
static gboolean cap_packet_rate = TRUE; /* Report average packet rate */
|
static gboolean cap_packet_rate = TRUE; /* Report average packet rate */
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
static gboolean cap_file_hashes = TRUE; /* Calculate file hashes */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
#define HASH_SIZE_SHA1 20
|
||||||
|
#define HASH_SIZE_RMD160 20
|
||||||
|
#define HASH_SIZE_MD5 16
|
||||||
|
|
||||||
|
#define HASH_STR_SIZE (41) /* Max hash size * 2 + '\0' */
|
||||||
|
#define HASH_BUF_SIZE (1024 * 1024)
|
||||||
|
|
||||||
|
|
||||||
|
static gchar file_sha1[HASH_STR_SIZE];
|
||||||
|
static gchar file_rmd160[HASH_STR_SIZE];
|
||||||
|
static gchar file_md5[HASH_STR_SIZE];
|
||||||
|
|
||||||
|
#define FILE_HASH_OPT "H"
|
||||||
|
#else
|
||||||
|
#define FILE_HASH_OPT ""
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
|
|
||||||
typedef struct _capture_info {
|
typedef struct _capture_info {
|
||||||
const char *filename;
|
const char *filename;
|
||||||
guint16 file_type;
|
guint16 file_type;
|
||||||
int file_encap;
|
int file_encap;
|
||||||
gint64 filesize;
|
gint64 filesize;
|
||||||
|
|
||||||
guint64 packet_bytes;
|
guint64 packet_bytes;
|
||||||
double start_time;
|
double start_time;
|
||||||
double stop_time;
|
double stop_time;
|
||||||
|
@ -168,6 +195,10 @@ enable_all_infos(void)
|
||||||
cap_data_rate_bit = TRUE;
|
cap_data_rate_bit = TRUE;
|
||||||
cap_packet_size = TRUE;
|
cap_packet_size = TRUE;
|
||||||
cap_packet_rate = TRUE;
|
cap_packet_rate = TRUE;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
cap_file_hashes = TRUE;
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -189,6 +220,10 @@ disable_all_infos(void)
|
||||||
cap_data_rate_bit = FALSE;
|
cap_data_rate_bit = FALSE;
|
||||||
cap_packet_size = FALSE;
|
cap_packet_size = FALSE;
|
||||||
cap_packet_rate = FALSE;
|
cap_packet_rate = FALSE;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
cap_file_hashes = FALSE;
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -251,6 +286,13 @@ print_stats(const gchar *filename, capture_info *cf_info)
|
||||||
if (cap_data_rate_bit) print_value("Data bit rate: ", 2, " bits/sec", cf_info->data_rate*8);
|
if (cap_data_rate_bit) print_value("Data bit rate: ", 2, " bits/sec", cf_info->data_rate*8);
|
||||||
if (cap_packet_size) printf ("Average packet size: %.2f bytes\n", cf_info->packet_size);
|
if (cap_packet_size) printf ("Average packet size: %.2f bytes\n", cf_info->packet_size);
|
||||||
if (cap_packet_rate) print_value("Average packet rate: ", 2, " packets/sec", cf_info->packet_rate);
|
if (cap_packet_rate) print_value("Average packet rate: ", 2, " packets/sec", cf_info->packet_rate);
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
if (cap_file_hashes) {
|
||||||
|
printf ("SHA1: %s\n", file_sha1);
|
||||||
|
printf ("RIPEMD160: %s\n", file_rmd160);
|
||||||
|
printf ("MD5: %s\n", file_md5);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -293,6 +335,13 @@ print_stats_table_header(void)
|
||||||
if (cap_data_rate_bit) print_stats_table_header_label("Data bit rate (bits/sec)");
|
if (cap_data_rate_bit) print_stats_table_header_label("Data bit rate (bits/sec)");
|
||||||
if (cap_packet_size) print_stats_table_header_label("Average packet size (bytes)");
|
if (cap_packet_size) print_stats_table_header_label("Average packet size (bytes)");
|
||||||
if (cap_packet_rate) print_stats_table_header_label("Average packet rate (packets/sec)");
|
if (cap_packet_rate) print_stats_table_header_label("Average packet rate (packets/sec)");
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
if (cap_packet_rate) {
|
||||||
|
print_stats_table_header_label("SHA1");
|
||||||
|
print_stats_table_header_label("RIPEMD160");
|
||||||
|
print_stats_table_header_label("MD5");
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
@ -400,6 +449,25 @@ print_stats_table(const gchar *filename, capture_info *cf_info)
|
||||||
putquote();
|
putquote();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
if (cap_file_hashes) {
|
||||||
|
putsep();
|
||||||
|
putquote();
|
||||||
|
printf("%s", file_sha1);
|
||||||
|
putquote();
|
||||||
|
|
||||||
|
putsep();
|
||||||
|
putquote();
|
||||||
|
printf("%s", file_rmd160);
|
||||||
|
putquote();
|
||||||
|
|
||||||
|
putsep();
|
||||||
|
putquote();
|
||||||
|
printf("%s", file_md5);
|
||||||
|
putquote();
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,6 +596,9 @@ usage(gboolean is_error)
|
||||||
fprintf(output, "General infos:\n");
|
fprintf(output, "General infos:\n");
|
||||||
fprintf(output, " -t display the capture file type\n");
|
fprintf(output, " -t display the capture file type\n");
|
||||||
fprintf(output, " -E display the capture file encapsulation\n");
|
fprintf(output, " -E display the capture file encapsulation\n");
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
fprintf(output, " -H display the SHA1, RMD160, and MD5 hashes of the file\n");
|
||||||
|
#endif
|
||||||
fprintf(output, "\n");
|
fprintf(output, "\n");
|
||||||
fprintf(output, "Size infos:\n");
|
fprintf(output, "Size infos:\n");
|
||||||
fprintf(output, " -c display the number of packets\n");
|
fprintf(output, " -c display the number of packets\n");
|
||||||
|
@ -571,6 +642,9 @@ usage(gboolean is_error)
|
||||||
fprintf(output, "\n");
|
fprintf(output, "\n");
|
||||||
fprintf(output, "If no options are given the default is to display all infos in long report\n");
|
fprintf(output, "If no options are given the default is to display all infos in long report\n");
|
||||||
fprintf(output, "output format.\n");
|
fprintf(output, "output format.\n");
|
||||||
|
#ifndef HAVE_LIBGCRYPT
|
||||||
|
fprintf(output, "\nFile hashing support (-H) is not present.\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_PLUGINS
|
#ifdef HAVE_PLUGINS
|
||||||
|
@ -586,6 +660,16 @@ failure_message(const char *msg_format _U_, va_list ap _U_)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
static void
|
||||||
|
hash_to_str(const unsigned char *hash, size_t length, char *str) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < (int) length; i++) {
|
||||||
|
sprintf(str+(i*2), "%02x", hash[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
|
@ -598,6 +682,12 @@ main(int argc, char *argv[])
|
||||||
#ifdef HAVE_PLUGINS
|
#ifdef HAVE_PLUGINS
|
||||||
char* init_progfile_dir_error;
|
char* init_progfile_dir_error;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
FILE *fh;
|
||||||
|
char hash_buf[HASH_BUF_SIZE];
|
||||||
|
gcry_md_hd_t hd;
|
||||||
|
size_t hash_bytes;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get credential information for later use.
|
* Get credential information for later use.
|
||||||
|
@ -618,7 +708,7 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
/* Process the options */
|
/* Process the options */
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "tEcsduaeyizvhxCALTRrNqQBmb")) !=-1) {
|
while ((opt = getopt(argc, argv, "tEcs" FILE_HASH_OPT "duaeyizvhxCALTRrNqQBmb")) !=-1) {
|
||||||
|
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
|
||||||
|
@ -682,6 +772,13 @@ main(int argc, char *argv[])
|
||||||
cap_packet_rate = TRUE;
|
cap_packet_rate = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
case 'H':
|
||||||
|
if (report_all_infos) disable_all_infos();
|
||||||
|
cap_file_hashes = TRUE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
continue_after_wtap_open_offline_failure = FALSE;
|
continue_after_wtap_open_offline_failure = FALSE;
|
||||||
break;
|
break;
|
||||||
|
@ -751,8 +848,40 @@ main(int argc, char *argv[])
|
||||||
print_stats_table_header();
|
print_stats_table_header();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
if (cap_file_hashes) {
|
||||||
|
gcry_check_version(NULL);
|
||||||
|
gcry_md_open(&hd, GCRY_MD_SHA1, 0);
|
||||||
|
if (hd) {
|
||||||
|
gcry_md_enable(hd, GCRY_MD_RMD160);
|
||||||
|
gcry_md_enable(hd, GCRY_MD_MD5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (opt = optind; opt < argc; opt++) {
|
for (opt = optind; opt < argc; opt++) {
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBGCRYPT
|
||||||
|
strcpy(file_sha1, "<unknown>");
|
||||||
|
strcpy(file_rmd160, "<unknown>");
|
||||||
|
strcpy(file_md5, "<unknown>");
|
||||||
|
|
||||||
|
if (cap_file_hashes) {
|
||||||
|
fh = ws_fopen(argv[opt], "r");
|
||||||
|
if (fh && hd) {
|
||||||
|
while((hash_bytes = fread(hash_buf, 1, HASH_BUF_SIZE, fh)) > 0) {
|
||||||
|
gcry_md_write(hd, hash_buf, hash_bytes);
|
||||||
|
}
|
||||||
|
gcry_md_final(hd);
|
||||||
|
hash_to_str(gcry_md_read(hd, GCRY_MD_SHA1), HASH_SIZE_SHA1, file_sha1);
|
||||||
|
hash_to_str(gcry_md_read(hd, GCRY_MD_RMD160), HASH_SIZE_RMD160, file_rmd160);
|
||||||
|
hash_to_str(gcry_md_read(hd, GCRY_MD_MD5), HASH_SIZE_MD5, file_md5);
|
||||||
|
}
|
||||||
|
fclose(fh);
|
||||||
|
gcry_md_reset(hd);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
|
|
||||||
wth = wtap_open_offline(argv[opt], &err, &err_info, FALSE);
|
wth = wtap_open_offline(argv[opt], &err, &err_info, FALSE);
|
||||||
|
|
||||||
if (!wth) {
|
if (!wth) {
|
||||||
|
|
|
@ -17,6 +17,8 @@ S<[ B<-e> ]>
|
||||||
S<[ B<-y> ]>
|
S<[ B<-y> ]>
|
||||||
S<[ B<-i> ]>
|
S<[ B<-i> ]>
|
||||||
S<[ B<-z> ]>
|
S<[ B<-z> ]>
|
||||||
|
S<[ B<-x> ]>
|
||||||
|
S<[ B<-H> ]>
|
||||||
S<[ B<-L> ]>
|
S<[ B<-L> ]>
|
||||||
S<[ B<-T> ]>
|
S<[ B<-T> ]>
|
||||||
S<[ B<-R> ]>
|
S<[ B<-R> ]>
|
||||||
|
@ -123,11 +125,15 @@ Displays the average data rate, in bits/sec
|
||||||
|
|
||||||
=item -z
|
=item -z
|
||||||
|
|
||||||
displays the average packet size, in bytes
|
Displays the average packet size, in bytes
|
||||||
|
|
||||||
=item -x
|
=item -x
|
||||||
|
|
||||||
displays the average packet rate, in packets/sec
|
Displays the average packet rate, in packets/sec
|
||||||
|
|
||||||
|
=item -H
|
||||||
|
|
||||||
|
Displays the SHA1, RIPEMD160, and MD5 hashes for the file.
|
||||||
|
|
||||||
=item -L
|
=item -L
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue