Home
Software
Utilities
About
Reader (md4.c)
https://centaur.pw/software/md4/md4.c
[
Direct Link
]
/* Centaur MD4 * * Version 3.0 * 4/7/2024 * * Functions for checking MD4 sums of files and strings * * md4.c */ #include <ctype.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <openssl/md4.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include "md4.h" int hashcompare(char hash1[MD4_STRING_LENGTH], char hash2[MD4_STRING_LENGTH]) { char _hash1[MD4_STRING_LENGTH]; char _hash2[MD4_STRING_LENGTH]; int a; for (a = 0; a < MD4_STRING_LENGTH; a++) { _hash1[a] = tolower(hash1[a]); } for (a = 0; a < MD4_STRING_LENGTH; a++) { _hash2[a] = tolower(hash2[a]); } if (!strcmp(_hash1, _hash2)) return(0); else return(1); } int ftype(char file[]) { struct stat statbuf; int s = stat(file, &statbuf); if (s != 0) { return(_NONE); } if (S_ISREG (statbuf.st_mode)) { return(_FILE); } else if (S_ISDIR (statbuf.st_mode)) { return(_DIR); } else { return(_NONE); } } int valid_md4_file(char fname[]) { FILE *fptr; char c; char test_md4[33]; if (ftype(fname) == _DIR) { return(-2); } fptr = fopen(fname, "r"); if (!fptr) return(-1); c = fgetc(fptr); if (!isprint(c) && c != ' ' && c != '\n' && c != '\t') { fclose(fptr); return(0); } rewind(fptr); fscanf(fptr, "%s", test_md4); fclose(fptr); if (strlen(test_md4) != 32) return(0); else return(1); } char * md4string(char string[], int uppercase) { int i; unsigned char digest[16]; static char md4str[33]; static char md4str_u[33]; MD4_CTX context; MD4_Init(&context); MD4_Update(&context, string, strlen(string)); MD4_Final(digest, &context); for (i = 0; i < 16; i++) { sprintf(&md4str[i*2], "%02x", (unsigned int)digest[i]); } if (uppercase) { for (i = 0; i < strlen(md4str); i++) { md4str_u[i] = toupper(md4str[i]); } return(md4str_u); } else { return(md4str); } } unsigned long fdsize(int fd) { struct stat statbuf; if (fstat(fd, &statbuf) < 0) return(-1); return statbuf.st_size; } char * md4file(char fname[], int uppercase) { if (ftype(fname) == _DIR) return("(directory) "); int i; int file_descript; unsigned long file_size; char* file_buffer; static char md4f_retv_u[33]; file_descript = open(fname, O_RDONLY); if (file_descript < 0) return("(file access error) "); file_size = fdsize(file_descript); file_buffer = mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0); MD4((unsigned char*) file_buffer, file_size, result); munmap(file_buffer, file_size); for(i = 0; i < MD4_DIGEST_LENGTH; i++) { sprintf(&md4f_retv[i*2], "%02x", result[i]); } if (uppercase) { for (i = 0; i < strlen(md4f_retv); i++) { md4f_retv_u[i] = toupper(md4f_retv[i]); } return(md4f_retv_u); } return(md4f_retv); }