Как я могу перевести Perl Convert::ASN1 в код Ruby?
Вопрос
Может ли кто-нибудь посоветовать мне, что делает этот код и как мне проще всего преобразовать его в Ruby?
#!perl
use Convert::ASN1;
my $asn1 = Convert::ASN1->new(encoding => 'DER');
$asn1->prepare(q<
Algorithm ::= SEQUENCE {
oid OBJECT IDENTIFIER,
opt ANY OPTIONAL
}
Signature ::= SEQUENCE {
alg Algorithm,
sig BIT STRING
}
>);
my $data = $asn1->encode(sig => $body,
alg => {oid => sha512WithRSAEncryption()});
Это часть мексумген, библиотека Perl, которая подписывает update.rdf для продуктов Mozilla с помощью openssl.
Решение
Этот конкретный пример можно преобразовать как
data = ["308191300b06092a864886f70d01010d03818100" + body.unpack("H*")].pack("H*")
где «308191300b06092a864886f70d01010d03818100» — это префикс, созданный из этого выражения ASN до поля BIT STRING (включая размер BIT STRING), пакет («H») преобразует двоичные данные в шестнадцатеричное представление, а unpack («H») преобразует шестнадцатеричную строку обратно в двоичную. .
Но для более общего конвертера ASN лучше использовать OpenSSL::ASN1, который входит в состав стандартной библиотеки Ruby.Это совершенно недокументировано, но некоторым людям удалось это сделать. воспользуйся этим
Другие советы
Вы посмотрели Сеть::ASN1?