aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/checksum.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/checksum.c b/src/checksum.c
new file mode 100644
index 0000000..a26a415
--- /dev/null
+++ b/src/checksum.c
@@ -0,0 +1,68 @@
+//
+// Created by jhunk on 12/20/19.
+//
+#include "spm.h"
+#include <openssl/md5.h>
+#include <openssl/sha.h>
+
+char *md5sum(const char *filename) {
+ size_t bytes = 0;
+ unsigned char digest[MD5_DIGEST_LENGTH];
+ char buf[BUFSIZ];
+ MD5_CTX context;
+ MD5_Init(&context);
+ FILE *fp = fopen(filename, "r");
+ if (!fp) {
+ perror(filename);
+ return NULL;
+ }
+ char *result = calloc((MD5_DIGEST_LENGTH * 2) + 1, sizeof(char));
+ if (!result) {
+ perror("MD5 result");
+ return NULL;
+ }
+
+ while ((bytes = fread(buf, sizeof(char), BUFSIZ, fp)) != 0) {
+ MD5_Update(&context, buf, bytes);
+ }
+ fclose(fp);
+
+ MD5_Final(digest, &context);
+ char *rtmp = result;
+ for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
+ snprintf(&rtmp[i * 2], 3, "%02x", digest[i]);
+ }
+
+ return result;
+}
+
+char *sha256sum(const char *filename) {
+ size_t bytes = 0;
+ unsigned char digest[SHA256_DIGEST_LENGTH];
+ char buf[BUFSIZ];
+ SHA256_CTX context;
+ SHA256_Init(&context);
+ FILE *fp = fopen(filename, "r");
+ if (!fp) {
+ perror(filename);
+ return NULL;
+ }
+ char *result = calloc((SHA256_DIGEST_LENGTH * 2) + 1, sizeof(char));
+ if (!result) {
+ perror("SHA256 result");
+ return NULL;
+ }
+
+ while ((bytes = fread(buf, sizeof(char), BUFSIZ, fp)) != 0) {
+ SHA256_Update(&context, buf, bytes);
+ }
+ fclose(fp);
+
+ SHA256_Final(digest, &context);
+ char *rtmp = result;
+ for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
+ snprintf(&rtmp[i * 2], 3, "%02x", digest[i]);
+ }
+
+ return result;
+} \ No newline at end of file