PyDERASN: kuidas ma kirjutasin ASN.1 raamatukogu slots ja blobs'idega

ASN.1 see on standard (ISO, ITU-T, ГОСб) keeles, mis kirjeldab struktureeritud teavet ja selle teabe kodeerimise reegleid. Minu kui programmeerija jaoks on see lihtsalt veel ĂŒks serialiseerimise ja andmete esitamise formaat, nagu JSON, XML, XDR ja teised. See on laialdaselt levinud meie igapĂ€evaelus ning paljud inimestega kokku puutuvad: mobiil- ja telefonivĂ”rgus (UMTS, LTE, WiMAX, SS7, H.323), vĂ”rgu protokollides (LDAP, SNMP, Kerberos), kĂ”iges, mis puudutab krĂŒptograafiat (X.509, CMS, PKCS-standardid), pangakaartides ja biometraalsetes passides ning paljus muus.

Selles artiklis kĂ€sitletakse PyDERASN: Python ASN.1 raamatukogu, mida kasutatakse aktiivselt krĂŒptograafia projektides Atlas.

PyDERASN: kuidas ma kirjutasin ASN.1 raamatukogu slots ja blobs'idega
Tegelikult ei tohiks ASN.1-d krĂŒptograafiliste ĂŒlesannete jaoks soovitada: ASN.1 ja selle kodeerijad on keerulised. See tĂ€hendab, et kood ei ole lihtne, mis toob alati kaasa tĂ€iendava rĂŒnnakusuuna. Piisab vaatamast haavatavuste loendit ASN.1 raamatukogudes. Bruce Schneier oma Cryptography engineering ei soovita samuti seda standardit kasutada selle keerukuse tĂ”ttu: "The best-known TLV encoding is ASN.1, but it is incredibly complex and we shy away from it". Kuid kahjuks on meil tĂ€na soovitatakse seda standardit mitte kasutada, kuna see on vĂ€ga keeruline: „Parim teadaolev TLV kodeerimine on ASN.1, kuid see on uskumatult keeruline ja me hoidume sellest.” Kuid kahjuks oleme tĂ€na silmitsi avatud vĂ”tmete infrastruktuuri , kus seda aktiivselt kasutatakse X.509 sertifika, CRL, OCSP, TSP, CMP protokollid, CMC, sĂ”numid CMS-i, ja hulk standardeid PKCS. SeetĂ”ttu tuleb osata töötada ASN.1-ga, kui tegelete millegagi, mis on seotud krĂŒptograafiaga.

ASN.1 vÔib olla kodeeritud mitmel viisil/kodeerimisega:

  • BER (Basic Encoding Rules)
  • CER (Canonical Encoding Rules)
  • DER (Distinguished Encoding Rules)
  • GSER (Generic String Encoding Rules)
  • JER (JSON Encoding Rules)
  • LWER (Light Weight Encoding Rules)
  • OER (Octet Encoding Rules)
  • PER (Packed Encoding Rules)
  • SER (Signalling specific Encoding Rules)
  • XER (XML Encoding Rules)

ja palju teisi. Kuid krĂŒptograafilistes ĂŒlesannetes kasutatakse praktikas kahte: BER ja DER. Isegi allkirjastatud XML-dokumentides (XMLDSig, XAdES) on ikkagi Base64 kodeeritud ASN.1 DER objektid, nagu ka JSON-pĂ”hises protokollis ACME Let’s Encryptist. KĂ”iki neid kodeerijaid ja kodeerimise pĂ”himĂ”tteid on parem mĂ”ista artiklite ja raamatute kaudu: ASN.1 lihtsate sĂ”nadega, ASN.1 — Communication between heterogeneous systems by Olivier Dubuisson, ASN.1 Complete by Prof John Larmouth.

