Как разобрать ASN1 в Ruby - PullRequest
       100

Как разобрать ASN1 в Ruby

0 голосов
/ 18 декабря 2018

Еще немного запутался с ASN1.Я анализирую ответ метки времени RFC3161 с ruby ​​openssl, так что я знаю спецификацию.Я почти уверен, что структура загружается правильно, но я запутался в том, как найти нужные мне части / ключи.Я понимаю, что есть последовательности (упорядоченные) и наборы (неупорядоченные / уникальные).

Я вижу, что мы можем назвать asn1_object.value[0].value[0], но это неуклюже и Я надеялся, что знаю ключи или заголовки,Я могу воспринимать это как JSON или YAML и просто звонить asn1_object['TSTInfo']['serialNumber']. Разве это не работает таким образом?

Должны ли мы использовать свойства последовательности, которые должны быть в порядке, и уже знаем их положение, так как у нас также есть спецификации и длины?Это странно для меня, но, может быть, это потому, что я раньше не использовал много форматов TLV.К сожалению, openssl имеет минимальную документацию, как загрузить объект с помощью OpenSSL::ASN1.decode(der) и получить доступ к значению по индексу.Существует также метод traverse, но он не дает имен заголовков или чего-либо еще, что я хотел бы использовать в этом случае.

                #<OpenSSL::ASN1::Sequence:0x000055fdee1a2c68
                   @indefinite_length=false,
                   @tag=16,
                   @tag_class=:UNIVERSAL,
                   @tagging=nil,
                   @value=
                    [#<OpenSSL::ASN1::ObjectId:0x000055fdee1a2ec0
                      @indefinite_length=false,
                      @tag=6,
                      @tag_class=:UNIVERSAL,
                      @tagging=nil,
                      @value="1.2.840.113549.1.9.52">,
                     #<OpenSSL::ASN1::Set:0x000055fdee1a2c90
                      @indefinite_length=false,
                      @tag=17,
                      @tag_class=:UNIVERSAL,
                      @tagging=nil,
                      @value=
                       [#<OpenSSL::ASN1::Sequence:0x000055fdee1a2cb8
                         @indefinite_length=false,
                         @tag=16,
                         @tag_class=:UNIVERSAL,
                         @tagging=nil,
                         @value=
                        [#<OpenSSL::ASN1::Sequence:0x000055fdee1a2da8
                            @indefinite_length=false,
                            @tag=16,
                            @tag_class=:UNIVERSAL,
                            @tagging=nil,
                            @value=

                   @value=
                    [#<OpenSSL::ASN1::ObjectId:0x000055fdee1a3190
                      @indefinite_length=false,
                      @tag=6,
                      @tag_class=:UNIVERSAL,
                      @tagging=nil,
                      @value="signingTime">,
                     #<OpenSSL::ASN1::Set:0x000055fdee1a30f0
                      @indefinite_length=false,
                      @tag=17,
                      @tag_class=:UNIVERSAL,
                      @tagging=nil,
                      @value=
                       [#<OpenSSL::ASN1::UTCTime:0x000055fdee1a3118
                         @indefinite_length=false,
                         @tag=23,
                         @tag_class=:UNIVERSAL,
                         @tagging=nil,
                         @value=2018-12-19 01:49:08 UTC>]>]>

1 Ответ

0 голосов
/ 19 декабря 2018

Openssl.ASN1.decode (der) в примере, на который вы ссылаетесь, использует каноническую природу DER для восстановления структуры по проводным данным и вообще не использует схему ASN.1.Таким образом, хотя он может определить, какую форму, состав и содержание этой структуры, из того, что он читает из проводных данных (особенно, если он был закодирован с помощью явной пометки, которая также дает тип данных), он не имеет представления о том, какими были бы имена полей.в исходной схеме (это не данные проводного формата).

Если вы посмотрите на оригинальную схему ASN.1 для отметки времени RFC3161, вы можете определить, какие поля находятся.

Использование ASN.1 с C / C ++, Java и C #, как правило, одним.использует компилятор ASN.1 для генерации исходного кода.Этот исходный код определяет классы, которые содержат поля с именами полей, взятыми из схемы.Извините, я понятия не имею, возможно ли это в Openssl.ASN1

Неявный / Явный в Ruby.

Пример, для которого вы предоставили ссылку, дает небольшую свободу спример неявного тегирования.Это интерпретирует значение как целое число;строго говоря, это следует интерпретировать как большее количество ASN.1 для декодирования.Просто так получилось, что эти байты являются целыми числами.

...