Публичный ключ и проверка подписи файла

Пытаюсь интегрировать RuTokenSDK в приложение под iOS, написанное на Swift.

Есть некоторые проблемы с базовыми вещами, поэтому вопрос возможно уровня "начинающий".

В данный момент нужно реализовать проверку подписи файла (есть сам файл + sig). Пример на гитхабе не имеет функционала проверки подписи. Получение списка токенов я сделал, работать с ним могу, но не ясно:

- где взять публичной ключ (он требуется в функции C_Verify)

Может быть у кого-то есть пример реализации этой функциональности?

Заранее спасибо

Re: Публичный ключ и проверка подписи файла

alkal, добрый день.
Возможно, вам помогут примеры на С, которые находятся в папке sdk\pkcs11\samples\Standard или sdk\pkcs11\samples\PKIExtensions если вы используете CMS подпись.
Скачать архив можно по ссылке https://www.rutoken.ru/support/download/get/sdk.html

Re: Публичный ключ и проверка подписи файла

Спасибо, изучаю примеры.
Как я понял из них там для проверки подписи уже используется DER, но у меня sig-файл с PEM внутри. То есть мне нужно из PEM как то получить публичный ключ (да и всю остальную информацию).

Re: Публичный ключ и проверка подписи файла

В iOS (swift) можно использовать openssl + rtengine и у нас есть  пример проверки подписи в SDK: sdk/openssl/samples/Common/VerifyCMS

У вас проверка подписи будет реализована в том же приложении? То есть после подписания документа вы хотите проверить, что подпись успешна?
Или вы собираетесь проверять подписи документов, подписанных где-то еще?

Re: Публичный ключ и проверка подписи файла

Да, пример с проверкой я видел, но суть как раз в том, что мне нужно проверить подписанный "на стороне" файл.
То есть сейчас проблема с проверкой не в функции Verify, а в том, где для нее взять публичный ключ/сертификат. Точнее где его взять, я знаю, но как PEM PKCS7 преобразовать в нормальный человеческий сертификат, из которого можно получить информацию о ключе - дается тяжело.

Re: Публичный ключ и проверка подписи файла

В тексте примера описано как последовально из вашего файла PKCS#7 получается сертификат и подпись.
https://stackoverflow.com/questions/560 … th-openssl
Вот тут показано, как это сделать с помощью openssl.

(2023-06-01 12:26:37 отредактировано alkal)

Re: Публичный ключ и проверка подписи файла

С помощью командной строки и openssl команды я конечно могу преобразовать PEM, но вот в iOS доступа к командной строке нет.

По поводу указанного вами пример - sdk/openssl/samples/Common/VerifyCMS
Папки Common не существует. Но есть файл VerifyCMS в sdk/openssl/samples/sources, думаю это оно.

Но тут новая проблема - в примере есть функция PEM_read_bio_CMS, но она не дсотупна в моем проекте, а так же в сэмпл-проекте iOS в SDK.

В итоге сейчас я делаю следующее

let file = Bundle.main.url(forResource: "PHOTO.jpg", withExtension: "sig")
var fo = fopen(file!.path, "r")
let inBio = BIO_new_file(file!.path, "r")
let cert1 = PEM_read_bio_PKCS7(inBio, nil, nil, nil)
let fileChecked = Bundle.main.url(forResource: "PHOTO", withExtension: "jpg")
let inData = BIO_new_file(fileChecked!.path, "r")
let r = PKCS7_verify(cert1, nil, nil, inData, nil, 0)

Тут намешан Swift и C (это допустимо). Но в итоге в r у меня 0 и ERR_get_error показывает ошибку 276824181.

Возможно нужно использовать как в примере CMS_verify, но туда нужно передать cms, который нужно получить через PEM_read_bio_CMS, которого нет.

Я уже пятый раз подхожу к этому вопросу и нигде не могу найти четкую последовательно команд

Re: Публичный ключ и проверка подписи файла

Необходимо добавить импорт заголовка openssl/pem.h перед openssl/cms.h, тогда появится функция PEM_read_bio_CMS

Re: Публичный ключ и проверка подписи файла

alkal, добрый день.
Если информация еще актуальна, то пример для проверки подписи CMS выложен на github:
https://github.com/AktivCo/rutoken-demo … cms-verify