Академический Документы
Профессиональный Документы
Культура Документы
ViPNet PKCS11 Developer Guide Ru
ViPNet PKCS11 Developer Guide Ru
интерфейс
ViPNet PKCS#11 VT 4.2
Руководство разработчика
1991–2017 ОАО «ИнфоТеКС», Москва, Россия
Этот документ входит в комплект поставки программного обеспечения, и на него распространяются все условия
лицензионного соглашения.
Ни одна из частей этого документа не может быть воспроизведена, опубликована, сохранена в электронной базе данных
или передана в любой форме или любыми средствами, такими как электронные, механические, записывающие или иначе,
для любой цели без предварительного письменного разрешения ОАО «ИнфоТеКС».
Все названия компаний и продуктов, которые являются товарными знаками или зарегистрированными товарными знаками,
принадлежат соответствующим владельцам.
ОАО «ИнфоТеКС»
Обратная связь 9
Соглашения документа
Ниже перечислены соглашения, принятые в этом документе для выделения информации.
Обозначение Описание
Обозначение Описание
Меню > Подменю > Иерархическая последовательность элементов. Например, пункты меню
Команда или разделы на панели навигации.
Код Имя файла, путь, фрагмент текстового файла (кода) или команда,
выполняемая из командной строки.
Контактная информация
С вопросами по использованию продуктов ViPNet, пожеланиями или предложениями свяжитесь со
специалистами ОАО «ИнфоТеКС». Для решения возникающих проблем обратитесь в службу
технической поддержки.
8 (495) 737-6192,
pkcs11.h
pkcs11f.h
pkcs11t.h
cryptoki.h
pkcs11tc26.h
pkcs11tc26_12.h
pkcs11tc26_15.h
pkcs11ex.h
Если вам нужны дополнительные функции (см. «Функции расширения интерфейса PKCS#11» на
стр. 99), то необходимо включить также файл pkcs11_ex.h.
Выработку общего секретного ключа ГОСТ 28147-89 при помощи ключей ГОСТ Р 34.10-2001.
Таблица 3. Символы
Символ Определение
R/O Read-only
R/W Read/write
Таблица 4. Префиксы
Префикс Описание
C_ Function
CKA_ Attribute
CKN_ Notification
h a handle
ul a CK_ULONG
p a pointer
pb a pointer to a CK_BYTE
ph a pointer to a handle
Определения:
/* an unsigned 8-bit value */
typedef unsigned char CK_BYTE;
/* an unsigned 8-bit character */
typedef CK_BYTE CK_CHAR;
/* an 8-bit UTF-8 character */
typedef CK_BYTE CK_UTF8CHAR;
/* a BYTE-sized Boolean flag */
typedef CK_BYTE CK_BBOOL;
/* an unsigned value, at least 32 bits long */
typedef unsigned long int CK_ULONG;
/* a signed value, the same size as a CK_ULONG */
typedef long int CK_LONG;
/* at least 32 bits; each bit is a Boolean flag */
typedef CK_ULONG CK_FLAGS;
Указатели:
CK_BYTE_PTR /* Pointer to a CK_BYTE */
CK_CHAR_PTR /* Pointer to a CK_CHAR */
CK_UTF8CHAR_PTR /* Pointer to a CK_UTF8CHAR */
CK_ULONG_PTR /* Pointer to a CK_ULONG */
CK_VOID_PTR /* Pointer to a void */
CK_VOID_PTR_PTR /* Pointer to a CK_VOID_PTR */
NULL_PTR /* A NULL pointer */
Во многих местах настоящего документа будет использоваться так называемое «соглашение МНД»,
то есть соглашение об использовании массивов неопределенной длины.
Остановимся на параметре, который может понадобиться вам в работе — это logging_enabled (по
умолчанию включен). Если необходимо вести журналы работы модуля PKCS#11, этот параметр
необходимо включить (присвоить значение true). По умолчанию в журнал заносятся только
ошибки. Если требуется более подробное логирование, то необходимо сменить значение
logging_severity на 6 или 7. В ОС Windows события записываются в Debug Output, в ОС Linux — в
syslog).
Операции:
Параметры:
Атрибуты и объекты 19
Механизмы 20
Сессии 23
В интерфейсе PKCS#11 для администратора не предусмотрены прямые функции для записи или
чтения приватной информации пользователя, хотя косвенно это всегда возможно: установить
любой код в качестве ПИН-кода пользователя и прочесть всю приватную информацию. Поскольку
создание «нового» токена в ViPNet PKCS#11 VT осуществляется с помощью модуля
token_manager.exe, то основной функцией администратора токена является установление
первоначального ПИН-кода пользователя и восстановление доступа к приватной информации
пользователя в случае, если он забыл свой ПИН-код.
Где:
Каждый объект в интерфейсе PKCS#11 должен иметь атрибут CKA_CLASS, определяющий класс
объекта. В ViPNet PKCS#11 VT поддерживаются следующие классы объектов ( typedef CK_ULONG
CK_OBJECT_CLASS):
CKO_CERTIFICATE — сертификат;
CKO_DATA — данные.
где:
Выработка диверсифицированного в
CKM_KDF_4357 C_DeriveKey соответствии с RFC 4357
симметричного ключа ГОСТ 28147-89
Вычисление хэш-функции в
CKM_GOSTR3411 C_DigestInit
соответствии с ГОСТ Р 31.11-94
Временные объекты хранятся в кэше. Кэш объектов — это дополнительный слой над хранилищем
объектов, необходимый для хранения временных (сессионных) объектов, кэширования приватных
объектов (уже расшифрованных), кэширования общедоступных объектов. Кэш является общим для
всех объектов токена. В настоящее время используется простейшая политика кэширования — при
получении объекта из базы данных он сохраняется для дальнейшего использования в кэше.
Объекты хранятся в кэше до выполнения процедуры logout или закрытия сессии. Кэш может быть
отключен в файле настроек модуля pkcs11.
Состояние Описание
R/O Public Session Приложение открыло R/O сессию. Приложение получает R/O доступ
к public-объектам токена и R/W доступ к объектам public session.
Состояние Описание
R/W Public Session Приложение открыло R/W сессию. Приложение получает R/W доступ
ко всем public-объектам.
Приведенная ниже таблица суммирует виды доступа к различным объектам при различных
состояниях сессии.
Тип сессии
Type of object R/O Public R/W Public R/O User R/W User R/W SO
Если при записи или изменении объектов на токене не хватает скорости (скорость записи на
жестком диске — порядка 10 операций в секунду), то запись следует вести в многопоточном
режиме. В этом случае скорость записи будет расти линейно пропорционально количеству
потоков. Особенности многопоточной записи см. в разделе Особенности многопоточного
использования (на стр. 28).
Желательно, чтобы по этому атрибуту можно было однозначно определить искомый объект
(или хотя бы не более 10 объектов). Например, OpenSSL использует CKA_ID в качестве
уникального идентификатора ключевой пары (а также для связи с ней сертификата).
1 Синхронизация объектов из разных процессов: если объект создан или изменен в одном
процессе (процесс 1), то в другом процессе (процесс 2) эти изменения могут быть обнаружены
не сразу, если в (процессе 2) уже был вызван C_Initialize. Например, если изменить
значение атрибута в объекте токена в процессе 1, то в процессе 2 будет по-прежнему
использоваться старое значение атрибута.
Функции администрирования 42
Функции шифрования 80
Функции хэширования 88
C_GetFunctionList
CK_DEFINE_FUNCTION(CK_RV, C_GetFunctionList)(
CK_FUNCTION_LIST_PTR_PTR ppFunctionList
);
Пример:
CK_FUNCTION_LIST_PTR pFunctionList;
CK_C_Initialize pC_Initialize;
CK_RV rv;
/* It’s OK to call C_GetFunctionList before calling C_Initialize */
rv = C_GetFunctionList(&pFunctionList);
assert(rv == CKR_OK);
pC_Initialize = pFunctionList -> C_Initialize;
/* Call the C_Initialize function in the library */
rv = (*pC_Initialize)(NULL_PTR);
C_Initialize
CK_DEFINE_FUNCTION(CK_RV, C_Initialize)(
CK_VOID_PTR pInitArgs
);
1 Если pInitArgs равен NULL, то в библиотеке отключаются блокировки и она не может быть
использована в многопоточном режиме.
2.2 Если flags содержит CKF_OS_LOCKING_OK или заданы все функции CreateMutex,
DestroyMutex, LockMutex, UnlockMutex, то в библиотеке включаются блокировки и она
может быть использована в многопоточном режиме.
C_GetInfo
CK_DEFINE_FUNCTION(CK_RV, C_GetInfo)(
CK_INFO_PTR pInfo
);
C_GetInfo вызывается для получения общей информации об интерфейсе ViPNet PKCS#11 VT. В
качестве параметра используется стандартная структура CK_INFO:
typedef struct CK_INFO {
/* manufacturerID and libraryDecription have been changed from
* CK_CHAR to CK_UTF8CHAR for v2.10 */
CK_VERSION cryptokiVersion; /* Cryptoki interface ver */
CK_UTF8CHAR manufacturerID[32]; /* blank padded */
CK_FLAGS flags; /* must be zero */
/* libraryDescription and libraryVersion are new for v2.0 */
CK_UTF8CHAR libraryDescription[32]; /* blank padded */
CK_VERSION libraryVersion; /* version of library */
} CK_INFO;
C_GetSlotList
CK_DEFINE_FUNCTION(CK_RV, C_GetSlotList)(
CK_BBOOL tokenPresent,
CK_SLOT_ID_PTR pSlotList,
CK_ULONG_PTR pulCount
);
Функция C_GetSlotList вызывается для получения списка всех доступных слотов. Параметр
tokenPresent позволяет получать либо список всех слотов (tokenPresent = CK_FALSE), либо
только слотов, содержащих токен (tokenPresent = CK_TRUE).
Пример:
CK_ULONG ulSlotCount, ulSlotWithTokenCount;
CK_SLOT_ID_PTR pSlotList, pSlotWithTokenList;
CK_RV rv;
/* Get list of all slots */
rv = C_GetSlotList(CK_FALSE, NULL_PTR, &ulSlotCount);
if (rv == CKR_OK) {
pSlotList =
(CK_SLOT_ID_PTR) malloc(ulSlotCount*sizeof(CK_SLOT_ID));
rv = C_GetSlotList(CK_FALSE, pSlotList, &ulSlotCount);
if (rv == CKR_OK) {
/* Now use that list of all slots */
.
.
}
free(pSlotList);
}
/* Get list of all slots with a token present */
pSlotWithTokenList = (CK_SLOT_ID_PTR) malloc(0);
ulSlotWithTokenCount = 0;
while (1) {
rv = C_GetSlotList(
CK_TRUE, pSlotWithTokenList, ulSlotWithTokenCount);
if (rv != CKR_BUFFER_TOO_SMALL)
break;
pSlotWithTokenList = realloc(
pSlotWithTokenList,
ulSlotWithTokenList*sizeof(CK_SLOT_ID));
}
if (rv == CKR_OK) {
/* Now use that list of all slots with a token present */
.
.
}
free(pSlotWithTokenList);
C_GetSlotInfo
CK_DEFINE_FUNCTION(CK_RV, C_GetSlotInfo)(
C_GetTokenInfo
CK_DEFINE_FUNCTION(CK_RV, C_GetTokenInfo)(
CK_SLOT_ID slotID,
CK_TOKEN_INFO_PTR pInfo
);
Параметры:
Пример:
CK_ULONG ulCount;
CK_SLOT_ID_PTR pSlotList;
CK_SLOT_INFO slotInfo;
CK_TOKEN_INFO tokenInfo;
CK_RV rv;
rv = C_GetSlotList(CK_FALSE, NULL_PTR, &ulCount);
if ((rv == CKR_OK) && (ulCount > 0)) {
pSlotList = (CK_SLOT_ID_PTR) malloc(ulCount*sizeof(CK_SLOT_ID));
rv = C_GetSlotList(CK_FALSE, pSlotList, &ulCount);
assert(rv == CKR_OK);
/* Get slot information for first slot */
rv = C_GetSlotInfo(pSlotList[0], &slotInfo);
assert(rv == CKR_OK);
/* Get token information for first slot */
rv = C_GetTokenInfo(pSlotList[0], &tokenInfo);
if (rv == CKR_TOKEN_NOT_PRESENT) {
.
.
C_WaitForSlotEvent
CK_DEFINE_FUNCTION(CK_RV, C_WaitForSlotEvent)(
CK_FLAGS flags,
CK_SLOT_ID_PTR pSlot,
CK_VOID_PTR pReserved
);
Пример:
CK_FLAGS flags = 0;
CK_SLOT_ID slotID;
CK_SLOT_INFO slotInfo;
.
.
/* Block and wait for a slot event */
rv = C_WaitForSlotEvent(flags, &slotID, NULL_PTR);
assert(rv == CKR_OK);
/* See what’s up with that slot */
rv = C_GetSlotInfo(slotID, &slotInfo);
assert(rv == CKR_OK);
C_GetMechanismList
CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismList)(
CK_SLOT_ID slotID,
CK_MECHANISM_TYPE_PTR pMechanismList,
CK_ULONG_PTR pulCount
);
Параметры:
Пример:
CK_SLOT_ID slotID;
CK_ULONG ulCount;
CK_MECHANISM_TYPE_PTR pMechanismList;
CK_RV rv;
.
.
rv = C_GetMechanismList(slotID, NULL_PTR, &ulCount);
if ((rv == CKR_OK) && (ulCount > 0)) {
pMechanismList =
(CK_MECHANISM_TYPE_PTR)
malloc(ulCount*sizeof(CK_MECHANISM_TYPE));
rv = C_GetMechanismList(slotID, pMechanismList, &ulCount);
if (rv == CKR_OK) {
.
.
}
free(pMechanismList);
}
C_GetMechanismInfo
CK_DEFINE_FUNCTION(CK_RV, C_GetMechanismInfo)(
CK_SLOT_ID slotID,
CK_MECHANISM_TYPE type,
CK_MECHANISM_INFO_PTR pInfo
);
Параметры:
Пример:
CK_SLOT_ID slotID;
CK_MECHANISM_INFO info;
CK_RV rv;
.
.
/* Get information about the CKM_GOSTR3411 mechanism for this token */
rv = C_GetMechanismInfo(slotID, CKM_GOSTR3411, &info);
if (rv == CKR_OK) {
if (info.flags & CKF_DIGEST) {
.
.
}
}
C_InitToken
CK_DEFINE_FUNCTION(CK_RV, C_InitToken)(
CK_SLOT_ID slotID,
CK_UTF8CHAR_PTR pPin,
CK_ULONG ulPinLen,
CK_UTF8CHAR_PTR pLabel
);
Пример:
CK_SLOT_ID slotID;
CK_UTF8CHAR_PTR pin = “MyPIN”;
CK_UTF8CHAR label[32];
CK_RV rv;
C_InitPIN
CK_DEFINE_FUNCTION(CK_RV, C_InitPIN)(
CK_SESSION_HANDLE hSession,
CK_UTF8CHAR_PTR pPin,
CK_ULONG ulPinLen
);
Пример:
CK_SESSION_HANDLE hSession;
CK_UTF8CHAR newPin[]= {“NewPIN”};
CK_RV rv;
rv = C_InitPIN(hSession, newPin, sizeof(newPin));
if (rv == CKR_OK) {
.
.
}
C_SetPIN
CK_DEFINE_FUNCTION(CK_RV, C_SetPIN)(
CK_SESSION_HANDLE hSession,
CK_UTF8CHAR_PTR pOldPin,
Функция C_SetPIN позволяет изменять ПИН-код администратора или пользователя. Смена ПИН-
кода зависит от состояния сессии.
Функции из этого раздела осуществляют открытие и закрытие сессий, то есть сеансов связи с
различными токенами, а также авторизацию пользователя или администратора, необходимую для
выполнения тех или иных операций с приватными данными токена.
C_OpenSession
CK_DEFINE_FUNCTION(CK_RV, C_OpenSession)(
CK_SLOT_ID slotID,
CK_FLAGS flags,
CK_VOID_PTR pApplication,
CK_NOTIFY Notify,
CK_SESSION_HANDLE_PTR phSession
);
Функция C_OpenSession является одной из основных функций интерфейса PKCS#11, поскольку она
открывает сеанс связи с токеном.
Параметры:
перед применением этой функции прикладная программа каким-то образом должна выбрать
слот, содержащий нужный токен, и получить его идентификатор — параметр slotID.
C_CloseSession
CK_DEFINE_FUNCTION(CK_RV, C_CloseSession)(
CK_SESSION_HANDLE hSession
);
Пример:
CK_SLOT_ID slotID;
CK_BYTE application;
CK_NOTIFY MyNotify;
CK_SESSION_HANDLE hSession;
CK_RV rv;
.
.
application = 17;
C_CloseAllSessions
CK_DEFINE_FUNCTION(CK_RV, C_CloseAllSessions)(
CK_SLOT_ID slotID
);
C_GetSessionInfo
CK_DEFINE_FUNCTION(CK_RV, C_GetSessionInfo)(
CK_SESSION_HANDLE hSession,
CK_SESSION_INFO_PTR pInfo
);
CKU_SO — администратор;
Результатом выполнения функции C_Login является изменение состояния всех открытых к данному
токену сессий.
C_Logout
CK_DEFINE_FUNCTION(CK_RV, C_Logout)(
CK_SESSION_HANDLE hSession
);
Пример:
CK_SESSION_HANDLE hSession;
CK_UTF8CHAR userPIN[] = {“MyPIN”};
CK_RV rv;
C_GetOperationState
CK_DEFINE_FUNCTION(CK_RV, C_GetOperationState)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pOperationState,
CK_ULONG_PTR pulOperationStateLen
);
Если криптографическая операция не была запущена перед вызовом данной функции, то будет
возвращена ошибка CKR_OPERATION_NOT_INITIALIZED.
C_SetOperationState
CK_DEFINE_FUNCTION(CK_RV, C_SetOperationState)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pOperationState,
CK_ULONG ulOperationStateLen,
CK_OBJECT_HANDLE hEncryptionKey,
CK_OBJECT_HANDLE hAuthenticationKey
);
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hKey;
CK_BYTE* pSessionState;
CK_ULONG ulSessionStateLen;
CK_BYTE digest[32];
CK_ULONG ulDigestLen;
rv = C_DigestInit(hSession, &mechanism);
if (rv != CKR_OK) {
if (rv != CKR_OK) {
ulSessionStateLen = 0;
if (rv != CKR_OK) {
if (rv != CKR_OK) {
ulDigestLen = sizeof(digest);
if (rv != CKR_OK) {
if (rv != CKR_OK) {
if (rv != CKR_OK) {
ulDigestLen = sizeof(digest);
if (rv != CKR_OK) {
C_CreateObject
CK_DEFINE_FUNCTION(CK_RV, C_CreateObject)(
CK_SESSION_HANDLE hSession,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount,
CK_OBJECT_HANDLE_PTR phObject
);
Вновь созданный объект будет token-объектом тогда и только тогда, когда в шаблоне присутствует
атрибут CKA_TOKEN и его значение равно CK_TRUE. Во всех иных случаях вновь созданный объект
будет session-объектом.
Вновь созданный объект будет private-объектом, соответствующим типу объекта (см. «Атрибуты,
устанавливаемые по умолчанию» на стр. 104). Значение атрибута CKA_PRIVATE в шаблоне имеет
приоритет над значением по умолчанию.
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE
hData,
hCertificate,
hKey;
CK_OBJECT_CLASS
dataClass = CKO_DATA,
certificateClass = CKO_CERTIFICATE,
keyClass = CKO_PUBLIC_KEY;
CK_KEY_TYPE keyType = CKK_RSA;
CK_CHAR application[] = {“My Application”};
CK_BYTE dataValue[] = {...};
CK_BYTE subject[] = {...};
CK_BYTE id[] = {...};
CK_BYTE certificateValue[] = {...};
CK_BYTE modulus[] = {...};
CK_BYTE exponent[] = {...};
CK_BBOOL true = CK_TRUE;
CK_ATTRIBUTE dataTemplate[] = {
{CKA_CLASS, &dataClass, sizeof(dataClass)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_APPLICATION, application, sizeof(application)},
{CKA_VALUE, dataValue, sizeof(dataValue)}
};
CK_ATTRIBUTE certificateTemplate[] = {
{CKA_CLASS, &certificateClass, sizeof(certificateClass)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_VALUE, certificateValue, sizeof(certificateValue)}
};
CK_ATTRIBUTE keyTemplate[] = {
{CKA_CLASS, &keyClass, sizeof(keyClass)},
{CKA_KEY_TYPE, &keyType, sizeof(keyType)},
{CKA_WRAP, &true, sizeof(true)},
{CKA_MODULUS, modulus, sizeof(modulus)},
{CKA_PUBLIC_EXPONENT, exponent, sizeof(exponent)}
};
CK_RV rv;
.
.
/* Create a data object */
rv = C_CreateObject(hSession, &dataTemplate, 4, &hData);
C_CopyObject
CK_DEFINE_FUNCTION(CK_RV, C_CopyObject)(
CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount,
CK_OBJECT_HANDLE_PTR phNewObject
);
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hKey, hNewKey;
CK_OBJECT_CLASS keyClass = CKO_SECRET_KEY;
CK_KEY_TYPE keyType = CKK_DES;
CK_BYTE id[] = {...};
CK_BYTE keyValue[] = {...};
C_DestroyObject
CK_DEFINE_FUNCTION(CK_RV, C_DestroyObject)(
CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject
);
Параметры:
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hObject;
CK_OBJECT_CLASS dataClass = CKO_DATA;
CK_CHAR application[] = {“My Application”};
CK_BYTE dataValue[] = {...};
CK_BYTE value[] = {...};
CK_BBOOL true = CK_TRUE;
CK_ATTRIBUTE template[] = {
{CKA_CLASS, &dataClass, sizeof(dataClass)},
{CKA_TOKEN, &true, sizeof(true)},
{CKA_APPLICATION, application, sizeof(application)},
{CKA_VALUE, value, sizeof(value)}
};
CK_ULONG ulSize;
CK_RV rv;
.
.
rv = C_CreateObject(hSession, &template, 4, &hObject);
if (rv == CKR_OK) {
rv = C_GetObjectSize(hSession, hObject, &ulSize);
if (rv != CKR_INFORMATION_SENSITIVE) {
.
.
}
rv = C_DestroyObject(hSession, hObject);
.
.
}
C_GetAttributeValue
CK_DEFINE_FUNCTION(CK_RV, C_GetAttributeValue)(
CK_SESSION_HANDLE hSession,
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hObject;
CK_BYTE_PTR pModulus, pExponent;
CK_ATTRIBUTE template[] = {
{CKA_MODULUS, NULL_PTR, 0},
{CKA_PUBLIC_EXPONENT, NULL_PTR, 0}
};
CK_RV rv;
.
.
rv = C_GetAttributeValue(hSession, hObject, &template, 2);
if (rv == CKR_OK) {
pModulus = (CK_BYTE_PTR) malloc(template[0].ulValueLen);
template[0].pValue = pModulus;
/* template[0].ulValueLen was set by C_GetAttributeValue */
pExponent = (CK_BYTE_PTR) malloc(template[1].ulValueLen);
template[1].pValue = pExponent;
/* template[1].ulValueLen was set by C_GetAttributeValue */
rv = C_GetAttributeValue(hSession, hObject, &template, 2);
if (rv == CKR_OK) {
.
.
}
free(pModulus);
free(pExponent);
}
C_SetAttributeValue
CK_DEFINE_FUNCTION(CK_RV, C_SetAttributeValue)(
CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hObject,
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hObject;
CK_UTF8CHAR label[] = {“New label”};
CK_ATTRIBUTE template[] = {
CKA_LABEL, label, sizeof(label)-1
};
CK_RV rv;
.
.
rv = C_SetAttributeValue(hSession, hObject, &template, 1);
if (rv == CKR_OK) {
.
.
}
C_FindObjectsInit
CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsInit)(
CK_SESSION_HANDLE hSession,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount
);
C_FindObjectsFinal
CK_DEFINE_FUNCTION(CK_RV, C_FindObjectsFinal)(
CK_SESSION_HANDLE hSession
);
Пример:
CK_OBJECT_HANDLE hObject;
CK_ULONG ulObjectCount;
CK_RV rv;
.
.
rv = C_FindObjectsInit(hSession, NULL_PTR, 0);
assert(rv == CKR_OK);
while (1) {
rv = C_FindObjects(hSession, &hObject, 1, &ulObjectCount);
if (rv != CKR_OK || ulObjectCount == 0)
break;
.
.
}
C_GenerateRandom
CK_DEFINE_FUNCTION(CK_RV, C_GenerateRandom)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pRandomData,
CK_ULONG ulRandomLen
);
Параметры:
Пример:
CK_SESSION_HANDLE hSession;
CK_BYTE seed[] = {...};
CK_BYTE randomData[] = {...};
C_GenerateKey
CK_DEFINE_FUNCTION(CK_RV, C_GenerateKey)(
CK_SESSION_HANDLE hSession
CK_MECHANISM_PTR pMechanism,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulCount,
CK_OBJECT_HANDLE_PTR phKey
);
CKM_GOST28147_KEY_GEN;
CKM_PKCS5_PBKD2CKM_GOSTPBE;
CKM_GOSTPBE_94;
CKM_TLS_GOST_PRE_MASTER_KEY_GEN.
Механизм CKM_GOST28147_KEY_GEN
Выработка секретного ключа по алгоритму ГОСТ 28147-89.
Не имеет параметров.
Механизм CKM_GOSTPBE_94
Выработка секретного ключа ГОСТ 28147-89 из пароля в соответствии с описанием генерации
ключа для схемы PBES2 в документе ТК26.
Где:
Механизм CKM_TLS_GOST_PRE_MASTER_KEY_GEN
Выработка секретного ключа для использования в механизме CKM_TLS_GOST_MASTER_KEY_DERIVE.
Не имеет параметров.
Механизм CKM_PKCS5_PBKD2
Выработка секретного ключа ГОСТ 28147-89 из пароля в соответствии PKCS#5 PBKDF2.
Где:
C_GenerateKeyPair
CK_DEFINE_FUNCTION(CK_RV, C_GenerateKeyPair)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_ATTRIBUTE_PTR pPublicKeyTemplate,
CK_ULONG ulPublicKeyAttributeCount,
CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
CK_ULONG ulPrivateKeyAttributeCount,
CK_OBJECT_HANDLE_PTR phPublicKey,
CK_OBJECT_HANDLE_PTR phPrivateKey
);
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hPublicKey, hPrivateKey;
CK_MECHANISM mechanism = {
CKM_GOST3410_KEY_PAIR_GEN, NULL_PTR, 0
};
CK_BYTE subject[] = {...};
CK_BYTE id[] = {123};
CK_BBOOL true = CK_TRUE;
CK_ATTRIBUTE publicKeyTemplate[] = {
{CKA_ENCRYPT, &true, sizeof(true)},
{CKA_VERIFY, &true, sizeof(true)},
{CKA_WRAP, &true, sizeof(true)},
{CKA_ID, id, sizeof(id)}
};
CK_ATTRIBUTE privateKeyTemplate[] = {
{CKA_TOKEN, &true, sizeof(true)},
{CKA_PRIVATE, &true, sizeof(true)},
{CKA_SUBJECT, subject, sizeof(subject)},
{CKA_ID, id, sizeof(id)},
{CKA_SENSITIVE, &true, sizeof(true)},
{CKA_DECRYPT, &true, sizeof(true)},
{CKA_SIGN, &true, sizeof(true)},
{CKA_UNWRAP, &true, sizeof(true)}
};
CK_RV rv;
rv = C_GenerateKeyPair(
hSession, &mechanism,
publicKeyTemplate, 4,
privateKeyTemplate, 8,
&hPublicKey, &hPrivateKey);
if (rv == CKR_OK) {
.
.
}
При выполнении функции C_DeriveKey в случае, если аргумент phKey не равен NULL_PTR,
выработанный в результате выполнения функции объект-ключ удовлетворяет следующим
Механизм CKM_GOSTR3410_DERIVE
Фактически это механизм выработки общего секретного ключа (обозначающегося в RFC 4357 как
KEK — key encryption key) типа CKK_GOST28147 с помощью private- и public- ключей ГОСТ Р 34.10
2001 двух корреспондентов, которым необходимо установить между собой секретную связь.
Помимо открытого ключа, в этой структуре есть еще два параметра, kdf и UKM:
Таким образом, в этом механизме всегда должны быть выполнены следующие соотношения:
ulPublicDataLen = 64;
Кроме того, объект hBaseKey должен содержать атрибут CKA_DERIVE со значением CK_TRUE, в
противном случае функция выдает ошибку с тем же кодом.
Механизм CKM_GOSTR3410_12_DERIVE
Это механизм выработки общего секретного ключа (обозначающегося в RFC 4357 как KEK — key
encryption key) типа CKK_GOST28147 с помощью private- и public-ключей ГОСТ Р 34.10-2012 двух
корреспондентов, которым необходимо установить между собой секретную связь.
Параметры этого механизма представляют собой байтовый массив следующего формата (в данном
случае под операцией | подразумевается присоединение одного массива к другому):
CK_BYTE mechParam[] = kdf | publicKeyLength | publicKey | ukmSize | ukm;
Где:
Таким образом, в этом механизме всегда должны быть выполнены следующие соотношения:
publicKeyLength = 128 для ключевой пары с размером открытого ключа 1024 бит;
При несоответствии массива описанию выше ViPNet PKCS#11 VT выдает ошибку с кодом
CKR_MECHANISM_PARAM_INVALID.
Кроме того, объект hBaseKey должен содержать атрибут CKA_DERIVE со значением CK_TRUE, в
противном случае функция выдает ошибку с тем же кодом.
Механизм CKM_GOSTR3410_PUBLIC_KEY_DERIVE
Это механизм выработки public-ключа типа CKK_GOSTR3410 с помощью private-ключа ГОСТ Р 34.10-
2001.
Этот механизм не имеет параметров, поэтому pParameter должен быть равен NULL_PTR, а
ulParameterLen равен 0.
Механизм CKM_GOSTR3410_512_PUBLIC_KEY_DERIVE
Это механизм выработки public-ключа типа CKK_GOSTR3410_512 с помощью private-ключа ГОСТ Р
34.10-2012.
Этот механизм не имеет параметров, поэтому pParameter должен быть равен NULL_PTR, а
ulParameterLen равен 0.
Механизм CKM_TLS_GOST_PRF
Это алгоритм выработки случайных чисел с помощью базового ключа hBaseKey, входной
последовательности, именуемой также «затравкой», и некоторой метки. Параметром механизма
является структура CK_TLS_GOST_PRF_PARAMS:
typedef struct CK_TLS_GOST_PRF_PARAMS {
CK_TLS_PRF_PARAMS TlsPrfParams;
Механизм CKM_TLS_GOST_MASTER_KEY_DERIVE
Это алгоритм выработки мастер-ключа TLS с помощью базового ключа hBaseKey и случайных
данных клиента и сервера. Параметром механизма является структура
CK_TLS_GOST_MASTER_KEY_DERIVE_PARAMS:
typedef struct CK_TLS_GOST_MASTER_KEY_DERIVE_PARAMS {
CK_SSL3_RANDOM_DATA RandomInfo;
CK_BYTE_PTR pHashParamsOID;
CK_ULONG ulHashParamsOIDLen;
} CK_TLS_GOST_MASTER_KEY_DERIVE_PARAMS;
Здесь CK_SSL3_RANDOM_DATA — стандартная структура вида:
typedef struct CK_SSL3_RANDOM_DATA {
CK_BYTE_PTR pClientRandom;
CK_ULONG ulClientRandomLen;
CK_BYTE_PTR pServerRandom;
CK_ULONG ulServerRandomLen;
} CK_SSL3_RANDOM_DATA;
Эта структура получает результат работы функции — 4 симметричных ключа и два IV.
Выработанные симметричные ключи удовлетворяют соглашению СЗСК. Аргумент phKey в этом
случае не используется и должен быть равен NULL_PTR.
Механизм CKM_KDF_4357
Механизм получения диверсифицированного симметричного ключа типа CKK_GOST28147 из
существующего по алгоритму, описанному в RFC 4357.
Механизм в качестве параметра принимает массив байтов длиной 8 байт, который представляет
собой значение ukm (см. RFC 4357 http://www.ietf.org/rfc/rfc4357.txt). Если параметр не был
Механизм CKM_KDF_GOSTR3411_2012_256
Механизм получения диверсифицированного симметричного ключа типа CKK_GOST28147 из
существующего по алгоритму, описанному в документе Рекомендации по стандартизации Р
50.1.113-2016 http://www.tc26.ru/standard/rs/%D0%A0%2050.1.113-2016.pdf, раздел 4.4.
Механизм CKM_KDF_GOSTR3411_EXPORT
Механизм получения диверсифицированного симметричного ключа типа CKK_GOST28147 из
существующего по алгоритму, описанному в документе Рекомендации по стандартизации Р
50.1.113-2016 http://www.tc26.ru/standard/rs/%D0%A0%2050.1.113-2016.pdf, раздел 4.6.
Механизм в качестве параметра принимает массив байтов, который представляет собой значение
seed (см. Рекомендации по стандартизации Р 50.1.113-2016
http://www.tc26.ru/standard/rs/%D0%A0%2050.1.113-2016.pdf, раздел 4.6).
C_WrapKey
CK_DEFINE_FUNCTION(CK_RV, C_WrapKey)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hWrappingKey,
CK_OBJECT_HANDLE hKey,
CK_BYTE_PTR pWrappedKey,
CK_ULONG_PTR pulWrappedKeyLen
);
Механизм CKM_GOST28147_KEY_WRAP
Это механизм шифрования симметричного ключа типа CKK_GOST28147 с помощью симметричного
ключа типа CKK_GOST28147. Результатом работы является последовательность длиной 36 байт, где
первые 32 байта — зашифрованный симметричный ключ, последние 4 байта — имитовставка
(MAC).
Как hWrappingKey, так и hKey должны быть типа CKK_GOST28147, в противном случае функция
возвращает ошибку CKR_WRAPPING_KEY_TYPE_INCONSISTENT или CKR_KEY_TYPE_INCONSISTENT
соответственно. Кроме того, ключ hWrappingKey должен иметь атрибут CKA_WRAP со значением
TRUE.
hWrappingKey должен содержать открытый ключ принимающей стороны типа CKK_GOSTR3410, hKey
должен быть типа CKK_GOST28147, в противном случае функция возвращает ошибку
CKR_WRAPPING_KEY_TYPE_INCONSISTENT или CKR_KEY_TYPE_INCONSISTENT соответственно. Кроме
того, ключ hWrappingKey должен иметь атрибут CKA_WRAP со значением TRUE.
Где:
ulWrapOIDLen — длина pWrapOID, должен быть равен 0, если pWrapOID равен NULL;
Если вектор во время C_WrapKey равен NULL, то будет сгенерирован и использован случайный
вектор.
Если вектор во время C_WrapKey не равен NULL, то вектор будет сравнён с ukm, записанным в
зашифрованный блоб с ключом.
ulUKMLen — длина pUKM; если pWrapOID равен NULL, должен быть равен 0.
hKey — хэндл закрытого ключа отправителя для C_WrapKey, хэндл закрытого ключа
принимающей стороны для C_UnwrapKey. Если в hKey для C_WrapKey был передан
CK_INVALID_HANDLE, то будет сгенерирована и использована эфемерная ключевая пара.
Механизм CKM_MAGMA_WRAP_PKCS8
Механизм CKM_MAGMA_WRAP_PKCS8 используется для экспорта и импорта ключей в соответствии с
документом технического комитета по стандартизации «Криптографическая защита информации»
(ТК 26) «Транспортный ключевой контейнер. Дополнения к PKCS#8 и PKCS#12».
C_UnwrapKey
CK_DEFINE_FUNCTION(CK_RV, C_UnwrapKey)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hUnwrappingKey,
CK_BYTE_PTR pWrappedKey,
CK_ULONG ulWrappedKeyLen,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulAttributeCount,
CK_OBJECT_HANDLE_PTR phKey
);
Механизм CKM_GOST28147_KEY_WRAP
hUnwrappingKey должен быть типа CKK_GOST28147, в противном случае функция возвращает
ошибку CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT. Кроме того, ключ hUnwrappingKey должен иметь
атрибут CKA_UNWRAP со значением TRUE.
Механизм CKM_MAGMA_WRAP_PKCS8
Механизм импорта асимметричных ключей с использованием симметричного ключа по алгоритму
ГОСТ 28147-89. Импортировать можно ключи CKK_GOSTR3410 и CKK_GOSTR3410_512. Ключ, на
котором происходит импорт, должен иметь тип CKK_GOST28147 и атрибут CKA_UNWRAP со значением
TRUE.
C_EncryptInit
CK_DEFINE_FUNCTION(CK_RV, C_EncryptInit)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey
);
CKM_GOST28147_ECB;
CKM_GOST28147.
C_EncryptUpdate
CK_DEFINE_FUNCTION(CK_RV, C_EncryptUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen,
CK_BYTE_PTR pEncryptedPart,
CK_ULONG_PTR pulEncryptedPartLen
);
Входные параметры:
Выходные параметры:
pEncryptedPart — шифротекст;
Выходные параметры:
Пример:
#define PLAINTEXT_BUF_SZ 200
#define CIPHERTEXT_BUF_SZ 256
CK_ULONG firstPieceLen, secondPieceLen;
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hKey;
CK_BYTE iv[8];
CK_MECHANISM mechanism = {
CKM_GOST28147, iv, sizeof(iv)
};
CK_BYTE data[PLAINTEXT_BUF_SZ];
CK_BYTE encryptedData[CIPHERTEXT_BUF_SZ];
CK_ULONG ulEncryptedData1Len;
CK_ULONG ulEncryptedData2Len;
CK_ULONG ulEncryptedData3Len;
CK_RV rv;
.
.
firstPieceLen = 90;
secondPieceLen = PLAINTEXT_BUF_SZ-firstPieceLen;
rv = C_EncryptInit(hSession, &mechanism, hKey);
if (rv == CKR_OK) {
/* Encrypt first piece */
ulEncryptedData1Len = sizeof(encryptedData);
rv = C_EncryptUpdate(
C_Encrypt
CK_DEFINE_FUNCTION(CK_RV, C_Encrypt)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData,
CK_ULONG ulDataLen,
CK_BYTE_PTR pEncryptedData,
CK_ULONG_PTR pulEncryptedDataLen
);
Входные параметры:
pEncryptedData — шифротекст;
C_DecryptInit
CK_DEFINE_FUNCTION(CK_RV, C_DecryptInit)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey
);
C_DecryptUpdate
CK_DEFINE_FUNCTION(CK_RV, C_DecryptUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pEncryptedPart,
CK_ULONG ulEncryptedPartLen,
CK_BYTE_PTR pPart,
CK_ULONG_PTR pulPartLen
);
Входные параметры:
pEncryptedPart — шифротекст;
Выходные параметры:
C_DecryptFinal
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pLastPart,
CK_ULONG_PTR pulLastPartLen
);
Выходные параметры:
Входные параметры:
pEncryptedData — шифротекст;
Выходные параметры:
C_DigestInit
CK_DEFINE_FUNCTION(CK_RV, C_DigestInit)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism
);
CKM_GOSTR3411.
CKM_GOSTR3411_12_256.
CKM_GOSTR3411_12_512.
Входные параметры:
C_DigestKey
CK_DEFINE_FUNCTION(CK_RV, C_DigestKey)(
CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE hKey
);
Функция C_DigestKey выполняет хэширование очередной порции данных, где в качестве таких
данных выступают значения секретного ключа hKey. Перед вызовом функции C_DigestKey должна
быть проведена инициализация процедуры хэширования с помощью функции C_DigestInit (на
стр. 88).
Входные параметры:
Пример:
CK_SESSION_HANDLE hSession;
CK_MECHANISM mechanism = {
CKM_GOST3411, NULL_PTR, 0
};
CK_BYTE data[] = {...};
CK_BYTE digest[32];
CK_ULONG ulDigestLen;
CK_RV rv;
.
.
rv = C_DigestInit(hSession, &mechanism);
if (rv != CKR_OK) {
.
.
}
rv = C_DigestUpdate(hSession, data, sizeof(data));
if (rv != CKR_OK) {
.
.
}
rv = C_DigestKey(hSession, hKey);
if (rv != CKR_OK) {
.
.
}
ulDigestLen = sizeof(digest);
rv = C_DigestFinal(hSession, digest, &ulDigestLen);
Функция C_Digest последовательно выполняет C_DigestUpdate (на стр. 89) и C_DigestFinal (на
стр. 90).
Входные параметры:
C_SignInit
CK_DEFINE_FUNCTION(CK_RV, C_SignInit)(
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hKey
);
CKM_GOST28147_MAC;
CKM_GOSTR3411_HMAC;
CKM_GOSTR3410;
CKM_GOSTR3410_WITH_GOSTR3411_12_256;
CKM_GOSTR3410_WITH_GOSTR3411_12_512;
CKM_GOSTR3410_512;
CKM_GOSTR3411_12_256_HMAC;
CKM_GOSTR3411_12_512_HMAC.
C_SignUpdate
CK_DEFINE_FUNCTION(CK_RV, C_SignUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen
);
Входные параметры:
C_SignFinal
CK_DEFINE_FUNCTION(CK_RV, C_SignFinal)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pSignature,
CK_ULONG_PTR pulSignatureLen
);
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hKey;
CK_MECHANISM mechanism = {
CKM_GOST28147_MAC, NULL_PTR, 0
};
CK_BYTE data[] = {...};
CK_BYTE mac[4];
CK_ULONG ulMacLen;
CK_RV rv;
.
C_Sign
CK_DEFINE_FUNCTION(CK_RV, C_Sign)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pData,
CK_ULONG ulDataLen,
CK_BYTE_PTR pSignature,
CK_ULONG_PTR pulSignatureLen
);
Функция C_Sign последовательно выполняет C_SignUpdate (на стр. 93) и C_SignFinal (на стр. 94).
Входные параметры:
C_VerifyInit
CK_DEFINE_FUNCTION(CK_RV, C_VerifyInit)(
C_VerifyUpdate
CK_DEFINE_FUNCTION(CK_RV, C_VerifyUpdate)(
CK_SESSION_HANDLE hSession,
CK_BYTE_PTR pPart,
CK_ULONG ulPartLen
);
Входные параметры:
Входные параметры:
Пример:
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hKey;
CK_MECHANISM mechanism = {
CKM_GOST28147_MAC, NULL_PTR, 0
};
CK_BYTE data[] = {...};
CK_BYTE mac[4];
CK_RV rv;
.
.
rv = C_VerifyInit(hSession, &mechanism, hKey);
if (rv == CKR_OK) {
rv = C_VerifyUpdate(hSession, data, sizeof(data));
.
.
rv = C_VerifyFinal(hSession, mac, sizeof(mac));
.
.
}
C_Verify
CK_DEFINE_FUNCTION(CK_RV, C_Verify)(
CK_SESSION_HANDLE hSession,
Функция C_Verify последовательно выполняет C_VerifyUpdate (на стр. 96) и C_VerifyFinal (на
стр. 97).
Входные параметры:
C_GetFunctionListEx
CK_RV C_GetFunctionListEx(CK_FUNCTION_LIST_EX_PTR_PTR ppFunctionList)
Пример:
CK_FUNCTION_LIST_EX_PTR pFunctionListEx;
CK_C_UpdateTokenList pC_UpdateTokenList;
const char* label = “test label”;
CK_RV rv;
CK_SLOT_ID newSlot = 8888;
/* It’s OK to call C_GetFunctionListEx before calling C_Initialize */
rv = C_GetFunctionListEx(&pFunctionListEx);
assert(rv == CKR_OK);
rv = C_Initialize(NULL);
assert(rv == CKR_OK);
pC_UpdateTokenList = pFunctionList -> C_CreateToken;
/* Call the C_CreateToken() function in the library */
rv = (*C_CreateToken ())(newSlot, (CK_UTF8CHAR_PTR)label, strlen(label));
Параметры:
C_DettachToken
СK_RV C_DettachToken(CK_SLOT_ID slotID)
Эмулирует изъятие токена из слота. Если токен изъят, при попытке открытия сессии на данном
номере слота или попытке получения информации о токене будет возвращена ошибка
CKR_TOKEN_NOT_PRESENT.
Параметры:
Пример:
CK_SLOT_ID slotID;
CK_SESSION_HANDLE hSession;
CK_RV rv;
.
.
/* Detach token */
rv = C_DettachToken(slotID);
assert(rv == CKR_OK);
/* Can not open session on detached token */
rv = C_OpenSession( slotID, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL,
&hSession );
assert(rv == CKR_TOKEN_NOT_PRESENT);
.
.
/* Attach token */
rv = C_AttachToken(slotID);
assert(rv == CKR_OK);
rv = C_OpenSession( slotID, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL,
&hSession );
assert(rv == CKR_OK);
Параметры:
C_RemoveToken
CK_RV C_RemoveToken(CK_SLOT_ID slotID)
Параметры:
Пример:
CK_SLOT_ID slotID;
CK_MECHANISM_INFO info;
CK_ULONG ulSlotCount;
CK_RV rv;
.
.
/* Create new slot-token */
rv = C_CreateToken(slotID);
if(rv == CKR_OK)
{
...
C_CheckLicenseInfo
CK_RV C_CheckLicenseInfo(CK_VOID_PTR pContext)
Пример:
CK_RV rv;
.
.
/* Create new slot-token */
rv = C_CheckLicenseInfo(NULL);
if (rv != CKR_OK && rv == CKR_INVALID_LICENSE)
{
...
}
C_ReglamentInspection
CK_RV C_ReglamentInspection(CK_SLOT_ID slotID)
Параметры:
C_GetFunctionStatus;
C_CancelFunction;
C_DigestEncryptUpdate;
C_DecryptDigestUpdate;
C_SignEncryptUpdate;
C_DecryptVerifyUpdate;
C_SignRecoverInit;
C_SignRecover;
C_VerifyRecoverInit;
C_VerifyRecover;
C_SeedRandom.
CKA_CLASS = CKO_PRIVATE_KEY
Private CKM_GOSTR3410_KEY_P CKA_PRIVATE = CK_TRUE
C_GenerateKeyPair
key AIR_GEN CKA_KEY_TYPE =
CKK_GOSTR3410
CKA_CLASS = CKO_PUBLIC_KEY
CKM_GOSTR3410_KEY_P CKA_PRIVATE = CK_FALSE
Public key C_GenerateKeyPair
AIR_GEN CKA_KEY_TYPE =
CKK_GOSTR3410
CKA_CLASS = CKO_SECRET_KEY
CKM_GOST28147_KEY_G CKA_PRIVATE = CK_TRUE
Secret key C_GenerateKey
EN CKA_KEY_TYPE =
CKK_GOST28147
CKA_CLASS = CKO_SECRET_KEY
CKM_GOST28147_KEY_W CKA_PRIVATE = CK_TRUE
Secret key C_UnwrapKey
RAP CKA_KEY_TYPE =
CKK_GOST28147
CKA_CLASS = CKO_SECRET_KEY
CKM_GOSTR3410_DERIV CKA_PRIVATE = CK_TRUE
Secret key C_DeriveKey
E CKA_KEY_TYPE =
CKK_GOST28147
Public key
C_CreateObject CKA_PRIVATE = CK_FALSE
Certificate
Secret
key,
C_CreateObject CKA_PRIVATE = CK_TRUE
Private
key
Указатель
C_GetAttributeValue - 55
C_GetFunctionList - 31
C_GetFunctionListEx - 100
C_GetInfo - 31, 34
C_GetMechanismInfo - 36
C C_GetMechanismList - 36
C_GetObjectSize - 55, 58
C_AttachToken - 100 C_GetSessionInfo - 46
C_CheckLicenseInfo - 100 C_GetSlotInfo - 36
C_CloseAllSessions - 46 C_GetSlotList - 36
C_CloseSession - 46, 47 C_GetTokenInfo - 36, 38
C_CopyObject - 55 C_Initialize - 28, 31
C_CreateObject - 55 C_InitPIN - 43
C_CreateToken - 100 C_InitToken - 43
C_Decrypt - 81 C_Login - 46
C_DecryptFinal - 81, 88 C_Logout - 46, 49
C_DecryptInit - 81, 86 C_OpenSession - 46
C_DecryptUpdate - 81, 88 C_RemoveToken - 100, 102
C_DeriveKey - 64 C_SetAttributeValue - 55, 65, 105
C_DestroyObject - 55 C_SetOperationState - 52
C_DettachToken - 100, 101 C_SetPIN - 43
C_Digest - 89 C_Sign - 93
C_DigestFinal - 89, 92 C_SignFinal - 93, 96
C_DigestInit - 89, 90 C_SignInit - 93, 94, 97
C_DigestKey - 89 C_SignUpdate - 93, 96
C_DigestUpdate - 89, 92 C_UnwrapKey - 64
C_Encrypt - 81 C_Verify - 93
C_EncryptFinal - 81, 84 C_VerifyFinal - 93, 99
C_EncryptInit - 81, 82, 85 C_VerifyInit - 93, 97
C_EncryptUpdate - 81, 84 C_VerifyUpdate - 93, 99
C_Finalize - 31 C_WaitForSlotEvent - 36
C_FindObjects - 55 C_WrapKey - 64, 79
C_FindObjectsFinal - 55, 61, 62
C_FindObjectsInit - 55, 62
C_GenerateKey - 64
C_GenerateKeyPair - 64
М
Механизм CKM_GOST28147_KEY_WRAP - 77
Механизм CKM_GOSTR3410_12_DERIVE - 70
Механизм
CKM_GOSTR3410_512_PUBLIC_KEY_DERIVE - 70
Механизм CKM_GOSTR3410_DERIVE - 70
Механизм CKM_GOSTR3410_KEY_WRAP - 77,
80
Механизм
CKM_GOSTR3410_PUBLIC_KEY_DERIVE - 70
Механизм CKM_KDF_4357 - 70
Механизм CKM_KDF_GOSTR3411_2012_256 -
70
Механизм CKM_KDF_GOSTR3411_EXPORT - 70
Механизм CKM_MAGMA_WRAP_PKCS8 - 77
Механизм
CKM_TLS_GOST_KEY_AND_MAC_DERIVE - 70
Механизм
CKM_TLS_GOST_MASTER_KEY_DERIVE - 70
Механизм CKM_TLS_GOST_PRF - 70
О
Особенности использования интерфейса
PKCS#11 - 33
Особенности многопоточного использования
- 26
Ф
Функции расширения интерфейса PKCS#11 -
11