Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать attached sign с содержимым BEGIN CMS - END CMS? / 5 сообщений из 5, страница 1 из 1
25.10.2018, 10:35
    #39722663
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать attached sign с содержимым BEGIN CMS - END CMS?
Добрый день!

Подскажите, не могу найти, ссылок по поиску (CMS, BEGIN CMS, PKCS#7) куча, но ответа не вижу.
на просторах все найдено, и работает (attached и detached подпись):
Код: 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.
 uses ...
  JwaWinCrypt, JwaCryptUIApi;

const
  szOID_CP_GOST_R3411 = '1.2.643.2.2.9';
  szOID_SHA1RSA = '1.2.840.113549.1.1.5';

  // tc26
  id_tc26_gost3410_12_256 = '1.2.643.7.1.1.1.1'; //алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256
  id_tc26_gost3410_12_512 = '1.2.643.7.1.1.1.2'; //алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512

  id_tc26_gost3411_12_256 = '1.2.643.7.1.1.2.2'; //алгоритм хэширования ГОСТ Р 34.11-12 с ключом 256
  id_tc26_gost3411_12_512 = '1.2.643.7.1.1.2.3'; //алгоритм хэширования ГОСТ Р 34.11-12 с ключом 51
  MY_ENCODING_TYPE = (PKCS_7_ASN_ENCODING or X509_ASN_ENCODING);


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 := 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;



на одном ресурсе требуется прикреплять *.pdf.sig, который делает КриптоАРМ, содержимое выглядит как "-----BEGIN CMS-----" ... "-----END CMS-----", а подписанный найденным кодом файл выглядит как исходный файл + прикрепленное сообщение.
Подскажите, что исправить, чтобы получать такой же CMS?

Спасибо! :)
...
Рейтинг: 0 / 0
25.10.2018, 11:46
    #39722715
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать attached sign с содержимым BEGIN CMS - END CMS?
*.sig -- это и есть подпись. Достаточно передать на вход в криптоарм имя файла или содержимое -- дальше оно само всё сделает.

Пример:
https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=5763
...
Рейтинг: 0 / 0
25.10.2018, 11:51
    #39722719
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать attached sign с содержимым BEGIN CMS - END CMS?
А вот тут прямой пример на визуал бейсике (на вход нужен только файл для создания подписи). В делфи код будет аналогичным:
https://github.com/oresh247/KGNP/blob/f38a2516df9dcc82d2c0fcf0e35b74a8e0213473/CMD_ADD_EDS.vbs
...
Рейтинг: 0 / 0
25.10.2018, 19:16
    #39723043
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать attached sign с содержимым BEGIN CMS - END CMS?
Devillio,

DetachedSignature = true ?
...
Рейтинг: 0 / 0
25.10.2018, 19:17
    #39723045
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать attached sign с содержимым BEGIN CMS - END CMS?
JaDi*.sig -- это и есть подпись. Достаточно передать на вход в криптоарм имя файла или содержимое -- дальше оно само всё сделает.

Пример:
https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=5763

с каких времен КриптоАРМ стал поддерживать проверку raw-подписи?

Он работает с CMS.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать attached sign с содержимым BEGIN CMS - END CMS? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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