Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI - Получаю Access Violation при попытке подписать / 22 сообщений из 22, страница 1 из 1
22.04.2019, 19:55
    #39805063
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Пытаюсь выполнить подписание, но получаю Access Violation при вызове CryptSignMessage

Я использую
Код: plaintext
JwaWinCrypt
Почитав тему " https://www.sql.ru/forum/469165-a/kak-sdelat-cifrovuu-podpis-na-osnove-sertifikata" я изменил там прототип функции "CryptSignMessage".

Старое закомментировал и добваил вот это:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
  TByteArray = Array of PByte;
  PByteArray = ^TByteArray;
  TDWordArray = Array of DWORD;
  PDWordArray = ^TDWordArray;
  TPCCertContextArray = Array of PCCERT_CONTEXT;
  PPCCertContextArray = ^TPCCertContextArray;

function CryptSignMessage(
  var pSignPara : CRYPT_SIGN_MESSAGE_PARA;
  fDetachedSignature: BOOL;
  cToBeSigned: DWORD;
  const rgpbToBeSigned: PByteArray;
  rgcbToBeSigned: PDWordArray;
  pbSignedBlob: LPBYTE;
  var pcbSignedBlob: DWORD
): BOOL; stdcall;



Код процедуры подписи выглядит так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
procedure Sing(pSignerCert: PCCERT_CONTEXT; Text: TMemoryStream; const ASignature: String);
type
  TDWords = Array of DWORD;
  THandles = Array of PVOID;
var
  Size: DWORD;
  Sizes: TDWords;
  Texts: TByteArray;
  Signature: TMemoryStream;
  SigParams: CRYPT_SIGN_MESSAGE_PARA;
begin
  Signature := TMemoryStream.Create;
  try
    SetLength( Texts, 1 );
    SetLength( Sizes, 1 );

    Texts[ 0 ] := Text.Memory;
    Sizes[ 0 ] := Text.Size;

    FillChar( SigParams, SizeOf( CRYPT_SIGN_MESSAGE_PARA ), 0 );

    SigParams.cbSize := SizeOf( CRYPT_SIGN_MESSAGE_PARA );
    SigParams.dwMsgEncodingType := MY_ENCODING_TYPE;
    SigParams.pSigningCert := pSignerCert;
    SigParams.HashAlgorithm.pszObjId := szOID_RSA_MD5;
    SigParams.cMsgCert := 1;
    SigParams.rgpMsgCert := Pointer( pSignerCert );

    Win32Check( CryptSignMessage( SigParams, true, 1, Pointer( Texts ), Pointer( Sizes ), nil, Size ));
    Signature.Size := Size;

    Win32Check( CryptSignMessage( SigParams, true, 1, Pointer( Texts ), Pointer( Sizes ), Signature.Memory, Size ));
    Signature.Size := Size;

    if ASignature <> '' then
      Signature.SaveToFile( ASignature );
  finally
    FreeAndNil( Signature );
  end;
end;

...

Text := TMemoryStream.Create;
Text.LoadFromFile( '.\test\текстовый файл.txt' );
Sing( vCertContext, Text, '.\test\sign.txt' );



Ошибка AV вываливается на первом вызове CryptSignMessage.
В чем может заключаться моя ошибка?
...
Рейтинг: 0 / 0
22.04.2019, 22:08
    #39805091
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
SQL-TalkerВ чем может заключаться моя ошибка?

Всё не читал, но присваивание байту указателя выглядит прелестно само по себе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.04.2019, 22:11
    #39805092
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Хотя нет, ты же переопределил TByteArray со стандартного на какую-то хрень. Это ещё крече,
чем #define true false.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.04.2019, 06:45
    #39805139
Stranger484
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Первое что бросилось в глаза это
var pSignPara : CRYPT_SIGN_MESSAGE_PARA;
должно быть
pSignPara : PCRYPT_SIGN_MESSAGE_PARA;
...
Рейтинг: 0 / 0
23.04.2019, 07:01
    #39805142
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Stranger484,

я отталкивался от коа Альта - https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=469165&msg=5472038
...
Рейтинг: 0 / 0
23.04.2019, 08:28
    #39805161
Stranger484
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
...
Рейтинг: 0 / 0
23.04.2019, 10:09
    #39805209
Stranger484
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
исходя из https://docs.microsoft.com/ru-ru/windows/desktop/api/wincrypt/ns-wincrypt-_crypt_sign_message_para
rgpMsgCert

Array of pointers to CERT_CONTEXT structures to be included in the signed message. If the pSigningCert is to be included, a pointer to it must be in the rgpMsgCert array.
Поэтому надо допилить:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type
  TCerts = Array of PCCERT_CONTEXT;