BER on binaarne baitide orientatsiooniga (nĂ€iteks PER, populaarne mobiilsides — bitide orientatsiooniga) TLV-formaat. Iga element kodeeritakse jĂ€rgmiselt: sildi (Tag), mis tuvastab kodeeritava elemendi tĂŒĂŒbi (tĂ€isarv, string, kuupĂ€ev jne), pikkuse (Lsisu pikkust) ja sisu endaVÀÀrt). BER vĂ”imaldab valida, kas pöörata tĂ€helepanu pikkusele, seades erilise mÀÀramata pikkuse vÀÀrtuse ning lĂ”petades sĂ”numi End-Of-Octets mĂ€rgiga. Lisaks pikkuse kodeerimisele on BER-s palju varieeruvusi andmetĂŒĂŒpide kodeerimise viisides, nagu nĂ€iteks:

  • INTEGER, OBJECT IDENTIFIER, BIT STRING ning elemendi pikkus vĂ”ib olla normaliseerimata (ei ole kodeeritud minimaalses vormis);
  • BOOLEAN on tĂ”ene igasuguste mitte-null sisu puhul;
  • BIT STRING vĂ”ib sisaldada "ĂŒlejÀÀvaid" nullbite;
  • BIT STRING, OCTET STRING ja kĂ”ik nende tuletatud stringitĂŒĂŒbid, sealhulgas kuupĂ€ev/aeg, vĂ”ivad jaguneda muutuva pikkusega osadeks (chunk), mille pikkus on (de)kodeerimise ajal eelnevalt teadmata;
  • UTCTime/GeneralizedTime vĂ”ivad omada erinevaid viise ajavööndi nihke mÀÀramiseks ja "ĂŒlejÀÀvaid" nullsekundeid;
  • DEFAULT vÀÀrtused SEQUENCE's vĂ”ivad olla kodeeritud vĂ”i mitte;
  • Viimaste bitide nimelised vÀÀrtused BIT STRING'is vĂ”ivad soovi korral kodeerimata jÀÀda;
  • SEQUENCE (OF) / SET (OF) vĂ”ivad omada elementide suvalist jĂ€rjekorda.

Kuna eelnevalt mainitud asjaoludest johtuvat, pole alati vĂ”imalik andmeid kodeerida nii, et need oleksid originaalse vormiga identsed. SeetĂ”ttu loodi reeglite alamkogum: DER — rangelt mÀÀratlemine vaid ĂŒks lubatud kodeerimise viis, mis on kriitilise tĂ€htsusega krĂŒptograafiliste ĂŒlesannete jaoks, kus nĂ€iteks ĂŒksiku biti muutmine muudab allkirja vĂ”i kontrollsummat kehtetuks. DER-il on mĂ€rkimisvÀÀrne puudus: kĂ”igi elementide pikkused peavad kodeerimise ajal olema eelnevalt teada, mis ei vĂ”imalda andmeid voogesitusena serialiseerida. CER kodeeringul puudub see puudus, tagades samamoodi andmete ĂŒhemĂ”ttelise esituse. Kahjuks (vĂ”i Ă”nneks, et meil pole veel keerulisemaid dekoodereid?) ei ole see populaarseks saanud. SeetĂ”ttu kohtame praktikas „segatud” kasutust BER ja DER kodeeritud andmetega. Kuna nii CER kui ka DER on BER alamkogud, suudab iga BER-dekooder neid töödelda.

Probleemid pyasn1

Tööl kirjutame me palju programme, mis on seotud krĂŒptograafiaga ja Pythoniga. MĂ”ned aastad tagasi oli tasuta raamatukogude valik praktiliselt olematu: kas olid vĂ€ga madala tasemega raamatukogud, mis vĂ”imaldasid lihtsalt nĂ€iteks tĂ€isarvu ja struktuuri pealkirja kodeerida/dekodeerida, vĂ”i oli olemas raamatukogu pyasn1. Me kasutasime seda aastaid ja alguses olime sellega vĂ€ga rahul, kuna see vĂ”imaldab töötada ASN.1 struktuuridega kĂ”rgetasemeliste objektidena: nĂ€iteks dekodeeritud X.509 sertifikaadi objektil on vĂ”imalik ligipÀÀs oma vĂ€ljadele sĂ”naraamivahelise liidese kaudu: cert[«tbsCertificate»][«serialNumber»] nĂ€itab meile selle sertifikaadi seerianumbrit. Sarnaselt on vĂ”imalik „kokku panna” keerulisi objekte, töötades nendega nagu nimekirjade, sĂ”naraamatute kaudu ning seejĂ€rel lihtsalt kutsuda vĂ€lja funktsioon pyasn1.codec.der.encoder.encode ja saada dokumendi serialiseeritud esituse.

