2 года назад
История
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 с ошибкой