Home
Software
Utilities
About
Reader (md5.c)
https://centaur.pw/software/md5/md5.c
[
Direct Link
]
/* Centaur MD5 * * Version 3.0 * 4/7/2024 * * Functions for checking MD5 sums of files and strings * * md5.c */ #include <ctype.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <openssl/md5.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include "md5.h" int hashcompare(char hash1[MD5_STRING_LENGTH], char hash2[MD5_STRING_LENGTH]) { char _hash1[MD5_STRING_LENGTH]; char _hash2[MD5_STRING_LENGTH]; int a; for (a = 0; a < MD5_STRING_LENGTH; a++) { _hash1[a] = tolower(hash1[a]); } for (a = 0; a < MD5_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_md5_file(char fname[]) { FILE *fptr; char c; char test_md5[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_md5); fclose(fptr); if (strlen(test_md5) != 32) return(0); else return(1); } char * md5string(char string[], int uppercase) { int i; unsigned char digest[16]; static char md5str[33]; static char md5str_u[33]; MD5_CTX context; MD5_Init(&context); MD5_Update(&context, string, strlen(string)); MD5_Final(digest, &context); for (i = 0; i < 16; i++) { sprintf(&md5str[i*2], "%02x", (unsigned int)digest[i]); } if (uppercase) { for (i = 0; i < strlen(md5str); i++) { md5str_u[i] = toupper(md5str[i]); } return(md5str_u); } else { return(md5str); } } unsigned long fdsize(int fd) { struct stat statbuf; if (fstat(fd, &statbuf) < 0) return(-1); return statbuf.st_size; } char * md5file(char fname[], int uppercase) { if (ftype(fname) == _DIR) return("(directory) "); int i; int file_descript; unsigned long file_size; char* file_buffer; static char md5f_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); MD5((unsigned char*) file_buffer, file_size, result); munmap(file_buffer, file_size); for(i = 0; i < MD5_DIGEST_LENGTH; i++) { sprintf(&md5f_retv[i*2], "%02x", result[i]); } if (uppercase) { for (i = 0; i < strlen(md5f_retv); i++) { md5f_retv_u[i] = toupper(md5f_retv[i]); } return(md5f_retv_u); } return(md5f_retv); }