...
Все поддерживаемые устройствами Рутокен атрибуты объектов представлены в разделе Объекты PKCS #11.
Атрибуты ключевых объектов Рутокен PINPad
...
Подпись на Рутокен PINPad совместным механизмом хеширования и подписи
При использовании совместного механизма хеширования и подписи в функцию C_Sign()
с совместным механизмом (например, CKM_GOSTR3410_WITH_GOSTR3411
) передается текст в специальным формате для отображения его на экране Рутокен PINPad.
При вызове функции C_Sign()
на экране Рутокен PINPad появится текст сообщения, а функция будет ожидать нажатия пользователем кнопки подтверждения или отказа от операции на экране Рутокен PINPad.
Если пользователь подтверждает выполнение операции, то сообщение сначала хешируется внутри Рутокен PINPad, а затем подписывается. Функция C_Sign()
возвращает управление и блок сформированной цифровой подписи размером 64 байта для механизмов CKM_GOSTR3410_WITH_GOSTR3411
и CKM_GOSTR3410_WITH_GOSTR3411_12_256
и
128 байтдля механизма
CKM_GOSTR3410_WITH_GOSTR3411_12_512
.
Если пользователь отклоняет операцию подписи, функция C_Sign()
немедленно возвращает управление и код ошибки. Никаких вычислений хеша или цифровой подписи не производится.
Подпись на Рутокен PINPad отдельными механизмами хеширования и подписи
При использовании отдельных механизмов хеширования и подписи сначала в функцию C_Digest()
с механизмом хеширования (например, CKM_GOSTR3411
) передается текст в специальном формате для отображения его на экране Рутокен PINPad.
При вызове функция C_Digest()
вычисляет хеш и возвращает управление вместе с значением хеша. Исходное сообщение и значение хеша запоминаются внутри Рутокен PINPad.
Затем вызывается функция C_Sign()
с механизмом подписи (например, CKM_GOSTR3410
) и произвольным значением хеша. Рутокен PINPad сверяет сохраненное значение хеша с переданным функцией C_Sign()
и в случае совпадения отображает на экране текст исходного сообщения. Функция C_Sign()
ожидает нажатия пользователем кнопки подтверждения или отказа от операции на экране Рутокен PINPad. Если значения не совпадают, функция C_Sign()
возвращает ошибку без вывода на экране текста сообщения.
Если пользователь подтверждает выполнение операции, то сохраненное значение хеша в Рутокен PINPad подписывается, и функция C_Sign()
возвращает управление и блок сформированной цифровой подписи размером 64 байта для механизма CKM_GOSTR3410
и 128 байт для механизма CKM_GOSTR3410_512
.
Если пользователь отклоняет операцию подписи, функция C_Sign()
немедленно возвращает управление и код ошибки. Вычисления цифровой подписи не производится.
Пример подписи данных по алгоритму ГОСТ Р 34.10-2001
...
Code Block | ||||
---|---|---|---|---|
| ||||
while(TRUE)
{
...
/* Инициализировать операцию расшифрования */
printf("C_DecryptInit");
rv = pFunctionList->C_DecryptInit(hSession, // Хэндл сессии
&EncDecStreamMech, // Механизм расшифрования
hSecKey); // Хэндл секретного ключа
if (rv != CKR_OK)
{
printf(" -> Failed\n");
break;
}
printf(" -> OK\n");
/* Расшифровать шифротекст */
printf("Getting decrypted data size");
rv = pFunctionList->C_Decrypt(hSession, // Хэндл сессии
pbtEncryptedData, // Буфер с зашифрованными данными
ulEncryptedDataSize, // Размер зашифрованных данных
NULL_PTR, // Буфер с расшифрованными данными
&ulDecryptedDataSize); // Размер расшифрованных данных
if (rv != CKR_OK)
{
printf(" -> Failed\n");
break;
}
printf(" -> OK\n");
pbtDecryptedData = (CK_BYTE*)malloc(ulDecryptedDataSize);
if (pbtDecryptedData == NULL)
{
printf("Memory allocation for pbtDecryptedData failed! \n");
break;
}
memset(pbtDecryptedData,
0,
(ulDecryptedDataSize * sizeof(CK_BYTE)))Все поддерживаемые устройствами Рутокен;
printf("C_Decrypt");
rv = pFunctionList->C_Decrypt(hSession, // Хэндл сессии
pbtEncryptedData, // Буфер с зашифрованными данными
ulEncryptedDataSize, // Размер зашифрованных данных
pbtDecryptedData, // Буфер с расшифрованными данными
&ulDecryptedDataSize); // Размер расшифрованных данных
if (rv != CKR_OK)
{
printf(" -> Failed\n");
break;
}
printf(" -> OK\n");
/* Распечатать буфер, содержащий расшифрованный текст */
printf("Decrypted buffer is:\n");
for (i = 0;
i < ulDecryptedDataSize;
i++)
{
printf("%02X ", pbtDecryptedData[i]);
if ((i + 1) % 8 == 0)
printf("\n");
}
break;
}
if (pbtEncryptedData)
{
free(pbtEncryptedData);
pbtEncryptedData = NULL_PTR;
}
if (pbtDecryptedData)
{
free(pbtDecryptedData);
pbtDecryptedData = NULL_PTR;
} |
...
Code Block | ||||
---|---|---|---|---|
| ||||
CK_SLOT_ID slotID; // Идентификатор слота, к которому подключен токен CK_UTF8CHAR_PTR pUserPin; // PIN-код Пользователя Рутокен CK_ULONG ulUserPinLen; // Длина PIN-кода Пользователя Рутокен CK_UTF8CHAR_PTR pNewLocalPin; // Локальный PIN-код CK_ULONG ulNewLocalPinLen; // Длина локального PIN-кода CK_ULONG ulLocalID; // Идентификатор локального PIN-кода printf("Setting Local PIN-code"); rv = pfGetFunctionListEx->C_EX_SetLocalPIN( slotID, // Идентификатор слота, к которому подключен токен pUserPin, // Текущий PIN-код Пользователя Рутокен ulUserPinLen, // Длина текущего PIN-кода Пользователя Рутокен pNewLocalPin, // Новый локальный PIN-код &ulNewLocalPinLen, // Длина нового локального PIN-кода ulLocalID); // Идентификатор локального PIN-кода if (rv != CKR_OK) { printf(" -> Failed\n"); break; } printf(" -> OK\n"); |