/* Calculates and stores the hashes for a single message */ int SMBCALL smb_hashmsg(smb_t* smb, smbmsg_t* msg, const uchar* text, BOOL update) { size_t n; int retval=SMB_SUCCESS; hash_t found; hash_t** hashes; /* This is a NULL-terminated list of hashes */ if(smb->status.attr&SMB_EMAIL) return(SMB_SUCCESS); hashes=smb_msghashes(msg,text); if(smb_findhash(smb, hashes, &found, SMB_HASH_SOURCE_ALL, update)==SMB_SUCCESS && !update) { retval=SMB_DUPE_MSG; safe_snprintf(smb->last_error,sizeof(smb->last_error) ,"duplicate %s: %s found in message #%lu" ,smb_hashsourcetype(found.source) ,smb_hashsource(msg,found.source) ,found.number); } else if((retval=smb_addhashes(smb,hashes,/* skip_marked? */TRUE))==SMB_SUCCESS) msg->flags|=MSG_FLAG_HASHED; FREE_LIST(hashes,n); return(retval); }
void dump_hashes(void) { char tmp[128]; int retval; hash_t hash; if((retval=smb_open_hash(&smb))!=SMB_SUCCESS) { fprintf(errfp,"\n%s!smb_open_hash returned %d: %s\n" ,beep, retval, smb.last_error); return; } while(!smb_feof(smb.hash_fp)) { if(smb_fread(&smb,&hash,sizeof(hash),smb.hash_fp)!=sizeof(hash)) break; printf("\n"); printf("%-10s: %"PRIu32"\n","Number", hash.number); printf("%-10s: %s\n", "Source", smb_hashsourcetype(hash.source)); printf("%-10s: %"PRIu32"\n","Length", hash.length); printf("%-10s: %s\n", "Time", my_timestr(hash.time)); printf("%-10s: %02x\n", "Flags", hash.flags); if(hash.flags&SMB_HASH_CRC16) printf("%-10s: %04x\n", "CRC-16", hash.crc16); if(hash.flags&SMB_HASH_CRC32) printf("%-10s: %08"PRIx32"\n","CRC-32", hash.crc32); if(hash.flags&SMB_HASH_MD5) printf("%-10s: %s\n", "MD5", MD5_hex((BYTE*)tmp,hash.md5)); } smb_close_hash(&smb); }