//-------------------------------------------------------------------- // Пример создания хэша из содержимого файла. Имя файла задается в // командной строке и является обязательным параметром. // Замечание: под win32 рекомендуется использовать _s аналоги CRT функций. //-------------------------------------------------------------------- #define BUFSIZE 1024 #define GR3411LEN 64 int main(int argc, char *argv[]) { //------------------------------------------------------------- // Объявление и инициализация переменных. BOOL bIsReadingFailed = FALSE; HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; FILE* hFile; BYTE rgbFile[BUFSIZE]; DWORD cbRead = 0; BYTE rgbHash[GR3411LEN]; DWORD cbHash = 0; CHAR rgbDigits[] = "0123456789abcdef"; DWORD i; //-------------------------------------------------------------------- // Проверка того, передано ли имя файла. if(argc != 2 || argv[1] == NULL) { HandleError("The file name is absent.\n"); } //-------------------------------------------------------------------- // Открытие файла. // if(!fopen_s(&hFile, argv[1], "r+b")) if(!(hFile = fopen(argv[1], "r+b" ))) { HandleError("Error opening input file"); } printf( "The file %s was opened\n", argv[1]); //-------------------------------------------------------------------- // Получение дескриптора криптопровайдера. if(!CryptAcquireContext( &hProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT)) { HandleError("CryptAcquireContext failed"); } //-------------------------------------------------------------------- // Создание пустого объекта функции хэширования. if(!CryptCreateHash(hProv, CALG_GR3411_2012_256, 0, 0, &hHash)) { CryptReleaseContext(hProv, 0); HandleError("CryptCreateHash failed"); } //-------------------------------------------------------------------- // Чтение данных из файла и хэширование этих данных. do { cbRead = (DWORD)fread(rgbFile, 1, BUFSIZE, hFile); if(!cbRead) { bIsReadingFailed = TRUE; break; } if(!CryptHashData(hHash, rgbFile, cbRead, 0)) { CryptReleaseContext(hProv, 0); CryptDestroyHash(hHash); HandleError("CryptHashData failed"); } } while(!feof(hFile)); if(bIsReadingFailed) { CryptReleaseContext(hProv, 0); CryptDestroyHash(hHash); HandleError("ReadFile failed"); } //-------------------------------------------------------------------- // Получение параметра объекта функции хэширования. cbHash = GR3411LEN; if(!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) { CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); HandleError("CryptGetHashParam failed"); } printf("GR3411 hash of file %s is: ", argv[1]); for(i = 0; i < cbHash; i++) { printf("%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]); } printf("\n"); //-------------------------------------------------------------------- // Освобождение. CryptDestroyHash(hHash); CryptReleaseContext(hProv, 0); fclose(hFile); return S_OK; } // Конец примера
AIX: 5/6/7 или выше.
FreeBSD: 7/8/9 или выше.
Linux: LSB 3.1 (RHEL 4, SuSE 10) или выше.
Solaris: 10 или выше.
Mac OSX: 10.7/8 или выше.
iOS: 6/7 или выше.
Windows 2000 или выше: Необходимо Windows 2000 SP4 или старше с Internet Explorer 6.0 или старше.
Ядро Windows NT: не поддерживает.