<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Проблемы с работой примера хэширования из SDK/pkcs11/sample/standart]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/3059/" />
	<updated>2019-10-18T07:19:20Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/3059/</id>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с работой примера хэширования из SDK/pkcs11/sample/standart]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13434/#p13434" />
			<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-10-18T07:19:20Z</updated>
			<id>https://forum.rutoken.ru/post/13434/#p13434</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Проблемы с работой примера хэширования из SDK/pkcs11/sample/standart]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13433/#p13433" />
			<content type="html"><![CDATA[<p>Дело в том, что строки в Си заканчиваются на &#039;\0&#039; и именно это лишний символ искажает результат.<br />Нужно или записывать в виде массива байтов:</p><div class="codebox"><pre><code>static CK_BYTE data[] = { &#039;H&#039;,&#039;e&#039;,&#039;l&#039;,&#039;l&#039;,&#039;o&#039;,&#039; &#039;,&#039;c&#039;,&#039;r&#039;,&#039;y&#039;,&#039;p&#039;,&#039;t&#039;,&#039;o&#039;,&#039; &#039;,&#039;w&#039;,&#039;o&#039;,&#039;r&#039;,&#039;l&#039;,&#039;d&#039; };</code></pre></div><p>Или в качестве размера данных передавать результат подсчета длины строки, чтобы &#039;\0&#039; не фигурировал.</p><div class="codebox"><pre><code>    static char* data = &quot;Hello crypto world&quot;;
    /*************************************************************************
    * Инициализировать хэш-функцию                                           *
    *************************************************************************/
    rv = functionList-&gt;C_DigestInit(session, &amp;gostR3411_2012_256HashMech);
    CHECK_AND_LOG(&quot; C_DigestInit&quot;, rv == CKR_OK, rvToStr(rv), close_session);

    /*************************************************************************
    * Определить размер хэш-кода                                             *
    *************************************************************************/
    rv = functionList-&gt;C_Digest(session, data, strlen(data), NULL_PTR, &amp;hashSize);
    CHECK_AND_LOG(&quot; C_Digest(get size)&quot;, rv == CKR_OK, rvToStr(rv), close_session);

    /*************************************************************************
    * Вычислить хэш-код данных                                               *
    *************************************************************************/

    hash = (CK_BYTE_PTR)malloc(hashSize * sizeof(char));
    CHECK(&quot;  Memory allocation for hash&quot;, hash != NULL, close_session);

    rv = functionList-&gt;C_Digest(session, data, strlen(data), hash, &amp;hashSize);
    CHECK_AND_LOG(&quot; C_Digest (get hash)&quot;, rv == CKR_OK, rvToStr(rv), free_hash);</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Павел Анфимов]]></name>
				<uri>https://forum.rutoken.ru/user/7338/</uri>
			</author>
			<updated>2019-10-17T16:16:04Z</updated>
			<id>https://forum.rutoken.ru/post/13433/#p13433</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Проблемы с работой примера хэширования из SDK/pkcs11/sample/standart]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/13432/#p13432" />
			<content type="html"><![CDATA[<p>Здравствуйте. Не понимаю в чём проблема: запустил пример из SDK по созданию хэша с входными данными &quot;Hello crypto world&quot; с использованием алгоритма ГОСТ 2012-256. Должен получить следующее:<br />dd b5 1e 17 37 cc 3d 5f b0 64 e3 c2 a cc b5 1a 47 9c c7 72 30 55 ca 3a 21 8c 2d e4 46 7c a7 12. На деле имеем:<br /><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/10/49b00020ac189e5801d0d02e139e709b.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/10/49b00020ac189e5801d0d02e139e709b.png" alt="" /></a></span> <br />Решил проверить те же входные данные с алгоритмом SHA-1, т.к. результат работы можно легко получить на различных сайтах онлайн. На выходе получаю следующие данные:<br /><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/10/0ecc42f76c636a683b8ae7b5f0d416a1.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/10/0ecc42f76c636a683b8ae7b5f0d416a1.png" alt="" /></a></span><br />Проверил на нескольких сайтах онлайн с этими же входными данными и получил совсем другой результат:<br /><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/10/0467e144bd398167c03aaf254daf7477.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/10/0467e144bd398167c03aaf254daf7477.png" alt="" /></a></span> <br /><span class="postimg"><a class="fancybox fancybox.image" rel="group" href="https://forum.rutoken.ru/uploads/images/2019/10/179f2a7872d2af9df3cb71905e25df6a.png"><img class="fb_img" src="https://forum.rutoken.ru/uploads/previews/2019/10/179f2a7872d2af9df3cb71905e25df6a.png" alt="" /></a></span> <br />Как такое возможно? Использую Рутокен ЭЦП 2.0.<br />Код прикреплю на всякий случай:<br /></p><div class="codebox"><pre><code>/*************************************************************************
* Rutoken                                                                *
* Copyright (c) 2003-2019, CJSC Aktiv-Soft. All rights reserved.         *
* Подробная информация:  http://www.rutoken.ru                           *
*------------------------------------------------------------------------*
* Пример работы с Рутокен при помощи библиотеки PKCS#11 на языке C       *
*------------------------------------------------------------------------*
* Использование команд вычисления хэш-кода:                              *
*  - установление соединения с Рутокен в первом доступном слоте;         *
*  - определение типа подключенного токена;                              *
*  - вычисление хэш-кода ГОСТ Р 34.11-2012(512);                         *
*  - закрытие соединения с Рутокен.                                      *
*------------------------------------------------------------------------*
* Данный пример является самодостаточным.                                *
*************************************************************************/

#include &lt;Common.h&gt;

/*************************************************************************
* Данные, от которых будет производиться вычисление хэш-кода             *
*************************************************************************/
static CK_BYTE data[] = { &quot;Hello crypto world&quot; };



int main(void)
{
    HMODULE module;                                   // Хэндл загруженной библиотеки PKCS#11
    CK_SESSION_HANDLE session;                        // Хэндл открытой сессии

    CK_FUNCTION_LIST_PTR functionList;                // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
    CK_C_GetFunctionList getFunctionList;             // Указатель на функцию C_GetFunctionList

    CK_SLOT_ID_PTR slots;                             // Массив идентификаторов слотов
    CK_ULONG slotCount;                               // Количество идентификаторов слотов в массиве

    CK_MECHANISM_TYPE_PTR mechanisms;                 // Массив поддерживаемых механизмов
    CK_ULONG mechanismCount;                          // Количество поддерживаемых механизмов

    CK_BYTE_PTR hash;                                 // Указатель на временный буфер для хэш-кода данных
    CK_ULONG hashSize;                                // Размер временного буфера в байтах

    CK_RV rv;                                         // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11

    CK_ULONG i;                                       // Вспомогательная переменная-счетчик в циклах

    int isGostR3411_12_256Supported = 0;              // Флаг для проверки поддержки токеном CKM_GOSTR3411_12_256

    int errorCode = 1;                                // Флаг ошибки

    /*************************************************************************
    * Выполнить действия для начала работы с библиотекой PKCS#11             *
    *************************************************************************/
    printf(&quot;Initialization...\n&quot;);

    /*************************************************************************
    * Загрузить библиотеку                                                   *
    *************************************************************************/
    module = LoadLibrary(PKCS11ECP_LIBRARY_NAME);
    CHECK(&quot; LoadLibrary&quot;, module != NULL, exit);

    /*************************************************************************
    * Получить адрес функции запроса структуры с указателями на функции      *
    *************************************************************************/
    getFunctionList = (CK_C_GetFunctionList)GetProcAddress(module, &quot;C_GetFunctionList&quot;);
    CHECK(&quot; GetProcAddress&quot;, getFunctionList != NULL, unload_pkcs11);

    /*************************************************************************
    * Получить структуру с указателями на функции                            *
    *************************************************************************/
    rv = getFunctionList(&amp;functionList);
    CHECK_AND_LOG(&quot; Get function list&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    /*************************************************************************
    * Инициализировать библиотеку                                            *
    *************************************************************************/
    rv = functionList-&gt;C_Initialize(NULL_PTR);
    CHECK_AND_LOG(&quot; C_Initialize&quot;, rv == CKR_OK, rvToStr(rv), unload_pkcs11);

    /*************************************************************************
    * Получить количество слотов c подключенными токенами                    *
    *************************************************************************/
    rv = functionList-&gt;C_GetSlotList(CK_TRUE, NULL_PTR, &amp;slotCount);
    CHECK_AND_LOG(&quot; C_GetSlotList (number of slots)&quot;, rv == CKR_OK, rvToStr(rv), finalize_pkcs11);

    CHECK_AND_LOG(&quot; Checking available tokens&quot;, slotCount &gt; 0, &quot; No tokens available&quot;, finalize_pkcs11);

    /*************************************************************************
    * Получить список слотов c подключенными токенами                        *
    *************************************************************************/
    slots = (CK_SLOT_ID_PTR)malloc(slotCount * sizeof(CK_SLOT_ID));
    CHECK(&quot;  Memory allocation for slots&quot;, slots != NULL, finalize_pkcs11);

    rv = functionList-&gt;C_GetSlotList(CK_TRUE, slots, &amp;slotCount);
    CHECK_AND_LOG(&quot; C_GetSlotList&quot;, rv == CKR_OK, rvToStr(rv), free_slots);
    printf(&quot; Slots available: %d\n&quot;, (int)slotCount);

    /*************************************************************************
    * Получить список поддерживаемых токеном механизмов                      *
    *************************************************************************/
    rv = functionList-&gt;C_GetMechanismList(slots[0], NULL_PTR, &amp;mechanismCount);
    CHECK_AND_LOG(&quot; C_GetMechanismList (number of mechanisms)&quot;, rv == CKR_OK, rvToStr(rv), free_slots);

    CHECK_AND_LOG(&quot; Checking mechanisms available&quot;, mechanismCount &gt; 0, &quot; No mechanisms available&quot;, free_slots);

    mechanisms = (CK_MECHANISM_TYPE_PTR)malloc(mechanismCount * sizeof(CK_MECHANISM_TYPE));
    CHECK(&quot; Memory allocation for mechanisms&quot;, mechanisms != NULL_PTR, free_slots);

    rv = functionList-&gt;C_GetMechanismList(slots[0], mechanisms, &amp;mechanismCount);
    CHECK_AND_LOG(&quot; C_GetMechanismList&quot;, rv == CKR_OK, rvToStr(rv), free_mechanisms);

    /*************************************************************************
    * Определение поддерживаемых токеном механизмов                          *
    *************************************************************************/
    for (i = 0; i &lt; mechanismCount; ++i) {
        if (mechanisms[i] == CKM_GOSTR3411_12_256) {
            isGostR3411_12_256Supported = 1;
            break;
        }
    }

    CHECK_AND_LOG(&quot; Checking CKM_GOSTR3411_12_256 support&quot;, isGostR3411_12_256Supported,
                  &quot;CKM_GOSTR3411_12_512 isn`t supported!\n&quot;, free_mechanisms);

    /*************************************************************************
    * Открыть RW сессию в первом доступном слоте                             *
    *************************************************************************/
    rv = functionList-&gt;C_OpenSession(slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL_PTR, NULL_PTR, &amp;session);
    CHECK_AND_LOG(&quot; C_OpenSession&quot;, rv == CKR_OK, rvToStr(rv), free_mechanisms);

    printf(&quot;Initialization has been completed successfully.\n&quot;);

    /*************************************************************************
    * Вычислить хэш-код данных                                               *
    *************************************************************************/
    printf(&quot;\nHashing data...\n&quot;);

    /*************************************************************************
    * Инициализировать хэш-функцию                                           *
    *************************************************************************/
    rv = functionList-&gt;C_DigestInit(session, &amp;gostR3411_2012_256HashMech);
    CHECK_AND_LOG(&quot; C_DigestInit&quot;, rv == CKR_OK, rvToStr(rv), close_session);

    /*************************************************************************
    * Определить размер хэш-кода                                             *
    *************************************************************************/
    rv = functionList-&gt;C_Digest(session, data, sizeof(data), NULL_PTR, &amp;hashSize);
    CHECK_AND_LOG(&quot; C_Digest(get size)&quot;, rv == CKR_OK, rvToStr(rv), close_session);

    /*************************************************************************
    * Вычислить хэш-код данных                                               *
    *************************************************************************/

    hash = (CK_BYTE_PTR)malloc(hashSize * sizeof(CK_BYTE));
    CHECK(&quot;  Memory allocation for hash&quot;, hash != NULL, close_session);

    rv = functionList-&gt;C_Digest(session, data, sizeof(data), hash, &amp;hashSize);
    CHECK_AND_LOG(&quot; C_Digest (get hash)&quot;, rv == CKR_OK, rvToStr(rv), free_hash);

    /*************************************************************************
    * Распечатать буфер, содержащий хэш-код                                  *
    *************************************************************************/
    printf(&quot; Hashed buffer is: \n&quot;);
    printHex(hash, hashSize);
    printf(&quot;Hashing has been completed.\n&quot;);

    /*************************************************************************
    * Выставить признак успешного завершения программы                       *
    *************************************************************************/
    errorCode = 0;

    /*************************************************************************
    * Выполнить действия для завершения работы с библиотекой PKCS#11         *
    *************************************************************************/
    printf(&quot;\nFinalizing... \n&quot;);

    /*************************************************************************
    * Очистить память, выделенную под хэш-код                                *
    *************************************************************************/
free_hash:
    free(hash);

    /*************************************************************************
    * Закрыть открытую сессию в слоте                                        *
    *************************************************************************/
close_session:
    rv = functionList-&gt;C_CloseSession(session);
    CHECK_RELEASE_AND_LOG(&quot; C_CloseSession&quot;, rv == CKR_OK, rvToStr(rv), errorCode);

    /*************************************************************************
    * Очистить память, выделенную под механизмы и слоты                      *
    *************************************************************************/
free_mechanisms:
    free(mechanisms);

free_slots:
    free(slots);

    /*************************************************************************
    * Деинициализировать библиотеку                                          *
    *************************************************************************/
finalize_pkcs11:
    rv = functionList-&gt;C_Finalize(NULL_PTR);
    CHECK_RELEASE_AND_LOG(&quot; C_Finalize&quot;, rv == CKR_OK, rvToStr(rv), errorCode);

    /*************************************************************************
    * Выгрузить библиотеку из памяти                                         *
    *************************************************************************/
unload_pkcs11:
    CHECK_RELEASE(&quot; FreeLibrary&quot;, FreeLibrary(module), errorCode);

exit:
    if (errorCode) {
        printf(&quot;\n\nSome error occurred. Sample failed.\n&quot;);
    } else {
        printf(&quot;\n\nSample has been completed successfully.\n&quot;);
    }

    return errorCode;
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Binger]]></name>
				<uri>https://forum.rutoken.ru/user/11270/</uri>
			</author>
			<updated>2019-10-17T13:43:15Z</updated>
			<id>https://forum.rutoken.ru/post/13432/#p13432</id>
		</entry>
</feed>
