Skip to content

Соподписание по хешу и проверка ГОСТ с параметрами КриптоПро - #1

Draft
sozertsatel wants to merge 4 commits into
mainfrom
cursor/cosign-discovery-gost-cb6f
Draft

sozertsatel wants to merge 4 commits into
mainfrom
cursor/cosign-discovery-gost-cb6f

Conversation

@sozertsatel

@sozertsatel sozertsatel commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

Зачем

В 1.2.0 соподписание искало только файл с именем ровно <документ>.sig. Подпись 960-07-1529-Д-ИС20-27-АС-.pdf .sig (дефис и пробел в имени) не находилась, и программа молча создавала новый одноподписантный .sig. Подписанты КриптоПро с параметрами в signatureAlgorithm отклонялись проверкой с текстом «unrecognised signature parameters provided», хотя сами значения подписи ГОСТ Р 34.10-2012 верны.

Что изменилось

  • Поиск по содержимому. При добавлении документа в той же папке ищутся .sig / .p7s / .p7m, у которых messageDigest совпадает с хешем документа. Совпадение по имени больше не требуется. Перетащенный файл подписи с чужим именем сопоставляется так же; если хеш ни к одному документу очереди не подходит, имена перечисляются в статусе, а не пропускаются молча.
  • Явный выбор. Вместо флажка «Объединять с существующей .sig» — «Добавить к существующей подписи» / «Создать новую». У каждой строки очереди свой список: конкретный файл и число подписантов либо создание нового файла.
  • План до подписи. Например: «будет добавлена подпись №9 к «X.sig» (8 подписантов)» или «будет создан новый файл подписи». Если при создании нового уже есть <документ>.sig, в плане сказано, что он будет заменён; про резервную копию говорится, только если она включена в настройках.
  • Подтверждение. Перед подписью спрашивается согласие, если подходящие подписи в папке не войдут в новый файл, если <документ>.sig будет перезаписан без объединения, или если при объединении будут исключены подписанты с неверной привязкой к документу. Отказ ничего не записывает.
  • После подписи. Всегда видно число подписантов: «Подписан: 9 (8 + ваша) → X.sig» или «Подписан: 1, новый файл». Исключённые подписанты — отдельное предупреждение в строке.
  • Резервная копия. В «Настройках…» галочка «Создавать резервную копию .sig (.bak) перед подписанием». По умолчанию выключена. Если включить, копия пишется рядом непосредственно перед перезаписью.
  • «Объединить .sig» в меню убран. Соподписание выбирается в строке файла. Код объединения при подписании остаётся; имя результата при программном объединении по-прежнему <документ>.sig без молчаливой перезаписи.
  • Проверка ГОСТ. Если BouncyCastle отказывается от параметров signatureAlgorithm, значение подписи ГОСТ Р 34.10-2012 (256/512) и ГОСТ Р 34.10-2001 проверяется по подписанным атрибутам тем же ключом сертификата. Привязка messageDigest к документу по-прежнему обязательна.

Версия 1.3.1 — по замечаниям к тестовой сборке

  • Галочка резервной копии .bak в «Настройках…», по умолчанию выключена, состояние сохраняется.
  • Строка автора убрана с главного окна. На её месте — «Версия 1.3.1» из сборки. Автор по-прежнему в «О программе».
  • «Обзор…» и «Инструменты» стоят в одной строке над списком файлов, «Очистить список» — у правого края.
  • Сразу после «Инструменты» — «Применить ко всем»: все файлы, включая добавленные позже, берут режим первого файла. Если «Добавить к существующей» невозможно, строка остаётся на «Создать новую» и явно пишет, что подходящей подписи нет. Галочка сохраняется.
  • Пункт «Объединить .sig…» удалён из меню «Инструменты».

Главное окно 1.3.1: кнопки над списком, версия внизу

Тестовая сборка

Постоянная ссылка (pre-release test-latest, не latest): https://github.com/sozertsatel/SignService/releases/download/test-latest/SignService.exe

Workflow .github/workflows/test-latest.yml пересобирает exe теми же флагами, что и релиз, сдвигает тег test-latest на новый коммит и заменяет файлы. Запускается при push в cursor/cosign-discovery-gost-cb6f и в main, а также вручную. На репозитории zaynullinmi/SignService задание пропускается (github.repository == 'sozertsatel/SignService').

Автообновление программы ходит только в zaynullinmi/SignService/releases/latest. Этот pre-release в форке туда не попадает; тег test-latest к тому же не разбирается как номер версии.

Проверка на образцах

Образцы (PDF, восьмиподписантный файл с нестандартным именем и одноподписантный файл SignService) использовались только локально и в репозиторий не входят. Тест подключается, если задан SIGNSERVICE_SAMPLES или рядом лежит архив с образцами; иначе пропускается.

Объединение восьмиподписантного файла с подписью SignService по тому же PDF:

  • подписантов в результате: 9
  • все криптографически действительны (значение подписи, хеш документа, привязка сертификата)
  • исходные значения подписи сохранены: 8/8
  • план очереди для папки только с PDF и этим файлом: «будет добавлена подпись №9 к «960-07-1529-Д-ИС20-27-АС-.pdf .sig» (8 подписантов)»

Полный прогон dotnet run --project tests/SignService.Tests -c Release завершился с ALL TESTS PASSED.

Интерфейс

Очередь: добавить подпись к найденному файлу
Очередь: создать новый файл подписи
Подтверждение перед перезаписью и исключением подписантов
После подписи: счётчик добавленной подписи
Предупреждение об исключённых подписантах

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

cursoragent and others added 4 commits October 9, 2026 09:12
Подпись с нестандартным именем находится по содержимому, в очередь
явно попадает режим «добавить к файлу / создать новую», перед
перезаписью и исключением подписантов спрашивается подтверждение.
Проверка принимает signatureAlgorithm КриптоПро с параметрами ГОСТ.

Co-authored-by: sozertsatel <sozertsatel@users.noreply.github.com>
В истории версий — запись v1.3.0 от 09.10.2026. Номер версии
в метаданных сборки без суффикса коммита, чтобы файл и продукт
читали 1.3.0.

Co-authored-by: sozertsatel <sozertsatel@users.noreply.github.com>
По push в эту ветку и в main (и вручную) публикуется SignService.exe
на тег test-latest. Задание выполняется только в форке sozertsatel/SignService.

Co-authored-by: sozertsatel <sozertsatel@users.noreply.github.com>
Галочка .bak в настройках по умолчанию выключена. На главном окне
вместо автора показана версия, кнопки списка стоят над файлами,
«Объединить .sig» убран из меню, режим первого файла можно
применить ко всей очереди.

Co-authored-by: sozertsatel <sozertsatel@users.noreply.github.com>
@cursor

cursor Bot commented Oct 9, 2026

Copy link
Copy Markdown

Эта ветка заменена: upstream v1.3.0 (5177fd1) уже влил соподписание по содержимому и проверку ГОСТ. Правки окна 1.3.1 (резервная копия по желанию, версия вместо автора, кнопки над списком, «Применить ко всем») перенесены поверх upstream в #2: #2

Ветку этого запроса не переписывал.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants