Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline mata1986  
#1 Оставлено : 2 августа 2013 г. 16:54:57(UTC)
mata1986

Статус: Участник

Группы: Участники
Зарегистрирован: 02.08.2013(UTC)
Сообщений: 11


Hi,
I'm using Delphi XE.

I need to sign file with certificate from smart card, and type of file must be PKCS7, p7s.

I tried to sign .pdf or .unl and l can create new file (.p7s), but it is empty - size is 0KB.

Could you see what is wrong..

This is code:

Код:

procedure TForm1.BitBtn3Click(Sender: TObject);
var
  signPara: CRYPT_SIGN_MESSAGE_PARA;//CRYPT_SIGN_MESSAGE_PARA ;
  hashAlgorithm:     CRYPT_ALGORITHM_IDENTIFIER ;
  hStore:     HCERTSTORE ;
  pSignerContext:     PCCERT_CONTEXT ;
  lpData :Pointer; //array of PBYTE;//;
  dwDataSize : Pointer; //DWORD;//;
  dwDS: DWORD;
  bResult:boolean;
  lpSignedBlob:PBYTE;
  dwSignedBlobSize:DWORD;
  hFile, hTempFile:THandle ;
  dwWriteByte:DWORD;
  cToBeSigned:DWORD;
  size_new: DWORD;

  pStreamIn, tpStreamIn : TMemoryStream ;
  pStreamOut, tpStreamOut : TMemoryStream ;
  file_name:string;

  ret: Integer;
  Data: array [0..MAXBYTE] of AnsiChar;
  Cert: array [0..MAX_BUFFER_LEN] of AnsiChar;
  Lng: UINT;
  PIN: array[0..19] of AnsiChar;
  Rez: AnsiString;
  citac: TCitac;
  pwszCertSubject :PWideChar;

 const
  CERT_STORE_NAME = WideString('MY');
begin
hStore := CertOpenSystemStore (0, CERT_STORE_NAME);
                                                                                                                               //pwszCertSubject
     pSignerContext := CertFindCertificateInStore (hStore, (PKCS_7_ASN_ENCODING or X509_ASN_ENCODING), 0, CERT_FIND_SUBJECT_STR, nil, nil);

   CryptAcquireContext (@hStore, PWideChar(citac.ReaderId), PWideChar(citac.CardId), PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);//CRYPT_VERIFYCONTEXT) ;

     ZeroMemory (@hashAlgorithm, sizeof (CRYPT_ALGORITHM_IDENTIFIER));
     hashAlgorithm.pszObjId := szOID_RSA_MD5;

     signPara.cbSize := sizeof (CRYPT_SIGN_MESSAGE_PARA);
     signPara.dwMsgEncodingType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
     signPara.pSigningCert := pSignerContext;
     signPara.HashAlgorithm := hashAlgorithm;
     signPara.pvHashAuxInfo := nil;
     signPara.cMsgCert := 1;
     signPara.rgpMsgCert := &pSignerContext;
     signPara.cMsgCrl := 0;
     signPara.rgpMsgCrl := nil;
     signPara.cAuthAttr := 0;
     signPara.rgAuthAttr := nil;
     signPara.cUnauthAttr := 0;
     signPara.rgUnauthAttr := nil;
     signPara.dwFlags :=0;// CRYPT_MACHINE_KEYSET;
     signPara.dwInnerContentType := 0;

   cToBeSigned:=1;

   pStreamIn:= TMemoryStream.Create;
   pStreamOut:= TMemoryStream.Create;
   file_name:=edit1.Text;
   pStreamIn.LoadFromFile(file_name);

   tpStreamIn:= TMemoryStream.Create;
   tpStreamOut:= TMemoryStream.Create;
   tpStreamIn.CopyFrom (pStreamIn, pStreamIn.Size - pStreamIn.Position);

   tpStreamIn.Position:= 0;
   lpData:= tpStreamIn.Memory;
   dwDataSize := Pointer(tpStreamIn.Size);

   //bResult := CryptSignMessage(@signPara, true, cToBeSigned,  @lpData,  @dwDataSize, nil, @dwSignedBlobSize);

   CryptSignMessage(@signPara, true, cToBeSigned,  @lpData,  @dwDataSize, nil, @dwSignedBlobSize);


