PyDERASN: giunsa nako pagsulat ang usa ka librarya sa ASN.1 nga adunay mga slot ug blobs

ASN.1 kini usa ka sumbanan (ISO, ITU-T, GOST) alang sa usa ka pinulongan nga naghulagway sa structured nga impormasyon, ingon man mga lagda alang sa pag-encode niini nga impormasyon. Para nako, isip programmer, lain lang ni nga serialization ug data presentation format, kauban ang JSON, XML, XDR ug uban pa. Kini komon kaayo sa atong adlaw-adlaw nga kinabuhi, ug daghang mga tawo ang makasugat niini: sa cellular, telepono, VoIP komunikasyon (UMTS, LTE, WiMAX, SS7, H.323), sa network protocols (LDAP, SNMP, Kerberos), sa tanang butang nga mahitungod sa cryptography (X.509, CMS, PKCS nga mga sumbanan), sa mga bank card ug biometric nga mga pasaporte, ug sa daghang uban pang mga dapit.

Kini nga artikulo naghisgot sa PyDERASN: Python ASN.1 library nga aktibong gigamit sa mga proyekto nga may kalabutan sa cryptography sa Atlas.

PyDERASN: giunsa nako pagsulat ang usa ka librarya sa ASN.1 nga adunay mga slot ug blobs
Sa kinatibuk-an, ang ASN.1 dili girekomenda alang sa cryptographic nga mga buluhaton: ASN.1 ug ang mga codec niini komplikado. Kini nagpasabot nga ang code dili yano, ug kini kanunay nga usa ka dugang nga vector sa pag-atake. Igo na nga makita sa listahan mga kahuyangan sa mga librarya sa ASN.1. Bruce Schneier sa iyang Cryptography engineering gipugngan usab ang paggamit niini nga sumbanan tungod sa pagkakomplikado niini: "Ang labing nailhan nga TLV encoding mao ang ASN.1, apan kini hilabihan ka komplikado ug kami naglikay niini". Apan, sa walay palad, karon aduna kita publiko nga yawe nga mga imprastraktura nga aktibong gigamit X.509 nga mga sertipiko, CRL, OCSP, TSP, CMP nga mga protocol, CMC, mga mensahe CMS, ug daghang mga sumbanan PKCS. Busa, kinahanglan nga makahimo ka sa pagtrabaho sa ASN.1 kung adunay imong gibuhat nga may kalabutan sa cryptography.

Ang ASN.1 mahimong ma-encode sa lainlaing paagi/codec:

  • duman (Basic Encoding Rules)
  • cer (Canonical Encoding Rules)
  • DER (Gilain nga mga Lagda sa Pag-encode)
  • GSER (Generic String Encoding Rules)
  • JER (JSON Encoding Rules)
  • LWER (Light Weight Encoding Rules)
  • ANG ATON (Octet Encoding Rules)
  • PER (Packed Encoding Rules)
  • SER (Pagsenyas sa piho nga mga Lagda sa Encoding)
  • MGA DISIPULO (Mga Lagda sa Pag-encode sa XML)

ug uban pa. Apan sa mga buluhaton sa cryptographic, duha ang gigamit sa praktis: BER ug DER. Bisan sa gipirmahan nga XML nga mga dokumento (XMLDSig, XADES) mahimong Base64-encoded ASN.1 DER objects, sama sa JSON-oriented protocol acme gikan sa Let's Encrypt. Mas masabtan nimo kining tanan nga mga codec ug ang mga prinsipyo sa pag-encode sa BER / CER / DER sa mga artikulo ug libro: ASN.1 sa yano nga mga pulong, ASN.1 - Komunikasyon tali sa heterogeneous nga mga sistema ni Olivier Dubuisson, ASN.1 Kompleto ni Prof John Larmouth.

