...
Code Block | ||||
---|---|---|---|---|
| ||||
CK_SLOT_ID slotID; // идентификатор слота CK_TOKEN_INFO_EXTENDED ckTokenInfoEx; // структура расширенных данных токена CK_RV rv; rv; // вспомогательная переменная для хранения кода возврата . . ckTokenInfoEx.ulSizeofThisStructure = sizeof(CK_TOKEN_INFO_EXTENDED); // размер структуры CK_TOKEN_INFO_EXTENDED rv = pfGetFunctionListEx -> C_EX_GetTokenInfoExtended(slotID, &ckTokenInfoEx); // получение расширенной информации о токене if (rv == CKR_OK) // проверка результата printf ("Getting Extended Token Info -> OK \n"); else printf ("Getting Extended Token Info -> Failed \n"); |
...
Code Block | ||||
---|---|---|---|---|
| ||||
static CK_CHAR USER_PIN[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; // PIN-код Пользователя Рутокен по умолчанию static CK_CHAR SO_PIN[] = {'8', '7', '6', '5', '4', '3', '2', '1'}; // PIN-код Администратора Рутокен по умолчанию CK_FUNCTION_LIST_PTR pFunctionList; // указатель на структуру CK_FUNCTION_LIST, в которой хранится список стандартных функций CK_C_EX_GetFunctionList pfGetFunctionList; // указатель на функцию C_GetFunctionList CK_SLOT_ID slots[100]; // массив идентификаторов слотов CK_ULONG ulSlotCount = 100; // количество идентификаторов слотов в массиве CK_RUTOKEN_INIT_PARAM ckRtInitParams; // структура, задающая параметры форматирования токена CK_RV rv; // вспомогательная переменная для хранения кода возврата //* заполнение полей структуры CK_RUTOKEN_INIT_PARAM */ ckRtInitParams.ulSizeofThisStructure = sizeof(CK_RUTOKEN_INIT_PARAM); // задаем размер структуры ckRtInitParams.UseRepairMode = 0; // требуем ввод PIN-кода Администратора (0 - да, режим восстановления выключен, !0 - нет, режим восстановления включен) ckRtInitParams.pNewAdminPin = SO_PIN; // задаем новый PIN-код Администратора (минимум (?), максимум 32 байта) ckRtInitParams.ulNewAdminPinLen = sizeof(SO_PIN); // указываем длину нового PIN-кода Администратора ckRtInitParams.pNewUserPin = USER_PIN; // задаем новый PIN-код Пользователя (минимум (?), максимум 32 байта) ckRtInitParams.ulNewUserPinLen = sizeof (USER_PIN); // указываем длину нового PIN-кода Пользователя ckRtInitParams.ChangeUserPINPolicy = TOKEN_FLAGS_ADMIN_CHANGE_USER_PIN | TOKEN_FLAGS_USER_CHANGE_USER_PIN; // задаем политику смены PIN-кода пользователя: Администратором и Пользователем ckRtInitParams.ulMinAdminPinLen = 6; // задаем минимальную длину PIN-кода Администратора (минимум 6, максимум 32 байта) ckRtInitParams.ulMinUserPinLen = 6; // задаем минимальную длину PIN-кода Пользователя (минимум 6, максимум 32 байта) ckRtInitParams.ulMaxAdminRetryCount = 10; // задаем максимальное количество попыток доступа к PIN-коду Администратора (минимум 3, максимум 10 байтов) ckRtInitParams.ulMaxUserRetryCount = 10; // задаем максимальное количество попыток доступа к PIN-коду Пользователя (минимум 1, максимум 10 байтов) ckRtInitParams.pTokenLabel = "Rutoken label"; // задаем метку пользователя ckRtInitParams.ulLabelLen = 13; // указываем длину метки пользователя . . pfGetFunctionList = (CK_C_GetFunctionList)GetProcAddress(hModule,"C_GetFunctionList"); //получение списка стандартных функций pfGetFunctionList(&pFunctionList); rv = pfGetFunctionList -> C_GetSlotList(CK_TRUE, slots, &ulSlotCount); // получение списка слотов с подключенными токенами if (rv !== CKR_OK ) // проверка результата printf("Getting connected slots list -> failedOK \n"); else printf("Getting connected slots list -> OKfailed \n"); if (ulSlotCount == 0) printf("No Rutoken is available"); rv = pfGetFunctionListEx -> C_EX_InitToken(slots[0], SO_PIN, sizeof(SO_PIN), &ckRtInitParams); // инициализация токена (считаем, что подключен один токен к первому слоту) if (rv !== CKR_OK) // проверка результата printf("Token initialization -> failedOK \n"); else printf("Token initialization -> OKfailed \n"); |
C_EX_UnblockUserPIN()
...
Code Block | ||||
---|---|---|---|---|
| ||||
CK_SESSION_HANDLE hSession; // дескриптор сессии CK_CHAR ckcNewLabel[100]; // метка длиной 100 символов CK_RV rv; // вспомогательная переменная для хранения кода возврата . . pfGetFunctionList -> C_OpenSession(slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION), 0, 0, &hSession); // открытие сессии pfGetFunctionList -> C_Login(hSession, CKU_USER, USER_PIN, sizeof(USER_PIN)); // авторизация с правами пользователя strcpy ((char *)ckcNewLabel, "Label is set by C_EX_SetTokenName from rtPKCS11ecp.dll"); // определяем имя метки rv = pfGetFunctionList pfLstEx -> C_EX_SetTokenName(hSession, ckcNewLabel, 32); // задаем метку токена if (rv != CKR_OK) // проверка результата printf("Changing of label -> failed \n"); else printf("Changing of label -> OK \n"); . . pfGetFunctionList -> C_Logout(hSession); // выход пользователя pfGetFunctionList -> C_CloseSession(hSession); // закрытие сессии |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
CK_ULONG ckulLicenseNumber = 1; // считаем, что это первая лицензияидентификатор лицензии CK_BYTE ckbLicense[100]; // считаем,массив чтоидентификаторов этого достаточнолицензий CK_ULONG ckulLicenseLen = 0; // длина лицензии . . pfGetFunctionList -> C_OpenSession(slots[0], (CKF_SERIAL_SESSION), 0, 0,&hSession); // открытие сессии pfGetFunctionList -> C_Login(hSession, CKU_SO, SO_PIN, sizeof(SO_PIN)); // авторизация с правами Администратора pfGetFunctionListEx -> C_EX_GetLicense(hSession, ckulLicenseNumber, ckbLicense, &ckulLicenseLen); // считываем текущую лицезиюлицензию // новое значение лицензии: for (CKfor (CK_ULONG ckulIndex=0; ckulIndex < ckulLicenseLen; ckulIndex++) // новое значение лицензии: ckbLicense[ckulIndex] = (72 - ckulIndex); rv = pfLstEx->C_EX_SetLicense(hSession, ckulLicenseNumber, ckbLicense, ckulLicenseLen); // записываем новое значение лицензии if (rv != CKR_OK){ pfLst->C_Logout(hSession); pfLst->C_CloseSession(hSession); pfLst->C_Finalize(NULL_PTR); FreeLibrary(hModule);printf("C_EX_SetLicense() -> failed\n"); else printf("C_EX_SetLicense() failed-> OK\n"); }. . pfGetFunctionList -> C_Logout(hSession); // выход пользователя pfGetFunctionList -> C_CloseSession(hSession); // закрытие сессии |
...
CKR_FUNCTION_NOT_SUPPORTED.
Расширенные коды ошибок.
Примечание
Функция позволяет прочитать лицензию с токена. Функция может быть вызвана из сессии любого состояния. Длина лицензии может иметь единственное значение 72 байта, либо при передаче pLicense равного NULL_PTR в параметре pulLicenseLen возвращается указатель на длину буфера для требуемой лицензии.
...
коды ошибок.
Примечание
Функция позволяет прочитать лицензию с токена. Функция может быть вызвана из сессии любого состояния. Длина лицензии может иметь единственное значение 72 байта, либо при передаче pLicense равного NULL_PTR в параметре pulLicenseLen возвращается указатель на длину буфера для требуемой лицензии.
Пример
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
CK_ULONG ckulLicenseNumber = 1; // идентификатор лицензии
CK_BYTE ckbLicense[100]; // массив идентификаторов лицензий
CK_ULONG ckulLicenseLen = 0; // длина лицензии
.
.
pfGetFunctionList -> C_OpenSession(slots[0], (CKF_SERIAL_SESSION), 0, 0,&hSession); // открытие сессии
rv = pfGetFunctionListEx -> C_EX_GetLicense(hSession, ckulLicenseNumber, ckbLicense, &ckulLicenseLen); // считываем текущую лицензию
if (rv != CKR_OK)
printf("C_EX_GetLicense() -> failed\n");
else
printf("C_EX_GetLicense() -> OK\n");
.
.
pfGetFunctionList -> C_CloseSession(hSession); // закрытие сессии |
C_EX_GetCertificateInfoText()
...
Code Block | ||
---|---|---|
| ||
CK_BYTE Pin[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; // текущий PIN-код Пользователя CK_SLOT_ID slots[100]; // массив идентификаторов слотов . . rv = pfGetFunctionListEx -> C_EX_SetLocalPIN( slots[0], // считаем, что токен подключен к первому слоту Pin, // текущий PIN-код Пользователя arraysize(Pin), // длина текущего PIN-кода Пользователя "000000000000000000000000000000", // указатель на новый Локальный PIN-код 30, // длина нового Локального PIN-кода 0x1F // идентификатор Локального PIN-кода ); if (rv != CKR_OK) // проверка результата printf("C_EX_SetLocalPIN() -> failed \n"); else printf("C_EX_SetLocalPIN() -> OK \n"); |