Kuid probleemide ja piirangud ilmesid. Pyasn1-l olid ja kahjuks on siiani vigu: artikli kirjutamise hetkel dekodeeritakse ja kodeeritakse pyasn1 ĂŒks pĂ”hiliike — GeneralizedTime, vale viisil.

Meie projektides salvestame sageli ainult faili teed, nihke ja objekti pikkuse baitidesse, millele tahame viidata, et sÀÀsta ruumi. NÀiteks vÔib juhuslikult allkirjastatud fail tÔenÀoliselt asuda CMS SignedData ASN.1 struktuuris:

  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

                 SIIN ON ALLKIRJASTATUD FAILI SISELTUS PIKKUS 751 BAIITI

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

me saame kĂ€tte originaalallkirjastatud faili, mille siire on 65 bitti ja pikkus 751 bitti. pyasn1 ei salvestanud seda teavet oma dekodeeritud objektidesse. On kirjutatud nn TLVSeeker — vĂ€ikene raamatukogu, mis vĂ”imaldab dekodeerida siltide ja objektide pikkusi, kus kasutame kĂ€sku 'mine jĂ€rgmisele sildile', 'siseneda sildi sisse' (minnes SEQUENCE objekti sisse), 'mine jĂ€rgmisele sildile', 'teata oma offset ja objekti pikkus, kus me oleme'. See oli 'kĂ€sitsi' navigeerimine ASN.1 DER-serialiseeritud andmete seas. Kuid BER-serialiseeritud andmete puhul ei saanud nii töötada, kuna nĂ€iteks oktetstringi bitti jĂ€rjend vĂ”is olla kodeeritud mitme chunk'ina.

Teine probleem meie jaoks pyasn1 puhul on see, et dekodeeritud objektide pĂ”hjal ei saa aru, kas antud vĂ€li oli SEQUENCE'is kohal vĂ”i mitte. NĂ€iteks, kui struktuur sisaldab vĂ€lja Field SEQUENCE OF Smth OPTIONAL, siis see vĂ”is tĂ€iesti puududa saabunud andmetest (OPTIONAL), aga vĂ”is ka olemas olla, kuid samas olla nullpikkusega (tĂŒhi nimekiri). Üldiselt ei olnud seda vĂ”imalik selgitada. See on vajalik saabunud andmete rangeks kehtivuse kontrollimiseks. Kujutage ette, et mĂ”ni sertifitseerimiskeskus vĂ€ljastas sertifikaadi, millel on ASN.1 skeemi seisukohalt «mitte pĂ€ris» kehtivad andmed! NĂ€iteks sertifitseerimiskeskus «TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı» ĂŒletas oma juuresertifikaadis lubatud piirid. RFC 5280 komponendi subject pikkuse piire — seda ei saa ausalt dekodeerida skeemi jĂ€rgi. DER kodeerija nĂ”uab, et vĂ€li, mille vÀÀrtus on DEFAULT, ei kodeeritaks edastamise ajal — selliseid dokumente kohtab praktikas ning PyDERASN esimene versioon isegi teadlikult lubas sellist kehtetut (DER perspektiivist) kĂ€itumist tagasiside ĂŒhilduvuse nimel.

Veel probleem on see, et ei saa kergesti teada, millises vormis (BER/DER) on antud objekt struktureeritud. NĂ€iteks CMS standard ĂŒtleb, et sĂ”num kodeeritakse BER, kuid allkiri atribuudid, millest luuakse krĂŒptograafiline allkiri, peavad olema DER vormis. Kui dekodeerime DER-iga, siis saame probleemiks CMS-i töötlemisel; kui dekodeerime BER-iga, siis ei tea, missuguses vormis allkiri atribuudid olid. LĂ”ppkokkuvĂ”ttes peate leidma iga allkiri atribuudi asukoha TLVSeeker-iga (mida pyasn1-s ei ole) ning dekodeerima need eraldi, tuues need serialiseeritud esitusest vĂ€lja DER-iga.

