Структуры

CK_C_INITIALIZE_ARGS

Используется функцией C_Initialize().

CK_C_INITIALIZE_ARGS
typedef struct CK_C_INITIALIZE_ARGS {
   CK_CREATEMUTEX CreateMutex;
   CK_DESTROYMUTEX DestroyMutex;
   CK_LOCKMUTEX LockMutex;
   CK_UNLOCKMUTEX UnlockMutex;
   CK_FLAGS flags;
   CK_VOID_PTR pReserved;
} CK_C_INITIALIZE_ARGS;

Поддерживаются флаги (flags), указанные ниже.

  • CKF_LIBRARY_CANT_CREATE_OS_THREADS (0x00000001) – True, если потоки исполнения приложения, которые осуществляют вызовы к библиотеке, не могут использовать родные вызовы операционной системы для создания новых потоков. False – в обратном случае.

  • CKF_OS_LOCKING_OK (0x00000002) – True, если библиотека может использовать родную систему потоков операционной системы для захвата ресурса. False – в противном случае.

  • CKF_DEVELOPER_MODE (0x80000000) – установка этого флага ускоряет выполнение функций: C_Login() и C_Sign()/C_SignUpdate(). Ускорение обеспечивается засчет отключения проверки целостности и корректности функционирования. Рекомендуется использовать только для целей разработки и тестирования.

    Предупреждение

    Данный флаг поддерживается только апплетом Криптотокен.

CK_INFO

Используется функцией C_GetInfo().

CK_INFO
typedef struct CK_INFO {
  CK_VERSION cryptokiVersion;
  CK_UTF8CHAR manufacturerID[32];
  CK_FLAGS flags;
  CK_UTF8CHAR libraryDescription[32];
  CK_VERSION libraryVersion;
} CK_INFO;
CK_VERSION cryptokiVersion

Версия стандарта PKCS #11, с которым совместима библиотека Cryptoki. В текущей версии библиотеки это поле принимает значение v2.30.

CK_UTF8CHAR manufacturerID(32)

Идентификатор, определяющий разработчика библиотеки Cryptoki. Поле идентификатора принимает значение Aladdin R.D..

CK_FLAGS flags

Зарезервированное поле флагов. Должно принимать значение 0.

CK_UTF8CHAR libraryDescription(32)

Описание библиотеки Cryptoki: JaCarta PKCS #11 Module.

CK_VERSION libraryVersion

Версия библиотеки Cryptoki: v1.0.

CK_FUNCTION_LIST

Используется функцией C_GetFunctionList().

CK_FUNCTION_LIST
typedef struct CK_FUNCTION_LIST {
  CK_VERSION version;
  CK_C_Initialize C_Initialize;
  CK_C_Finalize C_Finalize;
  CK_C_GetInfo C_GetInfo;
  CK_C_GetFunctionList C_GetFunctionList;
  CK_C_GetSlotList C_GetSlotList;
  CK_C_GetSlotInfo C_GetSlotInfo;
  CK_C_GetTokenInfo C_GetTokenInfo;
  CK_C_GetMechanismList C_GetMechanismList;
  CK_C_GetMechanismInfo C_GetMechanismInfo;
  CK_C_InitToken C_InitToken;
  CK_C_InitPIN C_InitPIN;
  CK_C_SetPIN C_SetPIN;
  CK_C_OpenSession C_OpenSession;
  CK_C_CloseSession C_CloseSession;
  CK_C_CloseAllSessions C_CloseAllSessions;
  CK_C_GetSessionInfo C_GetSessionInfo;
  CK_C_GetOperationState C_GetOperationState;
  CK_C_SetOperationState C_SetOperationState;
  CK_C_Login C_Login;
  CK_C_Logout C_Logout;
  CK_C_CreateObject C_CreateObject;
  CK_C_CopyObject C_CopyObject;
  CK_C_DestroyObject C_DestroyObject;
  CK_C_GetObjectSize C_GetObjectSize;
  CK_C_GetAttributeValue C_GetAttributeValue;
  CK_C_SetAttributeValue C_SetAttributeValue;
  CK_C_FindObjectsInit C_FindObjectsInit;
  CK_C_FindObjects C_FindObjects;
  CK_C_FindObjectsFinal C_FindObjectsFinal;
  CK_C_EncryptInit C_EncryptInit;
  CK_C_Encrypt C_Encrypt;
  CK_C_EncryptUpdate C_EncryptUpdate;
  CK_C_EncryptFinal C_EncryptFinal;
  CK_C_DecryptInit C_DecryptInit;
  CK_C_Decrypt C_Decrypt;
  CK_C_DecryptUpdate C_DecryptUpdate;
  CK_C_DecryptFinal C_DecryptFinal;
  CK_C_DigestInit C_DigestInit;
  CK_C_Digest C_Digest;
  CK_C_DigestUpdate C_DigestUpdate;
  CK_C_DigestKey C_DigestKey;
  CK_C_DigestFinal C_DigestFinal;
  CK_C_SignInit C_SignInit;
  CK_C_Sign C_Sign;
  CK_C_SignUpdate C_SignUpdate;
  CK_C_SignFinal C_SignFinal;
  CK_C_SignRecoverInit C_SignRecoverInit;
  CK_C_SignRecover C_SignRecover;
  CK_C_VerifyInit C_VerifyInit;
  CK_C_Verify C_Verify;
  CK_C_VerifyUpdate C_VerifyUpdate;
  CK_C_VerifyFinal C_VerifyFinal;
  CK_C_VerifyRecoverInit C_VerifyRecoverInit;
  CK_C_VerifyRecover C_VerifyRecover;
  CK_C_DigestEncryptUpdate C_DigestEncryptUpdate;
  CK_C_DecryptDigestUpdate C_DecryptDigestUpdate;
  CK_C_SignEncryptUpdate C_SignEncryptUpdate;
  CK_C_DecryptVerifyUpdate C_DecryptVerifyUpdate;
  CK_C_GenerateKey C_GenerateKey;
  CK_C_GenerateKeyPair C_GenerateKeyPair;
  CK_C_WrapKey C_WrapKey;
  CK_C_UnwrapKey C_UnwrapKey;
  CK_C_DeriveKey C_DeriveKey;
  CK_C_SeedRandom C_SeedRandom;
  CK_C_GenerateRandom C_GenerateRandom;
  CK_C_GetFunctionStatus C_GetFunctionStatus;
  CK_C_CancelFunction C_CancelFunction;
  CK_C_WaitForSlotEvent C_WaitForSlotEvent;
} CK_FUNCTION_LIST;

