1c64685aaSPoul-Henning Kamp /* mdXhl.c * ---------------------------------------------------------------------------- 2c9502b53SPoul-Henning Kamp * "THE BEER-WARE LICENSE" (Revision 42): 3aaead0dfSPoul-Henning Kamp * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 4c9502b53SPoul-Henning Kamp * can do whatever you want with this stuff. If we meet some day, and you think 5c9502b53SPoul-Henning Kamp * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 6c9502b53SPoul-Henning Kamp * ---------------------------------------------------------------------------- 7c9502b53SPoul-Henning Kamp */ 8c9502b53SPoul-Henning Kamp 95d946b40SMatthew Dillon #include <sys/cdefs.h> 105d946b40SMatthew Dillon __FBSDID("$FreeBSD$"); 115d946b40SMatthew Dillon 126c20486dSPoul-Henning Kamp #include <sys/types.h> 138a24546cSPoul-Henning Kamp #include <sys/stat.h> 141ab6205cSBruce Evans #include <fcntl.h> 156c20486dSPoul-Henning Kamp #include <unistd.h> 16c9502b53SPoul-Henning Kamp 171ab6205cSBruce Evans #include <errno.h> 181ab6205cSBruce Evans #include <stdio.h> 191ab6205cSBruce Evans #include <stdlib.h> 201ab6205cSBruce Evans 211ab6205cSBruce Evans #include "mdX.h" 221ab6205cSBruce Evans 23c9502b53SPoul-Henning Kamp char * 2405f65b29SPoul-Henning Kamp MDXEnd(MDX_CTX *ctx, char *buf) 25c9502b53SPoul-Henning Kamp { 26c9502b53SPoul-Henning Kamp int i; 27c177a86bSGarrett Wollman unsigned char digest[LENGTH]; 28003d2998SGarrett Wollman static const char hex[]="0123456789abcdef"; 29c9502b53SPoul-Henning Kamp 308bc66d9bSPoul-Henning Kamp if (!buf) 31c177a86bSGarrett Wollman buf = malloc(2*LENGTH + 1); 328bc66d9bSPoul-Henning Kamp if (!buf) 3305f65b29SPoul-Henning Kamp return 0; 34c9502b53SPoul-Henning Kamp MDXFinal(digest, ctx); 35c177a86bSGarrett Wollman for (i = 0; i < LENGTH; i++) { 368bc66d9bSPoul-Henning Kamp buf[i+i] = hex[digest[i] >> 4]; 378bc66d9bSPoul-Henning Kamp buf[i+i+1] = hex[digest[i] & 0x0f]; 38c9502b53SPoul-Henning Kamp } 398bc66d9bSPoul-Henning Kamp buf[i+i] = '\0'; 408bc66d9bSPoul-Henning Kamp return buf; 41c9502b53SPoul-Henning Kamp } 42c9502b53SPoul-Henning Kamp 43c9502b53SPoul-Henning Kamp char * 44f7787644SJoerg Wunsch MDXFile(const char *filename, char *buf) 45c9502b53SPoul-Henning Kamp { 46c64685aaSPoul-Henning Kamp return (MDXFileChunk(filename, buf, 0, 0)); 478a24546cSPoul-Henning Kamp } 488a24546cSPoul-Henning Kamp 498a24546cSPoul-Henning Kamp char * 508a24546cSPoul-Henning Kamp MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len) 518a24546cSPoul-Henning Kamp { 527b7254e7SJohn-Mark Gurney unsigned char buffer[16*1024]; 53c9502b53SPoul-Henning Kamp MDX_CTX ctx; 548a24546cSPoul-Henning Kamp struct stat stbuf; 558a24546cSPoul-Henning Kamp int f, i, e; 568a24546cSPoul-Henning Kamp off_t n; 57c9502b53SPoul-Henning Kamp 58c9502b53SPoul-Henning Kamp MDXInit(&ctx); 59c9502b53SPoul-Henning Kamp f = open(filename, O_RDONLY); 60c64685aaSPoul-Henning Kamp if (f < 0) 61c64685aaSPoul-Henning Kamp return 0; 62*8d03d93fSJonathan T. Looney if (fstat(f, &stbuf) < 0) { 63*8d03d93fSJonathan T. Looney i = -1; 64*8d03d93fSJonathan T. Looney goto error; 65*8d03d93fSJonathan T. Looney } 668a24546cSPoul-Henning Kamp if (ofs > stbuf.st_size) 678a24546cSPoul-Henning Kamp ofs = stbuf.st_size; 688a24546cSPoul-Henning Kamp if ((len == 0) || (len > stbuf.st_size - ofs)) 698a24546cSPoul-Henning Kamp len = stbuf.st_size - ofs; 70*8d03d93fSJonathan T. Looney if (lseek(f, ofs, SEEK_SET) < 0) { 71*8d03d93fSJonathan T. Looney i = -1; 72*8d03d93fSJonathan T. Looney goto error; 73*8d03d93fSJonathan T. Looney } 748a24546cSPoul-Henning Kamp n = len; 752ca72005SBruce A. Mah i = 0; 768a24546cSPoul-Henning Kamp while (n > 0) { 778a24546cSPoul-Henning Kamp if (n > sizeof(buffer)) 788a24546cSPoul-Henning Kamp i = read(f, buffer, sizeof(buffer)); 798a24546cSPoul-Henning Kamp else 808a24546cSPoul-Henning Kamp i = read(f, buffer, n); 816eec0f2bSEnji Cooper if (i <= 0) 82c64685aaSPoul-Henning Kamp break; 83c9502b53SPoul-Henning Kamp MDXUpdate(&ctx, buffer, i); 848a24546cSPoul-Henning Kamp n -= i; 85c9502b53SPoul-Henning Kamp } 86*8d03d93fSJonathan T. Looney error: 878a24546cSPoul-Henning Kamp e = errno; 88c9502b53SPoul-Henning Kamp close(f); 898a24546cSPoul-Henning Kamp errno = e; 90c64685aaSPoul-Henning Kamp if (i < 0) 91c64685aaSPoul-Henning Kamp return 0; 92c64685aaSPoul-Henning Kamp return (MDXEnd(&ctx, buf)); 93c9502b53SPoul-Henning Kamp } 94c9502b53SPoul-Henning Kamp 95c9502b53SPoul-Henning Kamp char * 9625a14196SPoul-Henning Kamp MDXData (const void *data, unsigned int len, char *buf) 97c9502b53SPoul-Henning Kamp { 98c9502b53SPoul-Henning Kamp MDX_CTX ctx; 99c9502b53SPoul-Henning Kamp 100c9502b53SPoul-Henning Kamp MDXInit(&ctx); 101c9502b53SPoul-Henning Kamp MDXUpdate(&ctx,data,len); 102c64685aaSPoul-Henning Kamp return (MDXEnd(&ctx, buf)); 103c9502b53SPoul-Henning Kamp } 1049d8b6686SThomas Quinot 1052dd0a89cSThomas Quinot #ifdef WEAK_REFS 1062dd0a89cSThomas Quinot /* When building libmd, provide weak references. Note: this is not 1072dd0a89cSThomas Quinot activated in the context of compiling these sources for internal 1082dd0a89cSThomas Quinot use in libcrypt. 1092dd0a89cSThomas Quinot */ 1109d8b6686SThomas Quinot #undef MDXEnd 1119d8b6686SThomas Quinot __weak_reference(_libmd_MDXEnd, MDXEnd); 1129d8b6686SThomas Quinot #undef MDXFile 1139d8b6686SThomas Quinot __weak_reference(_libmd_MDXFile, MDXFile); 1149d8b6686SThomas Quinot #undef MDXFileChunk 1159d8b6686SThomas Quinot __weak_reference(_libmd_MDXFileChunk, MDXFileChunk); 1169d8b6686SThomas Quinot #undef MDXData 1179d8b6686SThomas Quinot __weak_reference(_libmd_MDXData, MDXData); 1182dd0a89cSThomas Quinot #endif 119