Добрый день!
Пытаюсь создать хэш на сервере для отправки с последующим подписанием его на клиенте.
Приведенный ниже код работаeт для ГОСТ Р 34.10-2001. Для ГОСТ 34.10-2012 256 падает в функции CryptSetHashParam с ошибкой "Указан неправильный тип (2148073482)"
const PROV_GOST_2001_DH = 75;
PROV_GOST_2012_256 = 80;
ALG_SID_GR3411 = 30;
ALG_SID_GR3411_2012_256 = 33;
CALG_GR3411 = (ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_GR3411);
CALG_GR3411_2012_256 = (ALG_CLASS_HASH or ALG_TYPE_ANY or ALG_SID_GR3411_2012_256);
HP_OID = $000a;
szOID_GostR3411_94_CryptoProParamSet = '1.2.643.2.2.30.1';
szOID_CP_GOST_R3411_12_256 = '1.2.643.7.1.1.2.2';
.......
var Prov: HCRYPTPROV;
Hash: HCRYPTHASH;
HashLen: DWORD;
szOid: ANSIString;
CALG: NativeUInt;
ProvType: Cardinal;
................
if Oid = GOST_2001 then begin
ProvType := PROV_GOST_2001_DH;
HashLen := 32;
szOid := szOID_GostR3411_94_CryptoProParamSet;
CALG := CALG_GR3411;
end
else begin
if Oid = GOST_2012_256 then begin
ProvType := PROV_GOST_2012_256;
HashLen := 32;
szOid := szOID_CP_GOST_R3411_12_256;
CALG := CALG_GR3411_2012_256;
end
else begin
Exit;
end;
end;
if CryptAcquireContext(@Prov, nil, nil, ProvType, CRYPT_VERIFYCONTEXT) then begin
if CryptCreateHash(Prov, CALG, 0, 0, @Hash) then begin
if CryptSetHashParam(Hash, HP_OID, PByte(PANSIChar(szOID)), 0) then begin
.............
end;
end;
end;
Отредактировано пользователем 18 декабря 2017 г. 11:39:38(UTC)
| Причина: Не указана