Статус: Новичок
Группы: Участники
Зарегистрирован: 17.12.2009(UTC) Сообщений: 3
Сказал(а) «Спасибо»: 1 раз
|
Есть тестовый пример: Код: HCRYPTPROV hProv = NULL;
HCRYPTPROV hProv2 = NULL;
HCRYPTHASH hHash = NULL;
HCRYPTHASH hHash2 = NULL;
BOOL bResult = CryptAcquireContext( &hProv,
NULL,
MS_ENHANCED_PROV,
1,
CRYPT_VERIFYCONTEXT);
bResult = CryptCreateHash( hProv,
CALG_SHA1,
NULL,
0,
&hHash);
bResult = CryptHashData( hHash,
(PBYTE)"TEST",
4,
0 );
PBYTE pbData = NULL;
DWORD dwData_Size =0;
DWORD dwTemp = sizeof(DWORD);
bResult = CryptGetHashParam( hHash,
HP_HASHSIZE,
(PBYTE)&dwData_Size,
&dwTemp,
0 );
pbData = new BYTE[dwData_Size];
ZeroMemory( pbData,
dwData_Size );
bResult = CryptGetHashParam( hHash,
HP_HASHVAL,
pbData,
&dwData_Size,
0 );
CryptDestroyHash(hHash);
CryptReleaseContext(hProv,0);
bResult = CryptAcquireContext( &hProv2,
NULL,
MS_ENHANCED_PROV,
1,
CRYPT_VERIFYCONTEXT);
bResult = CryptCreateHash( hProv2,
CALG_SHA1,
NULL,
0,
&hHash2);
bResult = CryptGetHashParam( hHash2,
HP_HASHSIZE,
(PBYTE)&dwData_Size,
&dwTemp,
0 );
bResult = CryptSetHashParam( hHash2,
HP_HASHVAL,
pbData,
0);
bResult = CryptHashData( hHash2,
(PBYTE)"test2",
5,
0);
DWORD dwLastError = GetLastError();
CryptDestroyHash(hHash2);
CryptReleaseContext(hProv2,0);
Соответственно, GetLastError() возвращает NTE_BAD_HASH_STATE(0x8009000c). Если в данном примере вызвать CryptSignHash (при условии не верифайного контекста с ключевой парой) с непустым LPCTSTR sDescription будет такая же ошибка (что вполне логично, ведь выполняется хэширование sDescription). Вопрос: что не так? и можно ли вообще хэшировать данные после выставления HP_HASHVAL? Если нет, то как это соотносится с MSND (CryptSetHashParam): Цитата:Occasionally, a hash value that has been generated elsewhere must be signed. This can be done by using the following sequence of operations:
Create a hash object by using CryptCreateHash. Set the HP_HASHVAL value. Sign the hash value by using CryptSignHash and obtain a digital signature block. Destroy the hash object by using CryptDestroyHash.
|