Библиотека pki-core-cpp – это инструмент, предназначенный для упрощения управления криптографическими примитивами, хранящимися на аппаратных СКЗИ Рутокен ЭЦП и Рутокен Пинпад, и выполнения с ними криптографических операций по стандартам PKI.
Для того, чтобы начать использовать 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, полученные в предыдущем вызове, недействительными. Также недействительными становятся объекты ключей и сертификатов, хранящихся на устройствах.
Для перечисления и использования ключевых пар на токене требуется предварительно авторизоваться, используя функцию rutoken::pkicore::Pkcs11Device::login. Чтобы сбросить права доступа на токене, необходимо вызвать функцию rutoken::pkicore::Pkcs11Device::logout.
Большинство операций, связанных с PKI, используют объекты классов rutoken::pkicore::ExternalCert, rutoken::pkicore::Pkcs11Cert, rutoken::pkicore::Pkcs11UserCert. Объекты класса ExternalCert используются, когда необходимо передать какой-либо сертификат, не хранящийся на токене. Используя метод rutoken::pkicore::Pkcs11Device::enumerateCerts, можно получить все сертификаты, хранящиеся на устройстве. Метод rutoken::pkicore::Pkcs11Device::enumerateUserCerts возвращает пользовательские сертификаты на устройстве, которые могут использоваться в операциях, требующих наличия соответствующей ключевой пары.
В общем случае для получения пользовательского сертификата, который можно использовать в операциях подписи, необходимо выполнить следующие действия:
rutoken::pkicore::Pkcs11Device::generateKeyPair.rutoken::pkicore::Pkcs10RequestInfo.rutoken::pkicore::createPkcs10Request.rutoken::pkicore::Pkcs11Device::importCert.Для создания подписанного 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.
Для создания шифрованного CMS сообщения необходимо использовать функцию rutoken::pkicore::cms::envelop. На данный момент поддерживается шифрование объектов с типом Data Content, который может содержать произвольные данные. Параметры операции шифрования задаются через класс rutoken::pkicore::cms::EnvelopParams. Используя метод rutoken::pkicore::cms::EnvelopedData::toBer, можно получить сообщение в формате BER.
Статический метод rutoken::pkicore::cms::EnvelopedData::parse позволяет получить объект класса EnvelopedData из сообщения в формате BER. Расшифровать сообщение можно, используя метод rutoken::pkicore::cms::EnvelopedData::decrypt. Параметры расшифрования задаются классом rutoken::pkicore::cms::EnvelopedData::DecryptParams.
1.8.8