Структура содержит указатели на все методы Cryptoki API.

CK_ATTRIBUTE

Используется функциями:

CK_ATTRIBUTE
typedef struct CK_ATTRIBUTE {
  CK_ATTRIBUTE_TYPE type;
  CK_VOID_PTR pValue;
  CK_ULONG ulValueLen;
} CK_ATTRIBUTE;
CK_ATTRIBUTE_TYPE type

Тип атрибута.

CK_VOID_PTR pValue

Значение атрибута.

CK_ULONG ulValueLen

Размер значения.

CK_MECHANISM

Используется функциями:

CK_MECHANISM
typedef struct CK_MECHANISM {
  CK_MECHANISM_TYPE mechanism;
  CK_VOID_PTR pParameter;
  CK_ULONG ulParameterLen;
} CK_MECHANISM;
CK_MECHANISM_TYPE mechanism

Тип механизма.

CK_VOID_PTR pParameter

Указатель на параметр, если требуется.

CK_ULONG ulParameterLen

Размер параметра в байтах.

CK_MECHANISM_INFO

Используется функцией C_GetMechanismInfo().

CK_MECHANISM_INFO
typedef struct CK_MECHANISM_INFO {
   CK_ULONG ulMinKeySize;
   CK_ULONG ulMaxKeySize;
   CK_FLAGS flags;
} CK_MECHANISM_INFO;
CK_ULONG ulMinKeySize

Минимальный размер ключа для механизма.

CK_ULONG ulMaxKeySize

Максимальный размер ключа для механизма.

CK_FLAGS flags

Флаги, определяющие возможности механизма.

Поддерживаются флаги (flags), указанные ниже.

  • CKF_HW (0x00000001) – аппаратно реализуемый механизм.
  • CKF_ENCRYPT (0x00000100) – механизм зашифрования данных.
  • CKF_DECRYPT (0x00000200) – механизм расшифрования данных.
  • CKF_DIGEST (0x00000400) – механизм хэширования.
  • CKF_SIGN (0x00000800) – механизм формирования ЭП и имитовставки.
  • CKF_SIGN_RECOVER (0x00001000) – для поддерживаемых библиотекой Cryptoki механизмов этот флаг не установлен.
  • CKF_VERIFY (0x00002000) – механизм проверки ЭП и имитовставки.
  • CKF_VERIFY_RECOVER (0x00004000) – для поддерживаемых библиотекой Cryptoki механизмов этот флаг не установлен.
  • CKF_GENERATE (0x00008000) – механизм выработки симметричных ключей.
  • CKF_GENERATE_KEY_PAIR (0x00010000) – механизм генерации ключевой пары.
  • CKF_WRAP (0x00020000) – механизм экспорта симметричных ключей.
  • CKF_UNWRAP (0x00040000) – механизм импорта зашифрованных криптографических ключей.
  • CKF_DERIVE (0x00080000) – механизм выработки общего ключа.
  • CKF_EXTENSION (0x80000000) – для поддерживаемых библиотекой Cryptoki механизмов этот флаг не установлен.

