Home
Software
Utilities
About
Reader (md.c)
https://centaur.pw/software/m18/md.c
[
Direct Link
]
/* Centaur M18 * 2/24/2026 * Version 1.0 * Jon Siragusa <jon@centaur.pw> * https://www.centaur.pw/ * * Copyright (C) Centaur, 2026. All Rights Reserved. * * md.c */ #include <ctype.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <openssl/evp.h> #include "ftype.h" #include "md.h" void struppercase(char *str) { while (*str) { *str = toupper((unsigned char)*str); str++; } } int valid_checksum_file(char fname[]) { int valid_lines = 0; if (strlen(fname) == 0 || ftype(fname) == FTYPE_DIR) return(0); FILE *fptr = fopen(fname, "r"); if (!fptr) return(0); char ln[1024]; char *S; while (fgets(ln, sizeof(ln), fptr)) { unsigned short int ok = 1; ln[strcspn(ln, "\n")] = 0; if (strlen(ln) == 0 || (strlen(ln) > 0 && ln[0] == '#')) continue; else { char *H = strtok_r(ln, " \t", &S); char *F = strtok_r(NULL, " \t", &S); if (strlen(H) < 32 || strlen(F) == 0) continue; else { int i; for (i = 0; i < strlen(H); i++) if (!isxdigit(H[i])) ok = 0; if (ok) valid_lines++; } } } fclose(fptr); return valid_lines ? 1 : 0; } char * mdstring(const EVP_MD *type, char string[], int uppercase) { int i; static char mdstr[EVP_MAX_MD_SIZE]; EVP_MD_CTX *context = EVP_MD_CTX_new(); unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned int md_len; EVP_DigestInit_ex(context, type, NULL); EVP_DigestUpdate(context, string, strlen(string)); EVP_DigestFinal_ex(context, md_value, &md_len); EVP_MD_CTX_free(context); for (i = 0; i < md_len; i++) sprintf(&mdstr[i*2], "%02x", (unsigned int)md_value[i]); if (uppercase) { struppercase(mdstr); return(mdstr); } else return(mdstr); } char * mdfile(const EVP_MD *type, char fname[], int uppercase) { if (ftype(fname) == FTYPE_DIR) return("(directory) "); int i; static char mdf_retv[EVP_MAX_MD_SIZE]; FILE *file = fopen(fname, "rb"); if (!file) return("(file access error) "); unsigned char buffer[4096]; EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned int md_len; int read_len; EVP_DigestInit_ex(mdctx, type, NULL); while ((read_len = fread(buffer, 1, sizeof(buffer), file)) > 0) EVP_DigestUpdate(mdctx, buffer, read_len); EVP_DigestFinal_ex(mdctx, md_value, &md_len); for (i = 0; i < md_len; i++) sprintf(&mdf_retv[i*2], "%02x", md_value[i]); EVP_MD_CTX_free(mdctx); fclose(file); if (uppercase) { struppercase(mdf_retv); return(mdf_retv); } else return(mdf_retv); }