ASN.1 и Erlang

    В давние-предавние времёна, когда компьютеры были большими, а инженеры дальновидными, когда дух маркетологов был неведом рыцарям битов и терминалов, в одном царстве-государстве, у Калинового моста, собрались эти бравые мужи и решили придумать способ представления прозвольных структур данных для передачи их по сети, чтобы их прекрасные дамы могли общаться между собою по телефону и не отвлекали их от решения проблем насущных. Так как маркетологов в тех краях было мало, способ получился изящным и потребляющим мало ресурсов на кодирование/декодирование. И нарекли они его ASN.1, или коротко — X.208.

    Протокол ASN.1 описывает структуру данных простым и понятным языком. Например, нам надо описать сообщение, которое будет содержать в себе поле версии (целое число), тип сообщения (перечисление) и тело сообщения (бинарные данные). Мы получим такое описание и сохраним его в файлик SP.asn:

    SP DEFINITIONS AUTOMATIC TAGS ::=
    BEGIN
    
    Message ::= SEQUENCE
    {
      version           INTEGER DEFAULT 1,
      type              MsgType,
      body              Body
    }
    
    MsgType ::= ENUMERATED
    {
      public(0),
      private(1),
      tralala(2)
    }
    
    Body ::= OCTET STRING
    
    END
    


    Есть много разных компиляторов для ASN.1, как платных, так и бесплатных, для разных языков программирования, но мы остановимся на одном из них — компилятор из стандартной поставки Erlang/OTP. Выполним примерно такую команду:

    $ erlc SP.asn
    


    После компиляции создастся четыре файла:
    • SP.erl — исходный код кодировщика/декодировщика на языке Erlang
    • SP.hrl — заголовочный файл, содержащий рекорды отдельных описываемых структур
    • SP.beam — BEAM-файл, результат компиляции SP.erl
    • SP.asn1db — файл, содержащий внутерннее представление разобранного ASN.1-файла, используется в тех случаях, когда один файл импортирует структуры другого, чтобы не проводить синтаксический разбор и анализ импортируемого файла лишний раз

    Теперь можно с чистой совестью запустить интерпретатор Erlang и закодировать сообщение:
    [zert@pluto]:Habrahabr $>> erl
    Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
    
    Eshell V5.7.2  (abort with ^G)
    1> rr("SP.hrl").
    ['Message']
    2> {ok, Bin} = 'SP':encode('Message', #'Message'{version = 3, type = private, body = "Hello, ASN.1"}).
    {ok,[48,20,128,1,3,129,1,1,130,12,72,101,108,108,111,44,32,65,83,78,46,49]}
    


    Мы получили список байтов, который уже можно передавать по сети, сохранять
    на диск и делать прочие действия, которые можно делать с байтами.
    Обратное к закодированию действие — раскодирование. Делается это не сложнее, чем кодирование:

    3> 'SP':decode('Message', Bin).
    {ok,#'Message'{version = 3,type = private,
                   body = "Hello, ASN.1"}}
    
    

    Это самые базовые способы использования компилятора ASN.1 из Erlang/OTP, узнать о нём больше поможет чтение документации, например, вот здесь.
    Поделиться публикацией

    Похожие публикации

    Комментарии 66

      +3
      наконец-то кто-то написал об asn.1

      подозреваю флейм по поводу сабж vs xml ;)
        +2
        Для ASN.1 есть же XER (не то что подумалось, а xml encoding rules), так что имхо нечего и спорить — из ASN.1 можно получить XML, а вот обратно увы :(
          0
          Корректней было бы сравнивать языки описания схемы XML (DTD, XSD/WXS, RELAX NG), по ним вполне можно построить эквивалентное ASN.1 представление.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Вы меня не поняли. XML в данном случае контейнер, ASN.1 язык описания содержимого этого контейнера, DTD, XSD, RELAX NG — тоже. Если языки описывают одно и тоже, можно сделать вывод, что они эквиваленты. Этого уже достаточно, чтобы считать сравнение DTD, XSD, RELAX NG vs ASN.1 корректным, а XML vs ASN.1 — нет.

              Бонус: из всего этого следует, что схемы XML теоретически возможно перевести на ASN.1, тогда эти ваши Структуры Данных можно генерировать также, как и прочий эйэсенный хлам.
              • НЛО прилетело и опубликовало эту надпись здесь
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    С тем, что результат фиговый не поспоришь.

                    Можно ли где-нибудь в сети посмотреть на спецификации каких-либо нетривиальных форматов описанных на ASN.1, например описание формата Flash-файлов?
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        > H.323? :)

                        На сколько я понял, специфицируются только форматы сообщений, а сами потоковые бинарные данные нет. Есть что-нибудь такое чтобы прям по полочкам от самого абстрактного уровня и до битов? Или ASN.1 для этого не применяется?
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            > Не совсем понимаю чего вы конкретно хотите

                            Я пытаюсь выяснить у носителя языка возможно ли на нём описывать\кодировать данные изначально чуждые языку или этот язык вещь в себе. Например, возможно ли описать существующий бинарный формат, и после бинарного кодирования получить файл совместимый с приложениями предназначенными для работы с такими файлами.

                            Это всё не из праздного любопытства, у нас есть проект-долгожитель, который производит бинарные данные, начинался он на Дельфи ещё при царе Горохе, потом С++, потом понадобилось на сервере с помощью PHP некоторую часть данных обрабатывать, сейчас стало понятно, что было бы не плохо иметь доступ к этим данным из .NET. В итоге, имеется куча маленьких велосипедов для доступа к этим данным и один большой на C++. Если бы можно было на чём-то описать прародителя всех велосипедов и генерировать из него для каждого языка\платформы свою проекцию, сохранив при этом бинарную совместимость — это была бы сказка.
                              0
                              ASN.1 не может генерировать произвольный бинарный формат. Бинарник, полученный из описания в ASN.1 имеет чёткую структуру, и описать уже существующий бинарный протокол, используя ASN.1 не получится.
                                0
                                На самом деле, может. Технология называется ECN.
                                  0
                                  Что-то никак не могу найти. Можешь ссылкой поделиться?
                                      0
                                      Спасибо, не натыкался раньше
                                        0
                                        Это потому, что ты смотрел на отсутствующий стандарт X.208. Если бы ты посмотрел X.680+, там бы сразу ECN нашёл.
                            0
                            В Wireshark есть поддержка MPEG Audio, и лежит файл с описанием формата в ASN.1. Но сам поток там не описывается, да и не применяется asn.1 для кодирования потоковых данных.
                              0
                              Применяется. Вернее, рассчитывалось, что может применяться. См. стандарт CER. Компилятор lionet.info/asn1c поддерживает потоковое декодирование.
                                0
                                Не знал, спасибо
            +4
            Флеймить по этой теме не имеет смысла, так как ниши у XML и ASN.1 разные, хотя и пересекаются в некоторой области, отличной от нуля. Но всё равно, в большинстве случаев надо использовать здравый смысл и выбрать тот инструмент, который лучше других подходит для решения проблемы. Фанатично пытаться повсюду использовать какой-то один формат в ущерб задаче — по меньшей мере глупо.
              +1
              JSON is my favourite ;)
              +1
              Google Protocol Buffers тоже вполне хороши.
                0
                ASN.1 ещё долго не уйдёт со сцены, так что работать с ним надо уметь. PB только что появился и пройдут ещё годы, прежде чем он получит такой же вес, как и ASN.1.
                  0
                  Он походу вобще не уйдет со сцены :) На нем вся криптография в этих всяких интернетах базируется. Как минимум.
                    0
                    Ну всё меняется в этом мире. Мало ли, что ещё придумают.
                      0
                      пока что asn.1 никуда не делся. а прошло более 2-х лет :-)
                        0
                        ASN.1 ещё минимум лет 15 будет жить, а максимум — неизвестно сколько.
                –6
                Гм, в Perl/PHP все проще, это встроенная функция pack/unpack (ну или serialize для эстетов) :)
                  +2
                  Это совсем разные вещи.
                  Аналог pack/unpack в ерланге — term_to_binary/binary_to_term.
                  –1
                  Эх… Для SEQUENCE'а из трех полей ASN понятен. Но в разборе какого-нибудь CMS увязнуть проще некуда. Хотя скорость и экономия памяти приличная.
                    0
                    А зачем для CMS тогда использовать ASN.1?
                      0
                      en.wikipedia.org/wiki/Content_management_system
                      !=
                      en.wikipedia.org/wiki/Cryptographic_Message_Syntax

                      А последний именно что ASN encoded.
                        0
                        Я про en.wikipedia.org/wiki/CMS_protocol подумал.
                        А в разборе Cryptographic Message Syntax что сложного? Можно ещё посмотреть на такие протоколы, как H.248 и H.323, там тоже ASN.1 используется и всё вполне нормально разбирается.
                          0
                          Как много в IT любви к аббревиатурам :)
                          Разбор не особо сложный — сложно для понимания. Хотя краем глаза глянул на H.323 — тож без поллитры не разберешься :)
                            0
                            Это так сначала кажется, что сложно. Когда начинаешь использовать — становится просто и понятно.
                              0
                              Ага, то-то в линуксе и большинстве сетевых устройств NAT h.323 представляет из себя эвристику, которая в общем случае не работает, а работает только с определенными опциями.
                              То-то решения для sip-телефония плодятся как грибы.
                              То-то фирма dlink закрыла поддержку h.323 в шлюзах.

                              Ну просто очень простой и дружественный протокол.
                                0
                                Казалось бы, причём тут ASN.1?
                                С таким же успехом можно высказываться против передачи данных с помощью байтов, аргументируя это тем, что от H.323 отказываются, а он передаётся байтами.
                                  0
                                  Можно и дальше расширить: практические примеры показывают, что бинарные протоколы, даже использующие ASN.1, все равно не становятся достаточно удобными и простыми в сопровождении.

                                  А отказываться не надо. Надо внимательно взвешивать технологии при их выборе.
                                    0
                                    Можете привести эти практические примеры, кроме H.323?
                                      0
                                      Легко: практически все развитые (читай настолько удобные, что не загнулись) протоколы интернета базирующиеся на TCP — НЕ БИНАРНЫЕ.
                                        0
                                        Когда у человека единственный инструмент — молоток, то всё вокруг кажется гвоздями. Когда единственный инструмент — PHP, всё становится текстовым протоколом.
                                          0
                                          Вместо того, чтобы делать выводы обо мне по моим сегодняшним постам, лучше почитайте RFC — узнаете, что вот уже 40 лет текстовые протоколы двигают Интернет.
                                            0
                                            Вот я на то и намекаю, что не все люди с PHP в руках делают интернет. Интернетом жизнь не ограничивается, есть много других, более интересных занятий.
                                              0
                                              И занятия эти сводятся к унаследованным сетям связи и каналам с крайне низкой пропускной способностью.
                                              А там где нету этих проблем, современные протоколы получаются текстовыми. Взять хотя бы относительно свежий MGCP: казалось бы, те же самые бравые мужи-телефонисты из nortel проектировали, но протокол почему-то вышел текстовым.
                                              С SIP та же история — разрабочик Bell Labs.
                                                0
                                                А взять хотя бы ещё более свежий H.248/Megaco, так почему-то есть и текстовый, и бинарный формат, как раз в ASN.1.
                                                  0
                                                  Ну а что там на практике у железок? Оба варианта поддерживаются одинаково хорошо?
                                                    0
                                                    Да.
                                                    Я вообще не пойму, с какой целью ведётся этот спор. Хотите сказать, что работать с ASN.1 не надо, так как формат плохой? Или то, что бинарные форматы не нужны? Или просто поговорить приспичило?
                                                      0
                                                      С целью опровергнуть первоначальное утверждение о простоте бинарных форматов.
                                                      Ну и бравых мужей помянуть словом бранным.
                                                        0
                                                        Я пока не видел опровержений. Если, конечно, не считать подход «мне не нравится — не нужно» достаточной аргументацией.

                                                        Кстати, протокол AMQP бинарный :)
                                                          0
                                                          «слишком многим не нравится — в большинстве случаев не нужен».
                                                            0
                                                            Т.е. везде должны использоваться Java, XML, PHP и Windows? Что решения, отличные от мейнстрима, не должны иметь права на жизнь?
                                                              0
                                                              Плохой пример. Но, да. В такой области как коммуникации — желательно придерживаться общепринятой практики.
                                                                0
                                                                Так вот, в телекоммуникациях ASN.1 — общепринятая практика.
                                                                  0
                                                                  Ну и пусть. Это дурное воспитание.
                                                                  А если считать телекоммуникациями еще и Интернет, то объем разработок в этой области гораздо больше разработок перекладывающих байтики связистов. И получается ASN.1 не особо общепринят.
                                                                    0
                                                                    Вечер юмора можно считать открытым?
                                                                      0
                                                                      Надеюсь у вас все будет хорошо.
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                    0
                                                    А судя по заголовку rfc 2543, он работал над протоколом от имени Bell Labs.
                      0
                      Сам Джо в своих тезисах XML'у противопоставляет UBF. Не знаю, насколько актуальная вещь.
                      0
                      Для описания CDR и т.п. записей оборудования ASN незаменим, так как позволяет покрывать сложную (включая рекурсию) структуру.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          GPB компактнее за счет более удачного кодирования — wire type и tag там идут одним байтом
                            0
                            ASN1, кроме всего прочего, еще и стандарт кодирования в цифровых подписях CMS Digital Signature (RFC3852), то есть используется много где

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое