Subject: Re: Запрос функционала. Big-endian функции для проверки подписи по ГОСТ 34.10

From: Sergey Matveev <[email-masked]>
Date: Mon, 7 Aug 2023 16:50:52 +0300

Приветствую!

*** Искандаров Эдуард [2023-08-07 13:54]:
>Хочется чтобы библиотека GoGOST предлагала функции для big-endian
>систем тоже.

По моему, вы что-то путаете в терминологии. GoGOST должен из коробки
работать и на big-endian системах тоже. math/big.Int (вы пишете
"int.Big", но, видимо, это опечатка) никакого отношения к endianness
систем не имеет: это библиотека для работы с "большими" числами,
варьируемой длины, выходящей за пределы размера машинного слова. Кроме
того, текущая функция проверки подписи PublicKey.VerifyDigest как-раз и
ожидает что и digest, и r и s будут big-endian (сериализованными) числами.

>func NewPublicFromCoords(c *Curve, x *int.Big, y *int.Big)

Это можно сделать так: gost3410.PublicKey{C: c, X: x, Y: y}.

>func (pub *PublicKey) VerifyDigestByParams(digest *int.Big, r *int.Big,
>s *int.Big) (bool, error) {
>
>В тоже время, это упростит клиентский код(в моем случае точно) тем, что
>не придется провоить избыточную сериализацию и десериализацию.

Вариант с передачей big.Int мне не нравится тем, что это всегда будет
означать наличие дополнительного кода у клиента, ведь он должен же будет
из байт получить big.Int. То есть, или мы заставляем клиента
(пользователя библиотека) писать какой-то дополнительный код и добавляем
больше функций в GoGOST. Или же, как это было до сих пор, мы не трогаем
библиотеку и клиента опционально (возможно ему не нужно будет делать
никакого преобразования endiannes/форматов) заставляем писать код для
верчения байт. Ваш вариант позволяет только сэкономить на верчении
нескольких десятков байт, что сущие доли копеек по сравнению с тысячами
куда более тяжёлых инструкций затрачиваемых при создании/проверке подписи.

Когда-то я добавлял PrivateKeyReverseDigest и
PrivateKeyReverseDigestAndSignature обёртки, которые удовлетворяли
интерфейсу crypto.Signer и могли сразу же использоваться для разных
задач. Сегодня выпустил GoGOST 5.13.0 релиз, в котором добавил
gost3410.PublicKeyReverseDigest и
gost3410.PublicKeyReverseDigestAndSignature, упрощающие проверку подписи
если необходимо "перевернуть" или хэш и подпись. Это не покрывает кучу
всех возможных вариаций подписи (
LE digest + LE RS, LE digest + LE SR, LE digest + BE RS, LE digest + BE SR
BE digest + LE RS, BE digest + LE SR, BE digest + BE RS, BE digest + BE SR),
но для задач X.509+TLS 1.3 оказалось достаточно. Если эти функции не
подойдут, то я не вижу проблем перетасовать несколько десятков байт.
http://www.git.cypherpunks.ru/?p=gostls13.git;a=commitdiff;h=99b9696abaa2f8c999c5f438013b9083503c32ce
Также добавил NewPublicKeyLE/BE, NewPrivateKeyLE/BE и RawLE/BE методы у
этих объектов.

-- 
Sergey Matveev (http://www.stargrave.org/)
OpenPGP: 12AD 3268 9C66 0D42 6967  FD75 CB82 0563 2107 AD8A