Ang BER kay binary byte-oriented (pananglitan, PER, popular sa cellular communication - bit-oriented) TLV format. Ang matag elemento gi-encode ingon: tag (Tag) pag-ila sa matang sa elemento nga gi-encode (integer, string, petsa, ug uban pa), gitas-on (Length) sa sulod ug sa sulod mismo (Value). Opsyonal nga gitugotan sa BER ang usa ka kantidad sa gitas-on nga matangtang pinaagi sa paghatag usa ka espesyal nga kantidad nga wala’y piho nga gitas-on ug tapuson ang mensahe sa Katapusan nga Oktet nga adunay label. Dugang sa gitas-on nga pag-encode, ang BER adunay daghang kabag-ohan sa paagi nga ang mga tipo sa datos gi-encode, sama sa:

  • Ang INTEGER, OBJECT IDENTIFIER, BIT STRING, ug ang gitas-on sa elemento mahimong ma-denormalize (dili gamay nga pag-encode);
  • Ang BOOLEAN tinuod alang sa bisan unsang dili null nga sulod;
  • Ang BIT STRING mahimong adunay "dugang" nga zero bits;
  • BIT STRING, OCTET STRING ug ang tanan nilang nakuha nga mga klase sa string, lakip ang petsa/oras, mahimong bahinon ngadto sa mga chunks (chunk) nga lainlaig gitas-on, ang gitas-on niini wala mahibaloi daan panahon sa (de)encoding;
  • UTCTime/GeneralizedTime mahimong adunay lain-laing mga paagi sa pagtakda sa time zone offset ug "dugang" zero fractions sa usa ka segundo;
  • Ang mga kantidad sa DEFAULT SEQUENCE mahimo o dili ma-encode;
  • Ang gihinganlan nga mga bili sa kataposang mga tipik sa BIT STRING mahimong opsyonal nga ibilin nga dili ma-encode;
  • SUNOD-SUNOD (OF)/SET (OF) mahimong adunay usa ka arbitraryong han-ay sa mga elemento.

Tungod sa tanan sa ibabaw, dili kanunay posible ang pag-encode sa datos aron kini parehas sa orihinal nga porma. Busa, usa ka subset sa mga lagda ang naimbento: DER - higpit nga nag-regulate sa usa lamang ka balido nga pamaagi sa pag-encode, nga hinungdanon alang sa mga buluhaton sa cryptographic, diin, pananglitan, ang pagbag-o sa usa ka gamay nga dili balido ang pirma o checksum. Ang DER adunay usa ka hinungdanon nga disbentaha: ang mga gitas-on sa tanan nga mga elemento kinahanglan mahibal-an daan sa oras sa pag-encode, nga wala magtugot sa stream serialization sa data. Ang CER codec gawasnon gikan sa kini nga kakulangan, parehas nga naggarantiya sa usa ka dili klaro nga representasyon sa datos. Ikasubo (o maayo na lang nga wala kami labi ka labi ka sopistikado nga mga decoder?), wala kini nahimong popular. Busa, sa praktis makasugat mi og "mixed" nga paggamit sa BER ug DER nga naka-encode nga datos. Tungod kay ang CER ug DER usa ka subset sa BER, ang bisan unsang BER decoder mahimong magproseso niini.

Mga problema sa pyasn1

Sa trabaho, nagsulat kami og daghang mga programa sa Python nga may kalabutan sa cryptography. Ug pipila ka tuig ang milabay halos wala'y kapilian nga libre nga mga librarya: bisan kini mga ubos kaayo nga lebel nga mga librarya nga nagtugot kanimo sa yano nga pag-encode / pag-decode, pananglitan, usa ka integer ug usa ka header sa istruktura, o kini usa ka librarya. pyasn1. Nagpuyo kami niini sulod sa pipila ka mga tuig ug sa sinugdanan nalipay kaayo, tungod kay kini nagtugot kanimo sa pagtrabaho uban sa ASN.1 nga mga istruktura sama sa taas nga lebel nga mga butang: pananglitan, ang usa ka decoded X.509 certificate object nagtugot kanimo sa pag-access sa mga field niini pinaagi sa usa ka interface sa diksyonaryo: cert["tbsCertificate"] ["serialNumber"] magpakita kanamo sa serial number niini nga sertipiko. Sa susama, mahimo nimong "makolekta" ang mga komplikado nga butang pinaagi sa pagtrabaho uban kanila sama sa mga lista, mga diksyonaryo, ug dayon tawagan ang function nga pyasn1.codec.der.encoder.encode ug makakuha usa ka serialized nga representasyon sa dokumento.

Bisan pa, gipadayag ang mga kakulangan, problema ug limitasyon. Adunay ug, sa walay palad, nagpabilin nga mga sayup sa pyasn1: sa panahon sa pagsulat, sa pyasn1 usa sa mga sukaranan nga tipo mao ang GeneralizedTime, dili husto gi-decode ug gi-encode.