CK_SLOT_INFO

Используется функцией C_GetSlotInfo().

CK_SLOT_INFO
typedef struct CK_SLOT_INFO {
   CK_UTF8CHAR slotDescription[64];
   CK_UTF8CHAR manufacturerID[32];
   CK_FLAGS flags;
   CK_VERSION  hardwareVersion;
   CK_VERSION firmwareVersion;
} CK_SLOT_INFO;
CK_UTF8CHAR slotDescription(64)

Строка символов с описанием слота.

CK_UTF8CHAR manufacturerID(32)

Идентификатор, определяющий разработчика библиотеки Cryptoki. Поле идентификатора принимает значение Aladdin R.D..

CK_FLAGS flags

Битовые флаги, определяющие возможности и состояние устройства.

CK_VERSION hardwareVersion

Номер аппаратной версии слота.

CK_VERSION firmwareVersion

Номер версии прошивки слота.

Поддерживаются флаги (flags), указанные ниже.

  • CKF_TOKEN_PRESENT (0x00000001) – True, если в слоте наличествует токен.
  • CKF_REMOVABLE_DEVICE (0x00000002) – True, если ридер поддерживает извлекаемые устройства.
  • CKF_HW_SLOT (0x00000004) – True, если слот аппаратный.

CK_TOKEN_INFO

Используется функцией C_GetTokenInfo().

CK_TOKEN_INFO
typedef struct CK_TOKEN_INFO {
   CK_UTF8CHAR label[32];
   CK_UTF8CHAR manufacturerID[32];
   CK_UTF8CHAR model[16];
   CK_CHAR serialNumber[16];
   CK_FLAGS flags;
   CK_ULONG ulMaxSessionCount;
   CK_ULONG ulSessionCount;
   CK_ULONG ulMaxRwSessionCount;
   CK_ULONG ulRwSessionCount;
   CK_ULONG ulMaxPinLen;
   CK_ULONG ulMinPinLen;
   CK_ULONG ulTotalPublicMemory;
   CK_ULONG ulFreePublicMemory;
   CK_ULONG ulTotalPrivateMemory;
   CK_ULONG ulFreePrivateMemory;
   CK_VERSION hardwareVersion;
   CK_VERSION firmwareVersion;
   CK_CHAR utcTime[16];
} CK_TOKEN_INFO;
CK_UTF8CHAR label(32)

Назначаемая приложением метка токена. Присваивается в момент инициализации.

CK_UTF8CHAR manufacturerID(32)

Идентификатор, определяющий разработчика библиотеки Cryptoki. Поле идентификатора принимает значение Aladdin R.D..

CK_UTF8CHAR model(16)

Модель устройства. Для поддерживаемых Cryptoki-библиотекой апплетов/устройств это поле принимает следующие значения:

  • eToken GOST для апплета Криптотокен;
  • JaCarta Laser для апплета Laser;
  • JaCarta для апплета Laser в случае, если он инициализирован с использованием Единого клиента JaCarta;
  • CNS для апплета Laser в случае, если он инициализирован с использованием стороннего ПО.
CK_CHAR serialNumber(16)

Серийный номер.

CK_FLAGS flags

Битовые флаги, определяющие возможности и состояние устройства.

CK_ULONG ulMaxSessionCount

Максимальное количество сеансов работы одного приложения с устройством. Для поддерживаемых Cryptoki-библиотекой устройств это поле принимает предусмотренное стандартом PKCS #11 значение CK_EFFECTIVELY_INFINITE.

CK_ULONG ulSessionCount

Количество открытых сеансов работы данного приложения с устройством. Для поддерживаемых Cryptoki-библиотекой устройств это поле принимает предусмотренное стандартом PKCS #11 значение CK_UNAVAILABLE_INFORMATION.

CK_ULONG ulMaxRwSessionCount

Максимальное количество сеансов одного приложения для чтения и записи в устройство. Для поддерживаемых Cryptoki-библиотекой устройств это поле принимает предусмотренное стандартом PKCS #11 значение CK_EFFECTIVELY_INFINITE.

CK_ULONG ulRwSessionCount

