С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
24 / 22 / 9
Регистрация: 23.09.2014
Сообщений: 326
1

Работа с библиотекой PKCS 11

22.09.2017, 16:01. Показов 4947. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кто нибудь работал с библиотекой PKCS 11 ? тык..
Пытаюсь получить ID сертификата с токена JaCarta.
И вроде бы инициализирую библиотеку... нахожу токен... открываю сессию.
В общем в принципе у меня есть SDK...
возникает проблемка вот с этой функцией getCertificateAttribute
Она принимает 5 аргументов
(CK_BYTE_PTR pX509data,
CK_ULONG ulX509dataSize,
JC_EX_X509_DATA_TYPE dataType,
CK_BYTE_PTR* pOutputdata,
CK_ULONG_PTR pulOutputdataSize
)

pX509data (in) – сертификат в формате x509.
ulX509dataSize (in) – размер сертификата.
dataType (in) –
тип получаемых данных:
X509_SUBJECT (0x01) – владелец сертификата,
X509_ISSUER (0x02) – издатель сертификата,
X509_SERIAL (0x03) – серийный номер сертификата.
pOutputdata (out) – выходные данные.
pulOutputdataSize (out) – размер выходных данных.

сложности по всей видимости возникают с аргументом JC_EX_X509_DATA_TYPE dataType.

Притом проблема в следующем: в SDK были файлы с описанием Типов Данных и Функций, но вот типа данных JC_EX_X509_DATA_TYPE я не нашел. В интернетах не могу ничего найти.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2017, 16:01
Ответы с готовыми решениями:

Работа с библиотекой
Нужно создать 3 функции в библиотеке по имени, по индексу, по совпадающему имени. New--Other--Dll...

Создание отсоединенной электронной подписи файла (PKCS#7)
Здравствуйте. Появилась необходимость создания отсоединенной электронной подписи файла в формате...

Работа с GD библиотекой
Как можно реализовать передачу изображения созданного с помощью GD библиотеки в twitter ?

Работа с библиотекой
Есть динамическая библиотека, как вызвать фукцию которая храниться в библиотеки????

4
24 / 22 / 9
Регистрация: 23.09.2014
Сообщений: 326
26.09.2017, 09:07  [ТС] 2
актуально.
0
24 / 22 / 9
Регистрация: 23.09.2014
Сообщений: 326
31.10.2017, 11:48  [ТС] 3
Даёшь некропостинг. Однако я с этим намучился не мало, и в интернетах крайне сложно найти нормальную инфу по данному вопросу ,так что я думаю кому-нибудь пригодится.
1. Ф-ия getCertificateAttribute не нужна для получения ID.
2. Подключать библиотеку стоит динамически и подключать надо "jcPKCS11-2.dll". jcPKCS11 Не увидит PKI апплет.
3. Код(красотой кода тут и не пахнет) :
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
var
  DLLHandle: HModule;
  Init: TInitialize;
  GetInfo: TGetCertificateInfo;
  FuncResult: CK_RV;
  MyApi: TPKCS11API;
  Finalize: TC_Finalize;
 
  GetSlotList: C_GetSlotList;
  slotsArray: TPKCS11SlotArray;
  slotObj: TPKCS11Slot;
  OpenSession: C_OpenSession;
  pulCount: CK_ULONG;    // receives number of slots
 
  slotID: CK_SLOT_ID;
  MySlotList:array of CK_SLOT_ID;
  i: integer;
 
//  info: CK_SLOT_INFO;
  flags: cardinal;
  phSession: CK_SESSION_HANDLE;
  pApplication: CK_VOID_PTR;
  Notify: CK_NOTIFY;
 
  // Дескриптор Сессии
  certificate: CK_OBJECT_HANDLE;
  certificateInfo: AnsiString;
  certificateInfoLength: CK_ULONG;
 
  //Поиск объектов
  FindObjectsInit: C_FindObjectsInit;
  pTemplate: CK_ATTRIBUTE_PTR;  // attribute values to match
  ulCount: CK_ULONG;
  FindObjects: C_FindObjects;
  phObject: array[0..99] of CK_OBJECT_HANDLE;
 
  ulObjectCount: CK_ULONG;
  FindObjectsFin: C_FindObjectsFinal;
  rezult: string;
  J: CK_ULONG;
  GetAttributeValue: C_GetAttributeValue;
  attrStruct: CK_ATTRIBUTE;
  bufferStr: string;
  getCertificateAttribute: TgetCertificateAttribute;
 
  dataType: CK_BYTE;
  MyAttribute: TPKCS11Attribute;
  MyString: WideString;
 
  GetTokenInfo:C_GetTokenInfo;
  tokenInfo:CK_TOKEN_INFO;
try
    // загружаем dll JaCarta динамически
    DLLHandle := loadLibrary('jcPKCS11-2.dll');
    if DLLHandle <> 0 then
    begin
     // получаем адрес функции
     //Инициализация библиотеки
      @Init := getProcAddress(DLLHandle, 'C_Initialize');
      // Лист подключеных токенов
      @GetSlotList := getProcAddress(DLLHandle, 'C_GetSlotList');
      //Открытия сессии с токенном
      @OpenSession := GetProcAddress(DLLHandle, 'C_OpenSession');
      //Отключаемся от библиотеки
      @Finalize := getProcAddress(DLLHandle, 'C_Finalize');
 
      //Получаем информацию о токене
      @GetTokenInfo := GetProcAddress(DLLHandle, 'C_GetTokenInfo');
      //Поиск объектов
      @FindObjectsInit := GetProcAddress(DLLHandle, 'C_FindObjectsInit');
      @FindObjects := GetProcAddress(DLLHandle, 'C_FindObjects');
      @FindObjectsFin := GetProcAddress(DLLHandle, 'C_FindObjectsFinal');
      //Получаем информацию  о сертификате
      @GetAttributeValue := getProcAddress(DLLHandle, 'C_GetAttributeValue');
      //Получаем информацию  о сертификате
      @GetInfo := getProcAddress(DLLHandle, 'getCertificateInfo');
      @getCertificateAttribute := GetProcAddress(DLLHandle, 'getCertificateAttribute');
      // если адрес функции найден
      if addr(@Init) <> nil then
      begin
        FuncResult := Init(nil);  //Инициализируем библиотеку
 
        rezult := MyApi.RVToString(FuncResult);
         //ShowMessage(rezult);
        if FuncResult = CKR_OK then
        try
          if Addr(@GetSlotList) <> nil then
          begin
            FuncResult := GetSlotList(CK_TRUE, nil, @pulCount);
            if (FuncResult = CKR_OK) and (pulCount <> 0) then
            begin
              SetLength(MySlotList,pulCount);
              try
                FuncResult := GetSlotList(CK_TRUE, @MySlotList[0], @pulCount);
                if FuncResult = CKR_OK then
                  SetLength(slotsArray, pulCount);
          
                if Addr(@OpenSession) <> nil then
                begin
                  flags := CKF_SERIAL_SESSION;
                  FuncResult := OpenSession(1, flags, pApplication, Notify, @phSession);
                end;
 
                if Addr(@FindObjectsInit) <> nil then
                  FuncResult := FindObjectsInit(phSession, NULL_PTR, 0);
                if (FuncResult = CKR_OK) and (Addr(@FindObjects) <> nil) then
                  FuncResult := FindObjects(phSession, @phObject, 1, @ulObjectCount);
                if (FuncResult = CKR_OK) and (Addr(@FindObjectsFin) <> nil) then
                  FuncResult := FindObjectsFin(phSession);
 
                if Addr(@GetAttributeValue) <> nil then
                begin
                  for J := 0 to ulObjectCount-1 do
                  begin
                    attrStruct.attrType := CKA_ID;
                    //attrStruct.attrType := CKA_OTP_USER_IDENTIFIER;
                    attrStruct.pValue := nil;
                    attrStruct.ulValueLen := 0;
                    FuncResult := GetAttributeValue(phSession, phObject[J], @attrStruct, 1);
                    bufferStr := StringOfChar(#0, attrStruct.ulValueLen);
                    attrStruct.pValue := PChar(bufferStr);
                    FuncResult := GetAttributeValue(phSession, phObject[J], @attrStruct, 1);
                    MyAttribute := TPKCS11Attribute.Create();
                    MyAttribute.AttrStruct := attrStruct;
                    Result := MyAttribute.ValueAsString;
                  end;
                end;
              finally
              end;
            end;
          end;
        finally
          if addr(@Finalize) <> nil then
            FuncResult := Finalize(NULL_PTR);
        end;
      end
      else
        showMessage('Function not exists...');
    end;

4. Очень сильно помог проект на Git. оттуда утащил:
pkcs11f.pas
pkcs11t.pas
pkcs11_api.pas
pkcs11_Slot.pas
pkcs11_Attribute.pas
0
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 29
17.04.2018, 09:58 4
Уважаемый vijer, не могли бы вы помочь разобраться? Мучаюсь с такой же темой. Мне нужно получить идентификатор ключа.
Есть SDK, подключил 5 файлов pas, закинул библиотеку. Не компилируется ваш код. БОльшая часть переменных в var инициализируется, часть подчеркнута красным, а именно Init: Tinitialize, GetInfo: TGetCertificateInfo, Finalize: TC_Finalize, getCertificateAttribute: TgetCertificateAttribute;

ФАйлы pas прописал в uses. Что я делаю не так?

Заранее спасибо.
0
24 / 22 / 9
Регистрация: 23.09.2014
Сообщений: 326
03.08.2018, 08:13  [ТС] 5
dima1208, Прошло конечно уже 4 месяца и думаю уже не актуально... но мало ли)
Delphi
1
2
3
4
5
6
7
8
type
TGetCertificateInfo = function(session: CK_SESSION_HANDLE; certificate: CK_OBJECT_HANDLE; certificateInfo: CK_INFO_PTR; certificateInfoLength: CK_ULONG_PTR): CK_RV; cdecl;
 
  TInitialize = function(ARGS: CK_C_INITIALIZE_ARGS_PTR): CK_RV; cdecl; //stdcall приводит к исключению Rised Violation...
 
  TC_Finalize = function(pReserved: CK_VOID_PTR): CK_RV; cdecl;
 
  TgetCertificateAttribute = function(pX509data: CK_BYTE_PTR; ulX509dataSize: CK_ULONG; dataType: CK_BYTE; pOutputdata: CK_BYTE_PTR; pulOutputdataSize: CK_ULONG_PTR): CK_RV; cdecl;
0
03.08.2018, 08:13
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2018, 08:13
Помогаю со студенческими работами здесь

Работа с библиотекой
В чем ошибка? 1.unit2.pas(57,58) Error: Fields cannot appear after a method or property...

Работа с библиотекой
Ребят помогите пожалуйста, 1 курс всего. Я создал библиотеку, работаю в ней, но для того кто бы...

Работа с библиотекой opencv
Добрый день! Я установил opencv 2.4.13 на vs12, настроил несколько раз, но у меня выдает ошибку:...

Работа с библиотекой в проекте C#
Добрый день. В проекте C# я подключил библиотеку, написанную, как я понял, на C++, но возникли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru