PyDERASN: ұяшықтары мен блобтары бар ASN.1 кітапханасын қалай жаздым

ASN.1 бұл құрылымдық ақпаратты сипаттайтын тілдің стандарты (ISO, ITU-T, GOST), сондай-ақ осы ақпаратты кодтау ережелері. Мен үшін, бағдарламашы ретінде, бұл JSON, XML, XDR және басқалармен бірге деректерді сериялау және ұсынудың тағы бір пішімі. Бұл біздің күнделікті өмірімізде өте кең таралған және көптеген адамдар онымен кездеседі: ұялы, телефон, VoIP байланысында (UMTS, LTE, WiMAX, SS7, H.323), желілік протоколдарда (LDAP, SNMP, Kerberos), барлық нәрселерде. криптографияға қатысты (X.509, CMS, PKCS стандарттары), банк карталары мен биометриялық төлқұжаттарда және т.б.

Бұл мақала талқыланады PyDERASN: Python ASN.1 кітапханасы криптографияға қатысты жобаларда белсенді қолданылады Атлас.

PyDERASN: ұяшықтары мен блобтары бар ASN.1 кітапханасын қалай жаздым
Жалпы, ASN.1 криптографиялық тапсырмалар үшін ұсынылмайды: ASN.1 және оның кодектері күрделі. Бұл код қарапайым болмайтынын білдіреді және бұл әрқашан қосымша шабуыл векторы болып табылады. Қараңызшы тізімге ASN.1 кітапханаларындағы осалдықтар. Брюс Шнайер өзінің Криптографиялық инженерия сонымен қатар күрделілігіне байланысты осы стандартты қолданбауға кеңес береді: «Ең танымал TLV кодтауы - ASN.1, бірақ ол өте күрделі және біз одан қашқақтаймыз». Бірақ, өкінішке орай, бүгін бізде ашық кілттер инфрақұрылымы олар белсенді түрде қолданылады X.509 сертификаттары, CRL, OCSP, TSP, CMP протоколдары, CMC, хабарлар CMS, және көптеген стандарттар PKCS. Сондықтан, егер сіз криптографияға қатысты кез келген әрекетті орындасаңыз, ASN.1-мен жұмыс істей білуіңіз керек.

ASN.1 әр түрлі жолдармен/кодектермен кодталуы мүмкін:

  • БЕР (Негізгі кодтау ережелері)
  • CER (канондық кодтау ережелері)
  • DER (Айрықша кодтау ережелері)
  • GSER (Жалпы жолды кодтау ережелері)
  • Джер (JSON кодтау ережелері)
  • LWER (Жеңіл салмақты кодтау ережелері)
  • REO (Октет кодтау ережелері)
  • PER (Бумаланған кодтау ережелері)
  • SER (сигналдың арнайы кодтау ережелері)
  • ШӘКІРТТЕР (XML кодтау ережелері)

және басқа да бірқатар. Бірақ криптографиялық тапсырмаларда іс жүзінде екеуі қолданылады: BER және DER. Тіпті қол қойылған XML құжаттарында (XMLDSig, XAdES) JSON-бағытталған протоколдағы сияқты Base64-кодталған ASN.1 DER нысандары әлі де болады. акме Let's Encrypt сайтынан. Сіз мақалалар мен кітаптарда осы кодектердің барлығын және BER/CER/DER кодтау принциптерін жақсырақ түсіне аласыз: ASN.1 қарапайым сөздермен, ASN.1 — Гетерогенді жүйелер арасындағы байланыс Оливье Дюбюссон, ASN.1 Профессор Джон Лармут толтырған.

