Как сохранить подпись OpenSSL в файл в формате ASN.1 - PullRequest
0 голосов
/ 12 апреля 2019

Я реализую шаг "sign" уже введенного хэша input_hash.Это можно сделать напрямую с помощью

openssl pkeyutl -sign -in input_hash -inkey private.key -out signature 

, однако я использую внешнее устройство для вычисления ответа.Это дает мне 64-байтовый ответ, который мне теперь удалось правильно преобразовать в структуру, используемую Openssl.Это должна быть структура ECDSA_SIG из openssl/bn.h

struct ECDSA_SIG {
    BIGNUM *r;
    BIGNUM *s;
}

Далее я хотел бы сохранить эту структуру в виде двоичного (DER) файла, используя правильный формат ASN.1.Однако я не могу найти правильную функцию в библиотеке openssl.

Обратите внимание, что я использую клавишу EC, поэтому использование инструментов openssl rsautl не вариант.Посмотрев на вывод команды openssl выше, я вижу ту же структуру, которую пытаюсь достичь.

$ openssl asn1parse -in signature -inform DER
0:d=0  hl=2 l=  69 cons: SEQUENCE
2:d=1  hl=2 l=  33 prim: INTEGER :E8229B1CF88EC5BC6E8270161E34D986FC8A5A7D5B2ED3B7C65BA808494E7030
37:d=1  hl=2 l=  32 prim: INTEGER :3FF76A6CB0210037C2D0F9075080E1B6461CDD8F52BB2374DB2B350E81C8A5C3

Единственный пропущенный сейчас шаг - это сохранение моей структуры ECDSA_SIG в файле в правильном формате.В противном случае проверка в openssl с помощью следующей команды

openssl pkeyutl -verify -inkey public.key -sigfile signature -pkeyopt digest:sha256 -in input_hash -pubin  

, очевидно, завершится неудачей.

1 Ответ

2 голосов
/ 12 апреля 2019

Если у вас есть подпись в структуре ECDSA_SIG, вы можете использовать функцию i2d_ECDSA_SIG для ее преобразования в формат DER.Документировано здесь:

https://www.openssl.org/docs/man1.1.1/man3/i2d_ECDSA_SIG.html

...