Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как добавить еще одну подпись в sig-файл? / 13 сообщений из 13, страница 1 из 1
24.05.2018, 17:26
    #39649527
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Добрый день!

Не нашел нигде готового текста, а сам туповат, помогите разобраться, пож-та?
Как создать sig файл для одной подписи, я нашел, работает четко.
Текст с просторов для одной подписи, рабочий
Код: 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.
uses JwaWinCrypt, JwaCryptUIApi...

function CryptSignMessage(pSignPara: PCRYPT_SIGN_MESSAGE_PARA;
  fDetachedSignature: BOOL; cToBeSigned: DWORD; rgpbToBeSigned: PByte;
  rgcbToBeSigned: Pointer; pbSignedBlob: PByte; var pcbSignedBlob: DWORD): BOOL;
  stdcall; external 'Crypt32.dll';

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 := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
    SignPara.pSigningCert := SignerCert;
    SignPara.HashAlgorithm.pszObjId := '1.2.643.100.113.1';
    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 TMainForm.Button1Click(Sender: TObject);
var
  cert: PCCERT_CONTEXT;
  pStreamIn, pStreamOut: TMemoryStream;
  afile: string;
  my: hcertstore;
begin
  if not OpenDialog1.Execute then Exit;

  my := CertOpenSystemStore(0, 'MY');
  cert := CryptUIDlgSelectCertificateFromStore(my, 0, '', '', 0, 0, nil);

  afile := OpenDialog1.FileName;
  pStreamIn := TMemoryStream.Create;
  pStreamOut := TMemoryStream.Create;
  pStreamIn.LoadFromFile(afile);
  SignStream(cert, pStreamIn, pStreamOut, true);
  pStreamOut.SaveToFile(afile + '.sig');
  FreeAndNil(pStreamOut);
  FreeAndNil(pStreamIn);
end;


Чтобы прицепить доп. подпись, решил, что в SignPara.rgpMsgCert нужно подать список тех сетрификатов, что уже есть в файле (плюс новую).
Не претендую на правильность, сделал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//получаю кол-во сертификатов в существующей подписи
    C := CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, mStreamSignIn.Memory, mStreamSignIn.Size);
    SetLength(ArrACert, C);
//создаю массив
    for i := 0 to C-1 do
      if JwaWinCrypt.CryptVerifyDetachedMessageSignature(@veriPara, i, mStreamSignIn.Memory, mStreamSignIn.Size, 1, Pointer(arrDataPointer), Pointer(arrDataSize), @ACert) then
        ArrACert[i] := ACert;
//затем добавляю в этот массив новый сертификат
    cert := CryptUIDlgSelectCertificateFromStore(my, 0, '', '', 0, 0, nil);
    SetLength(ArrACert, Length(ArrACert)+1);
    ArrACert[High(ArrACert)] := cert;
//и вызываю модифицированную процедуру:
    SignStreamSeveral(cert, ArrACert, pStreamIn, pStreamOut, true);


Процедура SignStreamSeveral
Код: 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 SignStreamSeveral(SignerCert: PCCERT_CONTEXT; ExistingSignerCerts: array of 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 := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
    SignPara.pSigningCert := SignerCert;
    SignPara.HashAlgorithm.pszObjId := '1.2.643.100.113.1';
    SignPara.HashAlgorithm.Parameters.cbData := 0;
    SignPara.HashAlgorithm.Parameters.pbData := nil;
    SignPara.cMsgCert := Length(ExistingSignerCerts);
    SignPara.rgpMsgCert := @ExistingSignerCerts; //вот этот момент меня смущает

    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;


В итоге размер sig файла увеличивается, как будто дописалось что-то, но при проверке криптопро выдает правильной только последнюю подпись (остальные не видит, и CryptGetMessageSignerCount тоже видит только 1 подпись (и она правильная)).
Подскажите, как правильно добавить подписи в sig-файл?

Спасибо!
...
Рейтинг: 0 / 0
24.05.2018, 17:51
    #39649537
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Devillio
Код: sql
1.
      SignPara.cMsgCert := 1;


Лично мне очень подозрительна эта единичка. Не пробовал почитать документацию что она значит?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2018, 23:45
    #39649613
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Devillio,

авторSignPara.HashAlgorithm.pszObjId := '1.2.643.100.113.1';

Идентификатор алгоритма хеширования = Идентификатор политики (Класс средства ЭП КС1)?
Сам так решил?
...
Рейтинг: 0 / 0
24.05.2018, 23:46
    #39649614
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Devillio,

а подпись вообще кому нужна, только "честно".

Для суда...

А суд что требует в своём документе?
Каждой подписи по файлу...
Зовите юриста.
...
Рейтинг: 0 / 0
24.05.2018, 23:58
    #39649618
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
hMsg:=CryptMsgOpenToDecode ( ... )

если загружается отсоединенная ЭП:
в Buffer - загружается отсоединенная ЭП и CryptMsgUpdate(hMsg, Buffer, размер Buffer, true);


читаем в цикле файле и вызываем CryptMsgUpdate ( false или true (если последний блок) )


Добавляем:
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, ... @X : CMSG_SIGNER_ENCODE_INFO )\

в X - предварительно заполняем (атрибуты\алгоритм)

Добавляем цепочку сертификатов:
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT @Z : массив CERT_BLOB
...
CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE ... nil, cbEncodedBlob)

выделение памяти для pbEncodedBlob
CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE ... pbEncodedBlob, cbEncodedBlob)

в pbEncodedBlob - будет CMS с нужными подписями и сертификатами
...
Рейтинг: 0 / 0
25.05.2018, 00:00
    #39649619
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
На форумах можно найти примеры\описание
в данном случае поискать: CMSG_CTRL_ADD_SIGNER

https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=90428#post90428
...
Рейтинг: 0 / 0
27.05.2018, 19:11
    #39650720
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
sql2012, благодарю за помощь!

Вот что получилось
Код: 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.
procedure TMainForm.cxButton5Click(Sender: TObject);
var
  hMsg: HCRYPTMSG;
  cert: PCCERT_CONTEXT;
  pStreamIn, pStreamOut, pStreamResult: TMemoryStream;
  my: hcertstore;
  cib: CRYPT_INTEGER_BLOB;
  pbEncodedBlob: PByte;
  cbEncodedBlob: DWORD;

begin
  if not OpenDialog1.Execute then Exit;

  try
    hMsg := CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, 0, nil, nil);

    try
      with TMemoryStream.Create do
      try
        LoadFromFile( OpenDialog1.FileName + '.sig' );
        Win32Check( CryptMsgUpdate( hMsg, Memory, Size, true ));
      finally
        Free
      end;

      my := CertOpenSystemStore(0, 'MY');
      cert := CryptUIDlgSelectCertificateFromStore(my, 0, '', '', 0, 0, nil);

      pStreamIn := TMemoryStream.Create;
      pStreamOut := TMemoryStream.Create;
      pStreamResult := TMemoryStream.Create;
      pStreamIn.LoadFromFile(OpenDialog1.FileName);
      SignStream(cert, pStreamIn, pStreamOut, true);

      cib.cbData := pStreamOut.Size;
      cib.pbData := pStreamOut.Memory;
      if not CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @cib) then
        RaiseLastOSError;

      if not CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, nil, cbEncodedBlob) then
        RaiseLastOSError;
      pbEncodedBlob := GetMemory(cbEncodedBlob);
      try
        if not CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, pbEncodedBlob, cbEncodedBlob) then
          RaiseLastOSError;
        pStreamResult.Write(pbEncodedBlob^, cbEncodedBlob);
        pStreamResult.SaveToFile(OpenDialog1.FileName + '.sig');
      finally
        FreeMemory(pbEncodedBlob);
      end;

    finally
      FreeAndNil(pStreamIn);
      FreeAndNil(pStreamOut);
      FreeAndNil(pStreamResult);
    end;

  finally

  end;
end;


На CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @cib) вываливается ошибка "неизвестный криптографический алгоритм".
Очень подозреваю, что связано с замечанием "Идентификатор алгоритма хеширования = Идентификатор политики (Класс средства ЭП КС1)?
Сам так решил? " :)
Пробовал менять на другие типа szOID_OIWSEC_sha1 (не уверен, что понимаю, что делаю), ошибка та же.
Подскажите, что не так?
Спасибо!

PS и еще момент не пойму, зачем вызывать CryptMsgUpdate в цикле? И если все таки вызывать, то как определять, что параметр fFinal пора ставить в true? :( тоже не понимаю этот момент. У меня сейчас для разработки всего 2 подписи, а в итоге будет подписывать намного больше, говорят, и до 10 будет.
PPS насчет алгоритма. Внедрили регистрацию входящих/исходящих, сама программа готова, все работает; поставлена цель уйти от бумаги и отправлять исходящие с sig файлами. Подскажите, пожта, для этой задачи какой надо ставить? Криптопро проверяет, пишет ок и при SignPara.HashAlgorithm.pszObjId := '1.2.643.100.113.1' (это просто в интернете нашел такой текст).

Еще раз благодарю за помощь!
...
Рейтинг: 0 / 0
27.05.2018, 19:23
    #39650726
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Ой блин я вместо CMSG_SIGNER_ENCODE_INFO саму подпись передаю, сори )))
Но другие вопросы все равно в силе
...
Рейтинг: 0 / 0
27.05.2018, 21:09
    #39650760
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
HashAlgorithm.pszObjId - это алгоритм шифрования.

Поиск (строки HashAlgorithm.pszObjId) по документации\форуму\поддерживаемым алгоритмам самого CSP - решит задачу.

Либо прописать "константой", как "обычно делают".
Пример - здесь .

Правильный вариант: по алгоритму подписи владельца сертификата - определять алгоритм хеширования.
В текущем состоянии необходимо различать алгоритмы ГОСТ-2001 и ГОСТ-2012 и выставлять соответствующий алгоритм хеширования.




>зачем вызывать CryptMsgUpdate в цикле

Чтобы читать и иметь возможность подписывать файлы любого размера, а не те, что помещаются в ОЗУ
+ можно сделать прогресс процесса подписания (актуально, при подписании файлов больше 100 мб).

Когда файлы не большие - можно, конечно, и сразу прочитать в память и передать в CryptMsgUpdate с флагом fFinal = true.


По ссылке на форум Крипто-ПРО - есть ссылки на документацию от КРИПТО-ПРО и на MSDN,
а в сообщении ниже приведен листинг с кодом.



>>Криптопро проверяет, пишет ок и при
>> SignPara.HashAlgorithm.pszObjId := '1.2.643.100.113.1' (это просто в интернете нашел такой текст).

Известная проблема, кто-то не так давно "прописал" и теперь все тиражируют.

Попадется другая сборка (или под другую платформу код переносить будешь) или другой CSP (ViPNet\SignalCom\Lissi..) - могут не пропустить "такую ошибку".
...
Рейтинг: 0 / 0
27.05.2018, 21:09
    #39650761
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
sql2012,

>HashAlgorithm.pszObjId - это алгоритм шифрования.

* ХЕШИРОВАНИЯ
...
Рейтинг: 0 / 0
29.05.2018, 11:43
    #39651647
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
не получается никак
Готовая функция, как получилось
Код: 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.
function CoSignMessage(ACertContext: PCCERT_CONTEXT; // Сертификат
                              pSignedMessageStream: TMemoryStream; // уже подписаное сообщение
                              pCosignedMessageStream: TMemoryStream; // результат - соподписаное сообщение
                              var sMsg: String): boolean;  // сообщение об ошибке в случае Result := false;
var
  hProv: HCRYPTPROV;
  hMsg: HCRYPTMSG;
  dwKeySpec: DWORD;
  SignerEncodeInfo: CMSG_SIGNER_ENCODE_INFO;
  CosignCertBlob: CERT_BLOB;
  dwSize: DWORD;
  pbCoSignedBlob: PByte;
  cbCoSignedBlob: DWORD;

begin
  try
    Result := false;
    hProv := 0;
    hMsg := nil;
    dwKeySpec := 0;

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

    // 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.
    if not CryptMsgUpdate(hMsg, pSignedMessageStream.Memory, pSignedMessageStream.Size,	true) then
    begin
      sMsg := 'CryptMsgUpdate failed.'#13#10+SysErrorMessage(GetLastError);
      Exit;
    end;

    // Initialize the CMSG_SIGNER_ENCODE_INFO structure for the cosigner.
    FillChar(SignerEncodeInfo, sizeof(CMSG_SIGNER_ENCODE_INFO), #0);
    SignerEncodeInfo.cbSize := sizeof(CMSG_SIGNER_ENCODE_INFO);
    SignerEncodeInfo.pCertInfo := ACertContext.pCertInfo;
    SignerEncodeInfo.hCryptProv := hProv;
    SignerEncodeInfo.dwKeySpec := dwKeySpec;
    SignerEncodeInfo.HashAlgorithm.pszObjId := ACertContext.pCertInfo.SignatureAlgorithm.pszObjId; // szOID_CP_GOST_R3411 = '1.2.643.2.2.9';

    // 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;

//так проверяю
      pStreamIn.LoadFromFile(OpenDialog1.FileName+'.sig');
      if not CertifUnit.CoSignMessage(ACert, pStreamIn, pStreamResult, S) then
        MessageDlg(S, mtWarning, [mbok], 0);


CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, @SignerEncodeInfo) возвращает "неизвестный криптографический алгоритм" все время ((
Направьте дальше, будьте добры!
...
Рейтинг: 0 / 0
30.05.2018, 12:34
    #39652402
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Devillio,

конечно не получится так.


OID хеша не может быть равен OID алгоритма подписи.
...
Рейтинг: 0 / 0
30.05.2018, 14:12
    #39652504
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить еще одну подпись в sig-файл?
Вас, случайно, не Андрей зовут?

Поменял на SignerEncodeInfo.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411;
ошибка та же :(
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как добавить еще одну подпись в sig-файл? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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