Пытаюсь получить Hash по ГОСТ алгоритму с помощью функций Cryptoapi.
Использую CryptoClType класс из:
cryptocl.clw
cryptocl.inc
На 4-ом шаге получаю ошибку 87 - Параметр задан неверно
Схематичный порядок действий:
Код: Выделить всё
Module('advapi32.dll')
CryptAcquireContext(*LONG hProv,<*CSTRING Container>,<*CSTRING Provider>,LONG ProviderType,LONG dwFlags),BYTE,RAW,PASCAL,NAME('CryptAcquireContextA')
CryptCreateHash(LONG hProv, LONG AlgId,LONG hKey,LONG dwFlags,*LONG phHash),BYTE,RAW,PASCAL
CryptHashData(ULONG hHash,LONG pbData,LONG dwDataLen,LONG dwFlags),BYTE,RAW,PASCAL
CryptGetHashParam(LONG hHash,LONG dwParam,LONG pbData,*LONG pdwDataLen,LONG dwFlags),BYTE, RAW, PASCAL
end
hHash long
ParamBLOB Group(_StrParam_BLOB).
hashlen long
HashArr BYTE,DIM(4),over(hashlen)
hashlensize long(4)
self.ProviderType = PROV_GOST_2012_256 ! 80
Algid = CALG_GR3411_2012_256 ! 32801
1. CryptAcquireContext(SELF.hCryptProv,,, SELF.ProviderType,CRYPT_VERIFYCONTEXT)
! Create an empty Hash
2. CryptCreateHash(SELF.hCryptProv,AlgId,0,0,hHash)
! Hash the supplied Password
3. CryptHashData(hHash,ADDRESS(Password),PasswordLen,0)
4. CryptGetHashParam(hHash,HP_HASHSIZE,ADDRESS(HashArr[1]),Hashlensize,0)
!!! Здесь получаю ошибку
ParamBLOB.ParamData &= NEW(STRING(hashlen))
5. CryptGetHashParam(hHash,HP_HASHVAL,ADDRESS(ParamBLOB.ParamData),hashlen,0)
self.ProviderType = PROV_RSA_AES ! 24
Algid = CALG_SHA_256 ! 32780
И пример на С из пакета Cryptopro SDK нормально отрабатывает с ГОСТ алгоритмом.
В чем может быть ошибка? Что не нравится функции CryptGetHashParam ?
Может, кто то сталкивался с такой проблемой ?