Отсоединенная подпись и проверка подписи больших файлов на OS Android

Добрый день, подскажите, пожалуйста, как можно сделать расчет хеша программно с помощью pkcs11, так как у Вас в документации указано, что для  ГОСТ 256/512 доступно только аппаратное хеширование (https://dev.rutoken.ru/pages/viewpage.a … 0%B8%D0%B8)

Re: Отсоединенная подпись и проверка подписи больших файлов на OS Android

Добрый день!

Примеры программного хеширования и подписания в формате CMS в Aндроид удобнее всего посмотреть в нашем демо-приложении Рутокен Демосмена для подписания допусков сотрудников к работе.

(2021-10-04 10:49:06 отредактировано SergeyRT)

Re: Отсоединенная подпись и проверка подписи больших файлов на OS Android

Спасибо за ответ.

Это код я видел, но смущают эти две строчки у Вас в документации:
CKM_GOSTR3411_12_256 для хеширования алгоритмом ГОСТ Р 34.11.2012 с длиной значения 256 бит (только аппаратно),
CKM_GOSTR3411_12_512 для хеширования алгоритмом ГОСТ Р 34.11.2012 с длиной закрытого ключа 512 бит (только аппаратно).

Все-таки аппаратно хешируется или программно для ГОСТ 256/512?

Re: Отсоединенная подпись и проверка подписи больших файлов на OS Android

SergeyRT, выбор программного или аппаратного хеширования задается параметрами механизма подписи или хеширования.

Пример программного хеширования:

static CK_BYTE parametersGostR3411_2012_256[] = { 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02 };

static CK_MECHANISM gostR3410_2012_256SigVerMech_WithHash = {CKM_GOSTR3410_WITH_GOSTR3411_12_256, parametersGostR3411_2012_256, sizeof(parametersGostR3411_2012_256)};

Аппаратное хеширование:

static CK_MECHANISM gostR3410_2012_256SigVerMech = {CKM_GOSTR3410_WITH_GOSTR3411_12_256, NULL_PTR,0)};

Полный пример можно увидеть, запустив пример в SDK по пути в архиве: sdk\pkcs11\samples\Standard\SignGOST34.10-2012-512WithHash.

Чтобы включить программное хеширование нужно раскомментировать соответствующие механизмы (строки 431- 448) (и закомментировать аппаратное) в файле \sdk\pkcs11\samples\include\Common.h

Спасибо, что указали на неточность в документации.

(2021-10-05 14:09:27 отредактировано SergeyRT)

Re: Отсоединенная подпись и проверка подписи больших файлов на OS Android

Добрый день, подскажите, пожалуйста,

1. Можно ли обойтись без открытия сессии для программного расчета хеша от исходных данных при проверке отсоединенной подписи?
- Исходные данные имеют большой размер.
- При формировании структуры CMSSignedData с большими исходными данными получаю ошибку OutOfMemoryError, поэтому формирую структуру CMSSignedData с помощью конструктора CMSSignedData(Map var1, byte[] var2), где var1 - хеш от исходных данных, var2 - отсоединенная подпись.

В документации нашел только методы C_DigestInit и C_Digest. Хеш вычисляется программно, то может можно избавиться от сессии, так как токен в проверке подписи не участвует?

2. Если ли некое API для проверки подписи на токене с передачей лишь хеша от исходных данных? Хеш вычисляется программно.

Re: Отсоединенная подпись и проверка подписи больших файлов на OS Android

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

1) проверку подписи с помощью библиотеки PKCS11 без сессии сделать не получится.
Формально токен не участвует, но интерфейс PKCS11 предназначен для работы с физическими устройствами.

2) "сырую" подпись (не в CMS формате) с программным хэшем можно проверить с помощью C_VerifyInit+C_Verify.