public inbox for gost@lists.stargrave.org
Atom feed
From: Sergey Matveev <stargrave@stargrave•org>
To: gost@lists.cypherpunks.ru
Subject: Re: Запрос функционала. Big-endian функции для проверки подписи по ГОСТ 34.10
Date: Mon, 7 Aug 2023 16:50:52 +0300	[thread overview]
Message-ID: <ZND2z8WEFga04VIi@stargrave.org> (raw)
In-Reply-To: <3691691395371@mail.yandex.ru>

[-- Attachment #1: Type: text/plain, Size: 4236 bytes --]

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

*** Искандаров Эдуард [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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

  reply	other threads:[~2023-08-07 13:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-07  8:54 Запрос функционала. Big-endian функции для проверки подписи по ГОСТ 34.10 Искандаров Эдуард
2023-08-07 13:50 ` Sergey Matveev [this message]
2023-08-07 15:37   ` Искандаров Эдуард