ファイルのハッシュを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]); } }
コメント