Sa among mga proyekto, aron makadaginot og wanang, kanunay namong gitipigan ang file path, offset, ug byte nga gitas-on sa butang nga gusto namong i-refer. Pananglitan, ang usa ka arbitraryong pinirmahan nga payl lagmit mahimutang sa usa ka CMS SignedData ASN.1 nga istruktura:

  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

ug makuha nato ang orihinal nga pinirmahan nga file sa offset nga 65 bytes, gitas-on nga 751 bytes. Ang pyasn1 wala magtipig niini nga impormasyon sa mga decoded nga mga butang niini. Ang gitawag nga TLVSeeker gisulat - usa ka gamay nga librarya nga nagtugot kanimo sa pag-decode sa mga tag ug mga gitas-on sa mga butang, sa interface nga among gimandoan nga "adto sa sunod nga tag", "adto sa sulod sa tag" (sulod sa SEQUENCE sa butang), "adto sa sunod nga tag", "isulti ang imong offset ug ang gitas-on sa butang kung asa kami." Kini usa ka "manual" nga pag-agi sa ASN.1 DER-serialized data. Apan imposible nga magtrabaho uban ang BER-serialized nga datos niining paagiha, tungod kay, pananglitan, ang byte string nga OCTET STRING mahimong ma-encode isip daghang mga tipak.

Ang laing disbentaha alang sa among pyasn1 nga mga buluhaton mao ang kawalay katakus sa pagsabut gikan sa mga decoded nga mga butang kung ang gihatag nga field anaa sa SEQUENCE o wala. Pananglitan, kung ang istruktura naglangkob sa Field SEQUENCE OF Smth OPTIONAL nga field, nan kini mahimong hingpit nga wala sa umaabot nga data (OPTIONAL), o kini mahimong anaa, apan sa samang higayon adunay zero nga gitas-on (usa ka walay sulod nga listahan). Sa kinatibuk-an nga kaso, dili kini mahibal-an. Ug kini gikinahanglan alang sa usa ka higpit nga pagsusi sa kabalido sa umaabot nga datos. Hunahunaa nga ang pipila ka awtoridad sa sertipikasyon mag-isyu og sertipiko nga adunay "dili kaayo" balido nga datos gikan sa punto sa panglantaw sa ASN.1 schemas! Pananglitan, ang sentro sa sertipikasyon nga "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı" sa iyang root certificate milapas sa gitugot. RFC 5280 mga utlanan sa gitas-on sa sangkap sa hilisgutan - dili kini matinud-anon nga ma-decode sumala sa laraw. Ang DER codec nanginahanglan nga ang usa ka uma kansang kantidad katumbas sa DEFAULT dili ma-encode sa panahon sa transmission - ang ingon nga mga dokumento makit-an sa kinabuhi, ug ang una nga bersyon sa PyDERASN bisan sa tinuyo nga gitugotan ang ingon nga dili balido (gikan sa punto sa panglantaw sa DER) nga pamatasan alang sa kaayohan. sa atrasado nga pagkaangay.

Ang laing limitasyon mao ang kawalay katakus nga dali nga mahibal-an kung unsang porma (BER / DER) kini o kana nga butang sa istruktura nga gi-encode. Pananglitan, ang CMS standard nag-ingon nga ang mensahe kay BER-encoded, apan ang gipirmahan nga Attrs field, diin ang cryptographic signature naporma, kinahanglang anaa sa DER. Kung kita mag-decode sa DER, unya mahulog kita sa pagproseso sa CMS mismo, kung mag-decode gamit ang BER, nan dili naton mahibal-an kung unsang porma ang gipirmahan ngaAttrs. Ingon usa ka sangputanan, ang TLVSeeker (kansang analogue wala sa pyasn1) kinahanglan nga pangitaon ang lokasyon sa matag usa sa mga napirmahan nga Attrs nga mga uma, ug gilain ang pag-decode niini, gikuha kini gikan sa serialized nga representasyon, kauban ang DER.

