![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть задача считать из ЭЦП сертификата (.cert) данные о владельце и дату окончания действия сертификата. Итого мы должны получить базу данных, которая сама будет считывать данные из сертификатов(тут главное что не из одного а из множества одновременно) и оформление каждого из них в БД в виде строк с данными по столбцам.
Столбцы: 1.ФИО 2.E-mail 3.Дата окончания действия сертификата. Есть исходник который парсит нудные мне данные но в лог файл, хотелось бы чтоб эти данные переводились в listview как описано выше. Вот сам исходник и скрин с примером работы программы: Код:
nit GetDataSert; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses Wcrypt2, XPBase64, Shared; procedure BinToHexInverted(Buffer, Text: PChar; BufSize: Integer); const Convert: Array [0 .. 15] of Char = '0123456789abcdef'; var ii: Integer; begin for ii := BufSize - 1 downto 0 do begin Text[0] := Convert[Byte(Buffer[ii]) shr 4]; Text[1] := Convert[Byte(Buffer[ii]) and $F]; Inc(Text, 2); end; end; function DecodeSerialNumber(Source: CRYPT_INTEGER_BLOB): String; begin SetLength(Result, Source.cbData * 2); BinToHexInverted(PChar(Source.pbData), Pointer(Result), Source.cbData); end; function DecodeName(Source: CERT_NAME_BLOB; encType: DWORD = X509_ASN_ENCODING or PKCS_7_ASN_ENCODING; strType: DWORD = CERT_X500_NAME_STR): String; var iLength: DWORD; begin iLength := CertNameToStr(encType, @Source, strType, nil, 0); SetLength(Result, iLength); iLength := CertNameToStr(encType, @Source, strType, Pointer(Result), iLength); SetLength(Result, iLength); end; function FileTime2DateTime(FileTime: TFileTime): TDateTime; var LocalFileTime: TFileTime; SystemTime: TSystemTime; begin FileTimeToLocalFileTime(FileTime, LocalFileTime); FileTimeToSystemTime(LocalFileTime, SystemTime); Result := SystemTimeToDateTime(SystemTime); end; procedure LOG(S: String); begin Form1.Memo1.Lines.Add(S); end; procedure TForm1.Button1Click(Sender: TObject); var cert: PCCERT_CONTEXT; M: TMemoryStream; encType: DWORD; PS: Pbyte; sz: DWORD; skip: DWORD; flags: DWORD; I: Integer; begin if OpenDialog1.Execute then begin Memo1.Clear; M := TMemoryStream.Create; try M.LoadFromFile(OpenDialog1.FileName); encType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING; cert := CertCreateCertificateContext(encType, M.Memory, M.Size); if not Assigned(cert) then begin // flags := CRYPT_STRING_BASE64REQUESTHEADER; CryptStringToBinary(Pointer(M.Memory), M.Size, flags, nil, sz, skip, flags); GetMem(PS, sz); try CryptStringToBinary(Pointer(M.Memory), M.Size, flags, Pointer(PS), sz, skip, flags); cert := CertCreateCertificateContext(encType, PS, sz); finally FreeMem(PS); end; // end; if Assigned(cert) then begin try // LOG(FormatDateTime('Действителен с: dd.mm.yyyy', FileTime2DateTime(cert^.pCertInfo^.NotBefore))); LOG(FormatDateTime('Действителен до: dd.mm.yyyy', FileTime2DateTime(cert^.pCertInfo^.NotAfter))); LOG('Субъект: ' + DecodeName(cert^.pCertInfo^.Subject)); LOG('Поставщик: ' + DecodeName(cert^.pCertInfo^.Issuer)); LOG('******'); LOG('Парсим мыло субъекта: ' + GetValue('', DecodeName(cert^.pCertInfo^.Subject), 'E=', ',', I)); LOG('******'); LOG('Серийный номер: ' + DecodeSerialNumber (cert^.pCertInfo^.SerialNumber)); finally if not CertFreeCertificateContext(cert) then ShowMessage(SysErrorMessage(GetLastError)); end; end else ShowMessage(SysErrorMessage(GetLastError));; finally M.Free; end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin end; end. |
#2
|
||||
|
||||
![]() Ну? Очевидно, в этом коде данные получаются из
Код:
cert^.pCertInfo^.NotBefore cert^.pCertInfo^.NotAfter cert^.pCertInfo^.Subject cert^.pCertInfo^.Issuer cert^.pCertInfo^.Subject cert^.pCertInfo^.SerialNumber jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
![]() Тогда вопрос, для этих данных стоит объявить глобальные переменные, и пихать в бд уже в другой процедуре? И второе, как их запихнуть в listview.
P.S сам не работал до этого с этим элементом, но видел пример реализации бд при помощи него у друга по двум вариантам, первое это чтение нужных параметров из файла и раскидывание их по нужным столбцам, второе добавление в ручную через Edit. Вот интересует из этого первый...как заносить данные которые уже считали, через массивы или вектора? |