...
var
  Certs: TCerts;
...
  SetLength( Certs, 1 );
  Certs[ 0 ] := pSignerCert;
...
  SigParams.rgpMsgCert := Pointer( Certs );
...
Рейтинг: 0 / 0
23.04.2019, 11:26
    #39805277
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
У меня пашет так:
Мне тут и помогли составить
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
procedure SignStream(SignerCert: PCCERT_CONTEXT; ASourceStream: TStream; ADestStream: TStream; DetachedSignature: Boolean);
var
  SignPara: CRYPT_SIGN_MESSAGE_PARA;
  bToBeSigned: array of PByte;
  cToBeSigned: array of DWORD;
  pMsgCrl: array of PCCERT_CONTEXT;
  pbSignedBlob: PByte;
  cbSignedBlob: DWORD;

begin
  SetLength(bToBeSigned, 1);
  SetLength(cToBeSigned, 1);
  SetLength(pMsgCrl, 1);
  bToBeSigned[0] := GetMemory(ASourceStream.Size);
  cToBeSigned[0] := ASourceStream.Size;
  pMsgCrl[0] := SignerCert;
  cbSignedBlob := 0;
  try
    ASourceStream.Read(bToBeSigned[0]^, ASourceStream.Size);
    ZeroMemory(@SignPara, SizeOf(CRYPT_SIGN_MESSAGE_PARA));
    SignPara.cbSize := SizeOf(CRYPT_SIGN_MESSAGE_PARA);
    SignPara.dwMsgEncodingType := MY_ENCODING_TYPE;
    SignPara.pSigningCert := SignerCert;
    SignPara.HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411);
    SignPara.HashAlgorithm.Parameters.cbData := 0;
    SignPara.HashAlgorithm.Parameters.pbData := nil;
    SignPara.cMsgCert := 1;
    SignPara.rgpMsgCert := Pointer(pMsgCrl);

    if not(CryptSignMessage(@SignPara, DetachedSignature, 1, Pointer(bToBeSigned), Pointer(cToBeSigned), nil, cbSignedBlob)) then
      RaiseLastOSError;
    pbSignedBlob := GetMemory(cbSignedBlob);
    try
      if not CryptSignMessage(@SignPara, DetachedSignature, 1, Pointer(bToBeSigned), Pointer(cToBeSigned), pbSignedBlob, cbSignedBlob) then
        RaiseLastOSError;
      ADestStream.Write(pbSignedBlob^, cbSignedBlob);
    finally
      FreeMemory(pbSignedBlob);
    end;
  finally
    FreeMemory(bToBeSigned[0]);
  end;
end;

procedure HashStream(ASourceStream: TStream; ADestStreamHash: TStream);
var
  HashPara: CRYPT_HASH_MESSAGE_PARA;

  cToBeHashed: DWORD;
  rgpbToBeHashed: array of PByte;
  rgcbToBeHashed: array of DWORD;
  pbHashedBlob: PByte;
  pcbHashedBlob: DWORD;

begin
  cToBeHashed := 1;

  ASourceStream.Position := 0;

  SetLength(rgpbToBeHashed, 1);
  SetLength(rgcbToBeHashed, 1);

  rgpbToBeHashed[0] := GetMemory(ASourceStream.Size);
  rgcbToBeHashed[0] := ASourceStream.Size;

  pcbHashedBlob := 0;
  try
    ASourceStream.Read(rgpbToBeHashed[0]^, ASourceStream.Size);
    ZeroMemory(@HashPara, SizeOf(CRYPT_HASH_MESSAGE_PARA));
    HashPara.cbSize := SizeOf(CRYPT_HASH_MESSAGE_PARA);
    HashPara.dwMsgEncodingType := MY_ENCODING_TYPE;
    HashPara.HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411);
    HashPara.HashAlgorithm.Parameters.cbData := 0;
    HashPara.HashAlgorithm.Parameters.pbData := nil;
    HashPara.pvHashAuxInfo := nil;

    if not(CryptHashMessage(@HashPara, True, cToBeHashed, Pointer(rgpbToBeHashed), Pointer(rgcbToBeHashed), nil, @pcbHashedBlob, nil,
      nil { Pointer(pcbComputedHash) } )) then
      RaiseLastOSError;
    pbHashedBlob := GetMemory(pcbHashedBlob);
    try
      if not(CryptHashMessage(@HashPara, True, cToBeHashed, Pointer(rgpbToBeHashed), Pointer(rgcbToBeHashed), pbHashedBlob, @pcbHashedBlob, nil,
        nil { pbComputedHash, Pointer(pcbComputedHash) } )) then
        RaiseLastOSError;
      ADestStreamHash.Write(pbHashedBlob^, pcbHashedBlob);
    finally
      FreeMemory(pbHashedBlob);
    end;
  finally
    FreeMemory(rgpbToBeHashed[0]);
  end;
