75 lines
1.3 KiB
C
75 lines
1.3 KiB
C
/* 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;
|
|
}
|