mchstest/cmd/mtrtoken/main.go

219 lines
9.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package mtrtoken
/*
#include <Common.h>
//Шаблон для поиска сертификата
CK_ATTRIBUTE certificateTemplate[] =
{
{ CKA_CLASS, &certificateObject, sizeof(certificateObject)}, // Класс - сертификат
{ CKA_TOKEN, &attributeTrue, sizeof(attributeTrue)}, // Сертификат является объектом токена
{ CKA_PRIVATE, &attributeFalse, sizeof(attributeFalse)}, // Сертификат доступен без аутентификации
{ CKA_CERTIFICATE_TYPE, &certificateType, sizeof(certificateType)}, // Тип сертификата - X.509
{ CKA_ID, &keyPairIdGost2012_512_1, sizeof(keyPairIdGost2012_512_1) - 1}, // Идентификатор сертификата, должен совпадать с CKA_ID соответствующей ключевой пары
{ CKA_CERTIFICATE_CATEGORY, &tokenUserCertificate, sizeof(tokenUserCertificate)}, // Категория сертификата - пользовательский
};
int test()
{
HMODULE module; // Хэндл загруженной библиотеки PKCS#11
CK_SESSION_HANDLE session; // Хэндл открытой сессии
CK_FUNCTION_LIST_PTR functionList; // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
CK_C_GetFunctionList getFunctionList; // Указатель на функцию C_GetFunctionList
CK_FUNCTION_LIST_EXTENDED_PTR functionListEx; // Указатель на список функций расширения PKCS#11, хранящийся в структуре CK_FUNCTION_LIST_EXTENDED
CK_C_EX_GetFunctionListExtended getFunctionListEx; // Указатель на функцию C_EX_GetFunctionListExtended
CK_SLOT_ID_PTR slots; // Указатель на массив идентификаторов слотов
CK_ULONG slotCount; // Количество идентификаторов слотов в массиве
CK_OBJECT_HANDLE_PTR certificates; // Указатель на массив хэндлов объектов, соответствующих критериям поиска
CK_ULONG objectCount; // Количество хэндлов объектов в массиве
CK_BYTE_PTR info; // Указатель на буфер, содержащий информацию о сертификате
CK_ULONG size; // Размер буфера, содержащего информацию о сертификате, в байтах
CK_RV rv; // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11
int r; // Код возврата для функций, возвращающих int
int errorCode = 1; // Флаг ошибки
//Выполнить действия для начала работы с библиотекой PKCS#11
printf("Initialization...\n");
//Загрузить библиотеку
module = LoadLibrary(PKCS11ECP_LIBRARY_NAME);
CHECK(" LoadLibrary", module != NULL, exit);
//Получить адрес функции запроса структуры с указателями на функции
getFunctionList = (CK_C_GetFunctionList)GetProcAddress(module, "C_GetFunctionList");
CHECK(" GetProcAddress (C_GetFunctionList)", getFunctionList != NULL, unload_pkcs11);
//Получить адрес функции запроса структуры с указателями на функции
//расширения стандарта PKCS#11
getFunctionListEx = (CK_C_EX_GetFunctionListExtended)GetProcAddress(module, "C_EX_GetFunctionListExtended");
CHECK(" GetProcAddress (C_EX_GetFunctionListExtended)", getFunctionList != NULL, unload_pkcs11);
//Получить структуру с указателями на функции
rv = getFunctionList(&functionList);
CHECK_AND_LOG(" Get function list", rv == CKR_OK, rvToStr(rv), unload_pkcs11);
//Получить структуру с указателями на функции расширения стандарта
rv = getFunctionListEx(&functionListEx);
CHECK_AND_LOG(" Get function list extended", rv == CKR_OK, rvToStr(rv), unload_pkcs11);
//Инициализировать библиотеку
rv = functionList->C_Initialize(NULL_PTR);
CHECK_AND_LOG(" C_Initialize", rv == CKR_OK, rvToStr(rv), unload_pkcs11);
//Получить количество слотов c подключенными токенами
rv = functionList->C_GetSlotList(CK_TRUE, NULL_PTR, &slotCount);
CHECK_AND_LOG(" C_GetSlotList (number of slots)", rv == CKR_OK, rvToStr(rv), finalize_pkcs11);
CHECK_AND_LOG(" Checking available tokens", slotCount > 0, " No tokens available", finalize_pkcs11);
//Получить список слотов c подключенными токенами
slots = (CK_SLOT_ID_PTR)malloc(slotCount * sizeof(CK_SLOT_ID));
CHECK(" Memory allocation for slots", slots != NULL_PTR, finalize_pkcs11);
rv = functionList->C_GetSlotList(CK_TRUE, slots, &slotCount);
CHECK_AND_LOG(" C_GetSlotList", rv == CKR_OK, rvToStr(rv), free_slots);
printf(" Slots available: %d\n", (int)slotCount);
//Открыть RW сессию в первом доступном слоте
rv = functionList->C_OpenSession(slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL_PTR, NULL_PTR, &session);
CHECK_AND_LOG(" C_OpenSession", rv == CKR_OK, rvToStr(rv), free_slots);
//Выполнить аутентификацию Пользователя
rv = functionList->C_Login(session, CKU_USER, USER_PIN, USER_PIN_LEN);
CHECK_AND_LOG(" C_Login", rv == CKR_OK, rvToStr(rv), close_session);
printf("Initialization has been completed successfully.\n");
//Получение информации о сертификате
printf("\nGetting information...\n");
//Получить массив хэндлов сертификатов
printf(" Getting certificates...\n");
r = findObjects(functionList, session, certificateTemplate, arraysize(certificateTemplate),
&certificates, &objectCount);
CHECK(" findObjects", r == 0, logout);
CHECK_AND_LOG(" Checking number of certificates", objectCount != 0, "No objects found\n", logout);
//Получение информации о сертификате
rv = functionListEx->C_EX_GetCertificateInfoText(session, certificates[0], &info, &size);
CHECK_AND_LOG(" C_EX_GetCertificateInfoText", rv == CKR_OK, rvToStr(rv), logout);
//Распечатать буфер, содержащий информацию о сертификате
r = printUTF8String(info);
CHECK(" Print info", r == 0, free_buffer);
printf("Information has been acquired successfully.\n");
//Выставить признак успешного завершения программы
errorCode = 0;
//Выполнить действия для завершения работы с библиотекой PKCS#11
printf("\nFinalizing... \n");
//Освобождение буфера, содержащего информацию о сертификате
free_buffer:
rv = functionListEx->C_EX_FreeBuffer(info);
CHECK_RELEASE_AND_LOG(" C_EX_FreeBuffer", rv == CKR_OK, rvToStr(rv), errorCode);
//Сбросить права доступа
logout:
rv = functionList->C_Logout(session);
CHECK_RELEASE_AND_LOG(" C_Logout", rv == CKR_OK, rvToStr(rv), errorCode);
//Закрыть открытую сессию в слоте
close_session:
rv = functionList->C_CloseSession(session);
CHECK_RELEASE_AND_LOG(" C_CloseSession", rv == CKR_OK, rvToStr(rv), errorCode);
//Очистить память из-под слотов
free_slots:
free(slots);
//Деинициализировать библиотеку
finalize_pkcs11:
rv = functionList->C_Finalize(NULL_PTR);
CHECK_RELEASE_AND_LOG(" C_Finalize", rv == CKR_OK, rvToStr(rv), errorCode);
//Выгрузить библиотеку из памяти
unload_pkcs11:
CHECK_RELEASE(" FreeLibrary", FreeLibrary(module), errorCode);
exit:
if (errorCode) {
printf("\n\nSome error occurred. Sample failed.\n");
} else {
printf("\n\nSample has been completed successfully.\n");
}
return errorCode;
}
*/
import "C"
import (
"fmt"
"time"
)
func main() {
fmt.Printf("Invoking c library...\n")
C.test()
time.Sleep(16 * time.Second)
// fmt.Println("Done ", C.x(10) )
}