<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Программирование openssl</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html</link>
    <description>Надо организовать клиент сервер с шифрованием средством openssl.&lt;br&gt;server.c&lt;br&gt;//----------------------------------------------------&lt;br&gt;#include &amp;lt;openssl/bio.h&amp;gt;&lt;br&gt;#include &amp;lt;openssl/ssl.h&amp;gt;&lt;br&gt;#include &amp;lt;openssl/err.h&amp;gt;&lt;br&gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;string.h&amp;gt;&lt;br&gt;&lt;br&gt;main()&lt;br&gt;&#123;&lt;br&gt;BIO *sbio, *bbio, *acpt, *out;&lt;br&gt;int len;&lt;br&gt;char tmpbuf&#091;1024&#093;;&lt;br&gt;SSL_CTX *ctx;&lt;br&gt;SSL *ssl;&lt;br&gt;ERR_load_crypto_strings();&lt;br&gt;ERR_load_SSL_strings();&lt;br&gt;OpenSSL_add_all_algorithms();&lt;br&gt;SSL_library_init();  &lt;br&gt;/* Might seed PRNG here */&lt;br&gt;ctx=SSL_CTX_new(SSLv23_server_method());&lt;br&gt;        if(ctx == NULL)&lt;br&gt;&#123;&lt;br&gt;    printf(&quot;CTX is null&#092;n&quot;);&lt;br&gt;    return;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;printf(&quot;After Cert Load&#092;n&quot;);&lt;br&gt;if (!SSL_CTX_use_certificate_file(ctx,&quot;certfiles/cacert.pem&quot;, SSL_FILETYPE_PEM)&lt;br&gt;&amp;#124;&amp;#124; SSL_CTX_use_PrivateKey_file(ctx,&quot;certfiles/rsa_private_key.pem&quot;, SSL_FILETYPE_PEM)&lt;br&gt;&amp;#124;&amp;#124; SSL_CTX_check_private_key(ctx))&lt;br&gt;&#123;&lt;br&gt;fprintf(stderr, &quot;Error setting up SSL_CTX&#092;n&quot;);&lt;br&gt;ERR_print_errors_fp(stderr);&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;printf(&quot;After Cert Load&#092;n&quot;);&lt;br&gt;/* M</description>

