diff options
author | berkeviktor@aol.com <berkeviktor@aol.com> | 2010-10-20 18:26:14 +0200 |
---|---|---|
committer | berkeviktor@aol.com <berkeviktor@aol.com> | 2010-10-20 18:26:14 +0200 |
commit | 48045bdf6aa3b2fe9f4da96fafe98b146933d932 (patch) | |
tree | 01367fa6bc0a62ab7e4e4bf47fd85f3199467a65 /src/common | |
parent | 6a58b4a5fc567d52425c0eb6b043e94a8f04e7ad (diff) |
add sha256sum support code
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]); |