README.md

Простой тупой ASN.1 генератор (оснащённый и простым парсером)

Пример использования

from asn1gen import *

# генерация объекта
o1 = SEQUENCE(
    INTEGER(1234567),
    OBJECT_IDENTIFIER(dot2oid("1.2.3.311.4.987654.5")),
    UNICODE_STRING("Превед медвед"),
    NULL()  # noqa:F405
)

# разбор объекта
o2, tail = ASN1.parse(o1.der())  # вернёт объект и остаток данных

assert not tail  # нет лишних данных
assert o1 == o2  # порождённый и разобранный совпадают

with open("test.asn1", "wb") as f:
    f.write(o1.der())  # сохраним в файл

with open("test.asn1", "rb") as f:
    o3, t3 = ASN1.parse(f.read())  # читаем из файла

assert not t3    # нет лишних данных
assert o1 == o3  # порождённый и прочитанный совпадают

Тест

Выполним python3 -m asn1gen (или run.sh), чтобы получить

Generated:
SEQUENCE[
  INTEGER(1234567),
  INTEGER(33061),
  SET[
    BOOLEAN(FALSE),
    OCTET_STRING(b'Hello World'),
    BOOLEAN(FALSE),
    BIT_STRING(36, 0b111100001111000011110000111100001111)],
  UNICODE_STRING(Превед медвед),
  IA5String(b'ia5-string'),
  PrintableString(printable string),
  UTF8_STRING(Ещё кусок юникода),
  BOOLEAN(TRUE),
  CHARACTER_STRING(b'asdasd'),
  UNIVERSAL_STRING(b'zxczczxc'),
  OBJECT_IDENTIFIER(1.2.3.311.4.987654.5),
  NULL]
-----BEGIN ASN.1-----
MIGnAgMS1ocCAwCBJTEbAQEABAtIZWxsbyBXb3JsZAEBAAMGBPDw8PDwHhz//h8EQAQ1BDIE
NQQ0BCAAPAQ1BDQEMgQ1BDQEFgppYTUtc3RyaW5nExBwcmludGFibGUgc3RyaW5nDCDQldGJ
0ZEg0LrRg9GB0L7QuiDRjtC90LjQutC+0LTQsAEB/x0GYXNkYXNkHAh6eGN6Y3p4YwYJKgOC
NwS8pAYFBQA=
-----END ASN.1-----

Parsed: comparision is True
SEQUENCE[
  INTEGER(1234567),
  INTEGER(33061),
  SET[
    BOOLEAN(FALSE),
    OCTET_STRING(b'Hello World'),
    BOOLEAN(FALSE),
    BIT_STRING(36, 0b111100001111000011110000111100001111)],
  UNICODE_STRING(Превед медвед),
  IA5String(b'ia5-string'),
  PrintableString(printable string),
  UTF8_STRING(Ещё кусок юникода),
  BOOLEAN(TRUE),
  CHARACTER_STRING(b'asdasd'),
  UNIVERSAL_STRING(b'zxczczxc'),
  OBJECT_IDENTIFIER(1.2.3.311.4.987654.5),
  NULL]
-----BEGIN ASN.1-----
MIGnAgMS1ocCAwCBJTEbAQEABAtIZWxsbyBXb3JsZAEBAAMGBPDw8PDwHhz//h8EQAQ1BDIE
NQQ0BCAAPAQ1BDQEMgQ1BDQEFgppYTUtc3RyaW5nExBwcmludGFibGUgc3RyaW5nDCDQldGJ
0ZEg0LrRg9GB0L7QuiDRjtC90LjQutC+0LTQsAEB/x0GYXNkYXNkHAh6eGN6Y3p4YwYJKgOC
NwS8pAYFBQA=
-----END ASN.1-----

Using OpenSSL in /usr/bin/openssl
Parsed by OpenSSL:
    0:d=0  hl=3 l= 167 cons: SEQUENCE          
    3:d=1  hl=2 l=   3 prim:  INTEGER           :12D687
    8:d=1  hl=2 l=   3 prim:  INTEGER           :8125
   13:d=1  hl=2 l=  27 cons:  SET               
   15:d=2  hl=2 l=   1 prim:   BOOLEAN           :0
   18:d=2  hl=2 l=  11 prim:   OCTET STRING      :Hello World
   31:d=2  hl=2 l=   1 prim:   BOOLEAN           :0
   34:d=2  hl=2 l=   6 prim:   BIT STRING        
      0000 - 04 f0 f0 f0 f0 f0                                 ......
   42:d=1  hl=2 l=  28 prim:  BMPSTRING         
   72:d=1  hl=2 l=  10 prim:  IA5STRING         :ia5-string
   84:d=1  hl=2 l=  16 prim:  PRINTABLESTRING   :printable string
  102:d=1  hl=2 l=  32 prim:  UTF8STRING        :Ещё кусок юникода
  136:d=1  hl=2 l=   1 prim:  BOOLEAN           :255
  139:d=1  hl=2 l=   6 prim:  <ASN1 29>         
      0000 - 61 73 64 61 73 64                                 asdasd
  147:d=1  hl=2 l=   8 prim:  UNIVERSALSTRING   
      0000 - 7a 78 63 7a 63 7a 78 63-                          zxczczxc
  157:d=1  hl=2 l=   9 prim:  OBJECT            :1.2.3.311.4.987654.5
  168:d=1  hl=2 l=   0 prim:  NULL              
Описание

Приспичило тут родить ASN.1 просто в виде питонового кода

Конвейеры
0 успешных
0 с ошибкой