BER – екілік байтқа бағытталған (мысалы, PER, ұялы байланыста танымал – битке бағытталған) TLV пішімі. Әрбір элемент келесідей кодталған: тег (Tag), кодталатын элемент түрін анықтау (бүтін сан, жол, күн және т.б.), ұзындығы (Length) мазмұн және мазмұнның өзі (Vжоғары). BER опциясы арнайы белгісіз ұзындық мәнін орнату және Сегіздіктің соңы туралы хабарды Сегіздіктің соңы белгісімен аяқтау арқылы ұзындық мәнін көрсетпеуге мүмкіндік береді. Ұзындықты кодтаудан басқа, BER деректер түрлерін кодтау тәсілінде көптеген өзгермелілікке ие, мысалы:

  • INTEGER, ОБЪЕКТ ИДЕНТИФИКАЕРІ, BIT STRING және элемент ұзындығы нормаланбауы мүмкін (ең аз пішінде кодталмаған);
  • BOOLEAN кез келген нөлдік емес мазмұн үшін ақиқат;
  • BIT STRING "қосымша" нөлдік биттерді қамтуы мүмкін;
  • BIT STRING, OCTET STRING және олардың барлық туынды жол түрлері, соның ішінде күні/уақыты, (де)кодтау кезінде ұзындығы алдын ала белгісіз айнымалы ұзындықтағы бөліктерге бөлінуі мүмкін;
  • UTCTime/GeneralizedTime уақыт белдеуінің ығысуын және секундтардың "қосымша" нөлдік бөліктерін көрсетудің әртүрлі тәсілдеріне ие болуы мүмкін;
  • DEFAULT SEQUENCE мәндері кодталуы немесе кодталмауы мүмкін;
  • BIT STRING ішіндегі соңғы биттердің аталған мәндері міндетті түрде кодталмаған болуы мүмкін;
  • SEQUENCE (OF)/SET (OF) элементтердің кез келген ретіне ие болуы мүмкін.

Жоғарыда айтылғандардың барлығына байланысты деректерді бастапқы пішінмен бірдей етіп кодтау әрқашан мүмкін бола бермейді. Сондықтан ережелердің ішкі жинағы ойлап табылды: DER - мысалы, бір битті өзгерту қолтаңбаны немесе бақылау сомасын жарамсыз ететін криптографиялық тапсырмалар үшін өте маңызды болып табылатын тек бір жарамды кодтау әдісін қатаң реттейді. DER маңызды кемшілігі бар: барлық элементтердің ұзындығы кодтау уақытында алдын ала белгілі болуы керек, бұл деректерді ағынды сериялауға мүмкіндік бермейді. CER кодекінде мұндай кемшілік жоқ, ол деректердің бір мәнді ұсынылуына кепілдік береді. Өкінішке орай (немесе бізде одан да күрделі декодерлердің жоқтығы бақытты ма?), ол танымал бола алмады. Сондықтан іс жүзінде біз BER және DER кодталған деректерін «аралас» пайдалануды кездестіреміз. CER және DER екеуі де BER жиыны болғандықтан, кез келген BER декодері оларды өңдей алады.

pyasn1 проблемалары

Жұмыста біз криптографияға қатысты көптеген Python бағдарламаларын жазамыз. Ал бірнеше жыл бұрын тегін кітапханаларды таңдау іс жүзінде болған жоқ: не бұл жай ғана кодтауға/декодтауға мүмкіндік беретін өте төмен деңгейлі кітапханалар, мысалы, бүтін сан мен құрылым тақырыбын немесе осы кітапхананы pyasn1. Біз онымен бірнеше жыл өмір сүрдік және бастапқыда біз өте риза болдық, өйткені ол сізге жоғары деңгейлі нысандар сияқты ASN.1 құрылымдарымен жұмыс істеуге мүмкіндік береді: мысалы, декодталған X.509 сертификатының нысаны оның өрістеріне арқылы кіруге мүмкіндік береді. сөздік интерфейсі: cert[“tbsCertificate”] [“serialNumber”] бізге осы сертификаттың сериялық нөмірін көрсетеді. Сол сияқты күрделі нысандарды олармен тізімдер, сөздіктер ретінде жұмыс істеу арқылы «жинақтауға» болады, содан кейін жай ғана pyasn1.codec.der.encoder.encode функциясын шақырып, құжаттың серияланған көрінісін алуға болады.

Дегенмен, кемшіліктер, проблемалар мен шектеулер анықталды. pyasn1-де қателер болды және, өкінішке орай, әлі де бар: жазу кезінде pyasn1 негізгі түрлерінің бірі GeneralizedTime, дұрыс емес декодталған және кодталған.

Біздің жобаларымызда кеңістікті үнемдеу үшін біз көбінесе файл жолын, ығысуын және сілтеме жасағымыз келетін нысанның байт ұзындығын сақтаймыз. Мысалы, ерікті қол қойылған файл CMS SignedData ASN.1 құрылымында орналасуы мүмкін:

  0     [1,3,1018]  ContentInfo SEQUENCE
  4     [1,1,   9]   . contentType: ContentType OBJECT IDENTIFIER 1.2.840.113549.1.7.2 (id_signedData)
 19-4   [0,0,1003]   . content: [0] EXPLICIT [UNIV 16] ANY
 19     [1,3, 999]   . . DEFINED BY id_signedData: SignedData SEQUENCE
 23     [1,1,   1]   . . . version: CMSVersion INTEGER v3 (03)
 26     [1,1,  19]   . . . digestAlgorithms: DigestAlgorithmIdentifiers SET OF
                           [...]
 47     [1,3, 769]   . . . encapContentInfo: EncapsulatedContentInfo SEQUENCE
 51     [1,1,   8]   . . . . eContentType: ContentType OBJECT IDENTIFIER 1.3.6.1.5.5.7.12.2 (id_cct_PKIData)
 65-4   [1,3, 751]   . . . . eContent: [0] EXPLICIT OCTET STRING 751 bytes OPTIONAL

                 ТУТ СОДЕРЖИМОЕ ПОДПИСЫВАЕМОГО ФАЙЛА РАЗМЕРОМ 751 байт

820     [1,2, 199]   . . . signerInfos: SignerInfos SET OF
823     [1,2, 196]   . . . . 0: SignerInfo SEQUENCE
826     [1,1,   1]   . . . . . version: CMSVersion INTEGER v3 (03)
829     [0,0,  22]   . . . . . sid: SignerIdentifier CHOICE subjectKeyIdentifier
                               [...]
956     [1,1,  64]   . . . . . signature: SignatureValue OCTET STRING 64 bytes
                     . . . . . . C1:B3:88:BA:F8:92:1C:E6:3E:41:9B:E0:D3:E9:AF:D8
                     . . . . . . 47:4A:8A:9D:94:5D:56:6B:F0:C1:20:38:D2:72:22:12
                     . . . . . . 9F:76:46:F6:51:5F:9A:8D:BF:D7:A6:9B:FD:C5:DA:D2
                     . . . . . . F3:6B:00:14:A4:9D:D7:B5:E1:A6:86:44:86:A7:E8:C9

және бастапқы қол қойылған файлды офсеттік 65 байт, 751 байт ұзындығы бойынша ала аламыз. pyasn1 бұл ақпаратты өзінің декодталған нысандарында сақтамайды. TLVSeeker деп аталатын - тегтер мен нысан ұзындығын декодтауға мүмкіндік беретін шағын кітапхана, оның интерфейсінде біз «келесі тегке өту», «тегтің ішіне өту» (SEQUENCE нысанының ішіне өту) пәрменін бердік. «Келесі тегке өтіңіз», «өз ығысуыңызды және біз орналасқан нысанның ұзындығын айтыңыз». Бұл ASN.1 DER серияланған деректер арқылы «қолмен» жүру болды. Бірақ BER-сериялық деректермен осылай жұмыс істеу мүмкін емес еді, өйткені, мысалы, OCTET STRING байт жолын бірнеше бөліктер түрінде кодтауға болады.

