(2022-10-25 17:20:39 отредактировано Виктор Павлович)

Скорость работы плагина для браузера

Добрый день. Я занимался тестированием скорости работы РуТокен 2.0 ЭЦП и в своей программе получил следующие результаты:

Инициализация библиотеки: 2 ms
C_GetSlotList: 0 ms
C_OpenSession: 305 ms
C_Login: 38 ms
C_GetTokenInfo: 64 ms
C_GetMechanismList: 26 ms
C_FindObjects: 160 ms (CKO_PRIVATE_KEY)
C_Digest: 685 ms (length = 63)
C_Sign: 323 ms
C_Digest: 907 ms (length = 126)
C_Sign: 325 ms
C_Digest: 1124 ms (length = 189)
C_Sign: 327 ms

После этого я использовал библиотеку для анализа librtpkcs11-spy.so.2.0.0 (отдельное спасибо за неё). И в процессе подписи документа на одном из проектов я получил следующий набор запросов к токену:

{0x16B1,0x16B1}:      0: C_GetFunctionList
{0x16B1,0x16B1}:      1: C_Initialize
{0x16B1,0x16B1}:      2: C_EX_GetFunctionListExtended
{0x16B1,0x16B1}:      3: C_GetSlotList
{0x16B1,0x16B1}:      4: C_GetSlotList
{0x16B1,0x16B1}:      5: C_GetSlotInfo
{0x16B1,0x16B1}:      6: C_GetSlotList
{0x16B1,0x16B1}:      7: C_GetSlotList
{0x16B1,0x16B1}:      8: C_GetSlotInfo
{0x16B1,0x16B1}:      9: C_EX_SlotManage
{0x16B1,0x16B1}:      10: C_OpenSession
{0x16B1,0x16B1}:      11: C_GetTokenInfo
{0x16B1,0x16B1}:      12: C_EX_GetTokenInfoExtended
{0x16B1,0x16B1}:      13: C_GetMechanismList
{0x16B1,0x16B1}:      14: C_GetMechanismList
{0x16B1,0x16B1}:      15: C_GetTokenInfo
{0x16B1,0x16B1}:      16: C_EX_GetTokenInfoExtended
{0x16B1,0x16B1}:      17: C_FindObjectsInit                
{0x16B1,0x16B1}:      18: C_FindObjects
{0x16B1,0x16B1}:      19: C_FindObjectsFinal
{0x16B1,0x16B1}:      20: C_GetAttributeValue
{0x16B1,0x16B1}:      21: C_GetAttributeValue
{0x16B1,0x16B1}:      22: C_FindObjectsInit
{0x16B1,0x16B1}:      23: C_FindObjects
{0x16B1,0x16B1}:      24: C_FindObjectsFinal
{0x16B1,0x16B1}:      25: C_GetAttributeValue
{0x16B1,0x16B1}:      26: C_GetAttributeValue
{0x16B1,0x16B1}:      27: C_GetAttributeValue
{0x16B1,0x16B1}:      28: C_GetAttributeValue
{0x16B1,0x16B1}:      29: C_GetSessionInfo
{0x16B1,0x16B1}:      30: C_GetTokenInfo
{0x16B1,0x16B1}:      31: C_EX_GetTokenInfoExtended
{0x16B1,0x16B1}:      32: C_GetSessionInfo
{0x16B1,0x16B1}:      33: C_GetTokenInfo
{0x16B1,0x16B1}:      34: C_EX_GetTokenInfoExtended
{0x16B1,0x16B1}:      35: C_GetSessionInfo
{0x16B1,0x16B1}:      36: C_GetTokenInfo
{0x16B1,0x16B1}:      37: C_EX_GetTokenInfoExtended
{0x16B1,0x16B1}:      38: C_FindObjectsInit             
{0x16B1,0x16B1}:      39: C_FindObjects
{0x16B1,0x16B1}:      40: C_FindObjectsFinal
{0x16B1,0x16B1}:      41: C_GetAttributeValue
{0x16B1,0x16B1}:      42: C_GetAttributeValue
{0x16B1,0x16B1}:      43: C_FindObjectsInit
{0x16B1,0x16B1}:      44: C_FindObjects
{0x16B1,0x16B1}:      45: C_FindObjectsFinal
{0x16B1,0x16B1}:      46: C_GetAttributeValue
{0x16B1,0x16B1}:      47: C_GetAttributeValue
{0x16B1,0x16B1}:      48: C_GetAttributeValue
{0x16B1,0x16B1}:      49: C_GetAttributeValue
{0x16B1,0x16B1}:      50: C_FindObjectsInit
{0x16B1,0x16B1}:      51: C_FindObjects
{0x16B1,0x16B1}:      52: C_FindObjectsFinal
{0x16B1,0x16B1}:      53: C_FindObjectsInit
{0x16B1,0x16B1}:      54: C_FindObjects
{0x16B1,0x16B1}:      55: C_FindObjectsFinal
{0x16B1,0x16B1}:      56: C_GetAttributeValue
{0x16B1,0x16B1}:      57: C_GetAttributeValue
{0x16B1,0x16B1}:      58: C_GetSessionInfo
{0x16B1,0x16B1}:      59: C_GetTokenInfo
{0x16B1,0x16B1}:      60: C_EX_GetTokenInfoExtended
{0x16B1,0x16B1}:      61: C_Logout
{0x16B1,0x16B1}:      62: C_Login
{0x16B1,0x16B1}:      63: C_FindObjectsInit
{0x16B1,0x16B1}:      64: C_FindObjects
{0x16B1,0x16B1}:      65: C_FindObjectsFinal
{0x16B1,0x16B1}:      66: C_SignInit
{0x16B1,0x16B1}:      67: C_Sign
{0x16B1,0x16B1}:      68: C_Sign
{0x16B1,0x16B1}:      69: C_CloseSession

