mdXhl.c revision 1.4
11.4Slukem/*	$NetBSD: mdXhl.c,v 1.4 1999/09/16 11:45:10 lukem Exp $	*/
21.1Sthorpej
31.2Sthorpej/*
41.1Sthorpej * ----------------------------------------------------------------------------
51.1Sthorpej * "THE BEER-WARE LICENSE" (Revision 42):
61.1Sthorpej * <phk@login.dkuug.dk> wrote this file.  As long as you retain this notice you
71.1Sthorpej * can do whatever you want with this stuff. If we meet some day, and you think
81.1Sthorpej * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
91.1Sthorpej * ----------------------------------------------------------------------------
101.1Sthorpej *
111.1Sthorpej * from FreeBSD Id: mdXhl.c,v 1.8 1996/10/25 06:48:12 bde Exp
121.2Sthorpej */
131.2Sthorpej
141.2Sthorpej/*
151.2Sthorpej * Modifed April 29, 1997 by Jason R. Thorpe <thorpej@netbsd.org>
161.1Sthorpej */
171.1Sthorpej
181.1Sthorpej#include <sys/types.h>
191.4Slukem
201.4Slukem#include <assert.h>
211.1Sthorpej#include <fcntl.h>
221.1Sthorpej#include <errno.h>
231.1Sthorpej#include <stdio.h>
241.1Sthorpej#include <stdlib.h>
251.4Slukem#include <unistd.h>
261.1Sthorpej
271.2Sthorpej#define	CONCAT(x,y)	__CONCAT(x,y)
281.2Sthorpej#define	MDNAME(x)	CONCAT(MDALGORITHM,x)
291.1Sthorpej
301.1Sthorpejchar *
311.2SthorpejMDNAME(End)(ctx, buf)
321.2Sthorpej	MDNAME(_CTX) *ctx;
331.2Sthorpej	char *buf;
341.1Sthorpej{
351.2Sthorpej	int i;
361.2Sthorpej	unsigned char digest[16];
371.2Sthorpej	static const char hex[]="0123456789abcdef";
381.2Sthorpej
391.4Slukem	_DIAGASSERT(ctx != 0);
401.4Slukem#ifdef _DIAGNOSTIC
411.4Slukem	if (ctx == 0)
421.4Slukem		return (NULL);
431.4Slukem#endif
441.4Slukem
451.2Sthorpej	if (buf == NULL)
461.2Sthorpej		buf = malloc(33);
471.2Sthorpej	if (buf == NULL)
481.2Sthorpej		return (NULL);
491.2Sthorpej
501.2Sthorpej	MDNAME(Final)(digest, ctx);
511.2Sthorpej
521.2Sthorpej	for (i = 0; i < 16; i++) {
531.3Schristos		buf[i+i] = hex[(u_int32_t)digest[i] >> 4];
541.2Sthorpej		buf[i+i+1] = hex[digest[i] & 0x0f];
551.2Sthorpej	}
561.2Sthorpej
571.2Sthorpej	buf[i+i] = '\0';
581.2Sthorpej	return (buf);
591.1Sthorpej}
601.1Sthorpej
611.1Sthorpejchar *
621.2SthorpejMDNAME(File)(filename, buf)
631.2Sthorpej	const char *filename;
641.2Sthorpej	char *buf;
651.1Sthorpej{
661.2Sthorpej	unsigned char buffer[BUFSIZ];
671.2Sthorpej	MDNAME(_CTX) ctx;
681.2Sthorpej	int f, i, j;
691.2Sthorpej
701.4Slukem	_DIAGASSERT(filename != 0);
711.4Slukem	/* buf may be NULL */
721.4Slukem#ifdef _DIAGNOSTIC
731.4Slukem	if (filename == 0 || *filename == '\0')
741.4Slukem		return (NULL);
751.4Slukem#endif
761.4Slukem
771.2Sthorpej	MDNAME(Init)(&ctx);
781.2Sthorpej	f = open(filename, O_RDONLY, 0666);
791.2Sthorpej	if (f < 0)
801.2Sthorpej		return NULL;
811.2Sthorpej
821.2Sthorpej	while ((i = read(f, buffer, sizeof(buffer))) > 0)
831.3Schristos		MDNAME(Update)(&ctx, buffer, (unsigned int)i);
841.2Sthorpej
851.2Sthorpej	j = errno;
861.2Sthorpej	close(f);
871.2Sthorpej	errno = j;
881.2Sthorpej
891.2Sthorpej	if (i < 0)
901.2Sthorpej		return NULL;
911.2Sthorpej
921.2Sthorpej	return (MDNAME(End)(&ctx, buf));
931.1Sthorpej}
941.1Sthorpej
951.1Sthorpejchar *
961.2SthorpejMDNAME(Data)(data, len, buf)
971.2Sthorpej	const unsigned char *data;
981.2Sthorpej	unsigned int len;
991.2Sthorpej	char *buf;
1001.1Sthorpej{
1011.2Sthorpej	MDNAME(_CTX) ctx;
1021.4Slukem
1031.4Slukem	_DIAGASSERT(data != 0);
1041.4Slukem#ifdef _DIAGNOSTIC
1051.4Slukem	if (data == 0)
1061.4Slukem		return (NULL);
1071.4Slukem#endif
1081.1Sthorpej
1091.2Sthorpej	MDNAME(Init)(&ctx);
1101.2Sthorpej	MDNAME(Update)(&ctx, data, len);
1111.2Sthorpej	return (MDNAME(End)(&ctx, buf));
1121.1Sthorpej}
113