Вопросы и немного конструктивной критики

Добрый день, я разрабатываю внешнюю ЭЦП компоненту для 1С на С++, IDE VS Professional 2022. По ходу разработки у меня появился ряд вопросов касательно KalkanCrypt.

  1. Сырая подпись почему-то работает только с входящим PEM и выходящим BASE64 флагами. В документации об этом нет ни слова.

  2. Все подписи (имеется ввиду CMS подпись) с отметкой Time Stamp не работают на тестовых вариантах(тестировал 3 разных варианта), на выходе вместо данных мы получаем пустую строку (без выявления ошибки), но на действующих ЭЦП все проходит нормально. (Пожалуйста укажите это явно в Технической Документации, либо исправьте тестовые варианты, чтобы они отрабатывались корректно.)

  3. Я не смог разобраться как использовать ваши статические “.lib” файлы (В технической документации нет об этом информации).
    После подключения либ файлов и попытке вызова из них функций по названиям, которые имеются в примерах и вашей технической документации, компилятор выдает ошибки вызова функций (то есть не может найти имена функций из этих либ). В примере для C++ используется динамическая библиотека, которая нам не подходит под задачи, а в примере для Linux используются либы из openSSL, которые не хотелось бы использовать (не из за того, что это сложнее, а из за переживаний на тему усложнения поддержки этого кода, тк вами используется, как я понял, кастомная openSSL).

  4. В технической документации достаточно скудно упоминаются возможности замены одних флагов на другие(и наслоения флагов друг на друга), это может ввести(и наверняка вводит) в заблуждение мало опытных разработчиков в этой среде, из за чего это сильно увеличивает затраты времени на разбирание Технической Документации для использования ваших библиотек.

  5. Ни в Технической Документации, ни в примерах нет информации как, например, записать внутрь PKCS12 контейнера отдельно хранящуюся подпись(CMS/DRAFT).

  6. Мы столкнулись с такой проблемой: если путь до файла (сертификата) содержит в себе кириллицу, то ваша библиотека не открывает этот файл как минимум через функцию “X509LoadCertificateFromFile()” (если путь полностью состоит из латиницы, то все проходит нормально и она работает).

  7. Документация разбросана в разных папках SDK (речь идёт про файлы с расширением “.docx”), так же как и примеры. Навигация была бы сильно удобнее, если бы все варианты документации имели бы свою папку, так же как и примеры для разных ЯП.
    Например забавная ситуация, когда я только начал разработку я столкнулся с такой проблемой, открываю пример под windows: смотрю в пример вижу там .txt файл захаркоженный в определенное место в папках (“example/test_CMS_GOST.txt”), пытаюсь его найти, а его просто нет, пользуюсь поиском по папке SDK нахожу его расположение тут “\C\Linux\C\test\example\test_CMS_GOST.txt”. Так же документация хранится по пути “\C\Linux\C\docs” (я понимаю что в заголовке этой документации написано, что она под библиотеки линукса, но она актуальна и для windows), а более менее подробная документация функций “SignData()” и “VerifyData()” имеет путь “\COM_Windows\docs”.

  8. Присутствие мелких ошибок в документации вводящих в ступор https://imgur.com/xFNZCIw (В данном случае не очевидно, что должна в себе содержать inSign).
    А вот тут в примере функция принимает 7 аргументов (https://imgur.com/9v1JdSk), а в документации и хэдере она имеет 10 аргументов (https://imgur.com/3lsKT6C).

  9. Пример имеющийся под C/C++ рассчитан сугубо под идеальные условия алгоритма выполнения, о чем стоило бы предупреждать в комментариях самого примера.

Этот пост не претензия, чтобы показать свое “фу”, а просто мои наблюдения и вопросы, возникшие по ходу работы, заранее спасибо за ответ

Привет! Я не из технической команды НУЦ РК, но попытался ответить на некоторые вопросы, так как сам активно ползуюсь либой kalkancrypt.

  1. Сырая подпись почему-то работает только с входящим PEM и выходящим BASE64 флагами. В документации об этом нет ни слова.

Если нужно завалидировать CMS подпись с подписываемыми данными внутри в сыром виде (обычно в DER кодировке), то нужно использовать флаги: SIGN_CMS + IN_BASE64 + OUT_BASE64

Если нужно проверять подпись отдельно от данных (detached CMS), то используй флаги: SIGN_CMS + IN_BASE64 + OUT_BASE64 + DETACHED_DATA

  1. Все подписи (имеется ввиду CMS подпись) с отметкой Time Stamp не работают на тестовых вариантах(тестировал 3 разных варианта), на выходе вместо данных мы получаем пустую строку (без выявления ошибки), но на действующих ЭЦП все проходит нормально. (Пожалуйста укажите это явно в Технической Документации, либо исправьте тестовые варианты, чтобы они отрабатывались корректно.)

Могу неправильно понять вопрос, но может быть вы не установили корневые сертификаты для тестовых ключей/подписей. К тому же нужно использовать тестовые OCSP, TSP.

  1. Ни в Технической Документации, ни в примерах нет информации как, например, записать внутрь PKCS12 контейнера отдельно хранящуюся подпись(CMS/DRAFT).

Kalkancrypt по сути это надстройка надо openssl. В данном кейсе, вы можете использовать openssl’ные функции для преобразовании PKCS12 контейнера.

  1. Документация разбросана в разных папках SDK (речь идёт про файлы с расширением “.docx”), так же как и примеры. Навигация была бы сильно удобнее, если бы все варианты документации имели бы свою папку, так же как и примеры для разных ЯП.

Хороший вопрос, я лично тоже потратил много времени для разбора либы. Как ответ на этот вопрос, можете поискать в поиске текущего форума. Многие вопросы тут уже задавали и техническая команда АО НИТ всегда отвечает на вопросы.

1 Симпатия