Meile oleks vÀga kasulik olnud automaatne DEFINED BY vÀljade töötlemine, mida esineb vÀga sageli. PÀrast ASN.1 struktuuri dekodeerimist vÔivad jÀÀda mitmed ANY vÀljad, mis peavad olema edasise skeemi kohaselt töödeldud, valitud OBJECT IDENTIFIER-i pÔhjal, mis on antud struktuuri vÀljas. Pythonis tÀhendab see if-lause kirjutamist ja edasist dekooderi kutsumist ANY vÀlja jaoks.

PyDERASN'i ilmumine

Atlassis saadame regulaarselt ĂŒlespoole patĆĄe, kui leiame mingeid probleeme vĂ”i arendame kasutatavaid avatud programme. Pyasn1-s oleme mitmel korral teinud tĂ€iustusi, kuid pyasn1 kood ei ole kĂ”ige kergemini arusaadav ja seal esines aeg-ajalt ĂŒhilduvuse muutusi API-s, mis on meid takistanud. Lisaks oleme harjunud kirjutama teste generatiivse testimisega, mida pyasn1-s ei olnud.

Ühel kaunil pĂ€eval otsustasin, et on aeg lĂ”petada selle talumine ja proovida kirjutada oma raamatukogu __slot__-idega, offset-idega ja kenasti kuvandud blob-idega! Lihtsalt ASN.1 kodeerija loomine ei piisanuks — tuleb tĂ”lkida kĂ”ik meie omavahel sĂ”ltuvad projektid sellele, ja see tĂ€hendab sadu tuhandeid koodiridu, mis sisaldavad palju ASN.1 struktuuridega töötamist. Seega ĂŒks nĂ”ue selle jaoks oli: lihtsus praeguse pyasn1 koodi tĂ”lkimisel. Kulutasin kogu oma puhkuse, et kirjutada see raamatukogu ning tĂ”lkida kĂ”ik projektid selle jaoks. Kuna need omavad praktiliselt 100% katvust testidega, tĂ€hendas see ka raamatukogu tĂ€ielikku toimimist.

PyDERASN-l on peaaegu 100%-line katteala testidega. Kasutatakse genereerivat testimist suurepĂ€rase teegiga. hypothesis. Samuti viidi lĂ€bi fuzzing py-afl-l 32 tuumalistes masinates. Kuigi meil on praktiliselt jÀÀnud vaid vĂ€he Python2 koodi, jĂ€rgib PyDERASN siiski selle ĂŒhilduvust ning seetĂ”ttu on tal ainus six sĂ”ltuvus. Lisaks on see testitud ASN.1:2008 compliance test suite.

Tööprintsiip on sarnane pyasn1-iga — töötamine kĂ”rgetasemeliste Python objektidega. ASN.1 skeemide kirjeldus on sarnane.

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

Kuid PyDERASN-il on sarnasus range tĂŒpiseerimisega. Pyasn1 puhul, kui vĂ€ljal oli tĂŒĂŒp CMSVersion(INTEGER), sai sellele omistada int vĂ”i INTEGER. PyDERASN nĂ”uab rangelt, et omistatav objekt oleks just CMSVersion. Lisaks sellele, et kirjutame Python3 koodi, kasutame ka typing annotations, seetĂ”ttu on meie funktsioonides arusaamatute argumentide asemel nagu def func(serial, contents) hoopis def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), ning PyDERASN aitab sĂ€ilitada sellist koodi.

Lisaks pakub PyDERASN ÀÀrmiselt mugavaid vĂ”imalusi selle sama tĂŒĂŒpide kohandamiseks. pyasn1 ei lubanud SubjectKeyIdentifier().subtype(implicitTag=Tag(
)) vĂ€ljal mÀÀrata SubjectKeyIdentifier() objekti (ilma vajaliku IMPLICIT TAG-ita), mistĂ”ttu tuli tihti kopeerida ja taasluua objekte ainult muudetud IMPLICIT/EXPLICIT sildide tĂ”ttu. PyDERASN jĂ€lgib rangelt ainult pĂ”hityĂŒpi — sildid tĂ€iendatakse automaatselt olemasolevast ASN.1 struktuuri skeemist. See lihtsustab rakenduste koodi oluliselt.

