Page tree

Versions Compared

Key

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

...

Для создания подписанного 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.

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

 
Code Block
using namespace rutoken::pkicore;

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

// В EnvelopParams необходимо передать токен, на котором будет производиться шифрование, а также сертификат получателя сообщения.
auto envelopedData = cms::envelop(cms::Data(data.begin(), data.end()), cms::EnvelopParams(device, ExternalCert(pemCert)));

// В DecryptParams необходимо передать пользовательский сертификат, для которого на токене содержится соответствующая ключевая пара.
auto message = envelopedData.decrypt(cms::EnvelopedData::DecryptParams(userCert));

// На данный момент поддерживается только содержимое типа Data Content.
assert(message.contentType() == cms::ContentType::data);

// Преобразуем сообщение к действительному типу.
auto result = cms::Data::cast(std::move(message));
auto resultData = result.data();

assert(resultData.size() == data.size());
assert(std::equal(data.begin(), data.end(), resultData.begin()));