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 : Python ASN.1 raamatukogu, mida kasutatakse aktiivselt krĂŒptograafia projektides .

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 Cryptography engineering 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 , kus seda aktiivselt kasutatakse , CRL, OCSP, TSP, CMP protokollid, , sĂ”numid , ja hulk standardeid . 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:
- (Basic Encoding Rules)
- (Canonical Encoding Rules)
- (Distinguished Encoding Rules)
- (Generic String Encoding Rules)
- (JSON Encoding Rules)
- LWER (Light Weight Encoding Rules)
- (Octet Encoding Rules)
- (Packed Encoding Rules)
- SER (Signalling specific Encoding Rules)
- (XML Encoding Rules)
ja palju teisi. Kuid krĂŒptograafilistes ĂŒlesannetes kasutatakse praktikas kahte: BER ja DER. Isegi allkirjastatud XML-dokumentides (, ) on ikkagi Base64 kodeeritud ASN.1 DER objektid, nagu ka JSON-pĂ”hises protokollis Letâs Encryptist. KĂ”iki neid kodeerijaid ja kodeerimise pĂ”himĂ”tteid on parem mĂ”ista artiklite ja raamatute kaudu: , , .
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 . 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, 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. 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. . Samuti viidi lĂ€bi -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 sĂ”ltuvus. Lisaks on see testitud .
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 , 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 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 ASN.1 failide dekodeerimiseks ning sellel on rikkalik . Saab dekodeerida suvalist ASN.1 formaati vÔi mÀÀrata selgelt mÀÀratud skeemi ja nÀha midagi sellist:

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 projektis.
Teised teegid
See ei olnud eesmĂ€rk, kuid PyDERASN osutus oluliselt 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 mu sĂŒlearvutis ĂŒle 20 minuti, samas kui PyDERASN vaid 28 sekundiga! On projekt , 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 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 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 , , , , PyDERASN on tÀiesti , mida levitatakse , ja saadaval tasuta allalaadimiseks. Kasutamise nÀiteid leidub ja .
, , liige , Python/Go arendaja, peaspetsialist .
Allikas: habr.com
