Ошибка при выполнении функции rt_eng_p11_key_pair_wrap на swift. iOS

Добрый день, коллеги.

Подскажите, пожалуйста, как сделать корректный вызов функции rt_eng_p11_key_pair_wrap на swift?

Скачал последнюю версию SDK и пытался собрать Ваш пример из гитхаб для iOS на swift (https://github.com/AktivCo/rutoken-demoshift-ios), перед этим подложив в проект нужные framework'и (openssl 1.1, engine - 1.1). Но наткнулся на проблему отсутствия rt_eng_init / rt_eng_final / rt_eng_p11_session_new и так далее (https://github.com/AktivCo/rutoken-demo … .swift#L54). Посмотрев на другой Ваш проект для iOS на Objc обнаружил, что вместо вышеуказанных функции там используется rt_eng_load_engine / rt_eng_unload_engine / rt_eng_p11_session_wrap и так далее. Поэтому заменил часть функций engine из swift проекта на функции из Objc проекта.

Пример кода:

let publicHandle: CK_OBJECT_HANDLE = findObject(CKO_PUBLIC_KEY, ...)
let privateHandle: CK_OBJECT_HANDLE = findObject(CKO_PRIVATE_KEY, ...)

var functionList = CK_FUNCTION_LIST()
try withUnsafeMutablePointer(to: &functionList) { pointer in
var functionListPointer: UnsafeMutablePointer<CK_FUNCTION_LIST>? = pointer
let rv = C_GetFunctionList(&functionListPointer)
guard rv == CKR_OK else {
  throw "Error"
}

guard let wrappedSession = rt_eng_p11_session_wrap(functionListPointer, token.session, 0, nil) else {
  throw "Error"
}
defer {
  rt_eng_p11_session_free(wrappedSession)
}

guard let evpPKey = rt_eng_p11_key_pair_wrap(wrappedSession, privateHandle, publicHandle) else {
  throw "Error" // получаю ошибку
}
defer {
  EVP_PKEY_free(evpPKey)
}

...
}

Предполагаю, что получение handle'ов ключей валидно, так как вызов функции C_EX_PKCS7Sign с использованием этих ключей выполняется успешно.

Re: Ошибка при выполнении функции rt_eng_p11_key_pair_wrap на swift. iOS

SergeyRT, здравствуйте!

Спасибо за сигнал.

Мы актуализировали https://github.com/AktivCo/rutoken-demoshift-ios (приложение Демосмена), теперь оно собирается с последним Рутокен SDK. И в том числе использует вызов rt_eng_p11_key_pair_wrap (https://github.com/AktivCo/rutoken-demo … swift#L148).
Обратите внимание, что ветка master использует OpenSSL 3.0 и rtengine3.

(2022-06-08 08:55:17 отредактировано SergeyRT)

Re: Ошибка при выполнении функции rt_eng_p11_key_pair_wrap на swift. iOS

Спасибо.

Собрал собственное приложение (приложение на React-native) и добавил все 4 необходимых framework'и (OpenSSL 3.0 и rtengine3).

- Приложение периодически падает при вызове d2i_X509 с ошибкой EXC_BAD_ACCESS (падает всегда, если вызывать чтение токенов при запуске приложения. А если запустить приложение, немного подождать и потом подключить токен, то падает не всегда). Вызов d2i_X509 полностью повторяет Ваш пример из гита.
- Вызов rt_eng_p11_key_pair_wrap все также отдает nil.

Подскажите, пожалуйста, как можно получить более подробную информацию о выполнении функции?

Re: Ошибка при выполнении функции rt_eng_p11_key_pair_wrap на swift. iOS

SergeyRT, добрый день!

Заработала ли у Вас Демосмена после переключения на новый master?

Для диагностики проблемы в коде вашего приложения пока недостаточно информации.
Подготовьте, пожалуйста, минимальный пример из вашего приложения, в котором воспроизводится падение.

Re: Ошибка при выполнении функции rt_eng_p11_key_pair_wrap на swift. iOS

Павел Анфимов,  добрый день!

Да, работает.

Свою проблему тоже удалось решить. Проблема была в "кривой" линковке либ