end;

function CoSignMessage(ACertContext: PCCERT_CONTEXT; // Сертификат
  pFileToSign: TStream; // сам файл
  pSignedMessageStream: TStream; // подпись сообщения
  pCosignedMessageStream: TStream; // результат - соподписаное подпись сообщения
  var sMsg: String): Boolean; // сообщение об ошибке в случае Result := false;
var
  hProv: HCRYPTPROV;
  hMsg: HCRYPTMSG;
  dwKeySpec: DWORD;
  HashAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  SignerEncodeInfo: CMSG_SIGNER_ENCODE_INFO;
  CosignCertBlob: CERT_BLOB;
  dwSize: DWORD;
  pbCoSignedBlob: PByte;
  cbCoSignedBlob: DWORD;

  SignFileSize: cardinal;
  Buffer: PByte;
  len: DWORD;

begin
  try
    Result := false;

    if not CryptAcquireCertificatePrivateKey(ACertContext, 0, nil, hProv, @dwKeySpec, nil) then
    begin
      sMsg := 'CryptAcquireCertificatePrivateKey failed.'#13#10 + SysErrorMessage(GetLastError);
      Exit;
    end;

    ZeroMemory(@HashAlgorithm, SizeOf(HashAlgorithm));
    HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411); // Идентификатор алгоритма хэша

    // Initialize the CMSG_SIGNER_ENCODE_INFO structure for the cosigner.
    ZeroMemory(@SignerEncodeInfo, SizeOf(CMSG_SIGNER_ENCODE_INFO));
    SignerEncodeInfo.cbSize := SizeOf(CMSG_SIGNER_ENCODE_INFO);
    SignerEncodeInfo.HashAlgorithm := HashAlgorithm;
    SignerEncodeInfo.HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411); // szOID_CP_GOST_R3411 = '1.2.643.2.2.9';
    SignerEncodeInfo.pCertInfo := ACertContext.pCertInfo;
    SignerEncodeInfo.HCRYPTPROV := hProv;
    SignerEncodeInfo.dwKeySpec := dwKeySpec;
    SignerEncodeInfo.pvHashAuxInfo := nil;

    // Open a message for decoding.
    hMsg := CryptMsgOpenToDecode(MY_ENCODING_TYPE, CMSG_DETACHED_FLAG, 0, 0, nil, nil);
    if hMsg = nil then
    begin
      sMsg := 'CryptMsgOpenToDecode failed.'#13#10 + SysErrorMessage(GetLastError);
      Exit;
    end;

    // Update the message with the encoded BLOB.
    try
      SignFileSize := pSignedMessageStream.Size;
      GetMem(Buffer, SignFileSize);
      pSignedMessageStream.Position := 0;
      len := pSignedMessageStream.Read(Buffer^, SignFileSize);
      if not CryptMsgUpdate(hMsg, Buffer, len, True) then
      begin
        sMsg := 'CryptMsgUpdate (detached file) failed.'#13#10 + SysErrorMessage(GetLastError);
        Exit;
      end;
    finally
      FreeMem(Buffer, SignFileSize);
    end;

    try
      SignFileSize := pFileToSign.Size;
      GetMem(Buffer, SignFileSize);
      pFileToSign.Position := 0;
      len := pFileToSign.Read(Buffer^, SignFileSize);
      if not CryptMsgUpdate(hMsg, Buffer, len, True) then
      begin
        sMsg := 'CryptMsgUpdate (signed file) failed.'#13#10 + SysErrorMessage(GetLastError);
        Exit;
      end;
    finally
      FreeMem(Buffer, SignFileSize);
    end;

    // Add the cosigner to the message.
    if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @SignerEncodeInfo) then
    begin
      sMsg := 'CMSG_CTRL_ADD_SIGNER failed.'#13#10 + SysErrorMessage(GetLastError);
      Exit;
    end;

    // Add the cosigner's certificate to the message.
    CosignCertBlob.cbData := ACertContext.cbCertEncoded;
    CosignCertBlob.pbData := ACertContext.pbCertEncoded;
    if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, @CosignCertBlob) then
    begin
      sMsg := 'CMSG_CTRL_ADD_CERT failed.'#13#10 + SysErrorMessage(GetLastError);
      Exit;
    end;

    // Get the size of the cosigned BLOB.
    if not CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, nil, cbCoSignedBlob) then
    begin
      sMsg := 'Sizing of cbSignerInfo failed.'#13#10 + SysErrorMessage(GetLastError);
      Exit;
    end;

    // Allocate memory for the cosigned BLOB.
    pbCoSignedBlob := GetMemory(cbCoSignedBlob);

    // Get the cosigned message BLOB.
    try
      if not CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, pbCoSignedBlob, cbCoSignedBlob) then
      begin
        sMsg := 'Getting cosigned message failed.'#13#10 + SysErrorMessage(GetLastError);
        Exit;
      end;
      pCosignedMessageStream.Write(pbCoSignedBlob^, cbCoSignedBlob);
      Result := True;
    finally
      FreeMemory(pbCoSignedBlob);
    end;

  finally
    if (hMsg <> nil) then
    begin
      CryptMsgClose(hMsg);
    end;
  end;
end;

function VerifySigStreams(AFileStream: TMemoryStream; ASigStream: TMemoryStream): Boolean;
var
  veriPara: CRYPT_VERIFY_MESSAGE_PARA;
  arrDataPointer: array of Pointer;
  arrDataSize: array of DWORD;
  c, i: Integer;
begin
  try
    Result := false;
    AFileStream.Position := 0;
    ASigStream.Position := 0;
    SetLength(arrDataPointer, 1);
    SetLength(arrDataSize, 1);
    arrDataPointer[0] := AFileStream.memory;
    arrDataSize[0] := AFileStream.Size;
    FillChar(veriPara, SizeOf(CRYPT_VERIFY_MESSAGE_PARA), #0);
    veriPara.cbSize := SizeOf(CRYPT_VERIFY_MESSAGE_PARA);
    veriPara.dwMsgAndCertEncodingType := MY_ENCODING_TYPE;

    c := CryptGetMessageSignerCount(MY_ENCODING_TYPE, ASigStream.memory, ASigStream.Size);
    Result := True;
    Result := Result and (c > 0);
    for i := 0 to c - 1 do
      Result := Result and CryptVerifyDetachedMessageSignature(@veriPara, 0, ASigStream.memory, ASigStream.Size, 1, Pointer(arrDataPointer),
        Pointer(arrDataSize), nil);
  except
    // TODO: говорить чего нибудь
    Result := false;
  end;
end;

function VerifySigFiles(sFileToVerifyPath, sSignaturePath: String): Boolean;
var
  veriPara: CRYPT_VERIFY_MESSAGE_PARA;
  mStreamIn, mStreamSignIn: TMemoryStream;
  arrDataPointer: array of Pointer;
  arrDataSize: array of DWORD;
begin
  try
    try
      mStreamIn := TMemoryStream.Create;
      mStreamIn.LoadFromFile(sFileToVerifyPath);
      mStreamSignIn := TMemoryStream.Create;
      mStreamSignIn.LoadFromFile(sSignaturePath);
      Result := VerifySigStreams(mStreamIn, mStreamSignIn);
    except
      // TODO: говорить чего нибудь
      Result := false;
    end;
  finally
    FreeAndNil(mStreamIn);
    FreeAndNil(mStreamSignIn);
  end;
end;

...
Рейтинг: 0 / 0
23.04.2019, 14:23
    #39805385
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Devillio,

У вас модуль с прототипами тоже от JEDI ( JwaWinCrypt.pas ) или другой?
...
Рейтинг: 0 / 0
23.04.2019, 14:43
    #39805400
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Код: pascal
1.
2.
3.
type
  TByteArray = Array of PByte;
  PByteArray = ^TByteArray;



тут вроде получается указатель на указатель, у автора так и задумано?
...
Рейтинг: 0 / 0
24.04.2019, 07:55
    #39805610
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Да, JwaWinCrypt, JwaCryptUIApi
...
Рейтинг: 0 / 0
25.04.2019, 00:03
    #39805935
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Devillio,

пора уже на ГОСТ-2012 переписать или автоопределение алгоритмов сделать.
...
Рейтинг: 0 / 0
25.04.2019, 10:30
    #39806041
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
sql2012, добрый день! :)
Пока сделал через ручной выбор:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  szOID_CP_GOST_R3411 =	'1.2.643.2.2.9'; //	Функция хэширования ГОСТ Р 34.11-94
  szOID_CP_GOST_R3411_12_256 = '1.2.643.7.1.1.2.2'; //	Функция хэширования ГОСТ Р 34.11-2012, длина выхода 256 бит
  szOID_CP_GOST_R3411_12_512 = '1.2.643.7.1.1.2.3'; //	Функция хэширования ГОСТ Р 34.11-2012, длина выхода 512 бит
