1 /* $NetBSD: mdXhl.c,v 1.2 1997/04/30 00:40:47 thorpej Exp $ */ 2 3 /* 4 * ---------------------------------------------------------------------------- 5 * "THE BEER-WARE LICENSE" (Revision 42): 6 * <phk@login.dkuug.dk> wrote this file. As long as you retain this notice you 7 * can do whatever you want with this stuff. If we meet some day, and you think 8 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 9 * ---------------------------------------------------------------------------- 10 * 11 * from FreeBSD Id: mdXhl.c,v 1.8 1996/10/25 06:48:12 bde Exp 12 */ 13 14 /* 15 * Modifed April 29, 1997 by Jason R. Thorpe <thorpej@netbsd.org> 16 */ 17 18 #include <sys/types.h> 19 #include <fcntl.h> 20 #include <unistd.h> 21 22 #include <errno.h> 23 #include <stdio.h> 24 #include <stdlib.h> 25 26 #define CONCAT(x,y) __CONCAT(x,y) 27 #define MDNAME(x) CONCAT(MDALGORITHM,x) 28 29 char * 30 MDNAME(End)(ctx, buf) 31 MDNAME(_CTX) *ctx; 32 char *buf; 33 { 34 int i; 35 unsigned char digest[16]; 36 static const char hex[]="0123456789abcdef"; 37 38 if (buf == NULL) 39 buf = malloc(33); 40 if (buf == NULL) 41 return (NULL); 42 43 MDNAME(Final)(digest, ctx); 44 45 for (i = 0; i < 16; i++) { 46 buf[i+i] = hex[digest[i] >> 4]; 47 buf[i+i+1] = hex[digest[i] & 0x0f]; 48 } 49 50 buf[i+i] = '\0'; 51 return (buf); 52 } 53 54 char * 55 MDNAME(File)(filename, buf) 56 const char *filename; 57 char *buf; 58 { 59 unsigned char buffer[BUFSIZ]; 60 MDNAME(_CTX) ctx; 61 int f, i, j; 62 63 MDNAME(Init)(&ctx); 64 f = open(filename, O_RDONLY, 0666); 65 if (f < 0) 66 return NULL; 67 68 while ((i = read(f, buffer, sizeof(buffer))) > 0) 69 MDNAME(Update)(&ctx, buffer, i); 70 71 j = errno; 72 close(f); 73 errno = j; 74 75 if (i < 0) 76 return NULL; 77 78 return (MDNAME(End)(&ctx, buf)); 79 } 80 81 char * 82 MDNAME(Data)(data, len, buf) 83 const unsigned char *data; 84 unsigned int len; 85 char *buf; 86 { 87 MDNAME(_CTX) ctx; 88 89 MDNAME(Init)(&ctx); 90 MDNAME(Update)(&ctx, data, len); 91 return (MDNAME(End)(&ctx, buf)); 92 } 93