/* Copyright (C) Andrew Tridgell 2002 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* simple front-end functions to mdfour code */ #include "ccache.h" #include #include #include static MD4_CTX md; static off_t totalN; void hash_buffer(const unsigned char *s, unsigned int len) { totalN += len; MD4Update(&md, s, len); } void hash_start(void) { MD4Init(&md); } void hash_string(const char *s) { hash_buffer(s, strlen(s)); } void hash_int(int x) { hash_buffer((char *)&x, sizeof(x)); } /* add contents of a file to the hash */ void hash_file(const char *fname) { char *buf; int fd; struct stat stats; fd = open(fname, O_RDONLY|O_BINARY); if (fd == -1) { cc_log("Failed to open %s\n", fname); fatal(__FUNCTION__); } if (fstat(fd, &stats) != 0) { cc_log("Failed to fstat the opened %s (descriptor %d)\n", fname, fd); close(fd); fatal(__FUNCTION__); } buf = mmap(NULL, stats.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (buf == MAP_FAILED) { cc_log("Failed to mmap %s\n", fname); close(fd); fatal(__FUNCTION__); } hash_buffer(buf, stats.st_size); close(fd); } /* return the hash result as a static string */ char *hash_result(void) { static char ret[53]; MD4End(&md, ret); snprintf(ret + 32, sizeof ret - 32, "-%lu", (unsigned long)totalN); return ret; }