Ang abilidad sa awtomatik nga pagproseso sa DEFINED BY fields, nga komon kaayo, giabiabi kaayo kanamo. Human sa pag-decode sa usa ka ASN.1 nga estraktura, mahimo kitang ibilin sa usa ka set sa BISAN UNSA nga mga natad nga kinahanglan nga maproseso pa sumala sa laraw nga gipili base sa OBJECT IDENTIFIER nga gitakda sa natad sa istruktura. Sa Python code, kini nagpasabut sa pagsulat kung ug dayon pagtawag sa decoder alang sa ANY field.

Ang pagtunga sa PyDERASN

Sa Atlas, kanunay kaming magpadala sa mga patch sa ibabaw sa agos kung makakita kami og mga problema o mapaayo ang libre nga software nga among gigamit. Sa pyasn1, nagsumite kami og mga pag-uswag sa makadaghang higayon, apan ang pyasn1 code dili ang pinakasayon ​​nga sabton ug usahay adunay dili magkatugma nga mga pagbag-o sa API nga naigo sa among mga kamot. Dugang pa, naanad kami sa pagsulat sa mga pagsulay nga adunay generative testing, nga dili mao ang kaso sa pyasn1.

Usa ka maayong adlaw, nakahukom ko nga igo na ang pag-agwanta niini ug panahon na sa pagsulay sa pagsulat sa akong kaugalingon nga librarya nga adunay mga __slot__s, mga offset ug nindot nga gihubad nga mga blobs! Dili igo nga maghimo lang ug ASN.1 codec - kinahanglan namong ibalhin ang tanan namong mga proyekto nga nagsalig niini, ug kini mga gatusan ka libo nga linya sa code nga puno sa trabaho sa mga istruktura sa ASN.1. Kana mao, usa sa mga kinahanglanon alang niini: ang kasayon ​​sa paghubad sa kasamtangan nga pyasn1 code. Pagkahuman sa tanan nakong bakasyon, gisulat nako kini nga librarya, gibalhin ang tanan nga mga proyekto niini. Tungod kay sila adunay hapit 100% nga sakup pinaagi sa mga pagsulay, kini nagpasabut nga ang librarya hingpit nga magamit.

Ang PyDERASN, parehas, adunay hapit 100% nga sakup sa pagsulay. Naggamit sa generative testing nga adunay nindot nga library pangagpas. Gipahigayon usab ug naglibog py-afl-kaon sa 32 nukleyar nga mga makina. Bisan pa sa kamatuoran nga kami halos wala nay Python2 code nga nahabilin, ang PyDERASN nagtan-aw gihapon sa pagkaangay niini ug tungod niini adunay bugtong unom ka pagkaadik. Usab, kini gisulayan batok ASN.1:2008 compliance test suite.

Ang prinsipyo sa pagtrabaho niini susama sa pyasn1 - nagtrabaho uban sa taas nga lebel nga mga butang sa Python. Ang paghulagway sa ASN.1 schemas susama.

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

Bisan pa, ang PyDERASN adunay usa ka pagkasama sa kusog nga pag-type. Sa pyasn1, kung ang usa ka natad sa tipo nga CMSVersion(INTEGER), nan kini mahimong itudlo int o INTEGER. Ang PyDERASN estrikto nga nagkinahanglan nga ang gi-assign nga butang kay eksakto nga CMSVersion. Dugang sa pagsulat sa Python3 code, gigamit usab namo pag-type sa mga anotasyon, mao nga ang atong mga gimbuhaton walay dili klaro nga mga argumento sama sa def func(serial, contents), apan def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), ug PyDERASN makatabang sa pag-obserbar sa maong code.

Sa parehas nga oras, ang PyDERASN adunay labi ka dali nga pagpatuyang alang sa kini nga pag-type. Ang pyasn1 wala motugot sa SubjectKeyIdentifier() .subtype(implicitTag=Tag(...)) field nga mag-assign ug butang sa SubjectKeyIdentifier() (nga walay gikinahanglan nga IMPLICIT TAG) ug kasagaran kinahanglang kopyahon ug mugnaon pag-usab ang mga butang tungod lang sa nausab nga IMPLICIT/ HAPIT nga mga tag. Ang PyDERASN higpit nga nag-obserbar lamang sa base nga tipo - kini awtomatik nga mopuli sa mga tag gikan sa anaa na nga ASN.1 schema sa istruktura. Gipasimple kaayo niini ang code sa aplikasyon.