...
    case IDAlgo of
    0: SignPara.HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411);
    1: SignPara.HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411_12_256);
    2: SignPara.HashAlgorithm.pszObjId := PAnsiChar(szOID_CP_GOST_R3411_12_512);
    end;



А автоматом из сертификата как-то можно получить?
...
Рейтинг: 0 / 0
25.04.2019, 11:24
    #39806082
Shuraken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Devillio...А автоматом из сертификата как-то можно получить?
А что именно? Если идентификатор алгоритма, то это pCertContext.pCertInfo.SubjectPublicKeyInfo.Algorithm.pszObjId, где pCertContext: PCCERT_CONTEXT

Если требуется название, то
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
const
  CERT_KEY_PROV_INFO_PROP_ID = 2;
var
  pInfo: PCRYPT_KEY_PROV_INFO;
  cbSize: DWORD;
  pCertContext: PCCERT_CONTEXT;
  AlgName: string;
  pOidInfo: PCCRYPT_OID_INFO;
begin
...
CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, pInfo, @cbSize);
AlgName := pInfo^.pwszProvName; // Crypto-Pro GOST R 34.10-2012 Strong Cryptographic Service Provider

//Информация об алгоритме подписи
pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SignatureAlgorithm.pszObjId), 0);
SignAlgorithm := pOIDInfo^.pwszName; //ГОСТ Р 34.11-2012/34.10-2012 256 бит
...
Рейтинг: 0 / 0
25.04.2019, 15:04
    #39806311
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Shuraken, благодарю!
...
Рейтинг: 0 / 0
01.08.2019, 16:14
    #39844209
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
Интересно, можно ли указать какой именно криптопровайдер использовать при создании подписи с помощью функции CryptSignMessage ?
В структуре CRYPT_SIGN_MESSAGE_PARA такого параметра нет, как же API выбирает криптопровайдер?
...
Рейтинг: 0 / 0
01.08.2019, 17:06
    #39844239
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
SQL-TalkerИнтересно, можно ли указать какой именно криптопровайдер использовать при создании подписи с помощью функции CryptSignMessage ?
В структуре CRYPT_SIGN_MESSAGE_PARA такого параметра нет, как же API выбирает криптопровайдер?

и зачем?
Вызвать MS CSP Full RSA имея ключ для КриптоПРО CSP ))?

Всё просто:
Сертификат => Контейнер => Информация о ключе\csp
...
Рейтинг: 0 / 0
01.08.2019, 17:08
    #39844240
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
SQL-Talker,

Получить "контекст" сертификата (по сути - файл читается, например, из профиля текущего пользователя), где прописана информация о CSP и т.п., в простонародии: при открытии сертификата - "ссылка на закрытый ключ"
...
Рейтинг: 0 / 0
01.08.2019, 17:51
    #39844262
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
sql2012,

Т.е., иными словами, CryptoAPI автоматически вызывает тот криптопровайдер, для которого (или которым?) была создана ключевая пара?
...
Рейтинг: 0 / 0
01.08.2019, 17:59
    #39844266
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
SQL-Talker,

Поясню - в нашем случае получается что у пользователей будет установлено 2 CSP РуТокен и КриптоПро, и они беспокоятся, "правильным ли провайдером они будут подписывать документы"
...
Рейтинг: 0 / 0
01.08.2019, 23:46
    #39844352
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
SQL-TalkerSQL-Talker,

Поясню - в нашем случае получается что у пользователей будет установлено 2 CSP РуТокен и КриптоПро, и они беспокоятся, "правильным ли провайдером они будут подписывать документы"

Тогда им нужно объяснить...
Что дело не в CSP, а в сертификате, который однозначно связан с ключевой парой.

И ruToken вообще может выступать в качестве обычного хранилища ключей, как флешка.
Или сделал реализацию и ключ неизвлекаемый, да CSP вызывается "Aktiv ruToken CSP v1.0"?
...
Рейтинг: 0 / 0
01.08.2019, 23:48
    #39844353
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Получаю Access Violation при попытке подписать
SQL-Talkersql2012,

Т.е., иными словами, CryptoAPI автоматически вызывает тот криптопровайдер, для которого (или которым?) была создана ключевая пара?

Высокоуровневые функции - вызывают внутри себя низкоуровневые.
Указал каким сертификатом подписывать - ищется соответствующий контейнер и CSP.

На низкоуровневых вызовах - там да, необходимо работать со списком CSP, контейнерами.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI - Получаю Access Violation при попытке подписать / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]