вот где здесь можно ошибиться? я две недели уже с ума схожу:
все считает, но смэв ни в какую не хочет принимать подпись (участок кода с подписью хеша опущен, если надо приведу полностью...)
var
OID_HashVerbaO:ansistring='1.2.643.2.2.30.2';
const
CALG_GR3411 = 32798;
procedure GetHashStream2(Container: WideString; DataStream: TStream; HashStream: TStream);
var
hProv: HCRYPTPROV;
DataLen: DWORD;
hHash: HCRYPTHASH;
InStream, OutStream: TBytesStream;
dwKeySpec: DWORD;
begin
dwKeySpec:=AT_KEYEXCHANGE; //}AT_SIGNATURE;
InStream:=TBytesStream.Create;
OutStream:=TBytesStream.Create;
try
InStream.CopyFrom(DataStream,DataStream.Size);
CryptCheck(CryptAcquireContext(@hProv, @Container[1], nil, 75, 0), 'CryptAcquireContext');
try
CryptCheck(CryptCreateHash(hProv, CALG_GR3411, 0, 0, @hHash), 'CryptCreateHash');
try
CryptCheck(CryptSetHashParam(hHash, HP_OID, @OID_HashVerbaO[1], 0),'CryptSetHashParam');
CryptCheck(CryptHashData(hHash, InStream.Memory, InStream.Size, 0), 'CryptHashData');
CryptCheck(CryptGetHashParam(hHash, HP_HASHVAL, nil, @DataLen, 0), 'CryptGetHashParam');
OutStream.Position:=0;
OutStream.Size:=DataLen;
CryptCheck(CryptGetHashParam(hHash, HP_HASHVAL, OutStream.Memory, @DataLen, 0), 'CryptGetHashParam');
HashStream.CopyFrom(OutStream,OutStream.Size);
finally
CryptCheck(CryptDestroyHash(hHash), 'CryptDestroyHash');
end;
finally
CryptCheck(CryptReleaseContext(hProv, 0), 'CryptReleaseContext');
end;
finally
InStream.Free;
OutStream.Free;
end;
end;