PyDERASN: bagaimana saya menulis perpustakaan ASN.1 dengan slot dan gumpalan

ASN.1 ini ialah piawai (ISO, ITU-T, GOST) bahasa yang menerangkan maklumat berstruktur, serta peraturan untuk pengekodan maklumat ini. Bagi saya, sebagai pengaturcara, ini hanyalah satu lagi format untuk menyeri dan mempersembahkan data, bersama-sama dengan JSON, XML, XDR dan lain-lain. Ia adalah perkara biasa dalam kehidupan seharian kita, dan ramai orang menemuinya: dalam selular, telefon, komunikasi VoIP (UMTS, LTE, WiMAX, SS7, H.323), dalam protokol rangkaian (LDAP, SNMP, Kerberos), dalam semua perkara yang berkenaan kriptografi (X.509, CMS, piawaian PKCS), dalam kad bank dan pasport biometrik, dan banyak lagi.

Artikel ini membincangkan PyDERASN: Pustaka Python ASN.1 digunakan secara aktif dalam projek yang berkaitan dengan kriptografi dalam Atlas.

PyDERASN: bagaimana saya menulis perpustakaan ASN.1 dengan slot dan gumpalan
Secara umum, ASN.1 tidak patut disyorkan untuk tugasan kriptografi: ASN.1 dan codecnya adalah kompleks. Ini bermakna bahawa kod itu tidak akan mudah, dan ini sentiasa merupakan vektor serangan tambahan. Lihat sahaja ke senarai kelemahan dalam perpustakaan ASN.1. Bruce Schneier dalam bukunya Kejuruteraan kriptografi juga menasihatkan agar tidak menggunakan standard ini kerana kerumitannya: "Pengekodan TLV yang paling terkenal ialah ASN.1, tetapi ia sangat rumit dan kami menjauhinya." Tetapi, malangnya, hari ini kita ada infrastruktur utama awam di mana ia digunakan secara aktif Sijil X.509, CRL, OCSP, TSP, protokol CMP, CMC, mesej CMS, dan banyak piawaian PKCS. Oleh itu, anda perlu boleh bekerja dengan ASN.1 jika anda melakukan apa-apa yang berkaitan dengan kriptografi.

ASN.1 boleh dikodkan dalam pelbagai cara/codec:

  • BER (Peraturan Pengekodan Asas)
  • CER (Peraturan Pengekodan Kanonik)
  • DER (Peraturan Pengekodan Terbilang)
  • GSER (Peraturan Pengekodan Rentetan Generik)
  • JER (Peraturan Pengekodan JSON)
  • LWER (Peraturan Pengekodan Berat Ringan)
  • REO (Peraturan Pengekodan Oktet)
  • PER (Peraturan Pengekodan Berbungkus)
  • SER (Peraturan Pengekodan khusus mengisyaratkan)
  • MURID (Peraturan Pengekodan XML)

dan beberapa lagi. Tetapi dalam tugasan kriptografi, dalam amalan, dua digunakan: BER dan DER. Walaupun dalam dokumen XML yang ditandatangani (XMLDSig, XAdES) masih akan ada objek ASN.64 DER yang dikodkan Base1, seperti dalam protokol berorientasikan JSON ACME daripada Let's Encrypt. Anda boleh lebih memahami semua codec dan prinsip pengekodan BER/CER/DER ini dalam artikel dan buku: ASN.1 dalam perkataan mudah, ASN.1 — Komunikasi antara sistem heterogen oleh Olivier Dubuisson, ASN.1 Dilengkapkan oleh Prof John Larmouth.

BER ialah format TLV berorientasikan bait binari (contohnya PER, popular dalam komunikasi selular - berorientasikan bit). Setiap elemen dikodkan sebagai: tag (Tag), mengenal pasti jenis elemen yang akan dikodkan (integer, rentetan, tarikh, dll.), panjang (Length) kandungan dan kandungan itu sendiri (Value). BER secara pilihan membenarkan anda untuk tidak menentukan nilai panjang dengan menetapkan nilai panjang tak tentu khas dan menamatkan mesej End-Of-Octets dengan tanda End-Of-Octets. Selain pengekodan panjang, BER mempunyai banyak kebolehubahan dalam cara ia mengekod jenis data, seperti:

  • INTEGER, PENGENALI OBJEK, BIT STRING dan panjang elemen mungkin tidak dinormalisasi (tidak dikodkan dalam bentuk minimum);
  • BOOLEAN adalah benar untuk sebarang kandungan bukan sifar;
  • BIT STRING mungkin mengandungi "tambahan" sifar bit;
  • BIT STRING, OCTET STRING dan semua jenis rentetan terbitannya, termasuk tarikh/masa, boleh dipecahkan kepada ketulan panjang berubah-ubah, yang panjangnya tidak diketahui terlebih dahulu pada masa (de)pengekodan;
  • UTCTime/GeneralizedTime mungkin mempunyai cara yang berbeza untuk menentukan offset zon waktu dan pecahan sifar saat "tambahan";
  • Nilai URUTAN lalai mungkin atau mungkin tidak dikodkan;
  • Nilai yang dinamakan bagi bit terakhir dalam BIT STRING secara pilihan boleh dinyahkodkan;
  • JURUTAN (DARI)/SET (DARI) boleh mempunyai sebarang susunan unsur.

Kerana semua perkara di atas, pengekodan data supaya ia sama dengan bentuk asal tidak selalu boleh dilakukan. Oleh itu, subset peraturan telah dicipta: DER - mengawal ketat hanya satu kaedah pengekodan yang sah, yang penting untuk tugasan kriptografi di mana, sebagai contoh, menukar satu bit akan menjadikan tandatangan atau checksum tidak sah. DER mempunyai kelemahan yang ketara: panjang semua elemen mesti diketahui terlebih dahulu pada masa pengekodan, yang tidak membenarkan pensirilan aliran data. Codec CER tidak mempunyai kelemahan ini, yang sama menjamin perwakilan data yang tidak jelas. Malangnya (atau adakah bernasib baik kerana kami tidak mempunyai penyahkod yang lebih kompleks?), ia tidak menjadi popular. Oleh itu, dalam amalan kami menghadapi penggunaan "campuran" data berkod BER dan DER. Memandangkan kedua-dua CER dan DER ialah subset BER, mana-mana penyahkod BER boleh mengendalikannya.

Masalah dengan pyasn1

Di tempat kerja kami menulis banyak program Python yang berkaitan dengan kriptografi. Dan beberapa tahun yang lalu hampir tiada pilihan perpustakaan percuma: sama ada ini adalah perpustakaan peringkat sangat rendah yang membolehkan anda hanya mengekod/menyahkod, contohnya, integer dan pengepala struktur, atau perpustakaan ini pyasn1. Kami menjalaninya selama beberapa tahun dan pada mulanya kami sangat gembira, kerana ia membolehkan anda bekerja dengan struktur ASN.1 seperti dengan objek peringkat tinggi: sebagai contoh, objek sijil X.509 yang dinyahkod membolehkan anda mengakses medannya melalui antara muka kamus: cert[“tbsCertificate”] ["serialNumber"] akan menunjukkan kepada kami nombor siri sijil ini. Begitu juga, anda boleh "mengumpul" objek kompleks dengan bekerja dengannya sebagai senarai, kamus, dan kemudian hanya memanggil fungsi pyasn1.codec.der.encoder.encode dan dapatkan perwakilan bersiri bagi dokumen.

Walau bagaimanapun, kelemahan, masalah dan batasan telah didedahkan. Terdapat dan, malangnya, masih terdapat ralat dalam pyasn1: pada masa penulisan, salah satu jenis asas dalam pyasn1 ialah GeneralizedTime, tak betul dinyahkod dan dikodkan.

Dalam projek kami, untuk menjimatkan ruang, kami selalunya menyimpan hanya laluan fail, mengimbangi dan panjang dalam bait objek yang ingin kami rujuk. Sebagai contoh, fail yang ditandatangani sewenang-wenangnya kemungkinan besar akan ditempatkan dalam 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

dan kita boleh mendapatkan fail asal yang ditandatangani pada offset 65 bait, 751 bait panjang. pyasn1 tidak menyimpan maklumat ini dalam objek yang dinyahkodnya. Apa yang dipanggil TLVSeeker telah ditulis - perpustakaan kecil yang membolehkan anda menyahkod tag dan panjang objek, dalam antara muka yang kami perintahkan "pergi ke teg seterusnya", "masuk ke dalam tag" (masuk ke dalam objek SEQUENCE), "pergi ke teg seterusnya", "beritahu offset anda dan panjang objek di mana kita berada." Ini adalah langkah "manual" melalui data bersiri ASN.1 DER. Tetapi adalah mustahil untuk bekerja dengan data bersiri BER dengan cara ini, kerana, sebagai contoh, rentetan bait OCTET STRING boleh dikodkan dalam bentuk beberapa ketulan.

Kelemahan lain untuk tugas pyasn1 kami ialah ketidakupayaan untuk memahami daripada objek yang dinyahkod sama ada medan yang diberikan terdapat dalam SEQUENCE atau tidak. Sebagai contoh, jika struktur mengandungi medan URUTAN Medan Smth PILIHAN, maka ia mungkin tidak hadir sepenuhnya daripada data masuk (PILIHAN), atau ia boleh hadir, tetapi mempunyai panjang sifar (senarai kosong). Secara umum, ini tidak dapat ditentukan. Dan ini diperlukan untuk pengesahan ketat kesahihan data yang diterima. Bayangkan beberapa pihak berkuasa pensijilan akan mengeluarkan sijil dengan data yang "tidak sepenuhnya" sah dari sudut pandangan skim ASN.1! Sebagai contoh, pihak berkuasa pensijilan "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı" melebihi had yang dibenarkan dalam sijil akarnya RFC 5280 had pada panjang komponen subjek - ia tidak boleh didekod secara jujur ​​mengikut skema. Codec DER memerlukan medan yang nilainya sama dengan DEFAULT tidak dikodkan semasa penghantaran - dokumen sedemikian berlaku dalam kehidupan, dan versi pertama PyDERASN malah sengaja membenarkan tingkah laku tidak sah tersebut (dari sudut pandangan DER) demi keserasian ke belakang.

Batasan lain ialah ketidakupayaan untuk mengetahui dengan mudah dalam bentuk (BER/DER) objek tertentu yang dikodkan dalam struktur. Sebagai contoh, piawaian CMS mengatakan bahawa mesej dikodkan BER, tetapi medan Atttrs yang ditandatangani, di mana tandatangan kriptografi dijana, mestilah dalam DER. Jika kita menyahkod dengan DER, kita akan gagal dalam pemprosesan CMS itu sendiri; jika kita menyahkod dengan BER, kita tidak akan tahu dalam bentuk mana Attr yang ditandatangani itu. Akibatnya, TLVSeeker (yang tidak mempunyai analog dalam pyasn1) perlu mencari lokasi setiap medanAttrs yang ditandatangani, dan secara berasingan, mengeluarkannya daripada perwakilan bersiri, menyahkodnya dengan DER.

Keupayaan untuk memproses secara automatik medan DEFINED BY, yang sangat biasa, sangat diingini untuk kami. Selepas menyahkod struktur ASN.1, kita mungkin ditinggalkan dengan banyak mana-mana medan yang mesti diproses selanjutnya mengikut skema yang dipilih berdasarkan PENGENALI OBJEK yang dinyatakan dalam medan struktur. Dalam kod Python, ini bermakna menulis jika dan kemudian memanggil penyahkod untuk SEBARANG medan.

Kemunculan PyDERASN

Di Atlas, kami kerap menghantar patch ke bahagian atas apabila kami menemui beberapa masalah atau memperbaiki program percuma yang kami gunakan. Kami menyerahkan penambahbaikan kepada pyasn1 beberapa kali, tetapi kod pyasn1 bukanlah yang paling mudah untuk difahami dan kadangkala terdapat perubahan API yang tidak serasi yang mengalahkan kami. Selain itu, kami terbiasa menulis ujian dengan ujian generatif, yang tidak berlaku dalam pyasn1.

Pada suatu hari yang baik, saya memutuskan bahawa saya sudah cukup dan sudah tiba masanya untuk mencuba menulis perpustakaan saya sendiri dengan __slot__s, offset dan gumpalan yang dipaparkan dengan cantik! Hanya mencipta codec ASN.1 tidak mencukupi - kami perlu memindahkan semua projek bergantung kami kepadanya, dan ini adalah ratusan ribu baris kod yang penuh dengan kerja dengan struktur ASN.1. Iaitu, salah satu keperluan untuknya: kemudahan terjemahan kod pyasn1 semasa. Setelah menghabiskan semua percutian saya, saya menulis perpustakaan ini dan memindahkan semua projek kepadanya. Memandangkan mereka mempunyai hampir 100% liputan dengan ujian, ini bermakna perpustakaan telah beroperasi sepenuhnya.

PyDERASN, begitu juga, mempunyai hampir 100% liputan ujian. Menggunakan ujian generatif dengan perpustakaan yang hebat hipotesis. Ia juga dijalankan kabur py-afl- Saya makan pada 32 mesin nuklear. Walaupun fakta bahawa kami hampir tiada kod Python2 yang tinggal, PyDERASN masih mengekalkan keserasian dengannya dan kerana ini mempunyai satu-satunya 6 ketagihan. Lebih-lebih lagi, ia diuji terhadap ASN.1:2008 suite ujian pematuhan.

Prinsip bekerja dengannya adalah serupa dengan pyasn1 - bekerja dengan objek Python peringkat tinggi. Perihalan skim ASN.1 adalah serupa.

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

Walau bagaimanapun, PyDERASN mempunyai beberapa kesamaan menaip yang kuat. Dalam pyasn1, jika medan adalah jenis CMSVersion(INTEGER), maka ia boleh diberikan int atau INTEGER. PyDERASN dengan tegas menghendaki objek yang diberikan adalah betul-betul CMSVersion. Selain menulis kod Python3, kami juga menggunakan menaip anotasi, jadi fungsi kami tidak akan mempunyai hujah yang tidak jelas seperti def func(siri, kandungan), tetapi def func(siri: CertificateSerialNumber, kandungan: EncapsulatedContentInfo), dan PyDERASN membantu mengekalkan kod tersebut.

Pada masa yang sama, PyDERASN mempunyai konsesi yang sangat mudah untuk menaip ini. pyasn1 tidak membenarkan medan SubjectKeyIdentifier().subtype(implicitTag=Tag(...)) untuk menetapkan objek kepada SubjectKeyIdentifier() (tanpa IMPLICIT TAG yang diperlukan) dan ia adalah perlu untuk sering menyalin dan mencipta objek hanya kerana teg IMPLICIT/EXPLICIT yang diubah. PyDERASN hanya memerhatikan jenis asas sahaja - ia akan menggantikan teg secara automatik daripada skema ASN.1 struktur yang sedia ada. Ini sangat memudahkan kod aplikasi.

Jika ralat berlaku semasa penyahkodan, maka dalam pyasn1 ia tidak mudah untuk memahami di mana sebenarnya ia berlaku. Sebagai contoh, dalam sijil Turki yang telah disebutkan di atas, kami akan menerima ralat berikut: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (at 138) untisficate bounds: 1 ⇐ 77 ⇐ 64 Apabila menulis struktur ASN .1 orang boleh membuat kesilapan, dan ini memudahkan untuk menyahpepijat aplikasi atau memikirkan masalah dengan dokumen berkod pihak lain.

Versi pertama PyDERASN tidak menyokong pengekodan BER. Ia muncul lebih lama kemudian dan masih tidak menyokong pemprosesan UTCTime/GeneralizedTime dengan zon waktu. Ini akan datang pada masa hadapan, kerana projek itu ditulis terutamanya pada masa lapang saya.

Juga, dalam versi pertama tiada kerja dengan DEFINED BY medan. Beberapa bulan kemudian ini peluang muncul dan mula digunakan secara aktif, dengan ketara mengurangkan kod aplikasi - dalam satu operasi penyahkodan adalah mungkin untuk mendapatkan keseluruhan struktur yang dibongkar dengan sangat mendalam. Untuk melakukan ini, skema menentukan medan yang "takrifkan" apa. Sebagai contoh, perihalan skema 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))),
    )

mengatakan bahawa jika contentType mengandungi OID dengan nilai id_signedData, maka medan kandungan (terletak dalam URUTAN yang sama) mesti dinyahkodkan mengikut skema SignedData. Mengapa terdapat banyak kurungan? Medan boleh "menentukan" beberapa medan pada masa yang sama, seperti yang berlaku dalam struktur EnvelopedData. Medan yang ditakrifkan dikenal pasti oleh laluan penyahkod yang dipanggil - ia menentukan lokasi sebenar mana-mana elemen dalam semua struktur.

Anda tidak selalu mahu atau tidak selalu mempunyai peluang untuk menambah takrifan ini dengan segera pada rajah. Mungkin terdapat kes khusus aplikasi apabila OID dan struktur diketahui hanya dalam projek pihak ketiga. PyDERASN menyediakan keupayaan untuk menetapkan takrifan ini tepat pada masa penyahkodan 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 sini kami mengatakan bahawa dalam CMS SignedData untuk semua sijil yang dilampirkan, menyahkod semua sambungannya (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool, dll.). Kami menunjukkan melalui laluan penyahkodan elemen mana yang perlu "digantikan" dengan takrifan, seolah-olah ia dinyatakan dalam skema.

Akhirnya, PyDERASN mempunyai keupayaan untuk lari dari baris arahan untuk penyahkodan fail ASN.1 dan mempunyai kaya cetakan yang cantik. Anda boleh menyahkod ASN.1 sewenang-wenangnya, atau anda boleh menentukan skema yang jelas dan melihat sesuatu seperti ini:

PyDERASN: bagaimana saya menulis perpustakaan ASN.1 dengan slot dan gumpalan

Maklumat yang dipaparkan: mengimbangi objek, panjang teg, panjang panjang, panjang kandungan, kehadiran EOC (akhir oktet), atribut pengekodan BER, atribut pengekodan panjang tak tentu, panjang dan ofset teg EXPLICIT (jika ada), kedalaman bersarang objek dalam struktur, nilai teg IMPLICIT/EXPLICIT, nama objek mengikut skema, jenis ASN.1 asasnya, nombor urutan di dalam SEQUENCE/SET OF, nilai PILIHAN (jika ada), nama boleh dibaca manusia INTEGER/ENUMERATED/BIT STRING mengikut skema, nilai mana-mana jenis asas , bendera DEFAULT/OPTIONAL daripada skema, tanda bahawa objek telah dinyahkod secara automatik sebagai DEFINED BY dan disebabkan OID ini berlaku, OID boleh dibaca manusia.

Sistem percetakan cantik direka khas supaya ia menghasilkan urutan objek PP yang divisualisasikan menggunakan alat yang berasingan. Tangkapan skrin menunjukkan pemapar dalam teks berwarna ringkas. Terdapat juga pemapar dalam format JSON/HTML, supaya ia boleh dilihat dengan penyerlahan dalam pelayar ASN.1, seperti dalam asn1js projek.

Perpustakaan lain

Ini bukan matlamat, tetapi PyDERASN ternyata ketara lebih pantas daripada pyasn1. Sebagai contoh, menyahkod fail CRL bersaiz megabait boleh mengambil masa yang lama sehingga anda perlu memikirkan format storan data perantaraan (pantas) dan menukar seni bina aplikasi. pyasn1 menyahkod CRL CACert.org pada komputer riba saya mengambil masa lebih 20 minit, manakala PyDERASN hanya mengambil masa 28 saat! Ada projek asn1crypto, bertujuan untuk kerja pantas dengan struktur kriptografi: ia menyahkod (sepenuhnya, bukan malas) CRL yang sama dalam 29 saat, tetapi menggunakan hampir dua kali lebih banyak RAM apabila berjalan di bawah Python3 (983 MiB berbanding 498), dan dalam 3.5 kali di bawah Python2 (1677 berbanding 488), manakala pyasn1 menggunakan sebanyak 4.3 kali lebih banyak (2093 berbanding 488).

Kami tidak menganggap asn1crypto, yang saya nyatakan, kerana projek itu masih di peringkat awal dan kami tidak pernah mendengar tentangnya. Sekarang kita tidak akan melihat ke arahnya sama ada, kerana saya segera mendapati bahawa GeneralizedTime yang sama tidak mengambil bentuk sewenang-wenangnya, dan semasa bersiri ia secara senyap mengeluarkan sebahagian kecil daripada saat. Ini boleh diterima untuk bekerja dengan sijil X.509, tetapi secara umum ia tidak akan berfungsi.

Pada masa ini, PyDERASN ialah penyahkod Python/Go DER percuma paling ketat yang saya tahu. Dalam pengekodan/asn1 perpustakaan Go kesayangan saya bukan pemeriksaan yang ketat PENGENALI OBJEK dan rentetan UTCTime/GeneralizedTime. Kadangkala ketegasan boleh menghalang (terutamanya disebabkan keserasian ke belakang dengan aplikasi lama yang tiada siapa akan membetulkannya), jadi PyDERASN boleh lulus pelbagai tetapan cek yang melemahkan.

Kod projek cuba semudah mungkin. Keseluruhan perpustakaan adalah satu fail. Kod ini ditulis dengan penekanan pada kemudahan pemahaman, tanpa pengoptimuman prestasi yang tidak perlu dan kod DRY. Ia tidak, seperti yang telah saya katakan, menyokong penyahkodan BER penuh bagi rentetan UTCTime/GeneralizedTime, serta jenis data REAL, RELATIVE OID, LUAR, INSTANCE OF, PDV TERBEnam, STRING CHARACTER. Dalam semua kes lain, saya secara peribadi tidak nampak gunanya menggunakan perpustakaan lain dalam Python.

Seperti semua projek saya, seperti PyGOST, GoGOST, NCCP, GoVPN, PyDERASN sepenuhnya perisian percuma, diedarkan di bawah terma LGPLv3+, dan tersedia untuk muat turun percuma. Terdapat contoh penggunaan di sini dan Ujian PyGOST.

Sergey Matveev, cypherpunk, ahli Yayasan SPO, pembangun Python/Go, ketua pakar FSUE "STC "Atlas".

Sumber: www.habr.com

Tambah komen