Kui dekodeerimise ajal tekib viga, on pyasn1-s keeruline mĂ”ista, kus see tĂ€pselt juhtus. NĂ€iteks juba varem mainitud TĂŒrgi sertifikaadiga saame sellise vea: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (at 138) unmet bounds: 1 ⇐ 77 ⇐ 64. ASN.1 struktuuride kirjutamisel vĂ”ivad inimesed eksida, ja see aitab lihtsustada rakenduste tĂ”rkeotsingut vĂ”i vĂ€lja selgitada probleemid vastaspoolte kodeeritud dokumentides.

Esimese versiooni PyDERASN-is ei olnud BER-kodeerimise toetust. See ilmus palju hiljem ja kuni praeguseni ei toetata UTCTime/GeneralizedTime töötlemist ajavöönditega. See tuleb tulevikus, kuna projekt kirjutatakse peamiselt töövÀlisel ajal.

Samuti ei olnud esimese versiooni puhul DEFINED BY vĂ€ljadega töötlemist. MĂ”ne kuu pĂ€rast see vĂ”imalus tekkis ja hakkas aktiivselt kasutama, oluliselt vĂ€hendades rakenduste koodi — ĂŒhe dekodeerimisoperatsiooni kĂ€igus saadakse tĂ€ielikult lahtiseks muundatud struktuur. Selleks mÀÀratakse skeemis, millised vĂ€ljad mida «mÀÀravad». NĂ€iteks skeemi CMS kirjeldus:

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