Моя цель была определить с какой максимальной скоростью можно осуществлять подписи документов. Моя программа показала около 500 мс инициализации и 325 мс подписи хеша. Итого 825 мс.

Реальная же картина работы плагина в браузере показывает большое количество повторяющихся запросов, по итогу дающих вот такой печальный результат - 6 секунд времени на 1 подпись хеша:

0: C_GetFunctionList: 15:02:32.590
<много-премного всего>
69: C_CloseSession: 15:02:38.398

Хотелось бы узнать, это нормально для плагина? Можно ли как-нибудь ускорить работу плагина без вызова лишних запросов?
Открыл сессию - Залогинился - Нашел ключ - Подписал

Re: Скорость работы плагина для браузера

Виктор Павлович, добрый день!

Короткий способ подписания описан в примере из Рутокен SDK, по пути внутри архива: <sdk>\pkcs11\samples\Standard\SignGOST34.10-2012-256WithHash.

Проверку на наличие механизмов (GetMechanismList) можно также исключить.

Кроме того, можно использовать программное хеширование данных, для этого надо раскомментировать соответствующие механизмы в sdk\pkcs11\samples\include\Common.h. См. строку 182 примера SignGOST34.10-2012-256WithHash.c

Re: Скорость работы плагина для браузера

Павел Анфимов пишет:

Короткий способ подписания описан в примере из Рутокен SDK, по пути внутри архива: <sdk>\pkcs11\samples\Standard\SignGOST34.10-2012-256WithHash.

Проверку на наличие механизмов (GetMechanismList) можно также исключить.

На основе этих примеров я и создал тестовую программу для подписи 32 байтового хеша подписываемого файла. Время выполнения программы - 325 мс хеш + 500 мс инициализация. Меня это устраивает.

Меня не устраивает скорость работы плагина для браузера. Я хочу понять, почему при использовании плагина для браузера для абсолютно той же задачи (подписать хеш) - я получаю 6 секунд выполнения и 69 вызовов API PKCS#11.

Re: Скорость работы плагина для браузера

Виктор Павлович, все зависит от того, как спроектирована веб-площадка.

Сам по себе, Рутокен Плагин работает быстрее. Посмотреть его возможности без программирования и оценить время работы можно на:
https://aktivco.github.io/rutoken-plugin-demo/

Re: Скорость работы плагина для браузера

Павел Анфимов пишет:

Сам по себе, Рутокен Плагин работает быстрее. Посмотреть его возможности без программирования и оценить время работы можно на:
https://aktivco.github.io/rutoken-plugin-demo/

Спасибо за ссылку. Очень помогло разобраться.