/* this is a cleaned-up version of * http://adamlamers.com/?p=5 */ #include #include #include #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; }