Kung adunay usa ka sayup nga mahitabo sa panahon sa pag-decode, dili sayon ​​​​alang sa pyasn1 nga masabtan kung diin kini nahitabo. Pananglitan, sa Turkish certificate nga nahisgotan na sa ibabaw, atong makuha ang mosunod nga sayop: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (sa 138) unsatisfied bounds: 1 ⇐ 77 ⇐ 64 Sa pagsulat sa mga istruktura sa ASN .1 ang mga tawo mahimong masayop ug makatabang kini nga mas dali nga ma-debug ang mga aplikasyon o mahibal-an ang mga problema sa mga naka-code nga dokumento sa pikas nga bahin.

Ang unang bersyon sa PyDERASN wala mosuporta sa BER encoding. Nagpakita kini sa ulahi ug wala gihapon nagsuporta sa pagproseso sa UTCTime / GeneralizedTime nga adunay mga time zone. Moabut kini sa umaabot, tungod kay ang proyekto gisulat labi na sa ilang libre nga oras.

Usab sa unang bersyon walay trabaho uban sa DEFINED BY fields. Pipila ka bulan ang milabay niini niabot ang kahigayonan ug nagsugod nga aktibo nga gigamit, kamahinungdanon nga pagkunhod sa aplikasyon code - sa usa ka decoding nga operasyon, kini mao ang posible nga sa pagkuha sa tibuok nga gambalay disassembled sa kaayo nga giladmon. Aron mahimo kini, sa schema, diin ang mga natad "gihubit" kung unsa ang gitakda. Pananglitan, usa ka paghulagway sa CMS schema:

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

nag-ingon nga kung ang contentType adunay usa ka OID nga adunay kantidad nga id_signedData, nan ang sulud sa sulud (naa sa parehas nga SEQUENCE) kinahanglan nga ma-decode sumala sa laraw sa SignedData. Nganong daghang bracket? Ang usa ka uma mahimong "maghubit" sa daghang mga natad sa parehas nga oras, sama sa kaso sa mga istruktura sa EnvelopedData. Ang gipiho nga mga natad giila sa gitawag nga decode path - kini nagtino sa eksaktong lokasyon sa bisan unsang elemento sa tanan nga mga istruktura.

Dili kanunay nga gusto o dili kanunay posible nga idugang dayon kini nga mga kahulugan sa laraw. Mahimong adunay mga kaso nga piho sa aplikasyon diin ang mga OID ug istruktura nahibal-an lamang sa usa ka proyekto sa ikatulo nga partido. Ang PyDERASN naghatag ug katakus sa pagtakda niini nga mga depinisyon sa panahon sa pag-decode sa istruktura:

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

Dinhi among giingon nga sa CMS SignedData alang sa tanan nga gilakip nga mga sertipiko, pag-decode sa tanan nilang mga extension (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool, ug uban pa). Gipakita namon pinaagi sa agianan sa pag-decode kung unsang elemento ang kinahanglan "ilisan" sa mga define, ingon nga kini gibutang sa schema.

Sa katapusan, ang PyDERASN adunay abilidad sa pagtrabaho gikan sa linya sa pagsugo alang sa decoding ASN.1 files ug adunay usa ka dato nindot nga pag-imprinta. Mahimo nimong i-decode ang usa ka arbitraryong ASN.1, o mahimo nimong itakda ang usa ka maayo nga gipasabut nga laraw ug makita ang usa ka butang nga sama niini:

PyDERASN: giunsa nako pagsulat ang usa ka librarya sa ASN.1 nga adunay mga slot ug blobs

Gipakita nga impormasyon: butang offset, tag gitas-on, gitas-on gitas-on, sulod gitas-on, presensya sa EOC (katapusan-sa-octets), BER encoding bandila, walay tino-gitas-on encoding bandila, EXPLICIT tag gitas-on ug offset (kon sa bisan unsa), butang nesting giladmon sa mga istruktura, IMPLICIT/EXPLICIT tag value, schema name sa object, base niini nga ASN.1 type, ordinal sulod sa SEQUENCE/SET OF, CHOICE value (kung aduna man), human-readable schema name INTEGER/ENUMERATED/BIT STRING, value sa bisan unsang base type , DEFAULT/OPTIONAL nga bandera gikan sa scheme, usa ka timaan nga ang butang awtomatik nga gi-decode ingon DEFINED BY ug tungod diin OID kini nahitabo, usa ka mabasa sa tawo nga OID.

