see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see, see
Selles artiklis kĂ€sitletakse : Python ASN.1 teek, mis on aktiivselt kasutusel krĂŒptograafia projektides .

Tegelikult ei tasu ASN.1 soovitada krĂŒptograafiliste ĂŒlesannete jaoks: ASN.1 ja selle koodekid on keerulised. See tĂ€hendab, et kood ei ole lihtne, mis alati tĂ€hendab lisariskide teket. Piisab, kui vaadata haavatavuste nimekirja. Bruce Schneier soovitab ka oma ei soovita seda standardit kasutada selle keerukuse tĂ”ttu: "Parima tuntud TLV kodeering on ASN.1, kuid see on ÀÀrmiselt keeruline ja me hoidume sellest." Kuid kahjuks on meil tĂ€na kus kasutatakse aktiivselt , CRL, OCSP, TSP, CMP protokollid, , sĂ”numid, , ja palju PKCS standardeid ASN.1 vĂ”ib olla kodeeritud mitmel viisil/koodikonniga:
BER
- CER
- DER
- GSER
- JER
- LWER (Kerge kaaluga kodeerimisreeglid)
- OER
- PER
- SER (Signaalimise spetsiifilised kodeerimisreeglid)
- XER
- ja mitmete teiste. Kuid krĂŒptograafilistes ĂŒlesannetes kasutatakse praktikas kahte: BER ja DER. Ieven kirjade eestkirjades (
XMLDSig, ACME ASN.1 lihtsate sÔnadega , , .
BER on binaarne baitide formaat (nt PER, populaarne mobiilside vallas â bitipĂ”hine) TLV-formaat. Iga element kodeeritakse jĂ€rgmiselt: sildiga (Tag), mis tuvastab kodeeritava elemendi tĂŒĂŒbi (tĂ€isarv, string, kuupĂ€ev jne), pikkus (Lsisu ja sisu pikkus (VvÀÀrtus). BER vĂ”imaldab volituseta pikuse vÀÀrtust mitte nĂ€idata, seades erilise mÀÀratlemata pikkuse vÀÀrtuse ja lĂ”petades sĂ”numi End-Of-Octets mĂ€rgistusega. Lisaks pikkuse kodeerimisele on BERis palju varieeruvust andmetĂŒĂŒpide kodeerimise viisis, nĂ€iteks:
- INTEGER, OBJECT IDENTIFIER, BIT STRING ja elemendi pikkus vÔivad olla normaliseerimata (minimaalsetes vormides mitte kodeeritud);
- BOOLEAN on tÔene, kui sisu ei ole null;
- BIT STRING vĂ”ib sisaldada "ĂŒlejÀÀnud" nullbitleid;
- BIT STRING, OCTET STRING ja kĂ”ik nende derivatiivsed stringi tĂŒĂŒbid, sealhulgas kuupĂ€ev/aeg, vĂ”ivad jagada muutuva pikkusega fragmentideks (chunk), mille pikkust ei teata (de)kodeerimise ajal;
- UTCTime/GeneralizedTime vĂ”ivad omada erinevaid viise ajavööndi kompensatsiooni mÀÀramiseks ja "ĂŒlejÀÀnud" nullilisi sekundeid;
- SEQUENCE'i vaikimisi vÀÀrtusi vÔib kodeerida, kuid seda ei ole kohustuslik;
- BIT STRINGi viimaste bittide nimetatud vÀÀrtusi vÔib soovi korral mitte kodeerida;
- SEQUENCE (OF)/SET (OF) vÔivad sisaldada elementide suvalist jÀrjestust.
Kuna kĂ”ik eelnevalt mainitud, on andmete kodeerimine nii, et need oleksid originaalvormiga identsed, mitte alati vĂ”imalik. SeetĂ”ttu on vĂ€lja töötatud alakomplekt reegleid: DER â rangelt reguleerib ainult ĂŒhte lubatud kodeerimisviisi, mis on kriitiline krĂŒptograafilistes ĂŒlesannetes, kus nĂ€iteks ĂŒhe biti muutmine muudabAllkiri vĂ”i kontrollsummat kehtetuks. DERil on oluline puudus: kĂ”igi elementide pikkused peavad olema kodeerimise ajal eelnevalt teada, mis ei vĂ”imalda andmeid voogesitada. CER kodeeringul puudub see puudus, tagades andmete ĂŒheselt mĂ”istetava esituse. Kahjuks (vĂ”i Ă”nneks, et meil pole veel keerulisemaid dekoodereid?) ei saanud see populaarseks. SeetĂ”ttu kohtame praktikas âsegatudâ BER ja DER kodeeritud andmete kasutamist. Kuna nii CER kui ka DER on BER alakomplektid, suudab iga BER dekooder neid töödelda.
Probleemid pyasn1-ga
Tööl kirjutame palju Pythoniga seotud programme, mis on seotud krĂŒptograafiaga. Ja paar aastat tagasi oli tasuta raamatukogude valik praktiliselt olematu: kas need olid vĂ€ga madala taseme raamatukogud, mis vĂ”imaldasid lihtsalt kodeerida/dekodeerida nĂ€iteks tĂ€isarvu ja struktuuri pĂ€ist, vĂ”i oli see raamistik . Meie kasutasime seda mitu aastat ja alguses olime sellega vĂ€ga rahul, kuna see vĂ”imaldab töötada ASN.1 struktuuridega nagu kĂ”rge taseme objektidega: nĂ€iteks dekodeeritud X.509 sertifikaadi objekt vĂ”imaldab juurdepÀÀsu oma vĂ€ljadele sĂ”nastiku liidest kaudu: cert[«tbsCertificate»][«serialNumber»] nĂ€itab meile selle sertifikaadi seerianumbrit. Samamoodi on vĂ”imalik âkokku pannaâ keerukaid objekte, töötades nendega nagu loendite ja sĂ”nastikega, ja seejĂ€rel lihtsalt kutsuda funktsioon pyasn1.codec.der.encoder.encode, et saada dokumendi serialiseeritud esindus.
Kuid ilmnesid puudused, probleemid ja piirangud. Pyasn1-s olid ja paraku on veelgi vigu: artikli kirjutamise hetkel, pyasn1 ĂŒks pĂ”hitĂŒĂŒpidest â GeneralizedTime, dekodeeritud ja kodeeritud.
Meie projektides, ruumi sÀÀstmiseks, salvestame sageli ainult faili tee, nihke ja objekti pikkuse baitides, millele tahame viidata. NÀiteks on juhuslikult allkirjastatud fail kindlasti 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 SISU MĂĂT 751 BITE
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
ja me saame originaalse allkirjastatud faili 65-baidise nihkega, mille pikkus on 751 bahti. pyasn1 ei hoia seda teavet oma dekodeeritud objektides. Kirjutati nii nimetatud TLVSeeker â vĂ€ike teek, mis vĂ”imaldab dekodeerida siltide ja objektide pikkuseid, mille kasutajaliideses kĂ€skisime "mine jĂ€rgmisele silti", "siseneda sildi sisse" (siseneme SEQUENCE objekti sisse), "mine jĂ€rgmisele silti", "anna oma nihke ja objekti pikkus, kus me asume". See oli "kĂ€si" liikumine ASN.1 DER-serialiseeritud andmete seas. Kuid BER-serialiseeritud andmetega ei saanud nii töötada, kuna nĂ€iteks OCTET STRINGi baitide jada vĂ”is olla kodeeritud mitmes chunkis.
Teine puudus pyasn1 jaoks meie ĂŒlesannete tĂ€itmisel on see, et dekodeeritud objektide pĂ”hjal ei saanud aru, kas antud vĂ€li oli SEQUENCE's vĂ”i mitte. NĂ€iteks, kui struktuur sisaldab vĂ€ljandid Field SEQUENCE OF Smth OPTIONAL, siis see vĂ”is tĂ€ielikult puududa saabunud andmetest (OPTIONAL), vĂ”i see vĂ”is olla kohal, kuid nullpikkusega (tĂŒhi loend). Ăldiselt ei suutnud seda vĂ€lja selgitada. Ja see on vajalik saabunud andmete range valideerimise kontrollimiseks. Kujutage ette, et mĂ”ni sertifitseerimiskeskus oleks vĂ€lja andnud sertifikaadi, millel on "mitte pĂ€ris" kehtivad ASN.1 skeemi kohaselt andmed! NĂ€iteks sertifitseerimiskeskus âTĂRKTRUST Elektronik Sertifika Hizmet SaÄlayıcısıâ oma juures sertifikaadis ĂŒletas lubatud. komponendi subject pikkuse piire â seda ei saa Ă”iglaselt dekodeerida skeemi kohaselt. DER kodeerija nĂ”uab, et vĂ€lja, mille vÀÀrtus on DEFAULT, ei kodeeritaks edastamise ajal â reaalses elus on selliseid dokumente, ja PyDERASN esimene versioon tunnustas isegi teadlikult sellist mitte-kehtivat (DER'i seisukohast) kĂ€itumist tagasiteenuse ĂŒhilduvuse nimel.
Veel piire on see, et pole kerge teada, millises vormingus (BER\/DER) on teatud objekt struktuuris kodeeritud. NĂ€iteks ĂŒtleb CMS standard, et sĂ”num kodeeritakse BER-is, kuid selle allkirjastatud atribuutide vĂ€li, millele on loodud krĂŒptograafiline allkiri, peab olema DER-is. Kui dekrĂŒpteerime DER-ina, kukume CMS-i töötlemisega kokku, kui aga BER-ina, jÀÀme teadmata, millises vormingus olid allkirjastatud atribuudid. LĂ”ppkokkuvĂ”ttes tuleb meil TLVSeeker-iga (mida pole pyasn1-s) otsida iga allkirjastatud atribuudi vĂ€lja asukohta ja eraldi dekodeerida see DER-ina.
Meie jaoks oli vÀga soovitav vÔimalus automaatseks töötlemiseks DEFINED BY vÀljade jaoks, mida esineb vÀga sageli. PÀrast ASN.1 struktuuri dekodeerimist vÔib meil jÀÀda palju ANY vÀlju, mis tuleb edasi töödelda skeemi alusel, mille valib objekti identifikaator, mis on mÀÀratud struktuuri vÀljas. Pythonis tÀhendab see, et peab kirjutama if-lause ja seejÀrel edastama dekoodri ANY vÀljale.
PyDERASN-i ilmumine
Atlasel, kui leiame mĂ”ningaid probleeme vĂ”i tĂ€iustame kasutatavaid avatud programme, saadame pidevalt patĆĄe edasi. Pyasn1-s oleme korduvalt saatnud tĂ€iustusi, kuid pyasn1 kood ei ole kĂ”ige arusaadavam ja mĂ”nikord on seal toimunud ĂŒhilduvuse muutusi API-s, mis on meile ka pipart andnud. Pluss, oleme harjunud kirjutama katsetusi genereeriva testimise abil, mida pyasn1-s polnud.
Ăhel kaunil pĂ€eval otsustasin, et on aeg lĂ”petada see talumine ja proovida kirjutada oma teek __slot__-idega, offset-idega ja hĂ€sti esitatavate blob-idega! Lihtsalt ASN.1 kooderi loomine ei oleks piisav â kĂ”ik meie projektid tuleks selle peale ĂŒle viia, ja see tĂ€hendaks sadu tuhandeid koodiridasid, kus on palju ASN.1 struktuuride töötlemist. Seega oli ĂŒks nĂ”ue, et see oleks lihtne olemasoleva pyasn1 koodi ĂŒleviimiseks. Kulutasin kogu oma puhkuse selle teegi kirjutamisele ja viisin kĂ”ik projektid selle peale ĂŒle. Kuna neil on praktiliselt 100%-line katteaste testidega, tĂ€hendas see ka teegi tĂ€ielikku toimimist.
PyDERASN-il on samuti praktiliselt 100%-line katteaste testidega. Kasutatakse genereerivat testimist, koos suurepĂ€rase teegiga . Samuti viidi lĂ€bi -ime 32-tuumasel masinatel. Kuigi meil on peaaegu tĂ€ielikult kadunud Python2 kood, jĂ€rgib PyDERASN ikkagi selle ĂŒhilduvust ja seetĂ”ttu on see ainus sĂ”ltuvus. Lisaks on see katsetatud vastavalt .
Töö pĂ”himĂ”te on sarnane pyasn1-iga â töötamine kĂ”rgelt tasemel 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-l on nii-range tĂŒĂŒbi range. Pyasn1-s, kui vĂ€ljal oli tĂŒĂŒp CMSVersion(INTEGER), vĂ”is sellele mÀÀrata int vĂ”i INTEGER. PyDERASN nĂ”uab rangelt, et mÀÀratud objekt oleks tĂ€pselt CMSVersion. Lisaks sellele, et me kirjutame Python3 koodi, kasutame ka , seega on meie funktsioonides mitte arusaamatud argumendid nagu def func(serial, contents), vaid def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), ja PyDERASN aitab sĂ€ilitada sellist koodi.
Samuti on PyDERASN-l vĂ€ga mugavad leebused selle sama tĂŒĂŒbi osas. pyasn1 ei lubanud SubjectKeyIdentifier().subtype(implicitTag=Tag(âŠ)) vĂ€lja mÀÀrata SubjectKeyIdentifier() objekti (ilma vajaliku IMPLICIT TAG-ita) ning tuli tihti kopeerida ja uuesti luua objekte ainult muudetud IMPLICIT/EXPLICIT siltide tĂ”ttu. PyDERASN jĂ€lgib rangelt ainult pĂ”hitulne â sildid tĂ€iendatakse automaatselt juba olemasolevas ASN.1 struktuuri skeemis. See lihtsustab oluliselt rakenduste koodi.
Kui dekodeerimise ajal tekib viga, siis pyasn1-s ei ole lihtsalt aru saada, kus see tĂ€pselt juhtus. NĂ€iteks juba varem mainitud TĂŒrgi sertifikaadi puhul saame sellise veateate: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (at 138) unsatisfied bounds: 1 â 77 â 64 ASN.1 struktuuride kirjutamisel vĂ”ivad inimesed eksida ja see aitab lihtsustada rakenduste tĂ”rkeotsingut vĂ”i tuvastada probleemid vastaspoole kodeeritud dokumentides.
Esimeses versioonis ei olnud PyDERASN-il BER-kodeerimise tuge. See ilmus palju hiljem ja kuni praeguseni ei toetata UTCTime/GeneralizedTime töötlemist ajavöönditega. See tuleb tulevikus, kuna projekt kirjutatakse peamiselt töö vaba aja jooksul.
Esimeses versioonis puudus ka DEFINED BY vĂ€ljade toimetamine. MĂ”ne kuu pĂ€rast sai see ning hakati seda aktiivselt kasutama, mis vĂ€hendas oluliselt rakenduste koodi - ĂŒhe dekodeerimise operatsiooni kĂ€igus vĂ”is saada tĂ€ielikult kogu struktureeritud teabe kĂ”ige sĂŒgavamalt. Selleks mÀÀratakse skeemi sees, millised vĂ€ljad, mida 'mÀÀravad'. NĂ€iteks CMS skeemi 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, siis tuleb vĂ€lja content (mis asub samas SEQUENCE-is) dekodeerida skeemi jĂ€rgi SignedData. Miks on nii palju sulge? VĂ€li vĂ”ib 'mÀÀrata' mitu vĂ€lja korraga, nagu see on EnvelopedData struktuurides. MÀÀratud vĂ€ljad tuvastatakse nn dekodeerimistee jĂ€rgi - see mÀÀrab tĂ€pse asukoha igas elemendis kĂ”igis struktuurides.
Ei ole alati soovitav ega alati vÔimalik need defines kohe skeemi lisada. VÔivad olla rakenduse spetsiifilised juhtumid, kus OID-id ja struktuurid on tuntud ainult vÀlistes projektides. PyDERASN pakub vÔimalust sÀilitada neid defines 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 ĂŒtleme, et CMS SignedData puhul dekodeerida kĂ”ik rakendatud sertifikaatide laiendused (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool jne). Me mÀÀrame lĂ€bi dekodeerimistee, kuhu elemendile tuleb 'asetada' defines, nagu oleks see mÀÀratud skeemis.
LÔpuks on PyDERASN-il vÔimalik töötada ASN.1 failide dekodeerimiseks ja sellel on rikas . VÔimalik on dekodeerida mis tahes ASN.1 ja mÀÀrata kindel skeem ning nÀha midagi sarnast:

