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