/////
Problem starts here- dwSignedBlobSize is null...

     lpSignedBlob := HeapAlloc (GetProcessHeap (), 0, DWORD(dwSignedBlobSize));

     //bResult := CryptSignMessage ( @signPara, FALSE, 1,  @lpData,  @dwDataSize, @lpSignedBlob,  @dwSignedBlobSize);

   CryptSignMessage ( @signPara, FALSE, 1,  @lpData,  @dwDataSize, @lpSignedBlob,  @dwSignedBlobSize);

     hFile := CreateFile (PWideChar(edit2.Text), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, hTempFile);
     WriteFile (hFile, lpSignedBlob, DWORD(dwSignedBlobSize), dwWriteByte, 0);
     CloseHandle (hFile);

     HeapFree (GetProcessHeap (), 0, lpSignedBlob);
     CertFreeCertificateContext (pSignerContext);
     CertCloseStore (hStore, CERT_CLOSE_STORE_CHECK_FLAG);

Offline Андрей Писарев  
#2 Оставлено : 2 августа 2013 г. 17:18:53(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,766
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
if not CryptAcquireContext () then ...
if not CryptSignMessage()then...

IntToStr(GetLastError) + ' message: ' + syserrormessage(getlasterror() ?


p.s.
delete: wcrypt2
use: jwawincrypt
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 2 августа 2013 г. 17:28:37(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,766
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Автор: mata1986 Перейти к цитате

I need to sign file with certificatefrom smart card, and type of file must be PKCS7, p7s.

PublicKey = RSA ?
Техническую поддержку оказываем тут
Наша база знаний
Offline mata1986  
#4 Оставлено : 2 августа 2013 г. 19:12:51(UTC)
mata1986

Статус: Участник

Группы: Участники
Зарегистрирован: 02.08.2013(UTC)
Сообщений: 11


Цитата:
PublicKey = RSA ?


Yes, RSA but with PrivateKey from smart Card
Offline Андрей Писарев  
#5 Оставлено : 2 августа 2013 г. 19:30:20(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,766
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Автор: mata1986 Перейти к цитате

Цитата:
PublicKey = RSA ?


Yes, RSA but with PrivateKey from smart Card


... GetLastError?
Техническую поддержку оказываем тут
Наша база знаний
Offline mata1986  
#6 Оставлено : 6 августа 2013 г. 9:28:34(UTC)
mata1986

Статус: Участник

Группы: Участники
Зарегистрирован: 02.08.2013(UTC)
Сообщений: 11

errors:
if not CryptAcquireContext () then ...
GetLastError is 'The keyset is not defined'

if not CryptSignMessage () then ...
GetLastError is 'Cannot find the certificate and private key for decryption'.

Is problem maybe in
CertOpenSystemStore (0, CERT_STORE_NAME)
or
CertFindCertificateInStore (hStore, (PKCS_7_ASN_ENCODING or X509_ASN_ENCODING), 0, CERT_FIND_SUBJECT_STR, nil, nil);
Offline MCR  
#7 Оставлено : 6 августа 2013 г. 9:32:02(UTC)
MCR

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.03.2012(UTC)
Сообщений: 177

Сказал(а) «Спасибо»: 57 раз
Поблагодарили: 11 раз в 8 постах
Автор: mata1986 Перейти к цитате
errors:
if not CryptAcquireContext () then ...
GetLastError is 'The keyset is not defined'

if not CryptSignMessage () then ...
GetLastError is 'Cannot find the certificate and private key for decryption'.

Is problem maybe in
CertOpenSystemStore (0, CERT_STORE_NAME)
or
CertFindCertificateInStore (hStore, (PKCS_7_ASN_ENCODING or X509_ASN_ENCODING), 0, CERT_FIND_SUBJECT_STR, nil, nil);

In debug mode
hStore and pSignerContext <> nil ????
Offline mata1986  
#8 Оставлено : 6 августа 2013 г. 9:42:50(UTC)
mata1986

Статус: Участник

Группы: Участники
Зарегистрирован: 02.08.2013(UTC)
Сообщений: 11

Yes, they are <> nil, always different values.
Offline Андрей Писарев  
#9 Оставлено : 6 августа 2013 г. 9:43:47(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,766
Мужчина
Российская Федерация

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Errors?
Цитата:
citac: TCitac;
begin
...

CryptAcquireContext (@hStore, PWideChar(citac.ReaderId), PWideChar(citac.CardId),

Отредактировано пользователем 6 августа 2013 г. 9:44:32(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline mata1986  
#10 Оставлено : 6 августа 2013 г. 9:49:06(UTC)
mata1986

Статус: Участник

Группы: Участники
Зарегистрирован: 02.08.2013(UTC)
Сообщений: 11

If I write 'if not CryptAcquireContext (@hStore, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then', then it does not give error, but on CryptSignMessage I get same error. It looks like I don't access to smart card (it does not blink).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.