//-------------------------------------------------------------------- // Пример создания хэша из содержимого файла. Имя файла задается в // командной строке и является обязательным параметром. // Замечание: под 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: 6/7.
FreeBSD: 11/12, pfSense 2.x.
Linux: LSB 4.x (RHEL 5/6/7/8, SuSE 11SP4/12/15, Oracle Linux 5/6/7/8, CentOS 6/7/8, Ubuntu 14.04/16.04/18.04/19.10, Linux Mint 18/19, Fedora 28/29/30/31, Debian 8/9/10 и др.).
Solaris: 10/11.
Mac OS X: 10.9/10.10/10.11/10.12/10.13/10.14/10.15.
iOS: 8/9/10/11/12/13.
Sailfish: 2/3.
Windows: 7/8/8.1/10, Server 2008/2008R2/2012/2012R2/2016/2019.