Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2013, 19:49   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию loadfromfile(TStream as file) как-то так

саама процедура
Код:
procedure TX509Certificate.LoadFromFile(FileName: string; Encoding: TEncoding);
var
  certfile: pBIO;
  p12: pPKCS12;
  a: pEVP_PKEY;
  c: pX509;
  ca: pSTACK_OFX509;
begin
if not(Encoding in [auto, DER, PEM, NETSCAPE, PKCS12]) then
  raise EOpenSSL.Create('Bad certificate encoding.');
certfile := BIO_new(BIO_s_file());
if certfile = nil then
  raise EOpenSSL.Create('Error creating BIO.');
BIO_read_filename(certfile, PChar(FileName));
if (Encoding = auto) or (encoding = DER) then
  begin
  fCertificate := d2i_X509_bio(certfile, nil);
  if (Encoding = auto) and (fCertificate = nil) then
    BIO_reset(certfile);
  end;
if ((Encoding = auto) and (fCertificate = nil)) or (encoding = NETSCAPE) then
  begin
  // See apps.c
  end;
if ((Encoding = auto) and (fCertificate = nil)) or (encoding = PEM) then
  begin
  fCertificate := PEM_read_bio_X509_AUX(certfile, c, nil, nil);
  if (Encoding = auto) and (fCertificate = nil) then
    BIO_reset(certfile);
  end;
if ((Encoding = auto) and (fCertificate = nil)) or (encoding = PKCS12) then
  begin
  p12 := d2i_PKCS12_bio(certfile, nil);
  PKCS12_parse(p12, nil, a, c, ca);
  fCertificate := c;
  PKCS12_free(p12);
  p12 := nil;
  end;
BIO_free(certfile);
if fCertificate = nil then
  raise EOpenSSL.Create('Unable to read certificate from file ' + FileName + '.');
end;
loadfromstream - просто нету, ну не предусмотрели.
Данных ну Оооооочень много и при обработке если использовать винчестрер т.е. вот так:
Код:
var
  cert:TX509Certificate;
  dir:string;
  mstream:TMemoryStream;
begin
 crttext.Clear;
 cert:= TX509Certificate.Create;
 mstream:=TMemoryStream.Create;
 http.Post(sertwin,param, mStream);
 mStream.Position := 0;
 mStream.SaveToFile('filename');
 cert.LoadFromFile('filename');
 with crttext.Lines do
  begin
   Add(cnv(cert.Issuer));
   Add('');
   Add(cnv(cert.Subject));
   Add('');
   Add(DATEToSTR(cert.NotBefore));
   Add('');
   Add(DATEToSTR(cert.NotAfter));
   Add('');
   Add(cnv(cert.Text));
  end;
 cert.Free;
end;
собственно как-то можно указать на файл, могу посмотреть что есть более-менее вменяемый и на скорость записи не влияющий способ.
IvaniuS вне форума Ответить с цитированием
Старый 22.07.2013, 20:07   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

может как то так
Код:
procedure TX509Certificate.LoadFromFile(MemoryStream:TMemoryStream; Encoding: TEncoding);
...
begin
if not(Encoding in [auto, DER, PEM, NETSCAPE, PKCS12]) then
  raise EOpenSSL.Create('Bad certificate encoding.');
certfile := BIO_new(BIO_s_mem());
if certfile = nil then
  raise EOpenSSL.Create('Error creating BIO.');
BIO_read(certfile,MemoryStream.memory,MemoryStream.length);
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 22.07.2013, 20:26   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

не нашел MemoryStream.length использовал MemoryStream.Size в итоге получил АВ.
если можно обойтись без редактирования заголовков, я только за, вот что есть в заголовках по работе с памятью из libeay32.pas (заголовки ддлки OpenSSL):
Код:
function BIO_s_mem; external LIBEAY_DLL_NAME;
function BIO_f_base64; external LIBEAY_DLL_NAME;
procedure BIO_set_mem_eof_return; external LIBEAY_DLL_NAME;

function BIO_get_mem_data(b: pBIO; var pp: PCharacter): integer; cdecl;
begin
result := BIO_ctrl(b, BIO_CTRL_INFO, 0, @pp);
end;

procedure BIO_set_mem_buf; external LIBEAY_DLL_NAME;
procedure BIO_get_mem_ptr; external LIBEAY_DLL_NAME;
function BIO_new_mem_buf; external LIBEAY_DLL_NAME;
function BIO_s_file; external LIBEAY_DLL_NAME;
это все из openSSlUtils.pas, libeay32.pas, libeay32.dll
мне желательно сделать так чтобы сохранить файл в память и из памяти указать путь.
Ах да забыл уточнить загрузка из файла в делфи выше 2009 вообще не работает, поэтому пишу все это на родной 7й.

Последний раз редактировалось IvaniuS; 22.07.2013 в 20:35.
IvaniuS вне форума Ответить с цитированием
Старый 22.07.2013, 20:29   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

конечно же BIO_write
из буфера в bio
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 22.07.2013, 20:58   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

ладно потом надеюсь пойму что к чему, все получилось, но только почему-то выскакивает следующее:
Цитата:
Project test1.exe raised exception class EOutOfResources with message "RichEdit line insertion error" ....
и в конце вставляет "" или "5\І" или что-то подобное. Решил странным способом, загружая сначала весь текст в Тстрингс и потом загружая текст в рич и чистя стрингс.

Последний раз редактировалось IvaniuS; 22.07.2013 в 22:44.
IvaniuS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чём разница между unit, header file, cpp file? TwiX Общие вопросы C/C++ 6 29.04.2012 19:49
CLIENTDATASET.LoadfromFile Turbine Помощь студентам 2 21.03.2011 14:21
Как работать с tStream для отправки пост запроса? Айдар Работа с сетью в Delphi 2 04.01.2011 20:34
ClientDataSet.LoadFromFile MAcK Общие вопросы Delphi 5 23.04.2010 00:22
Как передать http.get в Tstream?(indy) TwiX Работа с сетью в Delphi 3 09.08.2009 20:31