Количество открытых в данный момент данным приложением сеансов для чтения и записи. Для поддерживаемых Cryptoki-библиотекой устройств это поле принимает предусмотренное стандартом PKCS #11 значение CK_UNAVAILABLE_INFORMATION.

CK_ULONG ulMaxPinLen

Максимальная длина PIN-кода в байтах. Для поддерживаемых Cryptoki-библиотекой устройств это поле может принимать значение 16 или 32 в зависимости от апплета.

CK_ULONG ulMinPinLen

Минимальная длина PIN-кода в байтах. Для поддерживаемых Cryptoki-библиотеки устройств это поле может принимать значение 4 или 6 в зависимости от апплета.

CK_ULONG ulTotalPublicMemory

Согласно стандарту PKCS #11 в это поле должен записываться общий размер памяти, который может быть выделен для хранения публичных объектов. В поддерживаемых Cryptoki-библиотекой устройствах для хранения публичных и приватных объектов используется одна и та же память. Текущая версия модуля присваивает этому полю предусмотренное стандартом PKCS #11 значение CK_UNAVAILABLE_INFORMATION.

CK_ULONG ulFreePublicMemory

Согласно стандарту PKCS #11 в это поле должен записываться размер памяти, доступной для хранения публичных объектов. В поддерживаемых Cryptoki-библиотекой устройствах для хранения публичных и приватных объектов используется одна и та же память. Поэтому в данное поле записывается количество байтов памяти, доступной как для приватных, так и для публичных объектов. При этом, если размер доступной памяти больше 32 КБ, поле принимает значение 32767.

CK_ULONG ulTotalPrivateMemory

Согласно стандарту PKCS #11, в это поле должен записываться общий размер памяти, которая может быть выделена для хранения приватных объектов. В поддерживаемых Cryptoki-библиотекой устройствах для хранения открытых и приватных объектов используется одна и та же память. Текущая версия модуля присваивает этому полю предусмотренное стандартом PKCS #11 значение CK_UNAVAILABLE_INFORMATION.

CK_ULONG ulFreePrivateMemory

Согласно стандарту PKCS #11, в это поле должен записываться размер памяти, доступной для хранения приватных объектов. В поддерживаемых Cryptoki-библиотекой устройствах для хранения публичных и приватных объектов используется одна и та же память. Поэтому в данное поле записывается количество байтов памяти, доступной как для приватных, так и для публичных объектов. При этом, если размер доступной памяти больше 32 КБ, поле принимает значение 32767.

CK_VERSION hardwareVersion

Номер версии устройства.

CK_VERSION firmwareVersion

Номер версии прошивки.

CK_CHAR utcTime(16)

Поддерживаемые Cryptoki-библиотекой устройства не содержат встроенных часов. Поле заполняется нулями.