<item>
    <title>Программирование openssl (angra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#13</link>
    <pubDate>Mon, 19 Jan 2009 05:17:06 GMT</pubDate>
    <description>Много несколько вариантов.&lt;br&gt;1. изменить свой протокол добавив туда посылку размера сообщения&lt;br&gt;2. использовать буферизованный ввод при помощи BIO_f_buffer&lt;br&gt;3. использовать nonblocking io  на основе select в комбинации с BIO_should_retry&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (Towellie)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#12</link>
    <pubDate>Mon, 19 Jan 2009 04:35:49 GMT</pubDate>
    <description>Ну вот я уже можно сказать скурил все маны оказалось что &lt;br&gt;int BIO_read(BIO *b, void *buf, int len); &lt;br&gt;Пытается прочесть из объекта b len байт данных в буфер buf. Возвращает количество &lt;br&gt;прочитанных байт. &lt;br&gt;- И будет пытаться пока соединение не завершится(Поэтому данные передавались в конце соединения - соединение рвется BIO_read выходит из цикла и показывает что получла) в отличие от &lt;br&gt;int BIO_gets(BIO *b, char *buf, int size); &lt;br&gt;Для большинства типов BIO выполняет операцию, аналогичную fgets &amp;#8212; читает из b в buf &lt;br&gt;до ближайшего конца строки, но не более size байт.&lt;br&gt;Тоесть функция read ждет а gets не ждет. - Поскольку я не знаю сколько мне должно придти (параметр len мне узнать не откуда) функция gets выглядит более предпочтительно - НО! Функция BIO_set_conn_hostname которая определяет объект ввода вывода не поддерживает BIO_gets&lt;br&gt;Connect BIOs support BIO_puts() but not BIO_gets().&lt;br&gt;Как мне быть? Куда смотреть теперь?&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (Towellie)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#11</link>
    <pubDate>Sun, 18 Jan 2009 04:10:44 GMT</pubDate>
    <description>Прошу прощения я не правильно вставил код. &lt;br&gt;Вобщем почитал я тут поэксперементировал немного - некоторые вещи прояснились переделал код - в общем я в обе стороны могу передавать, но возникла следующая трудность:&lt;br&gt;Код подкючения и тд и тп я писать не буду - он рабочий осталость только понять как работают BIO_read + BIO_write вобщем&lt;br&gt;Идея следующая - код записи и чтения везде одинаковый на одной стороне считать а потом записать а на втором конце соответственно наоборот.&lt;br&gt;Получается следующая картина:&lt;br&gt; ./send&lt;br&gt;Sending Hello server&lt;br&gt;End writing&lt;br&gt;lets reading&lt;br&gt;Before read&lt;br&gt;&lt;br&gt;./recv&lt;br&gt;Before read&lt;br&gt;&lt;br&gt;Это означает то, что функция write отработала программа пошла дальше читать, а на другом конце read не получила ничего. - Но прикол в следующем если убрать код чтения из send. - Он будет отмечен внизу, read&lt;br&gt;получит свой Hello server. &lt;br&gt;$./recv&lt;br&gt;Before read&lt;br&gt;&#091;13&#093;&amp;lt;-----&lt;br&gt;&#091;Hello client&lt;br&gt;&#093; --- &#091;13&#093; &lt;br&gt;End reading&lt;br&gt;lets writing&lt;br&gt;Sending Hello server&lt;br&gt;End writing&lt;br&gt;&lt;br&gt;$ ./send&lt;br&gt;Sending Hello server&lt;br&gt;End writing&lt;br&gt;lets reading&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (NuINu)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#10</link>
    <pubDate>Fri, 16 Jan 2009 09:36:02 GMT</pubDate>
    <description>&amp;gt;Спасибо за ответ - хороший материал. &lt;br&gt;&amp;gt;Прочитал первую статью с горем пополам(С английским все плохо) Интересно но много &lt;br&gt;&amp;gt;букв и другой подход нежели на ibm.com - (В том числе &lt;br&gt;&amp;gt;и то, что например в этих статьях они вообще не используют &lt;br&gt;&amp;gt;bio_read). &lt;br&gt;&amp;gt;Я их конечно дочитаю эти статьи чтобы понять в чем может быть &lt;br&gt;&amp;gt;проблема, но код я их использовать не буду. Тот код что &lt;br&gt;&amp;gt;выше это код взятый с openssl.org и исправленный немного(В первоначальном варианте &lt;br&gt;&amp;gt;он нерабочий) - сейчас уже почти все работает за исключением того &lt;br&gt;&lt;br&gt;собственно не понятно как он у вас работает, потому как в вашем клиенте нет главного, а именно попытки соединиться с сервером.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (Towellie)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#9</link>
    <pubDate>Fri, 16 Jan 2009 03:46:42 GMT</pubDate>
    <description>Спасибо за ответ - хороший материал.&lt;br&gt;Прочитал первую статью с горем пополам(С английским все плохо) Интересно но много букв и другой подход нежели на ibm.com - (В том числе и то, что например в этих статьях они вообще не используют bio_read).&lt;br&gt;Я их конечно дочитаю эти статьи чтобы понять в чем может быть проблема, но код я их использовать не буду. Тот код что выше это код взятый с openssl.org и исправленный немного(В первоначальном варианте он нерабочий) - сейчас уже почти все работает за исключением того что я не могу прочитать на сервере входящее сообщение.  И проанализированный со статьями на ibm.com (Очень доступные статьи) я с этих статей стырил код чтения - записи - с анализом ошибки и с повтором. - В коде с openssl.org он прекрасно себя чувствует при передаче с сервера на клиент а наоборот - нет - такая же в общем история.&lt;br&gt;//Write begin&lt;br&gt;printf(&quot;Sending Hello server&#092;n&quot;);&lt;br&gt;strcpy(tmpbuf, &quot;Hello server&#092;n&quot;);&lt;br&gt;for(;;)&lt;br&gt;&#123;&lt;br&gt; if(BIO_write(out, tmpbuf, strlen(tmpbuf)) &amp;lt;= 0)&lt;br&gt; &#123;&lt;br&gt;  if(! BIO_should_retry(out))</description>
</item>

<item>
    <title>Программирование openssl (NuINu)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#8</link>
    <pubDate>Thu, 15 Jan 2009 13:34:07 GMT</pubDate>
    <description>&amp;gt;Вобщем в итоге все упирается в то, что BIO_read на сервере возвращает &lt;br&gt;&amp;gt;-2 по документации If the return value is -2 then the &lt;br&gt;&amp;gt;operation is not implemented in the specific BIO type. &lt;br&gt;&amp;gt;И вот тут тупик. На клиенте функция отрабатывает. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;P.S. Если я опять по вашему мнению спираю всю мысленную работу на &lt;br&gt;&amp;gt;вас - вы хоть отпишите(Даже сообщения ты студент, ты пень, кури &lt;br&gt;&amp;gt;маны только приветвтвуются) &lt;br&gt;&lt;br&gt;почитай: &lt;br&gt;http://www.linuxjournal.com/article/4822&lt;br&gt;http://www.linuxjournal.com/article/5487&lt;br&gt;&lt;br&gt;на ibm.com есть 3 статьи по программированию.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (Towellie)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#7</link>
    <pubDate>Thu, 15 Jan 2009 09:41:51 GMT</pubDate>
    <description>Вобщем в итоге все упирается в то, что BIO_read на сервере возвращает -2 по документации If the return value is -2 then the operation is not implemented in the specific BIO type.&lt;br&gt;И вот тут тупик. На клиенте функция отрабатывает.&lt;br&gt;&lt;br&gt;P.S. Если я опять по вашему мнению спираю всю мысленную работу на вас - вы хоть отпишите(Даже сообщения ты студент, ты пень, кури маны только приветвтвуются)&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (Towellie)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#6</link>
    <pubDate>Thu, 15 Jan 2009 07:04:56 GMT</pubDate>
    <description>&amp;gt;так использую BIO_should_retry()? &lt;br&gt;&lt;br&gt;Дело еще например в том что логично предположить, что при удачном приеме (Если len &amp;gt; 0) - (Это на клиенте где прием удается)  то функция &lt;br&gt;BIO_should_retry должна вернуть true(потому что соединение еще не закрыто) и ошибиться в том что это именно sbio(потому, что мы же все таки с него считываем) тоже сложно.(Хотя я пробовал и bio) один фиг возврящяется 0.&lt;br&gt;:S&lt;br&gt;</description>
</item>

<item>
    <title>Программирование openssl (Towellie)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7829.html#5</link>
    <pubDate>Thu, 15 Jan 2009 06:20:06 GMT</pubDate>
    <description>Вобщем судя по всему надо переделывать кусок кода для чтения&lt;br&gt;//Read end&lt;br&gt;    for(;;) &#123;&lt;br&gt;        len = BIO_read(sbio, tmpbuf, 1024);&lt;br&gt;        if(len &amp;lt;= 0) break;&lt;br&gt;        tmpbuf&#091;len&#093;=&apos;&#092;0&apos;;&lt;br&gt;    &#125;&lt;br&gt;    printf(&quot;&#037;s&quot;, tmpbuf);&lt;br&gt;//Read end&lt;br&gt;Если добавить&lt;br&gt;//Read end&lt;br&gt;    for(;;) &#123;&lt;br&gt;        len = BIO_read(sbio, tmpbuf, 1024);&lt;br&gt;        printf(&quot;&#037;d &amp;lt;------ should&#092;n&quot;, BIO_should_retry(sbio));&amp;lt;---- Это&lt;br&gt;        if(len &amp;lt;= 0) break;&lt;br&gt;        tmpbuf&#091;len&#093;=&apos;&#092;0&apos;;&lt;br&gt;    &#125;&lt;br&gt;    printf(&quot;&#037;s&quot;, tmpbuf);&lt;br&gt;//Read end &lt;br&gt;Возвращается 0 на обоих функциях(на сервере)&lt;br&gt;For example if a call to BIO_read() on a socket BIO returns 0 and BIO_should_retry() is false then the cause will be that the connection closed.&lt;br&gt;Значит соединение закрыто? Оно должно быть открыто может я как то не так использую BIO_should_retry()?&lt;br&gt;</description>
</item>

</channel>
</rss>