ĂŒtleb, et kui contentType sisaldab OID-i vÀÀrtusega id_signedData, tuleb content (mis asub samas SEQUENCE'is) dekodeerida skeemi SignedData abil. Miks on nii palju sulge? VĂ€li vĂ”ib „mÀÀrata” mitu vĂ€ljundit korraga, nagu seda nĂ€hakse EnvelopedData struktuurides. MÀÀratletavad vĂ€ljad tuvastatakse nn dekodeerimise teede kaudu — see mÀÀrab igas elemendi tĂ€pset asukohta kĂ”igis struktuurides.

Ei pruugi alati soovida vÔi olla vÔimalik kohe skeemi neid definesid lisada. VÔivad olla rakendusespetsiifilised olukorrad, kus OID-id ja struktuurid on teada ainult kolmandas projektis. PyDERASN vÔimaldab mÀÀrata neid definesid otse struktuuri dekodeerimise hetkel:

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

Siin rÀÀgime, et CMS SignedData jaoks tuleks dekodeerida kĂ”ik manustatud sertifikaadid ja nende laiendused (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool jne). Me mÀÀrame dekodeerimise teel, millisele elemendile tuleks „asetada” defines, justkui oleks see mÀÀratud skeemis.

LĂ”puks vĂ”imaldab PyDERASN töötada kĂ€sku rea kaudu ASN.1 failide dekodeerimiseks ning sellel on rikkalik ilus trĂŒkkimine. Saab dekodeerida suvalist ASN.1 formaati vĂ”i mÀÀrata selgelt mÀÀratud skeemi ja nĂ€ha midagi sellist:

PyDERASN: kuidas ma kirjutasin ASN.1 raamatukogu slots ja blobs'idega

Kuvatud teave: objekti nihke, sildi pikkus, pikkuse pikkus, sisu pikkus, EOC (octetite lĂ”pp) olemasolu, BER-kodeerimise tunnus, mÀÀramata pikkuse kodeerimise tunnus, EXPLICIT sildi pikkus ja nihke (kui on), objekti sĂŒgavus struktuurides, IMPLICIT/EXPLICIT sildi vÀÀrtus, objekti nimi skeemi jĂ€rgi, selle pĂ”hi ASN.1 tĂŒĂŒp, jĂ€rjestuse/koosseisu sees olev jĂ€rjekorranumber, CHOICE vÀÀrtus (kui on), inimese loetav INTEGER/ENUMERATED/BIT STRING nimi skeemi jĂ€rgi, mis tahes pĂ”hityĂŒpide vÀÀrtus, skeemilt DEFAULT/OPTIONAL lipp, tunnus, et objekt dekodeeriti automaatselt kui DEFINED BY ning millise OID-i tĂ”ttu see juhtus, inimese loetav OID.

Pretty printing sĂŒsteem on loodud genereerima PP-objektide jĂ€rjekordi, mis visualiseeritakse juba eraldiseisvate vahendite kaudu. Screenshot'il on nĂ€ha renderdaja lihtsas vĂ€rvilises tekstis. On olemas ka JSON/HTML formaadis renderdaid, et seda saaks brauseris ASN.1-i esitlemisega nĂ€ha nagu asn1js projektis.

Teised teegid

See ei olnud eesmĂ€rk, kuid PyDERASN osutus oluliselt kiiremaks kui pyasn1. NĂ€iteks CRL-failide dekodeerimine megabaidise suurusega vĂ”ib vĂ”tta nii kaua aega, et tuleb mĂ”elda andmete salvestamise (kiirete) vaheformaadi kasutamisele ja rakenduste arhitektuuri muutmisele. pyasn1 dekodeerib CRL CACert.org mu sĂŒlearvutis ĂŒle 20 minuti, samas kui PyDERASN vaid 28 sekundiga! On projekt asn1crypto, mis keskendub krĂŒptograafiliste struktuuridega kiirele töötlemisele: see dekodeerib (tĂ€ielikult, mitte laiskalt) sama CRL 29 sekundiga, kuid kasutab kĂ€ivitamisel Python3 all peaaegu kaks korda rohkem mĂ€lu (983 MiB vĂ”rreldes 498 MiB), ja 3.5 korda rohkem Python2 all (1677 vĂ”rreldes 488), samas kui pyasn1 kasutab lausa 4.3 korda rohkem (2093 vĂ”rreldes 488).

asn1crypto, mida mainisin, me ei arutanud, sest projekt oli alles alguses ja me ei olnud sellest kuulnud. Praegu ei vaataks ka me selle poole, kuna mĂ€rkasin kohe, et sama GeneralizedTime ei aktsepteeri suvalist vormingut ja serialiseerimise kĂ€igus eemaldab ta vaikselt kordajaid. See on vastuvĂ”etav X.509 sertifikaatidega töötamiseks, kuid ĂŒldiselt ei sobi.

Praegu on PyDERASN kĂ”ige rangem vabalt saadaval olev Python/Go DER-dekooder, mida ma tunnen. Minu lemmik Go encoding/asn1 teegis ei ole range kontroll OBJECT IDENTIFIER ja UTCTime/GeneralizedTime stringide jaoks. MĂ”nikord vĂ”ib rangeus segada (peamiselt vanade rakendustega ĂŒhilduvuse tĂ”ttu, mida keegi ei hakka parandama), seega saab PyDERASN-is dekodeerimise ajal edastada erinevaid seadeid kontrollide leevendamiseks.

Projekti kood pĂŒĂŒab olla vĂ”imalikult lihtne. KĂ”ik raamatukogu on ĂŒks fail. Kood on kirjutatud arusaadavuse rĂ”huga, ilma liigsete jĂ”udluse optimeerimisteta ja DRY-koodita. Nagu juba mainitud, ei sisalda see tĂ€ielikku BER dekodeerimist UTCTime/GeneralizedTime stringide jaoks, samuti REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING andmetĂŒĂŒpe. KĂ”igil muudel juhtudel ei nĂ€e ma isiklikult mĂ”tet Pythonis kasutada teisi raamatukogusid.

Nagu kÔik mu projektid, nagu PyGOST, GoGOST, NNCP, GoVPN, PyDERASN on tÀiesti avamood, mida levitatakse LGPLv3+, ja saadaval tasuta allalaadimiseks. Kasutamise nÀiteid leidub siin ja PyGOST testides.

Sergei Matvejev, krĂŒptopank, liige SPO Fondist, Python/Go arendaja, peaspetsialist FGUP „NTC Atlaas“.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster