diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/checksum.c | 74 | ||||
-rw-r--r-- | src/common/checksum.h | 6 |
2 files changed, 80 insertions, 0 deletions
diff --git a/src/common/checksum.c b/src/common/checksum.c new file mode 100644 index 00000000..a0f2cdef --- /dev/null +++ b/src/common/checksum.c @@ -0,0 +1,74 @@ +/* this is a cleaned-up version of + * http://adamlamers.com/?p=5 + */ + +#include <stdio.h> +#include <malloc.h> +#include <errno.h> + +#include "checksum.h" + +void +sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]) +{ + int i = 0; + for (i = 0; i < SHA256_DIGEST_LENGTH; i++) + { + sprintf(outputBuffer + (i * 2), "%02x", hash[i]); + } + outputBuffer[64] = 0; +} + +void +sha256 (char *string, char outputBuffer[65]) +{ + int i; + unsigned char hash[SHA256_DIGEST_LENGTH]; + SHA256_CTX sha256; + + SHA256_Init (&sha256); + SHA256_Update (&sha256, string, strlen(string)); + SHA256_Final (hash, &sha256); + + for (i = 0; i < SHA256_DIGEST_LENGTH; i++) + { + sprintf (outputBuffer + (i * 2), "%02x", hash[i]); + } + outputBuffer[64] = 0; +} + +int +sha256_file (char *path, char outputBuffer[65]) +{ + int bytesRead; + unsigned char *buffer; + unsigned char hash[SHA256_DIGEST_LENGTH]; + SHA256_CTX sha256; + + FILE *file = fopen (path, "rb"); + if (!file) + { + return -534; + } + + SHA256_Init (&sha256); + buffer = malloc (BUFSIZE); + bytesRead = 0; + + if (!buffer) + { + return ENOMEM; + } + + while ((bytesRead = fread (buffer, 1, BUFSIZE, file))) + { + SHA256_Update (&sha256, buffer, bytesRead); + } + + SHA256_Final (hash, &sha256); + sha256_hash_string (hash, outputBuffer); + + fclose (file); + free (buffer); + return 0; +} diff --git a/src/common/checksum.h b/src/common/checksum.h new file mode 100644 index 00000000..1d5d62e3 --- /dev/null +++ b/src/common/checksum.h @@ -0,0 +1,6 @@ +#include <openssl/sha.h> +#define BUFSIZE 32768 + +void sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]); +void sha256 (char *string, char outputBuffer[65]); +int sha256_file (char *path, char outputBuffer[65]); |