Kuvatav teave: objekti nihke, sildi pikkus, sisu pikkus, EOC (end-of-octets) olemasolu, BER-kodeerimise tunnus, mÀÀramatu pikkuse kodeerimise tunnus, EXPLICIT sildi pikkus ja nihke (kui on), objekti sisestamise sĂŒgavus struktuurides, IMPLICIT/EXPLICIT sildi vÀÀrtus, objekti nimetus skeemi jĂ€rgi, selle pĂ”hine ASN.1 tĂŒĂŒp, jĂ€rjestuse/seeria sisene number, CHOICE (kui on) vÀÀrtus, loetav INTEGER/ENUMERATED/BIT STRING nimetus skeemi jĂ€rgi, mis tahes pĂ”hityĂŒbi vÀÀrtus, skeemi DEFAULT/OPTIONAL lipp, objekti automaatse dekodeerimise mĂ€rk, DEFINED BY ja millise OID-i tĂ”ttu see toimus, loetav OID.
Pretty printing sĂŒsteem on loodud nii, et see genereerib PP-objektide jĂ€rjestuse, mida visualiseeritakse juba eraldi vahendite abil. Screenshotil on nĂ€idatud renderer lihtsas vĂ€rvilises tekstis. On olemas ka JSON/HTML formaadi renderer'id, et seda saaks esitleda ASN.1 nagu projektis.
Muud raamatukogud
See ei olnud eesmĂ€rk, kuid PyDERASN osutus oluliselt kui pyasn1. NĂ€iteks CRL-failide dekodeerimine, mille suurus on megabaidid, vĂ”ib vĂ”tta nii kaua aega, et tuleb mĂ”elda kiirete vaheandmete salvestamisvormingute peale ja rakenduste arhitektuuri muutmisele. pyasn1 dekodeerib CRL minu sĂŒlearvutis ĂŒle 20 minuti, samas kui PyDERASN ainult 28 sekundiga! On projekt , mis on suunatud krĂŒptograafiliste struktuuride kiirele töötlemisele: see dekodeerib (tĂ€ielikult, mitte laiskalt) sama CRL 29 sekundiga, kuid kasutab peaaegu kaks korda rohkem operatiivmĂ€lu Python3 alusel (983 MiB versus 498), ja 3.5 korda rohkem Python2 alla (1677 versus 488), samas kui pyasn1 kasutab isegi 4.3 korda rohkem (2093 versus 488).
asn1crypto, millest ma rÀÀkisin, me ei vaadanud, sest projekt alles algas ja me ei kuulnud sellest. Praegu me tĂ”enĂ€oliselt ka ei vaataks sinna suunas, kuna mĂ€rkasin kohe, et sama GeneralizedTime ei aktsepteeri juhuslikku vormi ning serialiseerimise ajal eemaldab see vaikselt sekundimurdude. See on X.509 sertifikaatide töötlemise jaoks vastuvĂ”etav, kuid ĂŒldiselt ei sobi.
Praegu on PyDERASN kĂ”ige rangem avatud lĂ€htekoodiga Python/Go DER-dekodeerija, keda ma tunnen. Minu armastatud Go encoding/asn1 raamatukogus OBJEKTI TUHA ja UTCTime/GeneralizedTime stringid. MĂ”nikord vĂ”ib rangus takistada (peamiselt tagurpidi ĂŒhilduvuse tĂ”ttu vanade rakendustega, mida keegi ei hakka parandama), seetĂ”ttu saab PyDERASN-is dekodeerimise ajal anda edasi leevendavaid kontrollimisi.
Projekti kood pĂŒĂŒab olla vĂ”imalikult lihtne. Kogu teek on ĂŒks fail. Kood on kirjutatud arusaadavuse rĂ”huasetusega, ilma liigsete jĂ”udluse optimeerimisteta ja DRY-koodita. Sees ei ole, nagu juba öeldud, tĂ€ielikku BER-dekoodimise toetust UTCTime/GeneralizedTime stringide jaoks ning samuti REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING andmetĂŒĂŒbid. KĂ”igil teistel juhtudel ei nĂ€e ma isiklikult mĂ”tet kasutada Pythonis teisi teeke.
Nagu kĂ”ik minu projektid, tĂŒĂŒp , , , , PyDERASN on tĂ€ielikult , levitatakse jĂ€rgmistel tingimustel , ja on saadaval tasuta allalaadimiseks. NĂ€idiseid kasutamisest on ja .
, , liige , Python/Go arendaja, peamine spetsialist .
Allikas: habr.com
