është një standard (ISO, ITU-T, GOST) për një gjuhë që përshkruan informacionin e strukturuar, si dhe rregullat për kodimin e këtij informacioni. Për mua si programues, është thjesht një format tjetër për serializim dhe paraqitje të të dhënave, në të njëjtin nivel me JSON, XML, XDR dhe të tjerë. Ai është tepër i përhapur në jetën tonë të përditshme, dhe shumë njerëz me të përballen: në komunikimin celular, telefonik, VoIP (UMTS, LTE, WiMAX, SS7, H.323), në protokollet e rrjetit (LDAP, SNMP, Kerberos), në të gjitha aspektet që lidhen me kriptografinë (X.509, CMS, standardet PKCS), në kartat bankare dhe pasaportat biometrike, dhe shumë vende të tjera.
Ky artikull shqyrton : biblioteka Python ASN.1 e cila përdoret aktivisht në projekte që lidhen me kriptografinë në .

Në të vërtetë, nuk është e rekomandueshme që ASN.1 të përdoret për detyrat e kriptografisë: ASN.1 dhe kodifikuesit e tij janë të ndërlikuar. Kjo do të thotë se kodi nuk do të jetë i thjeshtë, dhe kjo gjithmonë paraqet një vektor të tepërt sulmi. Mjafton të shikoni e dobësive në bibliotekat ASN.1. Bruce Schneier në librin e tij nuk e rekomandon gjithashtu përdorimin e këtij standardi për shkak të kompleksitetit të tij: "Kodimi më i njohur TLV është ASN.1, por është jashtëzakonisht i ndërlikuar dhe ne shmangim përdorimin e tij". Por, fatkeqësisht, sot ne kemi në të cilat përdoren aktivisht , CRL, OCSP, TSP, protokollet CMP, , mesazhe , dhe një sërë standardesh . Pra, është e nevojshme të dinë të punojnë me ASN.1, nëse merret me diçka që lidhet me kriptografinë.
ASN.1 mund të kodifikohet në shumë mënyra/codec:
- (Rregullat Bazë të Kodifikimit)
- (Rregullat Kanonike të Kodifikimit)
- (Rregullat e Distinguar të Kodifikimit)
- (Rregullat e Kodifikimit të Karaktereve të Gjenerik)
- (Rregullat e Kodifikimit JSON)
- LWER (Rregullat e Kodifikimit të Lehtë)
- (Rregullat e Kodifikimit Oktet)
- (Rregullat e Kodifikimit të Paketuar)
- SER (Rregullat e Kodifikimit specifik të Signalisë)
- (Rregullat e Kodifikimit XML)
dhe disa tĂ« tjera. Por, nĂ« problemet kriptografike, nĂ« praktikĂ« pĂ«rdoren dy: BER dhe DER. Edhe nĂ« dokumentet XML tĂ« nĂ«nshkruara (, ) do tĂ« kenĂ« objekte ASN.1 DER tĂ« koduara nĂ« Base64, ashtu si nĂ« protokollin e orientuar ndaj JSON-it nga Letâs Encrypt. MĂ« mirĂ« Ă«shtĂ« tĂ« kuptohet tĂ« gjithĂ« kĂ«to kodek dhe parimet e kodifikimit BER/CER/DER nĂ« artikuj dhe libra: , , .
BER Ă«shtĂ« njĂ« format binar tĂ« orientuar ndaj bajtĂ«ve (p.sh. PER, i njohur nĂ« komunikimin celular â i orientuar ndaj bitĂ«ve) TLV. Ădo element kodifikohet nĂ« formĂ«n e: njĂ« etikete (Tag), qĂ« identifikon llojin e elementit tĂ« koduar (numri i plotĂ«, string, data, etj.), gjatĂ« shtrirjes (LgjatĂ«sinĂ« e pĂ«rmbajtjes dhe vetĂ« pĂ«rmbajtjen (VlerĂ«). BER opcionalisht lejon qĂ« vlera e gjatĂ« tĂ« mos tregojĂ« njĂ« vlerĂ«, duke vendosur njĂ« vlerĂ« tĂ« veçantĂ« tĂ« gjatĂ« tĂ« pasiguruar dhe pĂ«rfundon mesazhin me etiketĂ«n End-Of-Octets. PĂ«rveç kodimit tĂ« gjatĂ«, nĂ« BER ka shumĂ« variacione nĂ« mĂ«nyrĂ«n e kodimit tĂ« tipeve tĂ« tĂ« dhĂ«nave, si p.sh.:
- INTEGER, OBJECT IDENTIFIER, BIT STRING dhe gjatësia e elementit mund të jenë jashtë normalizimit (nuk janë koduar në formën minimale);
- BOOLEAN është i vërtetë për çdo përmbajtje të ndryshme nga zero;
- BIT STRING mund të përmbajë bit si «të tepërt» zero;
- BIT STRING, OCTET STRING dhe të gjitha tipet e tjera të vargjeve të nxjerra, përfshirë datën / kohën, mund të ndahen në copa (chunk) me gjatësi të ndryshueshme, gjatësi të cilave gjatë (de)kodimit nuk dihet paraprakisht;
- UTCTime / GeneralizedTime mund të kenë mënyra të ndryshme për të specifikuar devijimin e zonës kohore dhe «të tepërt» zero fraksione sekondash;
- Vlerat DEFAULT të SEQUENCE mund të kodohen ose jo;
- Vlerat e emëruara të bive të fundit në BIT STRING mund të mos kodohen sipas dëshirës;
- SEQUENCE (OF) / SET (OF) mund të kenë një rend të rastësishëm të elementeve.
PĂ«r shkak tĂ« gjithĂ« sipĂ«rpĂ«rmendurave, kodimi i tĂ« dhĂ«nave nĂ« mĂ«nyrĂ« qĂ« ato tĂ« jenĂ« identike me formĂ«n origjinale â nuk Ă«shtĂ« gjithmonĂ« i mundur. Prandaj, u shpik njĂ« nĂ«ngrup rregullash: DER â rregullon njĂ« mĂ«nyrĂ« tĂ« vetme tĂ« lejuar pĂ«r kodim, qĂ« Ă«shtĂ« thelbĂ«sore pĂ«r problemet kriptografike, ku, pĂ«r shembull, ndĂ«rrimi i njĂ« bÄ«ti do tĂ« bĂ«nte qĂ« nĂ«nshkrimi ose kontrolli i shumĂ«s tĂ« mos ishte i vlefshĂ«m. DER ka njĂ« disavantazh tĂ« dukshĂ«m: gjatĂ« çdo elementi duhet tĂ« dihen paraprakisht, gjatĂ« kodimit, qĂ« nuk lejon serializimin e tĂ« dhĂ«nave nĂ« rrjedhĂ«. Kodi CER Ă«shtĂ« pa kĂ«tĂ« disavantazh, duke garantuar po ashtu njĂ« pĂ«rfaqĂ«sim tĂ« qartĂ« tĂ« tĂ« dhĂ«nave. FatkeqĂ«sisht (apo me fat qĂ« nuk kemi mĂ« dekodues mĂ« tĂ« komplikuar?), ai nuk u bĂ« popullor. Prandaj, nĂ« praktikĂ«, hasim pĂ«rdorim "tĂ« pĂ«rzier" tĂ« tĂ« dhĂ«nave tĂ« koduara BER dhe DER. Duke qenĂ« se si CER ashtu edhe DER janĂ« nĂ«ngrupe tĂ« BER, çdo dekodues BER Ă«shtĂ« nĂ« gjendje t'i pĂ«rpunojĂ« ato.
Problemet me pyasn1
Në punë shkruajmë shumë programe në Python që lidhen me kriptografinë. Disa vite më parë, zgjedhjet për bibliotekat e lira ishin pothuajse të pakta: ose ishin biblioteka shumë të nivelit të ulët, që lejonin vetëm kodimin/dekodimin, për shembull, të një numri të plotë dhe titullit të një strukture, ose ishte biblioteka . Ne e përdorëm atë për disa vite dhe në fillim ishim shumë të kënaqur, sepse lejon të punojmë me strukturat ASN.1 si objekte të nivelit të lartë: për shembull, objekti i dekoduar i certifikatat X.509 na lejon të qasemi në fushat e tij përmes një interface-dikshionari: cert[«tbsCertificate»][«serialNumber»] do të na tregojë numrin serial të kësaj certifikate. Po ashtu, mund të "ndërtojmë" objekte të ndërlikuara duke punuar me to si me lista dhe fjalorë, e pastaj thjesht të thërrasim funksionin pyasn1.codec.der.encoder.encode dhe të marrim një përfaqësim të serializuar të dokumentit.
MegjithatĂ«, dolĂ«n probleme, mangĂ«si dhe kufizime. NĂ« pyasn1 kishte dhe, pĂ«r fat tĂ« keq, ende ka gabime: nĂ« momentin e shkruar tĂ« kĂ«tij artikulli, nĂ« pyasn1 njĂ« nga tipet bazĂ« â GeneralizedTime, nĂ« mĂ«nyrĂ« tĂ« pasaktĂ«.
Në projektet tona, për të kursyer hapësirë, shpesh ruajmë vetëm rrugën e skedarit, offsetin dhe gjatësinë në byte të objektit që dëshirojmë të referohemi. P.sh., një skedar i nënshkruar në mënyrë arbitrare sigurisht do të ndodhet në strukturën 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
KTU ĂSHTĂ PĂRMBAJTJA E SKEDARIT TĂ NĂNSHKUAR ME MADHĂSI 751 BYT
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
dhe ne mund tĂ« nxjerrim skedarin origjinal tĂ« nĂ«nshkruar me njĂ« zhvendosje prej 65 byte, me gjatĂ«si 751 byte. pyasn1 nuk e ruan kĂ«tĂ« informacion nĂ« objektet e tij tĂ« dekoduara. ĂshtĂ« shkruar njĂ« bibliotekĂ« e quajtur TLVSeeker â njĂ« bibliotekĂ« e vogĂ«l qĂ« lejon dekodimin e etiketimeve dhe gjatĂ«si tĂ« objekteve, nĂ« interfesin e sĂ« cilĂ«s komanduam 'kalo nĂ« etiketĂ«n tjetĂ«r', 'hy brenda etiketĂ«s' (hyjmĂ« brenda objektit SEQUENCE), 'kalo nĂ« etiketĂ«n tjetĂ«r', 'raporto offset-in dhe gjatĂ«si e objektit, ku ndodhemi'. Kjo ishte njĂ« 'shĂ«titje manuale' pĂ«r tĂ« dhĂ«nat ASN.1 DER-serializuar. Por nuk mund tĂ« punohej kĂ«shtu me tĂ« dhĂ«nat BER-serializuar, pasi, pĂ«r shembull, njĂ« varg bajtĂ«sh OCTET STRING mund tĂ« ishte koduar nĂ« disa chunk-e.
NjĂ« mangĂ«si tjetĂ«r pĂ«r ne nĂ« pyasn1 Ă«shtĂ« pamundĂ«sia pĂ«r tĂ« kuptuar nga objektet e dekoduara nĂ«se njĂ« fushĂ« e caktuar ishte e pranishme nĂ« SEQUENCE apo jo. PĂ«r shembull, nĂ«se struktura pĂ«rmban fushĂ«n Field SEQUENCE OF Smth OPTIONAL, ajo mund tĂ« mos ketĂ« qenĂ« e pranishme nĂ« tĂ« dhĂ«nat e ardhura (OPTIONAL), ose mund tĂ« ketĂ« qenĂ« e pranishme, por me gjatĂ«si zero (lista bosh). NĂ« pĂ«rgjithĂ«si, kjo nuk mund tĂ« bĂ«hej e qartĂ«. Kjo Ă«shtĂ« e nevojshme pĂ«r njĂ« kontroll rigoroz tĂ« vlefshmĂ«risĂ« sĂ« tĂ« dhĂ«nave tĂ« ardhura. Imagjinoni se ndonjĂ« qendĂ«r certifikimi do tĂ« lĂ«shonte njĂ« certifikatĂ« me tĂ« dhĂ«na 'jo krejt' tĂ« vlefshme sipas skemave ASN.1! PĂ«r shembull, qendra e certifikimit 'TĂRKTRUST Elektronik Sertifika Hizmet SaÄlayıcısı' nĂ« certifikatĂ«n e saj tĂ« rrĂ«njĂ«s kaloi kufijtĂ« e pranueshĂ«m. kĂ«to kufij tĂ« gjatĂ« tĂ« komponentit subject â Ă«shtĂ« e pamundur ta dekodosh drejt pĂ«r drejt sipas skemĂ«s. Kodi DER kĂ«rkon qĂ« njĂ« fushĂ«, e cila ka njĂ« vlerĂ« qĂ« Ă«shtĂ« nĂ« DEFAULT, tĂ« mos kodifikohet gjatĂ« transferimit â nĂ« jetĂ«, kĂ«to dokumente ndodhin dhe versioni i parĂ« i PyDERASN madje e lejonte kĂ«tĂ« sjellje tĂ« pavlefshme (sipas DER) pĂ«r shkak tĂ« kompatibilitetit tĂ« mbrapsht.
Një tjetër kufizim është pamundësia për të ditur lehtësisht në cilën format (BER/DER) është koduar një objekt në strukturë. Për shembull, standardi CMS thotë se mesazhi kodifikohet në BER, por fusha signedAttrs, mbi të cilin formohet nënshkrimi kriptografik, duhet të jetë në DER. Nëse dekodojmë me DER, do të hasim probleme në përpunimin e vetë CMS, ndërsa nëse dekodojmë me BER, nuk do ta dimë se në cilën formë ishte signedAttrs. Si rezultat, do të duhet të përdorim TLVSeeker (një analog nuk ekziston në pyasn1) për të kërkuar pozitat e çdo fushe signedAttrs dhe ta dekodojmë atë veçmas nga paraqitja e serializuar, duke e dekoduar me DER.
Një mundësi shumë e dëshiruar për ne ishte përpunimi automatik i fushave DEFINED BY, të cilat janë shumë të zakonshme. Pas dekodimit të strukturës ASN.1, mund të mbesin shumë fusha ANY, të cilat duhet të përpunohen më tej sipas një skeme, e zgjedhur në bazë të OBJECT IDENTIFIER të caktuar në fushën e strukturës. Në kodin Python, kjo do të thotë të shkruajmë if dhe më pas të thërrasim dekoduesin për fushën ANY.
Shfaqja e PyDERASN
Në Atlas, ne rregullisht dërgojmë patch-e për problemet e gjetura ose përmirësimet e programeve të lira që përdorim. Në pyasn1, ne kemi dërguar disa herë përmirësime, por kodi i pyasn1 nuk është shumë i thjeshtë për t'u kuptuar dhe ndonjëherë ka ndodhur ndryshime të pamundura në API-në e tij që na godisnin. Për më tepër, jemi mësuar të shkruajmë prova me testimin gjenerativ, gjë që nuk kishte në pyasn1.
NjĂ« ditĂ« tĂ« bukur vendosa qĂ« mjaft Ă«shtĂ« mjaft dhe Ă«shtĂ« koha tĂ« provoj tĂ« shkruaj bibliotekĂ«n time me __slot__-a, offset-e dhe blob-e qĂ« shfaqen shkĂ«lqyeshĂ«m! Thjesht tĂ« krijosh njĂ« kodues ASN.1 do tĂ« ishte e pamjaftueshme â duhej tĂ« pĂ«rkthenim tĂ« gjithĂ« projektet tona qĂ« varen nga njĂ«ri-tjetri mbi tĂ«, dhe kjo Ă«shtĂ« qindra mijĂ«ra rreshta kodi ku ka shumĂ« punĂ« me strukturat ASN.1. KĂ«shtu, njĂ« nga kĂ«rkesat pĂ«r tĂ« ishte: lehtĂ«sia e pĂ«rkthimit tĂ« kodit aktual tĂ« pyasn1. Pas gjithĂ« pushimit tim, shkrova kĂ«tĂ« bibliotekĂ« dhe pĂ«rktheva tĂ« gjithĂ« projektet mbi tĂ«. Duke qenĂ« se ato kanĂ« njĂ« mbulim praktikisht 100% me teste, kjo do tĂ« thoshte edhe funksionalitet tĂ« plotĂ« tĂ« bibliotekĂ«s.
PyDERASN, në mënyrë të ngjashme, ka një mbulim gati 100% me teste. Përdoret testimi gjenerativ me një bibliotekë të shkëlqyer. . Po ashtu është kryer edhe - në makina me 32 bërthama. Ndërkohë që na ka mbetur pothuajse pa kod Python2, PyDERASN ende ruan kompatibilitetin me të dhe për këtë arsye ka një varësi unike. Për më tepër, ai është testuar ndaj .
Parimi i punĂ«s me tĂ« Ă«shtĂ« i ngjashĂ«m me pyasn1 â puna me objekte tĂ« nivelit tĂ« lartĂ« nĂ« Python. PĂ«rshkrimi i skemave ASN.1 Ă«shtĂ« i ngjashĂ«m.
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)),
)
Megjithatë, PyDERASN ka një ngjashmëri të fortë të tipizimit. Në pyasn1, nëse një fushë kishte tipin CMSVersion(INTEGER), mund t'i jepej një int ose INTEGER. PyDERASN kërkon me rigorizitet që objekti që jepet të jetë pikërisht CMSVersion. Përveç faktit se ne shkruajmë kod në Python3, ne gjithashtu përdorim , prandaj funksionet tona nuk do kenë argumente të paqarta si def func(serial, contents), por def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), dhe PyDERASN ndihmon në ruajtjen e tillë të kodit.
NĂ« tĂ« njĂ«jtĂ«n kohĂ«, PyDERASN ofron lehtĂ«sira shumĂ« tĂ« dobishme pĂ«r kĂ«tĂ« lloj tipizimi. pyasn1 nuk lejonte qĂ« nĂ« SubjectKeyIdentifier().subtype(implicitTag=Tag(âŠ)) tĂ« jepni njĂ« objekt SubjectKeyIdentifier() (pa TAG-un e nevojshĂ«m IMPLICIT) dhe shpesh duhej tĂ« kopjoheshin dhe krijoheshin pĂ«rsĂ«ri objekte vetĂ«m pĂ«r shkak tĂ« ndryshimeve nĂ« TAG-et IMPLICIT/EXPLICIT. PyDERASN respekton vetĂ«m tipin bazĂ« â atĂ« e vendos automatikisht nga skema pĂ«rkatĂ«se tĂ« strukturĂ«s ASN.1. Kjo e thjeshton ndjeshĂ«m kodin e aplikacioneve.
Kur ndodh njĂ« gabim gjatĂ« dekodimit, nĂ« pyasn1 nuk Ă«shtĂ« e lehtĂ« tĂ« kuptohet se ku ka ndodhur ai. PĂ«r shembull, nĂ« certifikatĂ«n turke tĂ« pĂ«rmendur mĂ« lart, do tĂ« marrim kĂ«tĂ« gabim: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (nĂ« 138) kufij tĂ« pahappy: 1 â 77 â 64. Kur shkruhen struktura ASN.1, njerĂ«zit mund tĂ« gabojnĂ«, dhe kjo ndihmon nĂ« gjurmimin mĂ« tĂ« lehtĂ« tĂ« aplikacioneve ose nĂ« zbardhjen e problemeve me dokumentet e koduara nga pala tjetĂ«r.
Në versionin e parë të PyDERASN nuk kishte mbështetje për kodimin BER. Kjo u shfaq shumë më vonë dhe akoma nuk mbështetet përpunimi i UTCTime/GeneralizedTime me zona kohore. Kjo do të vijë në të ardhmen, pasi projekti shkruhet kryesisht në kohën e lirë nga puna.
Gjithashtu nĂ« versionin e parĂ« nuk kishte punim me fushat DEFINED BY. Pas disa muajsh kjo dhe filloi tĂ« pĂ«rdoret aktivisht, duke e reduktuar ndjeshmĂ«risht kodin e aplikacioneve â me njĂ« operacion dekodimi mund tĂ« merrje krejt strukturĂ«n e zbĂ«rthyer deri nĂ« thellĂ«sinĂ« mĂ« tĂ« madhe. PĂ«r kĂ«tĂ«, nĂ« skemĂ« pĂ«rcaktohen cilat fusha çfarĂ« "pĂ«rcaktojnĂ«". PĂ«r shembull, pĂ«rshkrimi i skemĂ«s 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))),
)
flet se se tipu i pĂ«rmbajtjes do tĂ« pĂ«rmbajĂ« OID me vlerĂ«n id_signedData, atĂ«herĂ« fusha e pĂ«rmbajtjes (e cila ndodhet nĂ« kĂ«tĂ« SEQUENCE) duhet tĂ« dekodohet sipas skemĂ«s SignedData. Pse ka kaq shumĂ« kllapa? Fusha mund tĂ« "pĂ«rcaktojĂ«" disa fusha njĂ«kohĂ«sisht, siç ndodh nĂ« struktura EnvelopedData. Fushat e pĂ«rcaktuara identifikohen sipas ashtuquajturit decode path â ai pĂ«rcakton vendndodhjen e saktĂ« tĂ« çdo elementi nĂ« tĂ« gjitha strukturat.
Nuk është gjithmonë dëshira ose gjithmonë ka mundësi që t'i shtosh këto defina menjëherë në skemë. Mund të ketë raste specifike aplikative kur OID-të dhe strukturat njihen vetëm në një projekt të jashtëm. PyDERASN ofron mundësinë e caktimit të këtyre definave pikërisht në momentin e dekodimit të strukturës:
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(),
}),),
),)})
Këtu flasim se në CMS SignedData për të gjitha certifikatat e bashkangjitura, dekodojmë të gjitha zgjerimet e tyre (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool, etj.). Ne tregojmë përmes decode path, se cili element duhet të «shkëmbejë» defines, sikur të ishte caktuar në skemë.
përfundimisht, PyDERASN ka mundësinë të punojë nga për dekodimin e skedarëve ASN.1 dhe ka një . Mund të dekodoni ASN.1 të rastësishme, ose mund të caktoni një skemë të saktë dhe të shihni diçka të ngjashme:

Informacioni i treguar: offset i objektit, gjatësia e tag-ut, gjatësia e gjatësi, gjatësia e përmbajtjes, prania e EOC (end-of-octets), shenja e kodimit BER, shenja e kodimit indefinite-length, gjatësia dhe offset-i i tag-ut EXPLICIT (nëse ka), thellësia e objektit në struktura, vlera IMPLICIT/EXPLICIT e tag-ut, emri i objektit sipas skemës, tipi i saj bazë ASN.1, numri rendor brenda SEQUENCE/SET OF, vlera e CHOICE (nëse ka), emri i lexueshëm i INTEGER/ENUMERATED/BIT STRING sipas skemës, vlera e çdo tipi bazë, flamuri DEFAULT/OPTIONAL nga skema, shenja që objekti u dekodua automatikisht si DEFINED BY dhe për shkak të cilit OID ka ndodhur këtë, OID e lexueshme.
Sistemi i pretty printing është projektuar në një mënyrë që gjeneron një mori objektesh PP, të cilat vizualizohen më vonë me mjete të veçanta. Në screenshot shikohet renderer-i në tekst të thjeshtë me ngjyra. Ekzistojnë edhe renderer-a në formatin JSON/HTML, për ta parë me ndriçim në shfletues ASN.1 si në projektin.
Biblioteka të tjera
Kjo sâka qenĂ« qĂ«llimi, por PyDERASN doli tĂ« jetĂ« nĂ« mĂ«nyrĂ« tĂ« konsiderueshme se pyasn1. PĂ«r shembull, dekodimi i skedarĂ«ve CRL qĂ« janĂ« nĂ« megabajt mund tĂ« marrĂ« njĂ« kohĂ« tĂ« tillĂ«, saqĂ« do tĂ« duhet tĂ« mendojmĂ« pĂ«r formate tĂ« pĂ«rkohshme tĂ« ruajtjes sĂ« tĂ« dhĂ«nave (tĂ« shpejta) dhe tĂ« ndryshojmĂ« arkitekturĂ«n e aplikacioneve. pyasn1 dekodifikon CRL nĂ« laptopin tim pĂ«r mĂ« shumĂ« se 20 minuta, ndĂ«rsa PyDERASN vetĂ«m nĂ« 28 sekonda! Ekziston njĂ« projekt , i orientuar pĂ«r punĂ« tĂ« shpejtĂ« me struktura kriptografike: ai dekodifikon (plotĂ«sisht, jo lenj) tĂ« njĂ«jtĂ«n CRL nĂ« 29 sekonda, pĂ«rveçse konsumon pothuajse dy herĂ« mĂ« shumĂ« memorie tĂ« aksesit kur ekzekutohet nĂ«n Python3 (983 MiB kundrejt 498), dhe 3.5 herĂ« mĂ« shumĂ« nĂ«n Python2 (1677 kundrejt 488), ndĂ«rsa pyasn1 konsumon deri nĂ« 4.3 herĂ« mĂ« shumĂ« (2093 kundrejt 488).
asn1crypto, që e përmenda, nuk e kemi shqyrtuar sepse projekti ishte ende në fillim dhe nuk kishim dëgjuar për të. Edhe tani, nuk do të shikonim në drejtim të tij, pasi e kuptova menjëherë se ai nuk pranon format të rastësishme për GeneralizedTime, dhe gjatë serializimit heshtazi heq ndarjet e sekondës. Kjo është e pranueshme për punën me certifikatat X.509, por në përgjithësi nuk do të përshtatet.
Aktualisht, PyDERASN është më i rrepti nga dekoderët e lirë Python/Go DER që njoh. Në bibliotekën encoding/asn1 të Go, që e doje. OBJECT IDENTIFIER dhe UTCTime/GeneralizedTime vargje. Ndonjëherë rreptësia mund të pengojë (fillimisht, për shkak të kompatibilitetit të prapavijës me aplikacione të vjetra, të cilat askush nuk do t'i korrigjosh), prandaj në PyDERASN gjatë dekodimit mund të kalosh që lehtësojnë kontrollin.
Kodi i projektit përpiqet të jetë sa më i thjeshtë. E gjithë biblioteka është një skedar. Kodi është shkruar me fokus në thjeshtësinë e kuptimit, pa optimizime të tepruara të performancës dhe kodit DRY. Në të nuk ka, siç e përmenda, mbështetje të plotë për dekodimin BER të përcaktimeve UTCTime/GeneralizedTime, si dhe për llojet e të dhënave REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING. Në të gjitha rastet e tjera, unë personalisht nuk shoh arsye për të përdorur biblioteka të tjera në Python.
Ashtu si të gjithë projektet e mia, tipo , , , , PyDERASN është plotësisht , i përhapur sipas kushteve , dhe është e disponueshme për shkarkim falas. Shembuj të përdorimit janë dhe në .
, , anëtar i , zhvillues Python/Go, specialist kryesor .
Burimi: habr.com
