PyDERASN: kumaha kuring nulis perpustakaan ASN.1 kalawan liang sarta blobs

ASN.1 Ieu mangrupikeun standar (ISO, ITU-T, GOST) tina basa anu ngajelaskeun inpormasi terstruktur, ogé aturan pikeun ngodekeun inpormasi ieu. Pikeun kuring, salaku programmer, ieu mangrupikeun format anu sanés pikeun sérialisasi sareng nampilkeun data, sareng JSON, XML, XDR sareng anu sanésna. Éta pisan umum dina kahirupan sapopoe urang, sareng seueur jalma anu mendakanana: dina sélulér, telepon, komunikasi VoIP (UMTS, LTE, WiMAX, SS7, H.323), dina protokol jaringan (LDAP, SNMP, Kerberos), dina sagala hal anu masalah kriptografi (X.509, CMS, standar PKCS), dina kartu bank jeung paspor biometric, sarta loba deui.

Artikel ieu nguruskeun PyDERASN: Python ASN.1 perpustakaan aktip dipaké dina proyék nu patali jeung kriptografi di Atlas.

PyDERASN: kumaha kuring nulis perpustakaan ASN.1 kalawan liang sarta blobs
Sacara umum, ASN.1 henteu pantes disarankeun pikeun tugas kriptografi: ASN.1 sareng codec na kompleks. Ieu ngandung harti yén kode moal jadi basajan, sarta ieu salawasna vektor serangan tambahan. Tingali waé kana daptar vulnerabilities di perpustakaan ASN.1. Bruce Schneier di na Téknik kriptografi ogé mamatahan ngalawan ngagunakeun standar ieu alatan pajeulitna: "The TLV encoding pangalusna dipikawanoh nyaéta ASN.1, tapi incredibly kompléks jeung urang isin jauh ti eta." Tapi, hanjakalna, ayeuna urang gaduh infrastruktur konci publik nu sipatna aktip dipaké sertipikat X.509, CRL, OCSP, TSP, protokol CMP, CMC, talatah CMS, sareng seueur standar PKCS. Ku alatan éta, anjeun kudu bisa digawekeun ku ASN.1 mun anjeun ngalakukeun nanaon patali kriptografi.

ASN.1 tiasa disandikeun ku sababaraha cara/codec:

  • BER (Aturan Encoding Dasar)
  • Cer (Aturan Encoding Canonical)
  • der (Aturan Encoding Dibédakeun)
  • GSER (Aturan Encoding String Generik)
  • JER (Aturan Encoding JSON)
  • LWER (Aturan Encoding Berat Ringan)
  • REO (Aturan Encoding Octet)
  • per (Aturan Encoding Dipak)
  • SER (Aturan Encoding husus Sinyal)
  • MURID (Aturan Encoding XML)

jeung sajumlah batur. Tapi dina tugas kriptografi, dina prakna, dua dianggo: BER sareng DER. Malah dina dokumén XML anu ditandatanganan (XMLDSig, XAdES) masih bakal aya objék ASN.64 DER anu disandikeun Base1, sapertos dina protokol berorientasi JSON acme ti Hayu urang Encrypt. Anjeun tiasa langkung ngartos sadayana codec ieu sareng prinsip coding BER / CER / DER dina tulisan sareng buku: ASN.1 dina kecap basajan, ASN.1 - Komunikasi antara sistem hétérogén ku Olivier Dubuisson, ASN.1 Dilengkepan ku Prof John Larmouth.

BER nyaéta binér bait-berorientasi (contona PER, populér dina komunikasi sélulér - bit-oriented) format TLV. Unggal unsur disandikeun salaku: tag (Tag), ngaidentipikasi jinis unsur anu bakal disandi (integer, string, tanggal, jsb), panjangna (Length) eusi jeung eusi sorangan (Valu). BER optionally ngidinan Anjeun pikeun teu nangtukeun nilai panjangna ku netepkeun nilai panjang teu tangtu husus sarta mungkas pesen End-Of-Octets kalawan tanda End-Of-Octets. Di sagigireun encoding panjang, BER gaduh seueur variabilitas dina cara nangkodkeun jinis data, sapertos:

  • INTEGER, OBJEK IDENTIFIER, BIT STRING sareng panjang unsur teu tiasa dinormalisasi (henteu disandikeun dina bentuk minimal);
  • BOOLEAN leres kanggo eusi anu henteu nol;
  • BIT STRING bisa ngandung "tambahan" nol bit;
  • BIT STRING, OCTET STRING sareng sadaya jinis senar anu diturunkeun, kalebet tanggal/waktu, tiasa dirobih kana sakumpulan panjang variabel, anu panjangna henteu dipikanyaho sateuacanna dina waktos (de) encoding;
  • UTCTime/GeneralizedTime tiasa gaduh cara anu béda pikeun nangtukeun zona waktos offset sareng "tambahan" nol fraksi detik;
  • Nilai DEFAULT SEQUENCE tiasa disandikeun atanapi henteu;
  • Nilai ngaranna tina bit panungtungan dina BIT STRING pilihan bisa unencoded;
  • SEQUENCE (OF) / SET (OF) tiasa ngagaduhan urutan unsur.

Kusabab sadaya di luhur, encoding data supados idéntik jeung formulir aslina teu salawasna mungkin. Ku alatan éta, sawaréh aturan ieu nimukeun: DER - mastikeun régulasi ngan hiji métode encoding valid, nu kritis pikeun tugas cryptographic mana, contona, ngarobah hiji bit bakal nyieun signature atawa checksum teu valid. DER gaduh kalemahan anu signifikan: panjang sadaya elemen kedah dipikanyaho sateuacanna dina waktos encoding, anu henteu ngamungkinkeun serialisasi aliran data. CER codec teu gaduh aral ieu, kitu ogé ngajamin hiji ngagambarkeun unambiguous data. Hanjakalna (atanapi éta untung yén urang henteu ngagaduhan dekoder anu langkung rumit?), éta henteu janten populer. Ku alatan éta, dina prakna urang sapatemon a "campuran" pamakéan data BER na DER disandikeun. Kusabab duanana CER sareng DER mangrupikeun sawaréh tina BER, dekoder BER tiasa ngadamelana.

Masalah sareng pyasn1

Di tempat damel urang nyerat seueur program Python anu aya hubunganana sareng kriptografi. Sareng sababaraha taun ka pengker ampir teu aya pilihan perpustakaan gratis: boh ieu perpustakaan tingkat rendah pisan anu ngamungkinkeun anjeun ngan saukur encode / decode, contona, integer sareng header struktur, atanapi perpustakaan ieu. pyasn1. Kami cicing di dinya pikeun sababaraha taun sareng mimitina kami resep pisan, sabab éta ngamungkinkeun anjeun damel sareng struktur ASN.1 sapertos objék tingkat luhur: contona, objék sertipikat X.509 anu dikodekeun ngamungkinkeun anjeun ngaksés widangna ngaliwatan panganteur kamus: sertipikat ["tbsCertificate"] ["SerialNumber"] bakal nembongkeun kami nomer serial sertipikat ieu. Nya kitu, anjeun tiasa "ngumpul" objék kompléks ku gawé bareng aranjeunna salaku daptar, kamus, lajeng saukur nelepon fungsi pyasn1.codec.der.encoder.encode tur meunangkeun representasi serialized tina dokumen.

Tapi, kakurangan, masalah sareng watesan diungkabkeun. Aya sareng, hanjakalna, masih aya kasalahan dina pyasn1: dina waktos nyerat, salah sahiji jinis dasar dina pyasn1 nyaéta GeneralizedTime, salah dikodekeun jeung disandi.

Dina proyék-proyék urang, pikeun ngahemat spasi, urang mindeng nyimpen ukur jalur file, offset jeung panjang dina bait tina objék urang rék rujukan. Contona, hiji file ditandatanganan sawenang bakal paling dipikaresep aya dina struktur 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

sareng urang tiasa kéngingkeun file anu ditandatanganan asli dina offset 65 bait, panjangna 751 bait. pyasn1 henteu nyimpen informasi ieu dina objék decoded na. Nu disebut TLVSeeker ditulis - perpustakaan leutik nu ngidinan Anjeun pikeun decode tags sarta panjangna obyék, dina antarbeungeut nu kami paréntah "buka tag salajengna", "lebet ka jero tag" (lebet ka jero obyek SEQUENCE), "Buka tag salajengna", "bejakeun offset anjeun sareng panjang obyék dimana kami aya." Ieu "manual" walk ngaliwatan ASN.1 DER-serialized data. Tapi teu mungkin pikeun digawe sareng data BER-serialized ku cara ieu, saprak, contona, string bait OCTET STRING bisa disandikeun dina bentuk sababaraha sakumpulan.

Kelemahan anu sanés pikeun tugas pyasn1 kami nyaéta henteu mampuh ngartos tina objék anu dikodekeun naha widang anu dipasihkeun aya dina SEQUENCE atanapi henteu. Contona, upami struktur ngandung hiji widang SEQUENCE OF Smth OPTIONAL widang, mangka bisa sagemblengna bolos tina data asup (OPTIONAL), atawa bisa hadir, tapi panjang nol (daftar kosong). Sacara umum, ieu teu bisa ditangtukeun. Sareng ieu dipikabutuh pikeun verifikasi ketat ngeunaan validitas data anu ditampi. Bayangkeun yén sababaraha otoritas sertifikasi bakal ngaluarkeun sertipikat sareng data anu "henteu sapinuhna" sah tina sudut pandang skéma ASN.1! Salaku conto, otoritas sertifikasi "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı" ngaleuwihan wates anu diidinan dina sertipikat akar na RFC 5280 wates dina panjang komponén subjek - teu bisa jujur ​​decoded nurutkeun skéma. Codec DER meryogikeun yén widang anu nilaina sami sareng DEFAULT henteu disandi nalika pangiriman - dokumén sapertos kitu lumangsung dina kahirupan, sareng versi munggaran PyDERASN malah ngahaja ngijinkeun kabiasaan sapertos kitu (tina sudut pandang DER) pikeun kapentingan kasaluyuan mundur.

Watesan séjén nyaéta henteu mampuh pikeun gampang mendakan dina bentuk naon (BER/DER) objék tinangtu disandikeun dina struktur. Contona, standar CMS nyebutkeun yén pesen téh BER-disandikeun, tapi widang signedAttrs, leuwih nu signature cryptographic dihasilkeun, kudu di DER. Upami urang ngodekeun sareng DER, urang bakal gagal dina ngolah CMS sorangan; upami urang ngodekeun nganggo BER, urang moal terang naon bentuk attrs anu ditandatanganan. Hasilna, TLVSeeker (anu teu aya analog dina pyasn1) kedah milarian lokasi masing-masing widang Attrs anu ditandatanganan, sareng nyalira, nyandak kaluar tina perwakilan serial, decode sareng DER.

Kamampuhan pikeun otomatis ngolah DIHENTIKAN BY widang, nu lumangsung pisan sering, éta pisan desirable pikeun urang. Saatos decoding struktur ASN.1, urang bisa jadi ditinggalkeun ku loba widang naon nu kudu diolah salajengna nurutkeun skéma dipilih dumasar kana OBJECT IDENTIFIER dieusian dina widang struktur. Dina kode Python, ieu hartina nulis lamun lajeng nelepon decoder pikeun widang ANY.

Munculna PyDERASN

Di Atlas, kami rutin ngirim patch ka luhur nalika urang manggihan sababaraha masalah atawa ningkatkeun program bébas kami nganggo. Urang dikintunkeun perbaikan pikeun pyasn1 sababaraha kali, tapi kode pyasn1 urang teu panggampangna pikeun ngarti sarta kadangkala aya parobahan API sauyunan nu ngéléhkeun urang handap. Tambih Deui, urang biasa nulis tés kalawan nguji generative, nu ieu mah kasus di pyasn1.

Hiji poé rupa kuring mutuskeun yén kuring kungsi cukup eta jeung éta waktu nyoba nulis perpustakaan kuring sorangan kalawan __slot__s, offsets na beautifully ditampilkeun blobs! Kantun nyiptakeun codec ASN.1 moal cekap - urang kedah nransferkeun sadaya proyek anu gumantung kana éta, sareng ieu mangrupikeun ratusan rébu garis kode anu pinuh ku karya sareng struktur ASN.1. Hartina, salah sahiji sarat pikeun eta: betah tarjamahan kode pyasn1 ayeuna. Saatos nyéépkeun sadaya liburan, kuring nyerat perpustakaan ieu sareng ngalihkeun sadaya proyék ka dinya. Kusabab aranjeunna gaduh ampir 100% sinyalna kalawan tés, ieu dimaksudkan yén perpustakaan éta pinuh operasional.

PyDERASN, sami, gaduh ampir 100% sinyalna tés. Ngagunakeun tés generative kalawan perpustakaan hébat hipotesa. Éta ogé dilaksanakeun ngahudangkeun py-afl- Kuring dahar on 32 mesin nuklir. Sanaos kanyataan yén kami ampir teu aya kode Python2 anu tinggaleun, PyDERASN masih tetep cocog sareng éta sareng kusabab ieu gaduh hiji-hijina genep kacanduan. Leuwih ti éta, éta diuji ngalawan ASN.1: 2008 test minuhan suite.

Prinsip gawé bareng éta sarupa pyasn1 - gawé bareng objék Python tingkat tinggi. Katerangan ngeunaan skéma ASN.1 sami.

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)),
    )

Sanajan kitu, PyDERASN boga sababaraha semblance tina ketikan kuat. Dina pyasn1, upami sawah mangrupikeun jinis CMSVersion (INTEGER), maka éta tiasa ditugaskeun int atanapi INTEGER. PyDERASN mastikeun yén obyek anu ditugaskeun persis CMSVersion. Salian nulis kode Python3, kami ogé ngagunakeun ngetikkeun anotasi, jadi fungsi urang moal boga argumen jelas kawas def func (serial, eusi), tapi def func (seri: CertificateSerialNumber, eusi: EncapsulatedContentInfo), sarta PyDERASN mantuan ngajaga kode sapertos.

Dina waktos anu sami, PyDERASN gaduh konsési anu saé pisan pikeun ngetik ieu. pyasn1 teu ngidinan SubjectKeyIdentifier () .subtype (implicitTag = Tag (...)) widang napelkeun hiji obyék ka SubjectKeyIdentifier () (tanpa perlu IMPLICIT TAG) jeung ieu diperlukeun pikeun mindeng nyalin jeung nyieun deui objék ngan kusabab nu robah implisit / tag eksplisit. PyDERASN mastikeun ngan ukur jinis dasarna - éta bakal otomatis ngagentos tag tina skéma struktur ASN.1 anu parantos aya. Ieu greatly simplifies kode aplikasi.

Upami aya kasalahan nalika decoding, maka dina pyasn1 henteu gampang ngartos dimana éta lumangsung. Salaku conto, dina sertipikat Turki anu parantos disebatkeun di luhur, urang bakal nampi kasalahan ieu: UTF8String (tbsCertificate: issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (di 138) wates anu teu puas: 1 ⇐ 77 ⇐ 64 Nalika nulis struktur ASN .1, jalma-jalma tiasa ngalakukeun kasalahan, sareng ieu ngagampangkeun pikeun nga-debug aplikasi atanapi ngabéréskeun masalah sareng dokumén anu disandi ku pihak séjén.

Versi munggaran PyDERASN henteu ngadukung encoding BER. Éta muncul langkung lami sareng tetep henteu ngadukung ngolah UTCTime/GeneralizedTime sareng zona waktos. Ieu bakal datang dina mangsa nu bakal datang, sabab proyék ieu ditulis utamana dina waktu luang kuring.

Ogé, dina versi munggaran teu aya gawé kalawan DEFINED BY widang. Sababaraha bulan engké ieu kasempetan timbul sarta mimiti dipaké aktip, nyata ngurangan kode aplikasi - dina hiji operasi decoding ieu mungkin pikeun ménta sakabéh struktur disassembled ka pisan jero. Jang ngalampahkeun ieu, skéma nangtukeun mana widang "ngahartikeun" naon. Contona, pedaran ngeunaan skéma 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))),
    )

nyebutkeun yen lamun contentType ngandung hiji OID kalawan nilai id_signedData, lajeng widang eusi (lokasina dina urutan sarua) kudu decoded nurutkeun skéma SignedData. Naha aya kitu loba tanda kurung? Hiji widang tiasa "nangtukeun" sababaraha widang dina waktos anu sami, sapertos dina struktur EnvelopedData. Widang anu ditetepkeun diidentipikasi ku anu disebut jalur decode - éta nangtukeun lokasi pasti tina unsur naon waé dina sadaya struktur.

Anjeun teu salawasna hayang atawa teu salawasna boga kasempetan pikeun geuwat nambahkeun ngahartikeun ieu diagram. Bisa jadi aya kasus husus aplikasi lamun OIDs jeung struktur dipikawanoh wungkul dina proyék pihak katilu. PyDERASN nyadiakeun kamampuhan pikeun nyetél ieu ngahartikeun katuhu dina waktu decoding struktur:

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(),
    }),),
),)})

Di dieu urang nyebutkeun yén dina CMS SignedData pikeun sakabéh sertipikat napel, decode sakabéh ekstensi maranéhanana (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool, jsb). Urang nunjukkeun ngaliwatan jalur decode nu unsur perlu "diganti" kalawan ngahartikeun, saolah-olah eta anu dieusian dina schema nu.

Tungtungna, PyDERASN boga kamampuhan pikeun ngajalankeun ti garis paréntah pikeun decoding file ASN.1 sarta ngabogaan euyeub percetakan geulis. Anjeun tiasa nga-decode ASN.1 sawenang-wenang, atanapi anjeun tiasa netepkeun skema anu jelas sareng ningali sapertos kieu:

PyDERASN: kumaha kuring nulis perpustakaan ASN.1 kalawan liang sarta blobs

Inpormasi anu ditampilkeun: obyék offset, panjang tag, panjangna panjang, panjang eusi, ayana EOC (end-of-octets), atribut encoding BER, atribut encoding panjang teu katangtu, panjang sareng offset tag EXPLICIT (upami aya), jero nyarang tina obyék dina struktur, nilai tag implisit/eksplisit, ngaran objék nurutkeun skéma, tipe dasarna ASN.1, nomer runtuyan di jero SEQUENCE/SET OF, nilai PILIHAN (lamun aya), ngaran manusa-bisa dibaca INTEGER/ENUMERATED/BIT STRING nurutkeun skéma, nilai tina sagala tipe dasar , DEFAULT / umbul pilihan ti skéma, tanda yén obyék ieu otomatis decoded sakumaha DIHARTI ku sarta alatan nu OID ieu kajadian, OID bisa dibaca manusa.

Sistem percetakan geulis dirancang husus ku kituna ngahasilkeun runtuyan objék PP nu visualized ngagunakeun parabot misah. Potret layar nunjukkeun renderer dina téks warna anu sederhana. Aya ogé renderers dina format JSON/HTML, ku kituna bisa ditempo kalayan panyorot dina browser ASN.1, saperti dina asn1js proyék.

perpustakaan séjén

Ieu sanés tujuan, tapi PyDERASN tétéla sacara signifikan Langkung gancang ti pyasn1. Salaku conto, decoding file CRL ukuran megabyte tiasa lami pisan dugi ka anjeun kedah mikir ngeunaan format panyimpenan data perantara (gancang) sareng ngarobih arsitéktur aplikasi. pyasn1 decodes CRL CACert.org on laptop kuring nyokot leuwih 20 menit, bari PyDERASN nyokot ngan 28 detik! Aya proyek asn1crypto, aimed dina karya gancang kalayan struktur cryptographic: eta decodes (lengkep, teu puguh) CRL sarua dina 29 detik, tapi meakeun ampir dua kali loba RAM nalika ngajalankeun handapeun Python3 (983 MiB versus 498), sarta dina 3.5 kali dina Python2 (1677). versus 488), sedengkeun pyasn1 meakeun saloba 4.3 kali leuwih (2093 versus 488).

Kami henteu nganggap asn1crypto, anu ku kuring disebatkeun, sabab proyék éta masih aya dina infancy sareng kami henteu acan nguping perkawis éta. Ayeuna urang ogé moal ningali arahna, sabab kuring langsung mendakan yén GeneralizedTime anu sami henteu nyandak bentuk sawenang-wenang, sareng salami sérialisasi éta cicingeun ngaleungitkeun fraksi sadetik. Ieu bisa ditarima keur gawé bareng sertipikat X.509, tapi sacara umum moal jalan.

Ayeuna, PyDERASN mangrupikeun dekoder Python / Go DER anu paling ketat anu kuring terang. Dina encoding / asn1 perpustakaan Go tercinta abdi teu cek ketat OBJEK IDENTIFIER sareng string UTCTime / GeneralizedTime. Kadang strictness tiasa ngahalangan (utamana kusabab kasaluyuan mundur sareng aplikasi anu lami anu teu aya anu bakal ngalereskeun), ku kituna PyDERASN tiasa lulus. rupa-rupa setélan cek weakening.

Kodeu proyék nyobian janten sasederhana mungkin. Sakabéh perpustakaan mangrupa hiji file. Kode ieu ditulis kalawan tekenan kana betah pamahaman, tanpa optimizations kinerja perlu jeung kode garing. Éta henteu, sakumaha anu kuring parantos nyarios, ngadukung decoding BER pinuh ku senar UTCTime / GeneralizedTime, ogé REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING tipe data. Dina sakabeh kasus sejenna, abdi pribadi teu ningali titik ngagunakeun perpustakaan lianna di Python.

Kawas sakabeh proyék kuring, kawas PyGOST, GoGOST, NCCP, GoVPN, PyDERASN sagemblengna software bébas, disebarkeun dina kaayaan LGPLv3+, sarta geus sadia pikeun diundeur haratis. Aya conto pamakéan di dieu jeung tés PyGOST.

Sergey Matveev, cypherpunk, anggota Yayasan SPO, Python / Go pamekar, lulugu spesialis FSUE "STC "Atlas".

sumber: www.habr.com

Tambahkeun komentar