
ПАСЗИ 3
.docxМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
ЗНАКОМСТВО С ETOKEN API
Отчет по лабораторной работе №3
по дисциплине «Программно-аппаратные средства защиты информации»
-
Студент гр. 731-2
__________
Руководитель
Преподаватель каф. КИБЭВС
__________
Введение
Цель работы: ознакомиться с основами работы с eToken API, изучить базовые функции, связанные с определением наличия eToken в системе, научиться получать информацию о подключенном eToken.
1 ХОД РАБОТЫ
Первоочередно для выполнения работы были добавлены заголовочные файлы и глобальные переменные, что представлено на рисунке 1.1.
Рисунок 1.1 – Добавление заголовочного файла и инициализация методов и глобальных переменных
Далее для использования функции библиотеки PKCS#11, была произведена ее инициализация, а также была добавлена функция выдачи сообщение о соответствующей ошибке и завершение работы программы, что представлено на рисунках 1.2 – 1.3.
Рисунок 1.2 – Функция инициализации библиотеки
Рисунок 1.3 – Функция выхода из программы
Далее была написана функция отображения информации о библиотеке и выполнена ее реализация, что представлено на рисунках 1.4 – 1.5.
Рисунок 1.4 – Функция вывода информации о библиотеке
Рисунок 1.5 – Вывод выполнения функции
Далее была написана функция отображения информации о подключенном eToken путем опознания идентификатора виртуального слота, а также была написана функция проверяющая возникновение событий подключения и отключения eToken к компьютеру, что представлено на рисунках 1.6 – 1.7.
Рисунок 1.6 – Описание функции отображения информации о токене
Рисунок 1.7 – Описание функции проверки наличия токена
Далее была написана функция main, в которой производилась инициализация библиотеки, выводилась информация о библиотеке, запускался поток ожидания событий и завершалась работа библиотеки, что представлено на рисунках 1.8 – 1.9.
Рисунок 1.8 – Описание функции main
Рисунок 1.9 – Вывод функции main
Заключение
В ходе выполнения лабораторной работы был произведено ознакомление с основами работы с eToken API, изучены базовые функции, связанные с определением наличия eToken в системе, обучены получать информацию о подключенном eToken.
Приложение
#include "stdlib.h"
#include "stdio.h"
#include <windows.h>
#include "include\eTPkcs11.h"
using namespace std;
void init();
void leave(const char*);
void displayLibraryInfo();
void displayTokenInfo(DWORD slotId);
//Глобальные переменные
CK_FUNCTION_LIST_PTR pFunctionList = NULL;
CK_C_GetFunctionList pGFL = 0;
bool wasInit = false;
static HANDLE hThread = 0;
void displayLibraryInfo()
{
CK_INFO lib_info;
pFunctionList->C_GetInfo(&lib_info);
printf("<Common Library Information> \n");
printf(" Version - %d.%d \n", lib_info.cryptokiVersion.major, lib_info.cryptokiVersion.minor);
printf(" Manufacturer - %s \n", lib_info.manufacturerID);
printf(" Description eToken PKCS - %s \n", lib_info.libraryDescription);
printf(" Library version - %d.%d \n", lib_info.libraryVersion.major, lib_info.libraryVersion.minor);
}
void displayTokenInfo(DWORD slotId)
{
CK_SLOT_INFO slot_info;
pFunctionList->C_GetSlotInfo(slotId, &slot_info);
CK_TOKEN_INFO token_info;
pFunctionList->C_GetTokenInfo(slotId, &token_info);
printf("> %s \n \n \n", slot_info.slotDescription);
if (!(slot_info.flags & CKF_TOKEN_PRESENT))
{
printf("Token not found \n");
}
else
{
printf("Manufacturer: %s \n", token_info.manufacturerID);
printf("Serial Number: %s \n", token_info.serialNumber);
printf("ulSessionCount: %d \n", token_info.ulSessionCount);
printf("ulMinPinLen: %d \n", token_info.ulMinPinLen);
printf("ulTotal private memory: %d \n", token_info.ulTotalPrivateMemory);
printf("ulFree private memory: %d \n", token_info.ulFreePrivateMemory);
if (slot_info.flags & CKF_WRITE_PROTECTED)
printf("Is write protected: YES \n");
else
printf("Is write protected: NO");
if (slot_info.flags & CKF_USER_PIN_LOCKED)
printf("Dual crypto operations: YES \n");
else
printf("Dual crypto operations: NO \n");
}
}
static DWORD __stdcall TokenNotifyThread(void*)
{
while (true)
{
DWORD slotId;
int res = pFunctionList->C_WaitForSlotEvent(0, &slotId, 0);
if (res == CKR_OK) displayTokenInfo(slotId);
else break;
}
return 0;
}
void init()
{
// Загружаем dll
HINSTANCE hLib = LoadLibraryA("etpkcs11.DLL");
if (hLib == NULL)
{
leave("Cannot load DLL.");
}
// Ищем точку входа для C_GetFunctionList
(FARPROC&)pGFL = GetProcAddress(hLib, "C_GetFunctionList");
if (pGFL == NULL)
{
leave("Cannot find GetFunctionList().");
}
//Берем список функций
if (CKR_OK != pGFL(&pFunctionList))
{
leave("Can't get function list. \n");
}
// Инициализируем библиотеку PKCS#11
if (CKR_OK != pFunctionList->C_Initialize(0))
{
leave("C_Initialize failed...\n");
}
wasInit = true;
}
static void leave(const char* message)
{
if (message) printf("%s ", message);
if (wasInit)
{
// Закрываем библиотеку PKCS#11
if (CKR_OK != pFunctionList->C_Finalize(0))
{
printf("C_Finalize failed...\n");
}
//ждем завершения работы потока, иначе убиваем его.
WaitForSingleObject(hThread, 5000);
if (hThread) { TerminateThread(hThread, 0); CloseHandle(hThread); }
hThread = 0;
wasInit = false;
}
exit(message ? -1 : 0);
}
int main()
{
init();
displayLibraryInfo();
hThread = CreateThread(NULL, 0, TokenNotifyThread, NULL, 0, NULL);
displayTokenInfo(8);
SetConsoleOutputCP(CP_UTF8);
return 0;
}
Томск 2025