Я реализую шаг "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
, очевидно, завершится неудачей.