1*62cf53fdSPedro F. Giffuni /*- mdXhl.c 2*62cf53fdSPedro F. Giffuni * SPDX-License-Identifier: Beerware 3*62cf53fdSPedro F. Giffuni * 4492e9ee5SJonathan T. Looney * ---------------------------------------------------------------------------- 5c9502b53SPoul-Henning Kamp * "THE BEER-WARE LICENSE" (Revision 42): 6aaead0dfSPoul-Henning Kamp * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 7c9502b53SPoul-Henning Kamp * can do whatever you want with this stuff. If we meet some day, and you think 8c9502b53SPoul-Henning Kamp * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 9c9502b53SPoul-Henning Kamp * ---------------------------------------------------------------------------- 10c9502b53SPoul-Henning Kamp */ 11c9502b53SPoul-Henning Kamp 125d946b40SMatthew Dillon #include <sys/cdefs.h> 135d946b40SMatthew Dillon __FBSDID("$FreeBSD$"); 145d946b40SMatthew Dillon 156c20486dSPoul-Henning Kamp #include <sys/types.h> 168a24546cSPoul-Henning Kamp #include <sys/stat.h> 171ab6205cSBruce Evans #include <fcntl.h> 186c20486dSPoul-Henning Kamp #include <unistd.h> 19c9502b53SPoul-Henning Kamp 201ab6205cSBruce Evans #include <errno.h> 211ab6205cSBruce Evans #include <stdio.h> 221ab6205cSBruce Evans #include <stdlib.h> 231ab6205cSBruce Evans 241ab6205cSBruce Evans #include "mdX.h" 251ab6205cSBruce Evans 26c9502b53SPoul-Henning Kamp char * 2705f65b29SPoul-Henning Kamp MDXEnd(MDX_CTX *ctx, char *buf) 28c9502b53SPoul-Henning Kamp { 29c9502b53SPoul-Henning Kamp int i; 30c177a86bSGarrett Wollman unsigned char digest[LENGTH]; 31003d2998SGarrett Wollman static const char hex[]="0123456789abcdef"; 32c9502b53SPoul-Henning Kamp 338bc66d9bSPoul-Henning Kamp if (!buf) 34c177a86bSGarrett Wollman buf = malloc(2*LENGTH + 1); 358bc66d9bSPoul-Henning Kamp if (!buf) 3605f65b29SPoul-Henning Kamp return 0; 37c9502b53SPoul-Henning Kamp MDXFinal(digest, ctx); 38c177a86bSGarrett Wollman for (i = 0; i < LENGTH; i++) { 398bc66d9bSPoul-Henning Kamp buf[i+i] = hex[digest[i] >> 4]; 408bc66d9bSPoul-Henning Kamp buf[i+i+1] = hex[digest[i] & 0x0f]; 41c9502b53SPoul-Henning Kamp } 428bc66d9bSPoul-Henning Kamp buf[i+i] = '\0'; 438bc66d9bSPoul-Henning Kamp return buf; 44c9502b53SPoul-Henning Kamp } 45c9502b53SPoul-Henning Kamp 46c9502b53SPoul-Henning Kamp char * 47de13c242SEd Maste MDXFd(int fd, char *buf) 48c9502b53SPoul-Henning Kamp { 49de13c242SEd Maste return MDXFdChunk(fd, buf, 0, 0); 508a24546cSPoul-Henning Kamp } 518a24546cSPoul-Henning Kamp 528a24546cSPoul-Henning Kamp char * 53de13c242SEd Maste MDXFdChunk(int fd, char *buf, off_t ofs, off_t len) 548a24546cSPoul-Henning Kamp { 557b7254e7SJohn-Mark Gurney unsigned char buffer[16*1024]; 56c9502b53SPoul-Henning Kamp MDX_CTX ctx; 578a24546cSPoul-Henning Kamp struct stat stbuf; 58de13c242SEd Maste int readrv, e; 59492e9ee5SJonathan T. Looney off_t remain; 60492e9ee5SJonathan T. Looney 61492e9ee5SJonathan T. Looney if (len < 0) { 62492e9ee5SJonathan T. Looney errno = EINVAL; 63492e9ee5SJonathan T. Looney return NULL; 64492e9ee5SJonathan T. Looney } 65c9502b53SPoul-Henning Kamp 66c9502b53SPoul-Henning Kamp MDXInit(&ctx); 67492e9ee5SJonathan T. Looney if (ofs != 0) { 68492e9ee5SJonathan T. Looney errno = 0; 69492e9ee5SJonathan T. Looney if (lseek(fd, ofs, SEEK_SET) != ofs || 70492e9ee5SJonathan T. Looney (ofs == -1 && errno != 0)) { 71492e9ee5SJonathan T. Looney readrv = -1; 728d03d93fSJonathan T. Looney goto error; 738d03d93fSJonathan T. Looney } 748d03d93fSJonathan T. Looney } 75492e9ee5SJonathan T. Looney remain = len; 76492e9ee5SJonathan T. Looney readrv = 0; 77492e9ee5SJonathan T. Looney while (len == 0 || remain > 0) { 78492e9ee5SJonathan T. Looney if (len == 0 || remain > sizeof(buffer)) 79492e9ee5SJonathan T. Looney readrv = read(fd, buffer, sizeof(buffer)); 808a24546cSPoul-Henning Kamp else 81492e9ee5SJonathan T. Looney readrv = read(fd, buffer, remain); 82492e9ee5SJonathan T. Looney if (readrv <= 0) 83c64685aaSPoul-Henning Kamp break; 84492e9ee5SJonathan T. Looney MDXUpdate(&ctx, buffer, readrv); 85492e9ee5SJonathan T. Looney remain -= readrv; 86c9502b53SPoul-Henning Kamp } 878d03d93fSJonathan T. Looney error: 88492e9ee5SJonathan T. Looney if (readrv < 0) 89492e9ee5SJonathan T. Looney return NULL; 90c64685aaSPoul-Henning Kamp return (MDXEnd(&ctx, buf)); 91c9502b53SPoul-Henning Kamp } 92c9502b53SPoul-Henning Kamp 93c9502b53SPoul-Henning Kamp char * 94de13c242SEd Maste MDXFile(const char *filename, char *buf) 95de13c242SEd Maste { 96de13c242SEd Maste return (MDXFileChunk(filename, buf, 0, 0)); 97de13c242SEd Maste } 98de13c242SEd Maste 99de13c242SEd Maste char * 100de13c242SEd Maste MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len) 101de13c242SEd Maste { 102de13c242SEd Maste char *ret; 103de13c242SEd Maste int e, fd; 104de13c242SEd Maste 105de13c242SEd Maste fd = open(filename, O_RDONLY); 106de13c242SEd Maste if (fd < 0) 107de13c242SEd Maste return NULL; 108de13c242SEd Maste ret = MDXFdChunk(fd, buf, ofs, len); 109de13c242SEd Maste e = errno; 110de13c242SEd Maste close (fd); 111de13c242SEd Maste errno = e; 112de13c242SEd Maste return ret; 113de13c242SEd Maste } 114de13c242SEd Maste 115de13c242SEd Maste char * 11625a14196SPoul-Henning Kamp MDXData (const void *data, unsigned int len, char *buf) 117c9502b53SPoul-Henning Kamp { 118c9502b53SPoul-Henning Kamp MDX_CTX ctx; 119c9502b53SPoul-Henning Kamp 120c9502b53SPoul-Henning Kamp MDXInit(&ctx); 121c9502b53SPoul-Henning Kamp MDXUpdate(&ctx,data,len); 122c64685aaSPoul-Henning Kamp return (MDXEnd(&ctx, buf)); 123c9502b53SPoul-Henning Kamp } 1249d8b6686SThomas Quinot 1252dd0a89cSThomas Quinot #ifdef WEAK_REFS 1262dd0a89cSThomas Quinot /* When building libmd, provide weak references. Note: this is not 1272dd0a89cSThomas Quinot activated in the context of compiling these sources for internal 1282dd0a89cSThomas Quinot use in libcrypt. 1292dd0a89cSThomas Quinot */ 1309d8b6686SThomas Quinot #undef MDXEnd 1319d8b6686SThomas Quinot __weak_reference(_libmd_MDXEnd, MDXEnd); 1329d8b6686SThomas Quinot #undef MDXFile 1339d8b6686SThomas Quinot __weak_reference(_libmd_MDXFile, MDXFile); 1349d8b6686SThomas Quinot #undef MDXFileChunk 1359d8b6686SThomas Quinot __weak_reference(_libmd_MDXFileChunk, MDXFileChunk); 1369d8b6686SThomas Quinot #undef MDXData 1379d8b6686SThomas Quinot __weak_reference(_libmd_MDXData, MDXData); 1382dd0a89cSThomas Quinot #endif 139