Ang nindot nga sistema sa pag-imprenta espesyal nga gihimo sa paagi nga kini makamugna og han-ay sa PP nga mga butang nga gihubad na sa lain nga paagi. Ang screenshot nagpakita sa tighubad sa yano nga kolor nga teksto. Adunay usab mga tighubad sa JSON/HTML format aron kini makita uban sa pag-highlight sa ASN.1 browser sama sa asn1js proyekto.

Ang ubang mga librarya

Dili kini ang tumong, apan ang PyDERASN nahimong mahinungdanon mas paspas kay sa pyasn1. Pananglitan, ang pag-decode sa mga file sa CRL sa megabyte nga mga gidak-on mahimong dugay nga kinahanglan nimong hunahunaon ang bahin sa mga intermediate nga mga format sa pagtipig sa datos (paspas) ug usbon ang arkitektura sa mga aplikasyon. Ang pyasn1 nag-decode sa CRL CACert.org sa akong laptop sulod sa kapin sa 20 minutos, samtang ang PyDERASN nagkinahanglan lang ug 28 segundos! Adunay usa ka proyekto asn1crypto, nga gitumong sa paspas nga pagtrabaho sa mga istruktura sa cryptographic: kini nag-decode (bug-os, dili tapolan) sa parehas nga CRL sa 29 segundos, apan nagkonsumo hapit doble sa daghang RAM kung nagdagan sa ilawom sa Python3 (983 MiB kumpara sa 498), ug sa 3.5 ka beses sa ilawom sa Python2 (1677). vs 488), samtang ang pyasn1 mokonsumo ug 4.3 ka pilo nga mas daghan (2093 vs 488).

asn1crypto, nga akong gihisgutan, wala namo tagda, tungod kay ang proyekto anaa pa sa iyang pagkamasuso, ug wala kami makadungog mahitungod niini. Karon dili usab sila motan-aw sa iyang direksyon, tungod kay nahibal-an dayon nako nga ang parehas nga GeneralizedTime wala magkuha usa ka arbitraryong porma, ug sa panahon sa serialization kini hilom nga nagtangtang sa usa ka bahin sa usa ka segundo. Madawat kini alang sa pagtrabaho sa mga sertipiko sa X.509, apan sa kinatibuk-an dili kini molihok.

Sa pagkakaron, ang PyDERASN mao ang pinaka estrikto nga libre nga Python/Go DER decoder nga akong nailhan. Sa encoding/asn1 library sa akong paboritong Go walay higpit nga pagsusi OBJECT IDENTIFIER ug UTCTime/GeneralizedTime strings. Usahay ang pagka-estrikto mahimong makabalda (panguna tungod sa atrasado nga pagpahiuyon sa mga daan nga aplikasyon nga wala’y ayohon), mao nga sa PyDERASN sa panahon sa pag-decode, mahimo nimong ipasa lainlaing mga setting nagpahuyang nga mga tseke.

Ang code sa proyekto naningkamot nga mahimong yano kutob sa mahimo. Ang tibuok librarya kay usa ka file. Ang kodigo gisulat uban sa paghatag gibug-aton sa kasayon ​​sa pagsabot, nga walay wala kinahanglana nga performance optimizations ug DRY code. Dili, sama sa ako nang giingon, nagsuporta sa bug-os nga pag-decode sa BER sa mga string sa UTCTime / GeneralizedTime, ingon man ang TINUOD, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING nga tipo sa datos. Sa tanan nga uban nga mga kaso, ako personal nga wala’y nakita nga hinungdan sa paggamit sa ubang mga librarya sa Python.

Sama sa tanan nakong mga proyekto, sama sa PyGOST, GoGOST, NCCP, GoVPN, PyDERASN kay bug-os libre nga softwaregiapod-apod ubos sa mga termino LGPLv3+, ug magamit alang sa libre nga pag-download. Adunay mga pananglitan sa paggamit dinhi ug sa Mga pagsulay sa PyGOST.

Sergey Matveev, cypherpunk, membro SPO Foundation, Python/Go-developer, punoan nga espesyalista Federal State Unitary Enterprise "STC "Atlas".

Source: www.habr.com

Idugang sa usa ka comment