Blame src/md.c

Packit Service 5e8d2a
/* Aide, Advanced Intrusion Detection Environment
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * Copyright (C) 1999-2002,2005,2006,2010 Rami Lehti, Pablo Virolainen,
Packit Service 5e8d2a
 * Richard van den Berg
Packit Service 5e8d2a
 * $Header$
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * This program is free software; you can redistribute it and/or
Packit Service 5e8d2a
 * modify it under the terms of the GNU General Public License as
Packit Service 5e8d2a
 * published by the Free Software Foundation; either version 2 of the
Packit Service 5e8d2a
 * License, or (at your option) any later version.
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * This program is distributed in the hope that it will be useful, but
Packit Service 5e8d2a
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5e8d2a
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit Service 5e8d2a
 * General Public License for more details.
Packit Service 5e8d2a
 *
Packit Service 5e8d2a
 * You should have received a copy of the GNU General Public License
Packit Service 5e8d2a
 * along with this program; if not, write to the Free Software
Packit Service 5e8d2a
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service 5e8d2a
 */
Packit Service 5e8d2a
Packit Service 5e8d2a
#include "aide.h"
Packit Service 5e8d2a
#include <stdlib.h>
Packit Service 5e8d2a
#include "md.h"
Packit Service 5e8d2a
#include "report.h"
Packit Service 5e8d2a
#include <string.h>
Packit Service 5e8d2a
#ifdef WITH_MHASH
Packit Service 5e8d2a
#include <mhash.h>
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
#define HASH_HAVAL_LEN HASH_HAVAL256_LEN
Packit Service 5e8d2a
Packit Service 5e8d2a
Packit Service 5e8d2a
/*
Packit Service 5e8d2a
  It might be a good idea to construct a table, where these values are
Packit Service 5e8d2a
  stored. Only a speed issue.
Packit Service 5e8d2a
*/
Packit Service 5e8d2a
Packit Service 5e8d2a
DB_ATTR_TYPE hash_gcrypt2attr(int i) {
Packit Service 5e8d2a
#ifdef WITH_GCRYPT
Packit Service c89282
  DB_ATTR_TYPE r=0;
Packit Service 5e8d2a
  switch (i) {
Packit Service 5e8d2a
  case GCRY_MD_MD5: {
Packit Service 5e8d2a
    r=DB_MD5;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_SHA1: {
Packit Service 5e8d2a
    r=DB_SHA1;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_RMD160: {
Packit Service 5e8d2a
    r=DB_RMD160;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_TIGER: {
Packit Service 5e8d2a
    r=DB_TIGER;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_HAVAL: {
Packit Service 5e8d2a
    r=DB_HAVAL;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_SHA256: {
Packit Service 5e8d2a
    r=DB_SHA256;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_SHA512: {
Packit Service 5e8d2a
    r=DB_SHA512;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case GCRY_MD_CRC32: {
Packit Service 5e8d2a
    r=DB_CRC32;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  default:
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  return r;
Packit Service c89282
#else /* !WITH_GCRYPT */
Packit Service c89282
  return 0;
Packit Service c89282
#endif
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service d27706
const char * hash_gcrypt2str(int i) {
Packit Service d27706
#ifdef WITH_GCRYPT
Packit Service c89282
  char * r = "?";
Packit Service d27706
  switch (i) {
Packit Service d27706
  case GCRY_MD_MD5: {
Packit Service d27706
    r = "MD5";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_SHA1: {
Packit Service d27706
    r = "SHA1";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_RMD160: {
Packit Service d27706
    r = "RMD160";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_TIGER: {
Packit Service d27706
    r = "TIGER";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_HAVAL: {
Packit Service d27706
    r = "HAVAL";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_SHA256: {
Packit Service d27706
    r = "SHA256";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_SHA512: {
Packit Service d27706
    r = "SHA512";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  case GCRY_MD_CRC32: {
Packit Service d27706
    r = "CRC32";
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  default:
Packit Service d27706
    break;
Packit Service d27706
  }
Packit Service d27706
  return r;
Packit Service c89282
#else /* !WITH_GCRYPT */
Packit Service c89282
  return "?";
Packit Service c89282
#endif
Packit Service d27706
}
Packit Service d27706
Packit Service c89282
#pragma GCC diagnostic push
Packit Service c89282
#pragma GCC diagnostic ignored "-Wunused-parameter"
Packit Service 5e8d2a
DB_ATTR_TYPE hash_mhash2attr(int i) {
Packit Service 5e8d2a
#ifdef WITH_MHASH
Packit Service c89282
  DB_ATTR_TYPE r=0;
Packit Service 5e8d2a
  switch (i) {
Packit Service 5e8d2a
  case MHASH_CRC32: {
Packit Service 5e8d2a
    r=DB_CRC32;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_MD5: {
Packit Service 5e8d2a
    r=DB_MD5;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_SHA1: {
Packit Service 5e8d2a
    r=DB_SHA1;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_HAVAL: {   
Packit Service 5e8d2a
    r=DB_HAVAL;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_RMD160: {
Packit Service 5e8d2a
    r=DB_RMD160;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_TIGER: {
Packit Service 5e8d2a
    r=DB_TIGER;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_GOST: {
Packit Service 5e8d2a
    r=DB_GOST;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_CRC32B: {
Packit Service 5e8d2a
    r=DB_CRC32B;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_HAVAL224: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_HAVAL192: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_HAVAL160: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_HAVAL128: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_TIGER128: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_TIGER160: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_MD4: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_SHA256: {
Packit Service 5e8d2a
    r=DB_SHA256;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  case MHASH_SHA512: {
Packit Service 5e8d2a
    r=DB_SHA512;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#ifdef HAVE_MHASH_WHIRLPOOL		 
Packit Service 5e8d2a
  case MHASH_WHIRLPOOL: {
Packit Service 5e8d2a
    r=DB_WHIRLPOOL;
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  case MHASH_ADLER32: {
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  default:
Packit Service 5e8d2a
    break;
Packit Service 5e8d2a
  }
Packit Service c89282
Packit Service 5e8d2a
  return r;
Packit Service c89282
#else /*!WITH_MHASH */
Packit Service c89282
  return 0;
Packit Service c89282
#endif
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service c89282
#pragma GCC diagnostic pop
Packit Service c89282
Packit Service 5e8d2a
/*
Packit Service 5e8d2a
  Initialise md_container according it's todo_attr field
Packit Service 5e8d2a
 */
Packit Service 5e8d2a
Packit Service d27706
DB_ATTR_TYPE get_available_crypto() {
Packit Service d27706
  
Packit Service d27706
  DB_ATTR_TYPE ret = 0;
Packit Service d27706
Packit Service d27706
/*
Packit Service d27706
 * This function is usually called before config processing
Packit Service d27706
 * and default verbose level is 5
Packit Service d27706
 */
Packit Service d27706
#define lvl 255
Packit Service d27706
Packit Service d27706
  error(lvl, "get_available_crypto called\n");
Packit Service d27706
Packit Service d27706
#ifdef WITH_GCRYPT
Packit Service d27706
Packit Service d27706
  /*
Packit Service d27706
 * some initialization for FIPS
Packit Service d27706
 */
Packit Service d27706
  gcry_check_version(NULL);
Packit Service d27706
  error(lvl, "Found algos:");
Packit Service d27706
Packit Service d27706
  for(int i=0;i<=HASH_GCRYPT_COUNT;i++) {
Packit Service d27706
Packit Service d27706
    if ( (hash_gcrypt2attr(i) & HASH_USE_GCRYPT) == 0 )
Packit Service d27706
      continue;
Packit Service d27706
  
Packit Service d27706
    if (gcry_md_algo_info(i, GCRYCTL_TEST_ALGO, NULL, NULL) == 0) {
Packit Service d27706
      ret |= hash_gcrypt2attr(i);
Packit Service d27706
      error(lvl, " %s", hash_gcrypt2str(i));
Packit Service d27706
    }
Packit Service d27706
  }
Packit Service d27706
  error(lvl, "\n");
Packit Service d27706
Packit Service d27706
#endif
Packit Service d27706
Packit Service d27706
  error(lvl, "get_available_crypto_returned with %lld\n", ret);
Packit Service d27706
  return ret;
Packit Service d27706
}
Packit Service d27706
Packit Service 5e8d2a
int init_md(struct md_container* md) {
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  int i;
Packit Service 5e8d2a
  /*    First we check the parameter..   */
Packit Service 5e8d2a
#ifdef _PARAMETER_CHECK_
Packit Service 5e8d2a
  if (md==NULL) {
Packit Service 5e8d2a
    return RETFAIL;  
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  error(255,"init_md called\n");
Packit Service 5e8d2a
  /*
Packit Service 5e8d2a
    We don't have calculator for this yet :)
Packit Service 5e8d2a
  */
Packit Service 5e8d2a
  md->calc_attr=0;
Packit Service 5e8d2a
#ifdef WITH_MHASH
Packit Service 5e8d2a
  error(255,"Mhash library initialization\n");
Packit Service 5e8d2a
  for(i=0;i<=HASH_MHASH_COUNT;i++) {
Packit Service 5e8d2a
    if (((hash_mhash2attr(i)&HASH_USE_MHASH)&md->todo_attr)!=0) {
Packit Service 5e8d2a
      DB_ATTR_TYPE h=hash_mhash2attr(i);
Packit Service 5e8d2a
      error(255,"inserting %llu\n",h);
Packit Service 5e8d2a
      md->mhash_mdh[i]=mhash_init(i);
Packit Service 5e8d2a
      if (md->mhash_mdh[i]!=MHASH_FAILED) {
Packit Service 5e8d2a
				md->calc_attr|=h;
Packit Service 5e8d2a
      } else {
Packit Service 5e8d2a
	/*
Packit Service 5e8d2a
	  Oops.. 
Packit Service 5e8d2a
	  We just don't calculate this.
Packit Service 5e8d2a
	 */
Packit Service 5e8d2a
Packit Service 5e8d2a
				md->todo_attr&=~h;
Packit Service 5e8d2a
      }
Packit Service 5e8d2a
Packit Service 5e8d2a
    } else {
Packit Service 5e8d2a
      md->mhash_mdh[i]=MHASH_FAILED;      
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif 
Packit Service 5e8d2a
#ifdef WITH_GCRYPT
Packit Service d27706
  if(gcry_md_open(&md->mdh,0,GCRY_MD_FLAG_SECURE)!=GPG_ERR_NO_ERROR){
Packit Service 5e8d2a
		error(0,"gcrypt_md_open failed\n");
Packit Service 5e8d2a
		exit(IO_ERROR);
Packit Service 5e8d2a
	}
Packit Service 5e8d2a
  for(i=0;i<=HASH_GCRYPT_COUNT;i++) {
Packit Service d27706
Packit Service d27706
Packit Service 5e8d2a
    if (((hash_gcrypt2attr(i)&HASH_USE_GCRYPT)&md->todo_attr)!=0) {
Packit Service d27706
Packit Service d27706
        DB_ATTR_TYPE h=hash_gcrypt2attr(i);
Packit Service d27706
Packit Service d27706
        if (gcry_md_algo_info(i, GCRYCTL_TEST_ALGO, NULL, NULL) != 0) {
Packit Service d27706
            error(0,"Algo %s is not available\n", hash_gcrypt2str(i));
Packit Service d27706
            exit(-1);
Packit Service d27706
        }
Packit Service d27706
Packit Service d27706
        error(255,"inserting %llu\n",h);
Packit Service 5e8d2a
			if(gcry_md_enable(md->mdh,i)==GPG_ERR_NO_ERROR){
Packit Service 5e8d2a
				md->calc_attr|=h;
Packit Service 5e8d2a
			} else {
Packit Service d27706
				error(0,"gcry_md_enable %i failed\n",i);
Packit Service 5e8d2a
				md->todo_attr&=~h;
Packit Service 5e8d2a
			}
Packit Service 5e8d2a
		}
Packit Service 5e8d2a
	}
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  return RETOK;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
/*
Packit Service 5e8d2a
  update :)
Packit Service 5e8d2a
  Just call this when you have more data.
Packit Service 5e8d2a
 */
Packit Service 5e8d2a
Packit Service 5e8d2a
int update_md(struct md_container* md,void* data,ssize_t size) {
Packit Service 5e8d2a
    
Packit Service 5e8d2a
  error(255,"update_md called\n");
Packit Service 5e8d2a
Packit Service 5e8d2a
#ifdef _PARAMETER_CHECK_
Packit Service 5e8d2a
  if (md==NULL||data==NULL) {
Packit Service 5e8d2a
    return RETFAIL;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
#ifdef WITH_MHASH
Packit Service c89282
  int i;
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  for(i=0;i<=HASH_MHASH_COUNT;i++) {
Packit Service 5e8d2a
    if (md->mhash_mdh[i]!=MHASH_FAILED) {
Packit Service 5e8d2a
      mhash (md->mhash_mdh[i], data, size);
Packit Service 5e8d2a
    }
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  
Packit Service 5e8d2a
#endif /* WITH_MHASH */
Packit Service 5e8d2a
#ifdef WITH_GCRYPT
Packit Service 5e8d2a
	gcry_md_write(md->mdh, data, size);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  return RETOK;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
/*
Packit Service 5e8d2a
  close.. Does some magic.
Packit Service 5e8d2a
  After this calling update_db is not a good idea.
Packit Service 5e8d2a
*/
Packit Service 5e8d2a
Packit Service 5e8d2a
int close_md(struct md_container* md) {
Packit Service 5e8d2a
#ifdef _PARAMETER_CHECK_
Packit Service 5e8d2a
  if (md==NULL) {
Packit Service 5e8d2a
    return RETFAIL;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  error(255,"close_md called \n");
Packit Service 5e8d2a
#ifdef WITH_MHASH
Packit Service c89282
  int i;
Packit Service 5e8d2a
  for(i=0;i<=HASH_MHASH_COUNT;i++) {
Packit Service 5e8d2a
    if (md->mhash_mdh[i]!=MHASH_FAILED) {
Packit Service 5e8d2a
      mhash (md->mhash_mdh[i], NULL, 0);
Packit Service 5e8d2a
    }  
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif /* WITH_MHASH */
Packit Service 5e8d2a
#ifdef WITH_GCRYPT
Packit Service 5e8d2a
  gcry_md_final(md->mdh); 
Packit Service 5e8d2a
  /* Let's flush the buffers */
Packit Service 5e8d2a
Packit Service 5e8d2a
#define get_libgcrypt_hash(a,b,c,d) \
Packit Service 5e8d2a
  if(md->calc_attr&a&HASH_USE_GCRYPT){\
Packit Service 5e8d2a
		error(255,"Getting hash %i\n",b);\
Packit Service 5e8d2a
    memcpy(md->c,gcry_md_read(md->mdh,b),d);\
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_MD5,GCRY_MD_MD5,md5,HASH_MD5_LEN);
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_SHA1,GCRY_MD_SHA1,sha1,HASH_SHA1_LEN);
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_TIGER,GCRY_MD_TIGER,tiger,HASH_TIGER_LEN);
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_RMD160,GCRY_MD_RMD160,rmd160,HASH_RMD160_LEN);
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_SHA256,GCRY_MD_SHA256,sha256,HASH_SHA256_LEN);
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_SHA512,GCRY_MD_SHA512,sha512,HASH_SHA512_LEN);
Packit Service 5e8d2a
  get_libgcrypt_hash(DB_CRC32,GCRY_MD_CRC32,crc32,HASH_CRC32_LEN);
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  /*.    There might be more hashes in the library. Add those here..   */
Packit Service 5e8d2a
  
Packit Service 8ed9d9
  gcry_md_close(md->mdh);
Packit Service 5e8d2a
#endif  
Packit Service 5e8d2a
Packit Service 5e8d2a
#ifdef WITH_MHASH
Packit Service 5e8d2a
#define get_mhash_hash(b,c) \
Packit Service 5e8d2a
  if(md->mhash_mdh[b]!=MHASH_FAILED){ \
Packit Service 5e8d2a
    mhash_deinit(md->mhash_mdh[b],(void*)md->c); \
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  get_mhash_hash(MHASH_MD5,md5);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_SHA1,sha1);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_TIGER,tiger);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_RMD160,rmd160);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_CRC32,crc32);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_HAVAL,haval);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_GOST,gost);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_CRC32B,crc32b);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_SHA256,sha256);
Packit Service 5e8d2a
  get_mhash_hash(MHASH_SHA512,sha512);
Packit Service 5e8d2a
#ifdef HAVE_MHASH_WHIRLPOOL
Packit Service 5e8d2a
  get_mhash_hash(MHASH_WHIRLPOOL,whirlpool);
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  /*
Packit Service 5e8d2a
    There might be more hashes in the library we want to use.
Packit Service 5e8d2a
    Add those here..
Packit Service 5e8d2a
  */
Packit Service 5e8d2a
  
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
  return RETOK;
Packit Service 5e8d2a
}
Packit Service 5e8d2a
Packit Service 5e8d2a
/*
Packit Service 5e8d2a
  Writes md_container to db_line.
Packit Service 5e8d2a
 */
Packit Service 5e8d2a
Packit Service 5e8d2a
void md2line(struct md_container* md,struct db_line* line) {
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  error(255,"md2line \n");
Packit Service 5e8d2a
  
Packit Service 5e8d2a
#ifdef _PARAMETER_CHECK_
Packit Service 5e8d2a
  if (md==NULL||line==NULL) {
Packit Service 5e8d2a
    return RETFAIL;
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
#endif
Packit Service 5e8d2a
Packit Service 5e8d2a
#define copyhash(a,b,c)        \
Packit Service 5e8d2a
  if (line->attr&a) {          \
Packit Service 5e8d2a
    error(255,"Line has %llu\n",a); \
Packit Service 5e8d2a
    if (md->calc_attr&a) {     \
Packit Service 5e8d2a
      error(255,"copying %llu\n",a); \
Packit Service 5e8d2a
      line->b=(byte*)malloc(c);       \
Packit Service 5e8d2a
      memcpy(line->b,md->b,c); \
Packit Service 5e8d2a
    } else {                   \
Packit Service 5e8d2a
      line->attr&=~a;          \
Packit Service 5e8d2a
    }                          \
Packit Service 5e8d2a
  }
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  
Packit Service 5e8d2a
  copyhash(DB_MD5,md5,HASH_MD5_LEN);
Packit Service 5e8d2a
  copyhash(DB_SHA1,sha1,HASH_SHA1_LEN);
Packit Service 5e8d2a
  copyhash(DB_RMD160,rmd160,HASH_RMD160_LEN);
Packit Service 5e8d2a
  copyhash(DB_TIGER,tiger,HASH_TIGER_LEN);
Packit Service 5e8d2a
  copyhash(DB_CRC32,crc32,HASH_CRC32_LEN);
Packit Service 5e8d2a
  copyhash(DB_HAVAL,haval,HASH_HAVAL_LEN);
Packit Service 5e8d2a
  copyhash(DB_GOST,gost,HASH_GOST_LEN);
Packit Service 5e8d2a
  copyhash(DB_CRC32B,crc32b,HASH_CRC32B_LEN);
Packit Service 5e8d2a
Packit Service 5e8d2a
  copyhash(DB_SHA256,sha256,HASH_SHA256_LEN);
Packit Service 5e8d2a
  copyhash(DB_SHA512,sha512,HASH_SHA512_LEN);
Packit Service 5e8d2a
  copyhash(DB_WHIRLPOOL,whirlpool,HASH_WHIRLPOOL_LEN);
Packit Service 5e8d2a
}