Поддерживаются флаги (flags), указанные ниже.

  • CKF_RNG (0x00000001) – флаг установлен, если в токене присутствует встроенный генератор случайных чисел. Всегда установлен.
  • CKF_WRITE_PROTECTED (0x00000001) – флаг установлен, когда устройство работает в гостевом режиме, и не установлен, когда устройство работает в режимах, требующих ввода PIN-кода.
  • CKF_LOGIN_REQIURED (0x00000004) – флаг установлен, если выполнение некоторых криптографических функций требует, чтобы пользователь был залогинен. Всегда установлен.
  • CKF_USER_PIN_INITIALIZED (0x00000008) – флаг установлен, если инициализирован PIN-код пользователя, и не установлен в противном случае.
  • CKF_RESTORE_KEY_NOT_NEEDED (0x00000020) – установлен, если успешное сохранение состояния криптографических операций сеанса всегда содержит все ключи, необходимые для восстановления сессии. Всегда неустановлен.
  • CKF_CLOCK_ON_TOKEN (0x00000040) – флаг установлен, если в токене присутствуют встроенные аппаратные часы. Всегда неустановлен.
  • CKF_PROTECTED_AUTHENTICATION_PATH (0x00000100) – установлен, если токен поддерживает возможность аутентификации без ввода PIN-кода. Всегда неустановлен.
  • CKF_DUAL_CRYPTO_OPERATIONS (0x00000200) – флаг установлен, если токен поддерживает выполнение двух криптографических функций одновременно. Всегда неустановлен.
  • CKF_TOKEN_INITIALIZED (0x00000400) – установлен, если токен был инициализирован функцией C_InitToken(). Всегда установлен.
  • CKF_SECONDARY_AUTHENTICATION (0x00000800) – флаг установлен, если токен поддерживает вторичную аутентификацию для приватных объектов ключей. Всегда неустановлен.
  • CKF_USER_PIN_COUNT_LOW (0x00010000) – флаг установлен, если со времени последней успешной попытки ввода PIN-кода пользователя была предпринята, по меньшей мере, одна неудачная попытка ввода этого PIN-кода, и не установлен в противном случае.
  • CKF_USER_PIN_FINAL_TRY (0x00020000) – флаг установлен, если у пользователя осталась последняя попытка ввода PIN-кода, и не установлен в других случаях.
  • CKF_USER_PIN_LOCKED (0x00040000) – флаг установлен, если PIN-код пользователя заблокирован, и не установлен, если PIN-код пользователя не заблокирован.
  • CKF_USER_PIN_TO_BE_CHANGED (0x00080000) – установлен, если PIN-код пользователя установлен по умолчанию при инициализации или срок его действия истек, т.е. PIN-код необходимо изменить. Всегда неустановлен.
  • CKF_SO_PIN_COUNT_LOW (0x00100000) – флаг установлен, если со времени последней успешной попытки ввода PIN-кода администратора была предпринята, по меньшей мере, одна неудачная попытка ввода этого PIN-кода, и не установлен в противном случае.
  • CKF_SO_PIN_FINAL_TRY (0x00200000) – флаг установлен, если у администратора осталась последняя попытка ввода PIN-кода, и не установлен в других случаях.
  • CKF_SO_PIN_LOCKED (0x00400000) – флаг установлен, если PIN-код администратора заблокирован, и не установлен в противном случае.
  • CKF_SO_PIN_TO_BE_CHANGED (0x00800000) – установлен, если PIN-код администратора установлен по умолчанию при инициализации или срок его действия истек, т.е. PIN-код необходимо изменить. Всегда неустановлен.
  • CKF_ERROR_STATE (0x01000000) – установлен, если токен не прошел самопроверку FIPS 140-2 и находится в состоянии ошибки. Всегда неустановлен.

CK_SESSION_INFO

Используется функцией C_GetSessionInfo().

CK_SESSION_INFO
typedef struct CK_SESSION_INFO {
  CK_SLOT_ID slotID;
  CK_STATE state;
  CK_FLAGS flags;
  CK_ULONG ulDeviceError;
} CK_SESSION_INFO;
CK_SLOT_ID slotID

Идентификатор слота.

CK_STATE state

Состояние сеанса.

CK_FLAGS flags

Флаги, определяющие тип сессии.

CK_ULONG ulDeviceError

Код ошибки, определяемый криптографическим устройством. Не поддерживается.

Поддерживаются флаги (flags), указанные ниже.

  • CKF_RW_SESSION (0x00000002) – установлен, если сеанс поддерживает и чтение, и запись. Не установлен, если сеанс поддерживает только чтение.
  • CKF_SERIAL_SESSION (0x00000004) – этот флаг добавлен для обратной совместимости и должен быть всегда установлен.

CK_GOSTR3410_DERIVE_PARAMS

Используется функцией C_GenerateKey().

CK_GOSTR3410_DERIVE_PARAMS
typedef struct CK_GOSTR3410_DERIVE_PARAMS {
  CK_EC_KDF_TYPE     kdf;
  CK_BYTE_PTR        pPublicData;
  CK_ULONG           ulPublicDataLen;
  CK_BYTE_PTR        pUKM;
  CK_ULONG           ulUKMLen;
} CK_GOSTR3410_DERIVE_PARAMS;
kdf

Идентификатор используемой диверсификации ключа.

pPublicData

указатель на буфер, содержащий ключ проверки ЭП получателя. Ключ представлен в виде последовательной записи координат точки X и Y. Каждая координата представляет собой вектор длиной 32 байта в порядке от младшего к старшему (little-endian).

ulPublicDataLen

Длина буфера, содержащего открытый ключ получателя. Указывается в байтах, должна равняться 64.

pUKM

Указатель на буфер, содержащий параметр UKM (RFC 4357) в представлении от младшего к старшему (little-endian).

ulUKMLen

Длина буфера, содержащего UKM. Указывается в байтах, должна равняться 8.

Поле kdf может принимать следующие параметры:

  • CKD_NULL – общий ключ выводится по алгоритму, описанному в подразделе 5.2 RFC 4357;
  • CKD_CPDIVERSIFY_KDF – при выводе общего ключа сначала применяется алгоритм, описанный в подразделе 5.2 RFC 4357, а затем результат выполнения этого алгоритма подвергается диверсификации по алгоритму, описанному в подразделе 6.5 того же документа.