Біздің pyasn1 тапсырмаларының тағы бір кемшілігі - декодталған нысандардан берілген өрістің SEQUENCE ішінде бар-жоғын түсіну мүмкін емес. Мысалы, егер құрылымда Field SEQUENCE OF Smth ҚОСЫМША өрісі болса, онда ол кіріс деректерде мүлдем болмауы мүмкін (ҚОСЫМША) немесе ол бар болуы мүмкін, бірақ ұзындығы нөлдік болуы мүмкін (бос тізім). Жалпы, мұны анықтау мүмкін болмады. Және бұл алынған деректердің дұрыстығын қатаң тексеру үшін қажет. Кейбір сертификаттау органы ASN.1 схемалары тұрғысынан «толығымен» жарамды емес деректері бар сертификат береді деп елестетіп көріңіз! Мысалы, «TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı» сертификаттау орталығы өзінің түбірлік сертификатындағы рұқсат етілген шектен асып кетті. RFC 5280 пәндік компоненттің ұзақтығы бойынша шектеулер - оны схемаға сәйкес шынайы түрде декодтау мүмкін емес. DER кодекі мәні DEFAULT мәніне тең өрістің жіберу кезінде кодталмағанын талап етеді - мұндай құжаттар өмірде болады, ал PyDERASN бірінші нұсқасы тіпті осы мақсат үшін мұндай жарамсыз (DER көзқарасы бойынша) әрекетке әдейі рұқсат берді. кері үйлесімділік.

Тағы бір шектеу - құрылымда белгілі бір нысанның қандай пішінде (BER/DER) кодталғанын оңай анықтау мүмкін еместігі. Мысалы, CMS стандарты хабардың BER-кодталғанын айтады, бірақ криптографиялық қолтаңба жасалатын signedAttrs өрісі DER-де болуы керек. Егер біз DER көмегімен декодтасақ, біз CMS өңдеуде сәтсіздікке ұшыраймыз; егер біз BER арқылы кодты шешсек, signedAttrs қай пішінде екенін білмейміз. Нәтижесінде, TLVSeeker (pyasn1-де аналогы жоқ) signedAttrs өрістерінің әрқайсысының орнын іздеуі керек және оны серияланған көрсетілімнен бөлек алып, DER арқылы декодтауы керек.

Өте жиі болатын DEFINED BY өрістерін автоматты түрде өңдеу мүмкіндігі біз үшін өте қажет болды. ASN.1 құрылымын декодтаудан кейін бізде құрылым өрісінде көрсетілген ОБЪЕКТ ИДЕНТИФИКАЦИЯСЫ негізінде таңдалған схемаға сәйкес әрі қарай өңделуі тиіс көптеген КЕЗ КЕЛГЕН өрістер қалуы мүмкін. Python кодында бұл if жазуды, содан кейін КЕЗ КЕЛГЕН өріс үшін декодерді шақыруды білдіреді.

PyDERASN пайда болуы

Атласта біз кейбір ақауларды тапқанда немесе пайдаланатын тегін бағдарламаларды жақсартқанда, патчтарды үнемі жоғарғы жағына жібереміз. Біз pyasn1 жүйесіне жақсартуларды бірнеше рет жібердік, бірақ pyasn1 кодын түсіну оңай емес және кейде үйлеспейтін API өзгерістері бізді жеңіп шықты. Сонымен қатар, біз pyasn1-де болмаған генеративті тестілеу арқылы тест жазуға үйрендік.

Бір күні мен бұл жеткілікті болды деп шештім және __слот__s, офсеттер және әдемі көрсетілген блобтармен өз кітапханамды жазуға тырысатын кез келді! Жай ASN.1 кодекін жасау жеткіліксіз болар еді - біз оған барлық тәуелді жобаларымызды тасымалдауымыз керек және бұл ASN.1 құрылымдарымен жұмыс істеуге толы жүздеген мың код жолдары. Яғни, оған қойылатын талаптардың бірі: қазіргі pyasn1 кодының аудармасының жеңілдігі. Барлық демалысымды өткізіп, осы кітапхананы жазып, барлық жобаларды соған аудардым. Олар тесттермен 100% дерлік қамтылғандықтан, бұл кітапхананың толық жұмыс істейтінін білдіреді.

PyDERASN де 100% дерлік сынақты қамтиды. Керемет кітапханамен генеративті тестілеуді пайдаланады гипотеза. Ол да орындалды бұлыңғыр py-afl– Мен 32 ядролық аппаратта тамақтанамын. Бізде іс жүзінде Python2 коды қалмағанына қарамастан, PyDERASN әлі де онымен үйлесімділікті сақтайды және осыған байланысты жалғыз алты тәуелділік. Оның үстіне, ол қарсы сыналады ASN.1:2008 сәйкестік сынақ жинағы.

Онымен жұмыс істеу принципі pyasn1 - жоғары деңгейлі Python объектілерімен жұмыс істеуге ұқсас. ASN.1 схемаларының сипаттамасы ұқсас.

class TBSCertificate(Sequence):
    schema = (
        ("version", Version(expl=tag_ctxc(0), default="v1")),
        ("serialNumber", CertificateSerialNumber()),
        ("signature", AlgorithmIdentifier()),
        ("issuer", Name()),
        ("validity", Validity()),
        ("subject", Name()),
        ("subjectPublicKeyInfo", SubjectPublicKeyInfo()),
        ("issuerUniqueID", UniqueIdentifier(impl=tag_ctxp(1), optional=True)),
        ("subjectUniqueID", UniqueIdentifier(impl=tag_ctxp(2), optional=True)),
        ("extensions", Extensions(expl=tag_ctxc(3), optional=True)),
    )

Дегенмен, PyDERASN-де күшті терудің кейбір ұқсастықтары бар. pyasn1 ішінде өріс CMSVersion(INTEGER) типінде болса, оған int немесе INTEGER тағайындалуы мүмкін. PyDERASN тағайындалған нысанның дәл CMSVersion болуын қатаң талап етеді. Python3 кодын жазудан басқа, біз де қолданамыз аннотацияларды теру, сондықтан біздің функцияларымызда def func (сериялық, мазмұндар) сияқты түсініксіз аргументтер болмайды, бірақ def func (сериялық: CertificateSerialNumber, мазмұн: EncapsulatedContentInfo) және PyDERASN мұндай кодты сақтауға көмектеседі.

Сонымен қатар, PyDERASN-де дәл осы теру үшін өте ыңғайлы жеңілдіктер бар. pyasn1 SubjectKeyIdentifier().subtype(implicitTag=Tag(...)) өрісіне SubjectKeyIdentifier() параметріне нысанды тағайындауға рұқсат бермеді (қажетті IMPLICIT TAG жоқ) және нысандарды жиі көшіру және қайта жасау қажет болды. өзгертілген АЖЫРАУ/АЙЫҚ тегтер. PyDERASN тек негізгі типті қатаң сақтайды - ол құрылымның бұрыннан бар ASN.1 схемасындағы тегтерді автоматты түрде ауыстырады. Бұл қолданба кодын айтарлықтай жеңілдетеді.

Егер декодтау кезінде қате орын алса, pyasn1-де оның қай жерде болғанын түсіну оңай емес. Мысалы, жоғарыда айтылған түрік сертификатында біз келесі қатені аламыз: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (138-де) қанағаттандырылмаған шекаралар: 1 ⇐77 ⇐ 64 ASN .1 құрылымдарын жазу кезінде адамдар қателесуі мүмкін, бұл қолданбаларды жөндеуді немесе басқа тараптың кодталған құжаттарымен ақауларды анықтауды жеңілдетеді.

PyDERASN бірінші нұсқасы BER кодтауын қолдамайды. Ол әлдеқайда кейінірек пайда болды және әлі де уақыт белдеулерімен UTCTime/GeneralizedTime өңдеуді қолдамайды. Бұл болашақта болады, себебі жоба негізінен бос уақытымда жазылады.

