ファイルのハッシュをSHA256で計算するには、ファイルを丸ごとバッファに格納してOpenSSLのSHA256()を呼んでも構いませんが、ファイルサイズが大きいとメモリが確保できない恐れがあります。
そういう場合には、少しずつバッファに入れてSHA256_Update()に渡すといいですね。
#include "openssl/sha.h"
#define BUFLEN 16384
/****************************************************************************/
/* ファイルのSHA256ハッシュを取得する */
/****************************************************************************/
static short getSHA256hash(char *filePath)
{
unsigned long ulTotalFileSize;
unsigned long ulReadedFileSize, ulReadSize;
SHA256_CTX ctx256;
unsigned char buf[BUFLEN];
unsigned char ucHash[SHA256_DIGEST_LENGTH];
int size;
FILE *fp;
fpos_t sz;
int i;
fp = fopen( filePath, "rb" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", filePath );
return -1;
}
/* ファイルのサイズを取得 */
fseek( fp, 0, SEEK_END );
fgetpos( fp, &sz );
printf( "%s ファイルのサイズ: %d バイト", filePath, sz );
ulTotalFileSize = sz;
/* ファイルポインタを先頭に戻す */
rewind( fp );
SHA256_Init(&ctx256);
/* ファイルをバッファに少しずつ読み込み、SHA256でハッシュ計算をおこなう */
ulReadedFileSize = 0;
while( ulReadedFileSize < ulTotalFileSize ) {
if( (ulTotalFileSize - ulReadedFileSize) > BUFLEN ) {
ulReadSize = BUFLEN;
} else {
ulReadSize = ulTotalFileSize - ulReadedFileSize;
}
if((size = read(&fp, buf, ulReadSize)) != ulReadSize)
{
printf("error : read file.(size=%d)\n",size);
fclose(&fp);
return -1;
}
ulReadedFileSize += ulReadSize;
SHA256_Update(&ctx256, (unsigned char*)buf, ulReadSize);
}
fclose(&fp);
if( ulReadedFileSize != ulTotalFileSize ) {
printf("error : read file. ulReadedFileSize is wrong.\n");
return -1;
}
SHA256_Final(ucHash, &ctx256);
// ハッシュ値を出力
for(i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02X",ucHash[i]);
}
}


コメント