<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Вопросы по работе с OpenSSL C++]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/3090/" />
	<updated>2019-12-04T08:53:12Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/3090/</id>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13677/#p13677" />
			<content type="html"><![CDATA[<p>Binger, других вариантов получить issuer через openssl мне не известно.</p>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-12-04T08:53:12Z</updated>
			<id>https://forum.rutoken.ru/post/13677/#p13677</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13675/#p13675" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, Подскажите, пожалуйста, есть ли в OpenSSL функция подобная CMS_RecipientInfo_ktri_get0_signer_id, которая давала бы мне поле &quot;Issuer&quot;? Или его я могу получить только с помощью парсинга CMS?</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-12-03T12:59:25Z</updated>
			<id>https://forum.rutoken.ru/post/13675/#p13675</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13674/#p13674" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, огромное спасибо</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-12-03T09:47:05Z</updated>
			<id>https://forum.rutoken.ru/post/13674/#p13674</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13673/#p13673" />
			<content type="html"><![CDATA[<p>Binger, вам нужна CMS_get0_RecipientInfos <a href="https://www.openssl.org/docs/man1.0.2/man3/CMS_RecipientInfo_ktri_cert_cmp.html">https://www.openssl.org/docs/man1.0.2/m … t_cmp.html</a></p><p>Пример вызова: <a href="https://github.com/WestCoastRomS/android_device_SM-T350-vendor/blob/72d9680d6aa7eda7f99af25812a3307e5e7a5d0b/vendor/samsung/common/external/strongswan/src/libstrongswan/plugins/openssl/openssl_pkcs7.c#L591">https://github.com/WestCoastRomS/androi … cs7.c#L591</a></p>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-12-03T09:15:39Z</updated>
			<id>https://forum.rutoken.ru/post/13673/#p13673</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13672/#p13672" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, я хотел получить сертификаты получателей шифрованного сообщения, а не пользовательский. Какую тогда функцию можно использовать?</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-12-03T09:11:28Z</updated>
			<id>https://forum.rutoken.ru/post/13672/#p13672</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13671/#p13671" />
			<content type="html"><![CDATA[<p>CMS не обязательно должна содержать информацию о сертификате подписанта. Вы уверены, что сертификат пользователя есть в&nbsp; CMS?</p>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-12-03T09:08:30Z</updated>
			<id>https://forum.rutoken.ru/post/13671/#p13671</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13670/#p13670" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, добрый день. Подскажите, пожалуйста, что я не так делаю? Хотел получить сертификаты из cms для дальнейшей работы с ними и получения информации о серийном номере. Однако функция CMS_get1_certs() возвращает NULL. <br /></p><div class="codebox"><pre><code>#include &quot;stdafx.h&quot;

#define HARDWARE_KEYS

#include &lt;assert.h&gt;
#include &lt;CommonOpenSSL.h&gt;
#include &lt;openssl/cms.h&gt;


int main(void)
{
    EVP_PKEY* key;                                        // Описатель ключевой пары
    ENGINE* rtEngine;                                     // rtengine
    BIO* inBio;                                           // Описатель потока ввода
    BIO* outBio;                                          // Описатель потока вывода
    STACK_OF(X509) * certs = NULL;
    CMS_ContentInfo* cms;                                 // Описатель CMS структуры

    int r;                                                // Код возврата
    int errorCode = 1;                                    // Флаг ошибки

    printf(&quot;Sample has started.\n\n&quot;);
    /*************************************************************************
    * Создание rtengine и регистрация его в OpenSSL                          *
    *************************************************************************/
    r = rt_eng_init();
    CHECK(&quot;  rt_eng_init&quot;, r == 1, exit);

    /*************************************************************************
    * Получение rtengine                                                     *
    *************************************************************************/
    rtEngine = rt_eng_get0_engine();
    assert(rtEngine);

    /*************************************************************************
    * Установка rtengine реализацией по умолчанию                            *
    *************************************************************************/
    r = ENGINE_set_default(rtEngine, ENGINE_METHOD_ALL - ENGINE_METHOD_RAND);
    CHECK(&quot;  ENGINE_set_default&quot;, r == 1, finalize_engine);

    /*************************************************************************
    * Получение ключевой пары                                                *
    *************************************************************************/
    printf(&quot;  get_key_pair...\n&quot;);
    key = get_key_pair();
    CHECK(&quot;  get_key_pair&quot;, key != NULL, unregister_engine);

    /*************************************************************************
    * Открытие поточного ввода из файла                                      *
    *************************************************************************/
    inBio = BIO_new_file(&quot;cms_encrypted.pem&quot;, &quot;rb&quot;);
    CHECK(&quot;  BIO_new_file&quot;, inBio != NULL, free_key);

    /*************************************************************************
    * Чтение CMS структуры из файла                                          *
    *************************************************************************/
    cms = PEM_read_bio_CMS(inBio, NULL, NULL, NULL);
    CHECK(&quot;  PEM_read_bio_CMS&quot;, cms != NULL, free_in_bio);

   certs = CMS_get1_certs(cms);
    
   for (int i = 0; certs &amp;&amp; i &lt; sk_X509_num(certs); i++) 
  {
    X509 *cert = sk_X509_value(certs, i);
    const ASN1_INTEGER *serial = X509_get_serialNumber(cert);
  }
    ...</code></pre></div><p><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/12/5d78454af5ae52dfc84092bada5c49e8.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/12/5d78454af5ae52dfc84092bada5c49e8.png" alt="" /></a></span></p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-12-03T08:10:09Z</updated>
			<id>https://forum.rutoken.ru/post/13670/#p13670</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13664/#p13664" />
			<content type="html"><![CDATA[<p>Ориентируйтесь на возвращаемое значение CMS_decrypt <a href="https://www.openssl.org/docs/man1.0.2/man3/CMS_decrypt.html">https://www.openssl.org/docs/man1.0.2/m … crypt.html</a></p><p>Особенности функции decrypt: она всегда будет возвращать какие-то данные, даже когда на входе не соответствующий CMS сертификат. Это гарантирует одинаковое время выполнения функции для защиты от <a href="https://access.redhat.com/security/cve/cve-2012-0884">MMA атак</a>.</p>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-11-29T15:38:43Z</updated>
			<id>https://forum.rutoken.ru/post/13664/#p13664</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13663/#p13663" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, хотя может быть я не так поступал: я изменил значение CK_BYTE g_keyPairIdGost2012RtEngine[] = { &quot;1234567890&quot; } в Common.h,<br />где 1234567890- CKA_ID ключевой пары на токене.<br />Или каким образом можно выбрать ключевую пару для расшифрования?</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-11-29T15:32:42Z</updated>
			<id>https://forum.rutoken.ru/post/13663/#p13663</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13662/#p13662" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, попробовал расшифровать зашифрованный файл, используя ключ сертификата, которого нет в списке получателей и&nbsp; никаких ошибок не было в работе программы. Так и должно разве быть? Я просто в конечном итоге получил неверные данные расшифрованные:<br /></p><div class="codebox"><pre><code>ЎП\жH€s№вlMсAуПSP”e—8¦µўSЮy
ЯЛё‹–</code></pre></div><p>вместо:<br /></p><div class="codebox"><pre><code>1 2 3 4 5 
ONE TWO THREE FOUR FIVE</code></pre></div><p>Павел, как можно данную ситуацию превратить в ошибку?</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-11-29T15:24:15Z</updated>
			<id>https://forum.rutoken.ru/post/13662/#p13662</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13661/#p13661" />
			<content type="html"><![CDATA[<p>Вместо<br /></p><div class="codebox"><pre><code>r = PEM_write_bio_CMS(outBio.get(), cmsCntInfo);
CHECK(&quot;  PEM_write_bio_CMS&quot;, r &gt; 0, free_cms);</code></pre></div><p>на<br /></p><div class="codebox"><pre><code>r = i2d_CMS_bio(outBio.get(), cmsCntInfo);
CHECK(&quot;  i2d_CMS_bio&quot;, r &gt; 0, free_cms);</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-11-29T13:56:59Z</updated>
			<id>https://forum.rutoken.ru/post/13661/#p13661</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13660/#p13660" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, есть ли аналогия PEM_write_bio_CMS(outBio.get(), cms) для DER формата?</p>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-11-29T12:26:53Z</updated>
			<id>https://forum.rutoken.ru/post/13660/#p13660</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13658/#p13658" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>std::vector&lt;uint8_t&gt; readMemBio(BIO* bio) {
    char* ptr;
    int len = BIO_get_mem_data(bio, &amp;ptr);
    if (len &lt; 0) return {};

    std::vector&lt;uint8_t&gt; result(ptr, ptr + len);

    // normally returns 1 for success and 0 or -1 for failure.
    // File BIOs are an exception, they return 0 for success and -1 for failure.
    int r = BIO_reset(bio);
    if (r &lt;= 0) return {};

    return result;
}
...

bioPtr outBio(nullptr, BIO_free_all);
std::vector&lt;uint8_t&gt; cmsBuf;
...
cmsCntInfo = CMS_encrypt(certs, inBio.get(), cipher, 0);
CHECK(&quot;  CMS_encrypt&quot;, cms != NULL, free_sk_certs);

outBio.reset(BIO_new(BIO_s_mem()));
CHECK(&quot;  BIO_new&quot;, outBio != NULL, free_cms);

r = PEM_write_bio_CMS(outBio.get(), cmsCntInfo);
CHECK(&quot;  PEM_write_bio_CMS&quot;, r &gt; 0, free_cms);

cmsBuf = readMemBio(outBio.get());</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-11-29T11:52:30Z</updated>
			<id>https://forum.rutoken.ru/post/13658/#p13658</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13656/#p13656" />
			<content type="html"><![CDATA[<p><strong>Павел Анфимов</strong>, подскажите, пожалуйста, как шифрованное сообщение не выводить через поток вывода, а передать байты сообщения в массив unsigned char?<br /></p><div class="codebox"><pre><code>       /*************************************************************************
        * Открытие поточного вывода в файл                                       *
        *************************************************************************/
        outBio = BIO_new_file(&quot;cms_encrypted.pem&quot;, &quot;wb&quot;);
        CHECK(&quot;  BIO_new_file&quot;, outBio != NULL, free_cms);

        /*************************************************************************
        * Запись CMS структуры в файл                                            *
        *************************************************************************/
        r = PEM_write_bio_CMS(outBio, cms);
        CHECK(&quot;  PEM_write_bio_CMS&quot;, r == 1, free_out_bio);</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-11-29T11:49:26Z</updated>
			<id>https://forum.rutoken.ru/post/13656/#p13656</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Вопросы по работе с OpenSSL C++]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13652/#p13652" />
			<content type="html"><![CDATA[<p>Binger, вам нужно передать владение сертификатом контейнеру хранения сертификатов STACK_OF(X509) * certs.</p><p>Для этого у unique_ptr есть метод release():</p><div class="codebox"><pre><code>r = sk_X509_push(certs, cert.release());</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-11-29T10:40:14Z</updated>
			<id>https://forum.rutoken.ru/post/13652/#p13652</id>
		</entry>
</feed>