Сондай-ақ, бірінші нұсқада DEFINED BY өрістерімен жұмыс болған жоқ. Бірнеше айдан кейін бұл мүмкіндік туды және белсенді түрде қолданыла бастады, бұл қолданбалы кодты айтарлықтай азайтады - бір декодтау операциясында тереңдікке дейін бөлшектелген бүкіл құрылымды алуға болады. Ол үшін схема қай өрістер нені «анықтайтынын» көрсетеді. Мысалы, CMS схемасының сипаттамасы:

class ContentInfo(Sequence):
    schema = (
        ("contentType", ContentType(defines=((("content",), {
            id_authenticatedData: AuthenticatedData(),
            id_digestedData: DigestedData(),
            id_encryptedData: EncryptedData(),
            id_envelopedData: EnvelopedData(),
            id_signedData: SignedData(),
        }),))),
        ("content", Any(expl=tag_ctxc(0))),
    )

егер contentType құрамында id_signedData мәні бар OID болса, мазмұн өрісі (сол SEQUENCE ішінде орналасқан) SignedData схемасына сәйкес декодталуы керек екенін айтады. Неліктен жақшалар көп? Өріс EnvelopedData құрылымдарындағыдай бір уақытта бірнеше өрістерді «анықтай» алады. Анықталған өрістер декодтау жолы деп аталатын жолмен анықталады - ол барлық құрылымдардағы кез келген элементтің нақты орнын көрсетеді.

Сіз бұл анықтамаларды диаграммаға бірден қосуды қаламайсыз немесе әрқашан мүмкіндігіңіз бола бермейді. OID және құрылымдар тек үшінші тарап жобасында белгілі болған қолданбаға тән жағдайлар болуы мүмкін. PyDERASN құрылымды декодтау кезінде дәл осы анықтамаларды орнату мүмкіндігін береді:

ContentInfo().decode(data, ctx={"defines_by_path": ((
    (
        "content", DecodePathDefBy(id_signedData),
        "certificates", any, "certificate", "tbsCertificate",
        "extensions", any, "extnID",
    ),
    ((("extnValue",), {
        id_ce_authorityKeyIdentifier: AuthorityKeyIdentifier(),
        id_ce_basicConstraints: BasicConstraints(),
        [...]
        id_ru_subjectSignTool: SubjectSignTool(),
    }),),
),)})

Мұнда біз CMS SignedData жүйесінде барлық тіркелген сертификаттар үшін олардың барлық кеңейтімдерін декодтауын айтамыз (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool және т.б.). Біз декодтау жолы арқылы қандай элементті схемада көрсетілгендей анықтаулармен «ауыстыру» керектігін көрсетеміз.

Ақырында, PyDERASN-де қашу мүмкіндігі бар командалық жол ASN.1 файлдарын декодтау үшін және бай әдемі басып шығару. Сіз ерікті ASN.1 кодын шеше аласыз немесе нақты анықталған схеманы көрсетіп, келесідей нәрсені көре аласыз:

PyDERASN: ұяшықтары мен блобтары бар ASN.1 кітапханасын қалай жаздым

Көрсетілетін ақпарат: нысанның ығысуы, тег ұзындығы, ұзындық ұзындығы, мазмұн ұзындығы, EOC бар болуы (октеттердің соңы), BER кодтау атрибуты, белгісіз ұзындықтағы кодтау атрибуты, EXPLICIT тегінің ұзындығы мен ығысуы (бар болса), құрылымдардағы нысан, ЖАСЫРЫН/АЙҚЫН тег мәні, схемаға сәйкес нысан атауы, оның негізі ASN.1 түрі, SEQUENCE/SET OF ішіндегі реттік нөмірі, CHOICE мәні (бар болса), адам оқи алатын атау INTEGER/ENUMERATED/BIT STRING схемаға сәйкес, кез келген базалық түрдің мәні , схемадан ӘДІМДІ/ҚОСЫМША жалауша, нысанның автоматты түрде DEFINED BY ретінде декодталғандығының белгісі және бұл қандай OID болғанына байланысты, адам оқи алатын OID.

