//------------------------------------------------------------------------------------------------------------- // Данный пример демонстрирует использование объекта хэша PRFKEYMAT (CALG_GR3411_PRFKEYMAT, // CALG_GR3411_2012_256_PRFKEYMAT и CALG_GR3411_2012_512_PRFKEYMAT) для получения последовательности // псевдослучайных данных произвольной длины, а также для получения ключей CALG_G28147 и CALG_SYMMETRIC_512. //------------------------------------------------------------------------------------------------------------- static void HandleError(const char *s); int main() { //------------------------------------------------------------------------ // Объявление переменных. HCRYPTPROV hProv = 0; HCRYPTKEY hPrfKey = 0; HCRYPTHASH hPrfHash = 0; CRYPT_DATA_BLOB prfSeedBlob; BYTE pbPrfSeedData[] = { 0x11, 0x22, 0x33, 0x44 }; BYTE pbDataFirst[10]; DWORD cbDataFirst = 0; HCRYPTKEY hDerivedKey256 = 0; BYTE pbDataSecond[100]; DWORD cbDataSecond = 0; HCRYPTKEY hDerivedKey512 = 0; //------------------------------------------------------------------------ // Получение дескриптора контекста криптографического провайдера. if(CryptAcquireContext( &hProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT)) { printf("CSP context acquired.\n"); } else { HandleError("Error during CryptAcquireContext."); } //------------------------------------------------------------------------ // Генерация ключа для PRF. if(CryptGenKey( hProv, CALG_G28147, 0, &hPrfKey)) { printf("PRF key is created. \n"); } else { HandleError("Error during CryptGenKey."); } //------------------------------------------------------------------------ // Создание объекта хэша PRF. if(CryptCreateHash( hProv, CALG_GR3411_2012_256_PRFKEYMAT, hPrfKey, 0, &hPrfHash)) { printf("PRF hash is created. \n"); } else { HandleError("Error during CryptCreateHash."); } //------------------------------------------------------------------------ // Устанавливаем seed для PRF. prfSeedBlob.pbData = pbPrfSeedData; prfSeedBlob.cbData = sizeof(pbPrfSeedData); if(CryptSetHashParam( hPrfHash, HP_PRFKEYMAT_SEED, (LPBYTE)&prfSeedBlob, 0)) { printf("PRF seed is set. \n"); } else { HandleError("Error during CryptSetHashParam."); } //------------------------------------------------------------------------ // Получаем последовательность данных необходимой длины. cbDataFirst = sizeof(pbDataFirst); if(CryptGetHashParam( hPrfHash, HP_HASHVAL, pbDataFirst, &cbDataFirst, 0)) { printf("First part of data produced. \n"); } else { HandleError("Error during CryptGetHashParam."); } //------------------------------------------------------------------------ // Получаем ключ 256 бит. if(CryptDeriveKey( hProv, CALG_G28147, hPrfHash, 0, &hDerivedKey256)) { printf("256-bit key derived. \n"); } else { HandleError("Error during CryptDeriveKey."); } //------------------------------------------------------------------------ // Получаем еще последовательность данных необходимой длины. cbDataSecond = sizeof(pbDataSecond); if(CryptGetHashParam( hPrfHash, HP_HASHVAL, pbDataSecond, &cbDataSecond, 0)) { printf("Second part of data produced. \n"); } else { HandleError("Error during CryptGetHashParam."); } //------------------------------------------------------------------------ // Получаем ключ 512 бит. if(CryptDeriveKey( hProv, CALG_SYMMETRIC_512, hPrfHash, 0, &hDerivedKey512)) { printf("512-bit key derived. \n"); } else { HandleError("Error during CryptDeriveKey."); } //------------------------------------------------------------------------ // Освобождение памяти. if (hDerivedKey256) { CryptDestroyKey(hDerivedKey256); } if (hDerivedKey512) { CryptDestroyKey(hDerivedKey512); } if (hPrfHash) { CryptDestroyHash(hPrfHash); } if (hPrfKey) { CryptDestroyKey(hPrfKey); } if (hProv) { CryptReleaseContext(hProv, 0); } return 0; } // Конец примера
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.