/* $NetBSD: md5hl.c,v 1.1.1.1 2003/03/31 05:02:45 grant Exp $ */ /* * Written by Jason R. Thorpe , April 29, 1997. * Public domain. */ #ifdef HAVE_CONFIG_H #include #endif /* #include "namespace.h" */ #include #define MDALGORITHM MD5 #include #ifndef _DIAGASSERT #define _DIAGASSERT(cond) assert(cond) #endif /* $NetBSD: md5hl.c,v 1.1.1.1 2003/03/31 05:02:45 grant Exp $ */ /* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * wrote this file. As long as you retain this notice you * can do whatever you want with this stuff. If we meet some day, and you think * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * * from FreeBSD Id: mdXhl.c,v 1.8 1996/10/25 06:48:12 bde Exp */ /* * Modifed April 29, 1997 by Jason R. Thorpe */ #include #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #include #include #ifdef HAVE_UNISTD_H #include #endif #define CONCAT(x,y) __CONCAT(x,y) #define MDNAME(x) CONCAT(MDALGORITHM,x) char * MDNAME(End)(ctx, buf) MDNAME(_CTX) *ctx; char *buf; { int i; unsigned char digest[16]; static const char hex[]="0123456789abcdef"; _DIAGASSERT(ctx != 0); if (buf == NULL) buf = malloc(33); if (buf == NULL) return (NULL); MDNAME(Final)(digest, ctx); for (i = 0; i < 16; i++) { buf[i+i] = hex[(u_int32_t)digest[i] >> 4]; buf[i+i+1] = hex[digest[i] & 0x0f]; } buf[i+i] = '\0'; return (buf); } char * MDNAME(File)(filename, buf) const char *filename; char *buf; { unsigned char buffer[BUFSIZ]; MDNAME(_CTX) ctx; int f, i, j; _DIAGASSERT(filename != 0); /* buf may be NULL */ MDNAME(Init)(&ctx); f = open(filename, O_RDONLY, 0666); if (f < 0) return NULL; while ((i = read(f, buffer, sizeof(buffer))) > 0) MDNAME(Update)(&ctx, buffer, (unsigned int)i); j = errno; close(f); errno = j; if (i < 0) return NULL; return (MDNAME(End)(&ctx, buf)); } char * MDNAME(Data)(data, len, buf) const unsigned char *data; unsigned int len; char *buf; { MDNAME(_CTX) ctx; _DIAGASSERT(data != 0); MDNAME(Init)(&ctx); MDNAME(Update)(&ctx, data, len); return (MDNAME(End)(&ctx, buf)); }