Әдемі басып шығару жүйесі бөлек құралдардың көмегімен визуалды түрде көрсетілетін PP нысандарының тізбегін жасау үшін арнайы жасалған. Скриншот рендерерді қарапайым түсті мәтінмен көрсетеді. Сондай-ақ JSON/HTML пішіміндегі рендерерлер бар, сондықтан оны ASN.1 браузерінде бөлектеу арқылы көруге болады. asn1js жоба.

Басқа кітапханалар

Бұл мақсат емес еді, бірақ PyDERASN айтарлықтай шықты Тезірек pyasn1 қарағанда. Мысалы, мегабайт өлшеміндегі CRL файлдарын декодтау соншалықты ұзаққа созылуы мүмкін, сондықтан аралық деректерді сақтау пішімдері (жылдам) туралы ойлануға және қолданба архитектурасын өзгертуге тура келеді. pyasn1 CRL кодын шешеді CACert.org Менің ноутбугымда 20 минуттан астам уақыт кетеді, ал PyDERASN бар болғаны 28 секундты алады! Жоба бар asn1crypto, криптографиялық құрылымдармен жылдам жұмыс істеуге бағытталған: ол бірдей CRL кодты 29 секундта декодтайды (толық, жалқау емес), бірақ Python3 (983 МБ-қа қарсы 498) және Python3.5 (2) астында 1677 есе жұмыс істегенде жедел жадты екі есе дерлік тұтынады. 488-ге қарсы), ал pyasn1 4.3 есе көп тұтынады (2093-ге қарсы 488).

Мен атап өткен asn1crypto-ны біз қарастырмадық, өйткені жоба әлі бастапқы кезеңде болатын және біз бұл туралы естіген жоқпыз. Енді біз оның бағытына да қарамас едік, өйткені мен бірдей GeneralizedTime ерікті пішінді қабылдамайтынын және сериялау кезінде ол секундтың бір бөлігін үнсіз алып тастайтынын бірден білдім. Бұл X.509 сертификаттарымен жұмыс істеу үшін қолайлы, бірақ жалпы ол жұмыс істемейді.

Қазіргі уақытта PyDERASN - мен білетін ең қатаң тегін Python/Go DER декодері. Менің сүйікті Go кодтау/asn1 кітапханасында қатаң тексеру емес OBJECT IDENTIFIER және UTCTime/GeneralizedTime жолдары. Кейде қатаңдық кедергі келтіруі мүмкін (ең алдымен ешкім түзете алмайтын ескі қолданбалармен кері үйлесімділікке байланысты), сондықтан PyDERASN өтуі мүмкін әртүрлі параметрлер тексерулерді әлсірету.

Жоба коды мүмкіндігінше қарапайым болуға тырысады. Бүкіл кітапхана бір файлдан тұрады. Код өнімділікті қажетсіз оңтайландырусыз және DRY кодынсыз, түсінудің жеңілдігіне баса назар аудара отырып жазылған. Ол, мен айтып өткенімдей, UTCTime/GeneralizedTime жолдарының толық BER декодтауын, сондай-ақ REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, ендірілген PDV, CHARACTER STRING деректер түрлерін қолдамайды. Барлық басқа жағдайларда, мен Python-дағы басқа кітапханаларды пайдаланудың мәнін көрмеймін.

Менің барлық жобаларым сияқты PyGOST, GoGOST, ҰЯО, GoVPN, PyDERASN толығымен тегін бағдарламалық қамтамасыз ету, шарттары бойынша таратылады LGPLv3+, және тегін жүктеп алуға болады. Қолдану мысалдары бар осында мен PyGOST сынақтары.

Сергей Матвеев, киферпанк, мүше SPO қоры, Python/Go әзірлеушісі, бас маман «Атлас» СТК» КМК.

Ақпарат көзі: www.habr.com

пікір қалдыру