Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Начало использования

Для того, чтобы начать использовать pki-core-cpp, необходимо в настройках проекта добавить путь до каталога с заголовочными файлами библиотеки и включить файл rutoken/pki-core-cpp.h. Приложение должно быть слинковано с динамической библиотекой pki-core.

Первым вызовом pki-core-cpp должен быть rutoken::pkicore::initialize с указанием каталога, в котором лежит библиотека rtPKCS11ECP. По завершении работы с pki-core-cpp необходимо вызвать rutoken::pkicore::deinitialize для освобожения ресурсов библиотеки.

...

Большая часть классов, представленых в библиотеке, описывает объекты предметной области, не подразумевающие возможность копирования (нельзя на устройстве создать копию сертификата или ключа подписи). Такие классы имеют move-конструкторы, которые можно использовать для перемещения объектов.

...

Базовая работа с устройствами и сертификатами

pki-core-cpp позволяет работать с токенами, доступными через библиотеку rtPKCS11ECP. Для перечисления подключенных устройств необходимо использовать функцию rutoken::pkicore::Pkcs11Device::enumerate, которая возвращает список объектов класса rutoken::pkicore::Pkcs11Device. Вызов этой функции делает объекты Pkcs11Device, полученные в предыдущем вызове, недействительными. Также недействительными становятся объекты ключей и сертификатов, хранящихся на устройствах.

...

 

Code Block
using namespace rutoken::pkicore;

initialize(".");

auto devices = Pkcs11Device::enumerate();

// Выбор подходящего устройства.

assert(devices.size() == 1);
auto device = std::move(devices.front());

auto certs = device.enumerateCerts();

device.login("12345678");

auto userCerts = device.enumerateUserCerts();

device.logout();

deinitialize();

 

Формирование запроса PKCS#10

В общем случае для получения пользовательского сертификата, который можно использовать в операциях подписи, необходимо выполнить следующие действия:

...

 
Code Block
using namespace rutoken::pkicore;

auto key = device.generateKeyPair(Pkcs11Device::Gost34102001KeyGenParams());

X500Dn subject;
subject.setRdn(X500Dn::RdnId::commonName, "Ivanov Ivan Ivanovich");

Pkcs10RequestInfo info;
info.setSubject(subject);

auto request = createPkcs10Request(key, info);

// Вызов request.toPem() вернет PKCS#10 запрос на сертификат в формате PEM, который можно передать в центр сертификации для получения пользовательского сертификата.

device.importCert(ExternalCert(pemCert));

 

CMS

...

Подпись и проверка подписи в формате CMS

Для создания подписанного CMS сообщения необходимо использовать функцию rutoken::pkicore::cms::sign. На данный момент поддерживается подпись объектов с типом Data Content, который может содержать произвольные данные. Параметры операции подписи задаются через класс rutoken::pkicore::cms::SignParams. Используя метод rutoken::pkicore::cms::SignedData::toBer, можно получить сообщение в формате BER.

Статический метод rutoken::pkicore::cms::SignedData::parse позволяет получить объект класса SignedData из сообщения в формате BER. Подпись сообщения можно проверить, используя метод rutoken::pkicore::cms::SignedData::verify. Параметры проверки задаются классом rutoken::pkicore::cms::VerifyParams.

 
Code Block
using namespace rutoken::pkicore;

std::vector<unsigned char> data(10, 'a');

// В SignParams необходимо передать пользовательский сертификат, для которого на токене содержится соответствующая ключевая пара.
auto signedData = cms::sign(cms::Data(data.begin(), data.end()), cms::SignParams(cert));

// В VerifyParams необходимо передать токен, на котором будет производиться проверка подписи.
auto result = signedData.verify(cms::VerifyParams(device));

assert(result == cms::VerifyResult::success);
 

Шифрование

...

и расшифрование в формате CMS

Для создания шифрованного CMS сообщения необходимо использовать функцию rutoken::pkicore::cms::envelop. На данный момент поддерживается шифрование объектов с типом Data Content, который может содержать произвольные данные. Параметры операции шифрования задаются через класс rutoken::pkicore::cms::EnvelopParams. Используя метод rutoken::pkicore::cms::EnvelopedData::toBer, можно получить сообщение в формате BER.

...