mdXhl.c revision 1.8
11.8Sapb/*	$NetBSD: mdXhl.c,v 1.8 2009/03/06 18:15:24 apb 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.7Schristos * Modified April 29, 1997 by Jason R. Thorpe <thorpej@NetBSD.org>
161.1Sthorpej */
171.1Sthorpej
181.8Sapb#if HAVE_NBTOOL_CONFIG_H
191.8Sapb#include "nbtool_config.h"
201.8Sapb#endif
211.8Sapb
221.7Schristos#define	CONCAT(x,y)	__CONCAT(x,y)
231.7Schristos#define	MDNAME(x)	CONCAT(MDALGORITHM,x)
241.7Schristos
251.8Sapb#if !defined(_KERNEL) && defined(__weak_alias) && !defined(HAVE_NBTOOL_CONFIG_H)
261.7Schristos#define	WA(a,b)	__weak_alias(a,b)
271.7SchristosWA(MDNAME(End),CONCAT(_,MDNAME(End)))
281.7SchristosWA(MDNAME(File),CONCAT(_,MDNAME(File)))
291.7SchristosWA(MDNAME(Data),CONCAT(_,MDNAME(Data)))
301.7Schristos#undef WA
311.7Schristos#endif
321.7Schristos
331.7Schristos#include "namespace.h"
341.7Schristos
351.1Sthorpej#include <sys/types.h>
361.4Slukem
371.7Schristos#include MDINCLUDE
381.4Slukem#include <assert.h>
391.1Sthorpej#include <fcntl.h>
401.1Sthorpej#include <errno.h>
411.1Sthorpej#include <stdio.h>
421.1Sthorpej#include <stdlib.h>
431.4Slukem#include <unistd.h>
441.1Sthorpej
451.7Schristos
461.1Sthorpej
471.1Sthorpejchar *
481.2SthorpejMDNAME(End)(ctx, buf)
491.2Sthorpej	MDNAME(_CTX) *ctx;
501.2Sthorpej	char *buf;
511.1Sthorpej{
521.2Sthorpej	int i;
531.2Sthorpej	unsigned char digest[16];
541.2Sthorpej	static const char hex[]="0123456789abcdef";
551.2Sthorpej
561.4Slukem	_DIAGASSERT(ctx != 0);
571.4Slukem
581.2Sthorpej	if (buf == NULL)
591.2Sthorpej		buf = malloc(33);
601.2Sthorpej	if (buf == NULL)
611.2Sthorpej		return (NULL);
621.2Sthorpej
631.2Sthorpej	MDNAME(Final)(digest, ctx);
641.2Sthorpej
651.2Sthorpej	for (i = 0; i < 16; i++) {
661.3Schristos		buf[i+i] = hex[(u_int32_t)digest[i] >> 4];
671.2Sthorpej		buf[i+i+1] = hex[digest[i] & 0x0f];
681.2Sthorpej	}
691.2Sthorpej
701.2Sthorpej	buf[i+i] = '\0';
711.2Sthorpej	return (buf);
721.1Sthorpej}
731.1Sthorpej
741.1Sthorpejchar *
751.2SthorpejMDNAME(File)(filename, buf)
761.2Sthorpej	const char *filename;
771.2Sthorpej	char *buf;
781.1Sthorpej{
791.2Sthorpej	unsigned char buffer[BUFSIZ];
801.2Sthorpej	MDNAME(_CTX) ctx;
811.2Sthorpej	int f, i, j;
821.2Sthorpej
831.4Slukem	_DIAGASSERT(filename != 0);
841.4Slukem	/* buf may be NULL */
851.4Slukem
861.2Sthorpej	MDNAME(Init)(&ctx);
871.2Sthorpej	f = open(filename, O_RDONLY, 0666);
881.2Sthorpej	if (f < 0)
891.2Sthorpej		return NULL;
901.2Sthorpej
911.2Sthorpej	while ((i = read(f, buffer, sizeof(buffer))) > 0)
921.3Schristos		MDNAME(Update)(&ctx, buffer, (unsigned int)i);
931.2Sthorpej
941.2Sthorpej	j = errno;
951.2Sthorpej	close(f);
961.2Sthorpej	errno = j;
971.2Sthorpej
981.2Sthorpej	if (i < 0)
991.2Sthorpej		return NULL;
1001.2Sthorpej
1011.2Sthorpej	return (MDNAME(End)(&ctx, buf));
1021.1Sthorpej}
1031.1Sthorpej
1041.1Sthorpejchar *
1051.2SthorpejMDNAME(Data)(data, len, buf)
1061.2Sthorpej	const unsigned char *data;
1071.2Sthorpej	unsigned int len;
1081.2Sthorpej	char *buf;
1091.1Sthorpej{
1101.2Sthorpej	MDNAME(_CTX) ctx;
1111.4Slukem
1121.4Slukem	_DIAGASSERT(data != 0);
1131.1Sthorpej
1141.2Sthorpej	MDNAME(Init)(&ctx);
1151.2Sthorpej	MDNAME(Update)(&ctx, data, len);
1161.2Sthorpej	return (MDNAME(End)(&ctx, buf));
1171.1Sthorpej}
118