Скачиваний:
4
Добавлен:
22.03.2025
Размер:
181.78 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

ЗНАКОМСТВО С 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

Соседние файлы в предмете Программно-аппаратные средства защиты информации