<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Рутокен &mdash; Импорт ключа]]></title>
		<link>https://forum.rutoken.ru/topic/2331/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/2331" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Импорт ключа».]]></description>
		<lastBuildDate>Mon, 16 Nov 2015 17:34:26 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9072/#p9072</link>
			<description><![CDATA[<p>У вас в итоге все получилось?</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Mon, 16 Nov 2015 17:34:26 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9072/#p9072</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9061/#p9061</link>
			<description><![CDATA[<p>Пришлите, пожалуйста на tog&nbsp; с о б а к а&nbsp; &nbsp;rutoken.ru</p>]]></description>
			<author><![CDATA[null@example.com (Oleg Taraskin)]]></author>
			<pubDate>Tue, 10 Nov 2015 15:43:03 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9061/#p9061</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9060/#p9060</link>
			<description><![CDATA[<div class="quotebox"><cite>Oleg Taraskin пишет:</cite><blockquote><p>Скажите, а какая версия библиотеки PKCS#11 у вас ? Можете ее прислать ?</p></blockquote></div><p>Та которая в комплекте с вашим SDK. 1.1.5.0</p><p>Прислать куда?<br />Если возможно, напишите мне на e-mail (svetovidov@itopcase.ru).</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Tue, 10 Nov 2015 14:25:56 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9060/#p9060</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9059/#p9059</link>
			<description><![CDATA[<p>Скажите, а какая версия библиотеки PKCS#11 у вас ? Можете ее прислать ?</p>]]></description>
			<author><![CDATA[null@example.com (Oleg Taraskin)]]></author>
			<pubDate>Tue, 10 Nov 2015 14:14:32 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9059/#p9059</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9058/#p9058</link>
			<description><![CDATA[<div class="quotebox"><cite>Oleg Taraskin пишет:</cite><blockquote><p>Знаете, это очень странно, что вы получаете 44 байта. В CKA_VALUE открытого ключа <br />ГОСТ Р 34.10-2001 должна быть точка эллиптической кривой с длиной 64 байта. <br />Можете прислать код, который это делает ?</p></blockquote></div><p>Пожалуйста. <br />Код который получает значение открытого ключа и формирует из него блоб.<br /></p><div class="codebox"><pre><code>CK_ATTRIBUTE    stAttrValue[] = { { CKA_VALUE, NULL, 0 } };
        if( lRetCode == CKR_OK )
            lRetCode = pstFL-&gt;C_GetAttributeValue( m_hSession, hPublicKey, &amp;stAttrValue[0], sizeof( stAttrValue ) / sizeof( stAttrValue[0] ));
        if( lRetCode == CKR_OK )
        {
            stAttrValue[0].pValue = ( stAttrValue[0].ulValueLen != 0 ? new BYTE[stAttrValue[0].ulValueLen] : NULL );
            if( stAttrValue[0].pValue == NULL )
                lRetCode = CKR_HOST_MEMORY;
            else
            {
                lRetCode = pstFL-&gt;C_GetAttributeValue( m_hSession, hPublicKey, &amp;stAttrValue[0], sizeof( stAttrValue ) / sizeof( stAttrValue[0] ));
                if( lRetCode == CKR_OK )
                {
                    UINT    nSizeKeyParams = 0;
                    BYTE*    pbtKeyParams = NULL;
                    // Формируем поле параметров алгоритма электронной подписи
                    CSCLTLVField*    pfieldParameters = CProvider::asn1NewFieldParameters( m_nAlgorithm, nAlgParams );
                    if( pfieldParameters != NULL )
                    {
                        nSizeKeyParams = pfieldParameters-&gt;MakeBuffer( NULL );
                        pbtKeyParams = new BYTE[nSizeKeyParams];
                        if( pbtKeyParams != NULL )
                            nSizeKeyParams = pfieldParameters-&gt;MakeBuffer( pbtKeyParams );
                        else
                            nSizeKeyParams = 0;

                        delete pfieldParameters;
                    }

                    dwBlobLen = sizeof( CRYPT_PUBLICKEYBLOB::CRYPT_PUBKEY_INFO_HEADER ) + nSizeKeyParams + stAttrValue[0].ulValueLen;
                    pbtEphemBlob = new BYTE[dwBlobLen];
                    if( pbtEphemBlob != NULL )
                    {
                        CRYPT_PUBLICKEYBLOB*    pstCPKB = ( CRYPT_PUBLICKEYBLOB* )pbtEphemBlob;
                        pstCPKB-&gt;stPublicKeyParam.BlobHeader.bType = 0x06/*PUBLICKEYBLOB*/;
                        pstCPKB-&gt;stPublicKeyParam.BlobHeader.bVersion = 0x20/*BLOB_VERSION*/;
                        pstCPKB-&gt;stPublicKeyParam.BlobHeader.reserved = 0;
                        pstCPKB-&gt;stPublicKeyParam.BlobHeader.aiKeyAlg = 0x00002E23/*CALG_GR3410EL*/;
                        pstCPKB-&gt;stPublicKeyParam.KeyParam.Magic = 0x3147414D/*GR3410_1_MAGIC*/;
                        pstCPKB-&gt;stPublicKeyParam.KeyParam.BitLen = (nKeySize+nSizeKeyParams) * 8;
                        memcpy( &amp;pbtEphemBlob[sizeof( CRYPT_PUBLICKEYBLOB::CRYPT_PUBKEY_INFO_HEADER )], pbtKeyParams, nSizeKeyParams );
                        memcpy( &amp;pbtEphemBlob[sizeof( CRYPT_PUBLICKEYBLOB::CRYPT_PUBKEY_INFO_HEADER ) + nSizeKeyParams], stAttrValue[0].pValue, stAttrValue[0].ulValueLen );
                    }
                    if(pbtKeyParams)
                        delete [] pbtKeyParams;
                }

                delete [] ( BYTE* )stAttrValue[0].pValue;
            }
        }</code></pre></div><p>Код который получает из блоба открытый ключ<br /></p><div class="codebox"><pre><code>    BYTE* pbtKeyInfo=(BYTE*)&amp;pbtPublicKeyBlob[sizeof( CRYPT_PUBLICKEYBLOB::CRYPT_PUBKEY_INFO_HEADER )];
    CK_ULONG ulKeylength=((CRYPT_PUBLICKEYBLOB*)pbtPublicKeyBlob)-&gt;stPublicKeyParam.KeyParam.BitLen/8;
    ASSERT(ulKeylength==64);
    nKeySize=ulKeylength;
    return pbtKeyInfo;</code></pre></div><p>Код генерации ключа присылал раньше. Единственное отличие - параметры кривых выставляются такие же как и в открытом ключе.</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Tue, 10 Nov 2015 13:29:40 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9058/#p9058</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9057/#p9057</link>
			<description><![CDATA[<p>Знаете, это очень странно, что вы получаете 44 байта. В CKA_VALUE открытого ключа <br />ГОСТ Р 34.10-2001 должна быть точка эллиптической кривой с длиной 64 байта. <br />Можете прислать код, который это делает ?</p>]]></description>
			<author><![CDATA[null@example.com (Oleg Taraskin)]]></author>
			<pubDate>Tue, 10 Nov 2015 12:54:15 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9057/#p9057</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9056/#p9056</link>
			<description><![CDATA[<p>Вероятнее всего проблема в получении данных открытого ключа из блоба в пригодном для PKCS#11 виде.<br />Когда я получаю открытый ключ сертификата, я просто вычитываю из ASN.1 структуры сертификата открытый ключ. Он получается равным 64 байта.<br />А вот когда я получаю значение CKA_VALUE из объекта открытого ключа, я получаю всего 44 байта.<br />Как я понимаю, первые 20 байт это ASN.1 структура содержащая в себе параметры кривых.</p><p>В общем суть такова. Если я передаю в функцию C_DeriveKey 44 байта (сам ключ) получаю ошибку 0x00000071<br />Если передаю 64 байта (Параметры и ключ) то получаю ошибку 0x00000030</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Tue, 10 Nov 2015 11:55:33 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9056/#p9056</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9053/#p9053</link>
			<description><![CDATA[<div class="quotebox"><cite>Oleg Taraskin пишет:</cite><blockquote><div class="quotebox"><cite>SvetovidovDM пишет:</cite><blockquote><div class="quotebox"><cite>Oleg Taraskin пишет:</cite><blockquote><p>Дело в том, что OID парамсета 1.2.643.2.2.35.1 говорит о том, что пару можно использовать только для подписи <br />а 1.2.643.2.2.36.0 как для подписи, так и для DH. <br />см. <a href="http://cpdn.cryptopro.ru/content/csp36/html/group___pro_c_s_p_ex_CP_PARAM_OIDS.html">http://cpdn.cryptopro.ru/content/csp36/ … _OIDS.html</a><br />Это несмотря на то, что по сути кривые с OID 1.2.643.2.2.35.1 и 1.2.643.2.2.36.0&nbsp; - одинаковые.<br />Поэтому CryptoPro CSP и &quot;ругается&quot;.&nbsp; Если вы хотите использовать пару из PKCS#11 для DH то сгенерируйте ее с атрибутом <br />CKA_GOSTR3410_PARAMS равным 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00</p></blockquote></div><p>Спасибо, правда я пошел несколько другим путем, потому как в реальной жизни ключи будут попадаться самые разные. Поэтому вместо того чтобы использовать ключ отправителя генерирую эфемерный ключ и использую его закрытую часть для шифрования сессионного ключа, а открытую часть собираю в блоб и передаю вместе с данными.<br />Теперь экспорт и импорт ключей отрабатывает,но при расшифровке самого сообщения через CryptDecrypt получаю абсолютно не те данные которые должен был, хотя длина считается корректно, и сам метод не возвращает ошибки.</p></blockquote></div><p>А как тогда используется вторая неэфемеральная пара ? Т.е. я правильно понял, что вы решили сделать одностороннюю аутентификацию ?</p></blockquote></div><p>Расшифровку через CryptDecrypt починил, оказалась проблема в несогласованном механизме шифрования.</p><p>Вторая пара не используется.<br />Механизм шифрования следующий:<br />1. Получаем параметры кривых открытого ключа получателя.<br />2. Генерируем эфемерную ключевую пару<br />3. Вырабатываем ключ согласования из открытого ключа отправителя и закрытого эфемерной пары<br />4. Генерируем сессионный ключ и шифруем его на ключе согласования<br />5. Собираем блоб открытого ключа эфемерной пары<br />6. шифруем данные сессионным ключом.</p><br /><p>Собираем все это в структуру и передаем на сервер.<br />При расшифровке делаем так:<br />1. Берем закрытый ключ получателя<br />2. Берем значение открытого ключа из блоба<br />3. Получаем из этих ключей ключ согласования<br />4. Расшифровываем этим ключом сессионный ключ<br />5. Расшифровываем данные сессионным ключом.</p><p>Теперь работает - шифрование на PKCS#11 и CryptoAPI<br />Расшифровка - на CryptoAPI</p><p>На PKCS#11 расшифровка не проходит, при выработке общего ключа получаю ошибку 0x00000071, хотя та же функция работает и при выработке общего ключа для шифрования, и проходит успешно.</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Tue, 10 Nov 2015 08:50:18 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9053/#p9053</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9048/#p9048</link>
			<description><![CDATA[<div class="quotebox"><cite>SvetovidovDM пишет:</cite><blockquote><div class="quotebox"><cite>Oleg Taraskin пишет:</cite><blockquote><p>Дело в том, что OID парамсета 1.2.643.2.2.35.1 говорит о том, что пару можно использовать только для подписи <br />а 1.2.643.2.2.36.0 как для подписи, так и для DH. <br />см. <a href="http://cpdn.cryptopro.ru/content/csp36/html/group___pro_c_s_p_ex_CP_PARAM_OIDS.html">http://cpdn.cryptopro.ru/content/csp36/ … _OIDS.html</a><br />Это несмотря на то, что по сути кривые с OID 1.2.643.2.2.35.1 и 1.2.643.2.2.36.0&nbsp; - одинаковые.<br />Поэтому CryptoPro CSP и &quot;ругается&quot;.&nbsp; Если вы хотите использовать пару из PKCS#11 для DH то сгенерируйте ее с атрибутом <br />CKA_GOSTR3410_PARAMS равным 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00</p></blockquote></div><p>Спасибо, правда я пошел несколько другим путем, потому как в реальной жизни ключи будут попадаться самые разные. Поэтому вместо того чтобы использовать ключ отправителя генерирую эфемерный ключ и использую его закрытую часть для шифрования сессионного ключа, а открытую часть собираю в блоб и передаю вместе с данными.<br />Теперь экспорт и импорт ключей отрабатывает,но при расшифровке самого сообщения через CryptDecrypt получаю абсолютно не те данные которые должен был, хотя длина считается корректно, и сам метод не возвращает ошибки.</p></blockquote></div><p>А как тогда используется вторая неэфемеральная пара ? Т.е. я правильно понял, что вы решили сделать одностороннюю аутентификацию ?</p>]]></description>
			<author><![CDATA[null@example.com (Oleg Taraskin)]]></author>
			<pubDate>Fri, 06 Nov 2015 15:38:29 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9048/#p9048</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9047/#p9047</link>
			<description><![CDATA[<div class="quotebox"><cite>Oleg Taraskin пишет:</cite><blockquote><p>Дело в том, что OID парамсета 1.2.643.2.2.35.1 говорит о том, что пару можно использовать только для подписи <br />а 1.2.643.2.2.36.0 как для подписи, так и для DH. <br />см. <a href="http://cpdn.cryptopro.ru/content/csp36/html/group___pro_c_s_p_ex_CP_PARAM_OIDS.html">http://cpdn.cryptopro.ru/content/csp36/ … _OIDS.html</a><br />Это несмотря на то, что по сути кривые с OID 1.2.643.2.2.35.1 и 1.2.643.2.2.36.0&nbsp; - одинаковые.<br />Поэтому CryptoPro CSP и &quot;ругается&quot;.&nbsp; Если вы хотите использовать пару из PKCS#11 для DH то сгенерируйте ее с атрибутом <br />CKA_GOSTR3410_PARAMS равным 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00</p></blockquote></div><p>Спасибо, правда я пошел несколько другим путем, потому как в реальной жизни ключи будут попадаться самые разные. Поэтому вместо того чтобы использовать ключ отправителя генерирую эфемерный ключ и использую его закрытую часть для шифрования сессионного ключа, а открытую часть собираю в блоб и передаю вместе с данными.</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Fri, 06 Nov 2015 15:20:39 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9047/#p9047</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9016/#p9016</link>
			<description><![CDATA[<p>Дело в том, что OID парамсета 1.2.643.2.2.35.1 говорит о том, что пару можно использовать только для подписи <br />а 1.2.643.2.2.36.0 как для подписи, так и для DH. <br />см. <a href="http://cpdn.cryptopro.ru/content/csp36/html/group___pro_c_s_p_ex_CP_PARAM_OIDS.html">http://cpdn.cryptopro.ru/content/csp36/ … _OIDS.html</a><br />Это несмотря на то, что по сути кривые с OID 1.2.643.2.2.35.1 и 1.2.643.2.2.36.0&nbsp; - одинаковые.<br />Поэтому CryptoPro CSP и &quot;ругается&quot;.&nbsp; Если вы хотите использовать пару из PKCS#11 для DH то сгенерируйте ее с атрибутом <br />CKA_GOSTR3410_PARAMS равным 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00</p>]]></description>
			<author><![CDATA[null@example.com (Oleg Taraskin)]]></author>
			<pubDate>Mon, 02 Nov 2015 14:32:54 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9016/#p9016</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9015/#p9015</link>
			<description><![CDATA[<p>Выяснил, что в работающем и неработающем ключе разные параметры кривых.<br />В рабочем (сгенерированный с помощью КриптоПро CSP<br /></p><div class="codebox"><pre><code>SEQUENCE(2 elem)
   SEQUENCE(2 elem)
      OBJECT IDENTIFIER1.2.643.2.2.19
   SEQUENCE(2 elem)
      OBJECT IDENTIFIER1.2.643.2.2.36.0
      OBJECT IDENTIFIER1.2.643.2.2.30.1
BIT STRING(1 elem)
   OCTET STRING(64 byte) DEF9414282AAC2CF4D7B822F0790C39404A3F804C078821A9957DEA4DC30EE466390E0…</code></pre></div><p>В нерабочем (Сгереированный с помощью PKCS#11)<br /></p><div class="codebox"><pre><code>SEQUENCE(2 elem)
   SEQUENCE(2 elem)
      OBJECT IDENTIFIER1.2.643.2.2.19
   SEQUENCE(2 elem)
      OBJECT IDENTIFIER1.2.643.2.2.35.1
      OBJECT IDENTIFIER1.2.643.2.2.30.1
BIT STRING(1 elem)
   OCTET STRING(64 byte) 295550871C46A9C208E519463D60D68F664A496BACCBB50A1C0112F12081BA255A5320…</code></pre></div><p>Вопрос - можно лии их согласовать каким то образом?</p>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Mon, 02 Nov 2015 12:43:58 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9015/#p9015</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9014/#p9014</link>
			<description><![CDATA[<p>Добрый день ! </p><p>Создайте два контейнера КриптоПро CSP.&nbsp; <br />Соберите и запустите пример по выработке общего ключа DH, который есть в примерах КриптоПро CSP SDK (пример называется ExportingSessionKey ) и попробуйте создать общей сессионный ключ для этих двух контейнеров. </p><p>Если пример сработает, то проведите такой эксперимент: скопируйте значение открытого ключа из PKCS#11 (64 байта) <br />не переворачивая в один из блобов перед импортом в криптопро по смещению 36 байт от начала блоба.<br />Если импорт пройдет, то будем думать что делать дальше :)</p><p>С уважением,<br />Олег Тараскин</p>]]></description>
			<author><![CDATA[null@example.com (Oleg Taraskin)]]></author>
			<pubDate>Mon, 02 Nov 2015 11:19:24 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9014/#p9014</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9012/#p9012</link>
			<description><![CDATA[<div class="quotebox"><cite>Кирилл Мещеряков пишет:</cite><blockquote><p>Нужен код, создающий ключи на Рутокене ЭЦП и извлекающий открытый ключ. Параметры КриптоПро CSP не нужны.</p></blockquote></div><p>Ну весь код выкладывать не буду, он слишком большой. Параметры ключей - легко.</p><div class="codebox"><pre><code>    CK_BYTE         btTrue = 0x01;
    CK_BYTE         btFalse = 0x00;
    BYTE            abtParamSetGostR3410[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01 };
    BYTE            abtParamSetGostR3411[] = { 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01 };
    CK_MECHANISM    stMechanizm = { CKM_GOSTR3410_KEY_PAIR_GEN, NULL, 0 };
    CK_KEY_TYPE        lKeyType = CKK_GOSTR3410;
    CK_OBJECT_CLASS    lPublicKeyClass = CKO_PUBLIC_KEY;
    CK_OBJECT_CLASS    lPrivateKeyClass = CKO_PRIVATE_KEY;
    CK_ATTRIBUTE    stAttrPublicKey[] = 
    {
        { CKA_CLASS, &amp;lPublicKeyClass, sizeof( lPublicKeyClass ) },
        { CKA_KEY_TYPE, &amp;lKeyType, sizeof( lKeyType ) },
        { CKA_TOKEN, &amp;btTrue, sizeof( btTrue ) },
        { CKA_PRIVATE, &amp;btFalse, sizeof( btFalse ) },
        { CKA_ID, ( CK_CHAR* )(( const char* )astrID ), ( CK_ULONG )astrID.GetLength() },
        { CKA_LABEL, ( CK_CHAR* )(( const char* )astrKeyLabel ), ( CK_ULONG )astrKeyLabel.GetLength() },
        { CKA_SUBJECT, ( CK_CHAR* )(( const char* )astrSubject ), ( CK_ULONG )astrSubject.GetLength() },
        { CKA_GOSTR3410_PARAMS, &amp;abtParamSetGostR3410[0], sizeof( abtParamSetGostR3410 ) / sizeof( abtParamSetGostR3410[0] ) },
        { CKA_GOSTR3411_PARAMS, &amp;abtParamSetGostR3411[0], sizeof( abtParamSetGostR3411 ) / sizeof( abtParamSetGostR3411[0] ) },
        { CKA_ENCRYPT, &amp;btTrue, sizeof(btTrue)},  //*   
        { CKA_DERIVE, &amp;btTrue, sizeof(btTrue)},      //*
        { CKA_VERIFY, &amp;btTrue, sizeof( btTrue ) },
    };

    CK_ATTRIBUTE    stAttrPrivateKey[] = 
    {
        { CKA_CLASS, &amp;lPrivateKeyClass, sizeof( lPrivateKeyClass ) },
        { CKA_KEY_TYPE, &amp;lKeyType, sizeof( lKeyType ) },
        { CKA_TOKEN, &amp;btTrue, sizeof( btTrue ) },
        { CKA_PRIVATE, &amp;btTrue, sizeof( btTrue ) },
        { CKA_ID, ( CK_CHAR* )(( const char* )astrID ), ( CK_ULONG )astrID.GetLength() },
        { CKA_LABEL, ( CK_CHAR* )(( const char* )astrKeyLabel ), ( CK_ULONG )astrKeyLabel.GetLength() },
        { CKA_SUBJECT, ( CK_CHAR* )(( const char* )astrSubject ), ( CK_ULONG )astrSubject.GetLength() },
        { CKA_GOSTR3410_PARAMS, &amp;abtParamSetGostR3410[0], sizeof( abtParamSetGostR3410 ) / sizeof( abtParamSetGostR3410[0] ) },
        { CKA_GOSTR3411_PARAMS, &amp;abtParamSetGostR3411[0], sizeof( abtParamSetGostR3411 ) / sizeof( abtParamSetGostR3411[0] ) },
        { CKA_DECRYPT, &amp;btTrue,sizeof(btTrue) },    //*
        { CKA_DERIVE, &amp;btTrue,sizeof(btTrue)  },    //*
        { CKA_SIGN, &amp;btTrue, sizeof( btTrue ) },
    };

    //Параметры помеченные * внесены для тестирования плагина ИС НР. Возможно они будут добавлены и в основную реализацию
    CK_OBJECT_HANDLE    hPublicKey = ( CK_OBJECT_HANDLE )NULL;
    CK_OBJECT_HANDLE    hPrivateKey = ( CK_OBJECT_HANDLE )NULL;
    CK_RV    lRetCode = pstFL-&gt;C_GenerateKeyPair( m_hSession,
        &amp;stMechanizm,
        &amp;stAttrPublicKey[0],
        sizeof( stAttrPublicKey ) / sizeof( stAttrPublicKey[0] ),
        &amp;stAttrPrivateKey[0],
        sizeof( stAttrPrivateKey ) / sizeof( stAttrPrivateKey[0] ),
        &amp;hPublicKey,
        &amp;hPrivateKey );</code></pre></div><p>Извлечение ключа:<br /></p><div class="codebox"><pre><code>    // Берём значение открытого ключа
    CK_ATTRIBUTE    stAttrValue[] = { { CKA_VALUE, NULL, 0 } };
    if( lRetCode == CKR_OK )
        lRetCode = pstFL-&gt;C_GetAttributeValue( m_hSession, hPublicKey, &amp;stAttrValue[0], sizeof( stAttrValue ) / sizeof( stAttrValue[0] ));
    if( lRetCode == CKR_OK )
    {
        stAttrValue[0].pValue = ( stAttrValue[0].ulValueLen != 0 ? new BYTE[stAttrValue[0].ulValueLen] : NULL );
        if( stAttrValue[0].pValue == NULL )
            lRetCode = CKR_HOST_MEMORY;
        else
        {
            lRetCode = pstFL-&gt;C_GetAttributeValue( m_hSession, hPublicKey, &amp;stAttrValue[0], sizeof( stAttrValue ) / sizeof( stAttrValue[0] ));
            if( lRetCode == CKR_OK )
            {
                CKeyInfo*    pkeyInfo = new CKeyInfo( astrID, astrID.GetLength(), astrKeyLabel, astrKeyLabel.GetLength(),
                    ( BYTE* )stAttrValue[0].pValue, stAttrValue[0].ulValueLen );
                if( pkeyInfo != NULL )
                    m_posKeyInfo = m_listKeyInfos.AddTail( pkeyInfo );
            }

            delete [] ( BYTE* )stAttrValue[0].pValue;
        }
    }

    DWORD    dwErrorCode = ( lRetCode != CKR_OK ? ( 0x11000000 | lRetCode ) : ERROR_SUCCESS );
    return( dwErrorCode );</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (SvetovidovDM)]]></author>
			<pubDate>Fri, 30 Oct 2015 10:37:28 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9012/#p9012</guid>
		</item>
		<item>
			<title><![CDATA[Re: Импорт ключа]]></title>
			<link>https://forum.rutoken.ru/post/9011/#p9011</link>
			<description><![CDATA[<p>Нужен код, создающий ключи на Рутокене ЭЦП и извлекающий открытый ключ. Параметры КриптоПро CSP не нужны.</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Fri, 30 Oct 2015 10:31:24 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/9011/#p9011</guid>
		</item>
	</channel>
</rss>
