பைடெராஸ்ன்: ஸ்லாட்டுகள் மற்றும் குமிழ்கள் கொண்ட ASN.1 நூலகத்தை நான் எப்படி எழுதினேன்

ASN.1 இது கட்டமைக்கப்பட்ட தகவலை விவரிக்கும் மொழியின் தரநிலை (ISO, ITU-T, GOST), அத்துடன் இந்தத் தகவலை குறியாக்கம் செய்வதற்கான விதிகள். என்னைப் பொறுத்தவரை, ஒரு புரோகிராமராக, இது JSON, XML, XDR மற்றும் பிறவற்றுடன் தரவை வரிசைப்படுத்துவதற்கும் வழங்குவதற்கும் மற்றொரு வடிவமாகும். இது நம் அன்றாட வாழ்வில் மிகவும் பொதுவானது, மேலும் பலர் இதை எதிர்கொள்கிறார்கள்: செல்லுலார், தொலைபேசி, VoIP தகவல்தொடர்புகளில் (UMTS, LTE, WiMAX, SS7, H.323), நெட்வொர்க் நெறிமுறைகளில் (LDAP, SNMP, Kerberos), எல்லாவற்றிலும் கிரிப்டோகிராஃபி (X.509, CMS, PKCS தரநிலைகள்), வங்கி அட்டைகள் மற்றும் பயோமெட்ரிக் கடவுச்சீட்டுகள் மற்றும் பலவற்றைப் பற்றியது.

இந்த கட்டுரை கையாள்கிறது பைடெராஸ்ன்: பைதான் ASN.1 நூலகம் குறியாக்கவியல் தொடர்பான திட்டங்களில் தீவிரமாகப் பயன்படுத்தப்படுகிறது அட்லஸ்.

பைடெராஸ்ன்: ஸ்லாட்டுகள் மற்றும் குமிழ்கள் கொண்ட ASN.1 நூலகத்தை நான் எப்படி எழுதினேன்
பொதுவாக, கிரிப்டோகிராஃபிக் பணிகளுக்கு ASN.1 பரிந்துரைப்பது மதிப்புக்குரியது அல்ல: ASN.1 மற்றும் அதன் கோடெக்குகள் சிக்கலானவை. இதன் பொருள் குறியீடு எளிமையாக இருக்காது, மேலும் இது எப்போதும் கூடுதல் தாக்குதல் திசையன் ஆகும். சும்மா பார் பட்டியலில் ASN.1 நூலகங்களில் உள்ள பாதிப்புகள். புரூஸ் ஷ்னியர் அவரது குறியாக்கவியல் பொறியியல் இந்த தரநிலையை அதன் சிக்கலான தன்மையின் காரணமாக பயன்படுத்துவதற்கு எதிராகவும் அறிவுறுத்துகிறது: "நன்கு அறியப்பட்ட TLV குறியாக்கம் ASN.1 ஆகும், ஆனால் இது நம்பமுடியாத அளவிற்கு சிக்கலானது மற்றும் நாங்கள் அதிலிருந்து வெட்கப்படுகிறோம்." ஆனால், துரதிர்ஷ்டவசமாக, இன்று நம்மிடம் உள்ளது பொது விசை உள்கட்டமைப்பு அதில் அவை தீவிரமாக பயன்படுத்தப்படுகின்றன X.509 சான்றிதழ்கள், CRL, OCSP, TSP, CMP நெறிமுறைகள், சி.எம்.சி., செய்திகள் சி.எம்.எஸ், மற்றும் நிறைய தரநிலைகள் பி.கே.சி.எஸ். எனவே, நீங்கள் கிரிப்டோகிராஃபி தொடர்பான எதையும் செய்தால் ASN.1 உடன் வேலை செய்ய முடியும்.

ASN.1 பல்வேறு வழிகளில்/கோடெக்குகளில் குறியாக்கம் செய்யப்படலாம்:

  • BER (அடிப்படை குறியாக்க விதிகள்)
  • சிஈஆரின் (நியாய குறியீட்டு விதிகள்)
  • DER (சிறப்பான குறியாக்க விதிகள்)
  • GSER (பொதுவான சரம் குறியாக்க விதிகள்)
  • JER (JSON குறியாக்க விதிகள்)
  • LWER (இலகு எடை குறியீட்டு விதிகள்)
  • REO (ஆக்டெட் குறியாக்க விதிகள்)
  • தலா (பேக் செய்யப்பட்ட என்கோடிங் விதிகள்)
  • SER (குறிப்பிட்ட குறியாக்க விதிகளை சமிக்ஞை செய்தல்)
  • சீடர்கள் (எக்ஸ்எம்எல் குறியாக்க விதிகள்)

மற்றும் பலர். ஆனால் கிரிப்டோகிராஃபிக் பணிகளில், நடைமுறையில், இரண்டு பயன்படுத்தப்படுகின்றன: BER மற்றும் DER. கையொப்பமிடப்பட்ட XML ஆவணங்களில் கூட (XMLDSig, XAdES) JSON-சார்ந்த நெறிமுறையைப் போலவே Base64-குறியீடு செய்யப்பட்ட ASN.1 DER பொருள்கள் இன்னும் இருக்கும். ஆக்மி லெட்ஸ் என்க்ரிப்ட் என்பதிலிருந்து. கட்டுரைகள் மற்றும் புத்தகங்களில் இந்த கோடெக்குகள் மற்றும் BER/CER/DER குறியீட்டு கொள்கைகளை நீங்கள் நன்கு புரிந்து கொள்ள முடியும்: எளிய வார்த்தைகளில் ASN.1, ASN.1 — ஒலிவியர் டுபிஸன் மூலம் பன்முக அமைப்புகளுக்கு இடையேயான தொடர்பு, ASN.1 பேராசிரியர் ஜான் லார்மௌத் மூலம் முடிக்கப்பட்டது.

BER என்பது பைனரி பைட் சார்ந்த (உதாரணமாக PER, செல்லுலார் தகவல்தொடர்புகளில் பிரபலமானது - பிட் சார்ந்த) TLV வடிவம். ஒவ்வொரு உறுப்பும் இவ்வாறு குறியாக்கம் செய்யப்பட்டுள்ளது: குறிச்சொல் (Tag), குறியாக்கம் செய்யப்பட வேண்டிய உறுப்பு வகையைக் கண்டறிதல் (முழு எண், சரம், தேதி, முதலியன), நீளம் (Lநீளம்) உள்ளடக்கம் மற்றும் உள்ளடக்கம் (Vஅலு). ஒரு சிறப்பு காலவரையற்ற நீள மதிப்பை அமைத்து, எண்ட்-ஆஃப்-ஆக்டெட்ஸ் செய்தியை எண்ட்-ஆஃப்-ஆக்டெட்ஸ் குறியுடன் முடிப்பதன் மூலம் நீள மதிப்பைக் குறிப்பிடாமல் இருக்க BER விருப்பமாக உங்களை அனுமதிக்கிறது. நீள குறியாக்கத்தைத் தவிர, BER தரவு வகைகளை குறியாக்கம் செய்யும் விதத்தில் நிறைய மாறுபாடுகளைக் கொண்டுள்ளது, அவை:

  • INTEGER, OBJECT IDENTIFIER, BIT STRING மற்றும் உறுப்பு நீளம் ஆகியவை இயல்பாக்கப்படாமல் இருக்கலாம் (குறைந்தபட்ச வடிவத்தில் குறியாக்கம் செய்யப்படவில்லை);
  • பூலியன் பூஜ்யம் அல்லாத எந்த உள்ளடக்கத்திற்கும் உண்மை;
  • BIT STRING இல் "கூடுதல்" பூஜ்ஜிய பிட்கள் இருக்கலாம்;
  • BIT STRING, OCTET STRING மற்றும் தேதி/நேரம் உட்பட அவற்றிலிருந்து பெறப்பட்ட அனைத்து சரம் வகைகளையும் மாறி-நீளத் துண்டுகளாகப் பிரிக்கலாம், இதன் நீளம் (டி) குறியாக்கத்தின் போது முன்கூட்டியே தெரியாது;
  • UTCTime/GeneralizedTime ஆனது நேர மண்டல ஆஃப்செட் மற்றும் "கூடுதல்" வினாடிகளின் பூஜ்ஜிய பின்னங்களைக் குறிப்பிடும் வெவ்வேறு வழிகளைக் கொண்டிருக்கலாம்;
  • இயல்புநிலை வரிசை மதிப்புகள் குறியாக்கம் செய்யப்படலாம் அல்லது இல்லாமல் இருக்கலாம்;
  • BIT STRING இல் உள்ள கடைசி பிட்களின் பெயரிடப்பட்ட மதிப்புகள் விருப்பமாக குறியிடப்படாமல் இருக்கலாம்;
  • வரிசை (OF)/SET (OF) உறுப்புகளின் எந்த வரிசையையும் கொண்டிருக்கலாம்.

மேலே உள்ள எல்லாவற்றின் காரணமாக, அசல் வடிவத்திற்கு ஒரே மாதிரியான தரவுகளை குறியாக்கம் செய்வது எப்போதும் சாத்தியமில்லை. எனவே, விதிகளின் துணைக்குழு கண்டுபிடிக்கப்பட்டது: DER - ஒரே ஒரு செல்லுபடியாகும் குறியாக்க முறையை மட்டுமே கண்டிப்பாக ஒழுங்குபடுத்துகிறது, இது குறியாக்கப் பணிகளுக்கு முக்கியமானது, உதாரணமாக, ஒரு பிட்டை மாற்றுவது கையொப்பம் அல்லது செக்சம் செல்லாது. DER க்கு ஒரு குறிப்பிடத்தக்க குறைபாடு உள்ளது: அனைத்து உறுப்புகளின் நீளமும் குறியாக்க நேரத்தில் முன்கூட்டியே அறியப்பட வேண்டும், இது தரவை ஸ்ட்ரீம் வரிசைப்படுத்தலை அனுமதிக்காது. CER கோடெக்கிற்கு இந்தக் குறைபாடு இல்லை, அதேபோன்று தரவின் தெளிவற்ற பிரதிநிதித்துவத்திற்கு உத்தரவாதம் அளிக்கிறது. துரதிர்ஷ்டவசமாக (அல்லது இன்னும் சிக்கலான டிகோடர்கள் எங்களிடம் இல்லை என்பது அதிர்ஷ்டமா?), இது பிரபலமடையவில்லை. எனவே, நடைமுறையில் நாம் BER மற்றும் DER குறியிடப்பட்ட தரவின் "கலப்பு" பயன்பாட்டை எதிர்கொள்கிறோம். CER மற்றும் DER இரண்டும் BER இன் துணைக்குழு என்பதால், எந்த BER குறிவிலக்கியும் அவற்றைக் கையாள முடியும்.

pyasn1 இல் உள்ள சிக்கல்கள்

வேலையில் நாங்கள் கிரிப்டோகிராஃபி தொடர்பான நிறைய பைதான் புரோகிராம்களை எழுதுகிறோம். சில ஆண்டுகளுக்கு முன்பு நடைமுறையில் இலவச நூலகங்கள் எதுவும் இல்லை: இவை மிகக் குறைந்த அளவிலான நூலகங்களாகும், அவை உங்களை வெறுமனே குறியாக்கம்/டிகோட் செய்ய அனுமதிக்கின்றன, எடுத்துக்காட்டாக, ஒரு முழு எண் மற்றும் கட்டமைப்பு தலைப்பு அல்லது இந்த நூலகம் pyasn1. நாங்கள் பல ஆண்டுகளாக அதில் வாழ்ந்தோம், முதலில் நாங்கள் மிகவும் மகிழ்ச்சியடைந்தோம், ஏனெனில் இது ASN.1 கட்டமைப்புகளுடன் உயர்-நிலைப் பொருள்களுடன் வேலை செய்ய உங்களை அனுமதிக்கிறது: எடுத்துக்காட்டாக, டிகோட் செய்யப்பட்ட X.509 சான்றிதழ் பொருள் அதன் புலங்களை அணுக உங்களை அனுமதிக்கிறது. அகராதி இடைமுகம்: cert[“tbsCertificate”] ["serialNumber"] இந்தச் சான்றிதழின் வரிசை எண்ணைக் காண்பிக்கும். இதேபோல், சிக்கலான பொருட்களைப் பட்டியல்கள், அகராதிகளாகப் பணிபுரிவதன் மூலம் அவற்றை "அசெம்பிள்" செய்யலாம், பின்னர் pyasn1.codec.der.encoder.encode செயல்பாட்டை அழைத்து ஆவணத்தின் வரிசைப்படுத்தப்பட்ட பிரதிநிதித்துவத்தைப் பெறலாம்.

இருப்பினும், குறைபாடுகள், சிக்கல்கள் மற்றும் வரம்புகள் வெளிப்படுத்தப்பட்டன. துரதிர்ஷ்டவசமாக, pyasn1 இல் பிழைகள் இருந்தன மற்றும் இன்னும் உள்ளன: எழுதும் நேரத்தில், pyasn1 இல் உள்ள அடிப்படை வகைகளில் ஒன்று GeneralizedTime, தவறானது டிகோட் செய்யப்பட்டு குறியிடப்பட்டது.

எங்கள் திட்டங்களில், இடத்தைச் சேமிக்க, நாம் அடிக்கடி குறிப்பிட விரும்பும் பொருளின் பைட்டுகளில் கோப்பு பாதை, ஆஃப்செட் மற்றும் நீளம் ஆகியவற்றை மட்டுமே சேமிப்போம். எடுத்துக்காட்டாக, தன்னிச்சையான கையொப்பமிடப்பட்ட கோப்பு பெரும்பாலும் 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

                 ТУТ СОДЕРЖИМОЕ ПОДПИСЫВАЕМОГО ФАЙЛА РАЗМЕРОМ 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

மற்றும் அசல் கையொப்பமிடப்பட்ட கோப்பை ஆஃப்செட் 65 பைட்டுகள், 751 பைட்டுகள் நீளத்தில் பெறலாம். pyasn1 இந்த தகவலை அதன் டிகோட் செய்யப்பட்ட பொருட்களில் சேமிக்காது. TLVSeeker என்று அழைக்கப்படுவது எழுதப்பட்டது - குறிச்சொற்கள் மற்றும் பொருளின் நீளத்தை டிகோட் செய்ய உங்களை அனுமதிக்கும் ஒரு சிறிய நூலகம், அதன் இடைமுகத்தில் "அடுத்த குறிச்சொல்லுக்குச் செல்லுங்கள்", "குறிச்சொல்லின் உள்ளே செல்லுங்கள்" (SEQUENCE பொருளின் உள்ளே செல்லுங்கள்) "அடுத்த குறிச்சொல்லுக்குச் செல்லவும்", "உங்கள் ஆஃப்செட் மற்றும் நாங்கள் இருக்கும் பொருளின் நீளத்தைக் கூறுங்கள்." இது ASN.1 DER-வரிசைப்படுத்தப்பட்ட தரவு மூலம் "கையேடு" நடை. ஆனால் BER-வரிசைப்படுத்தப்பட்ட தரவுகளுடன் இந்த வழியில் வேலை செய்ய இயலாது, எடுத்துக்காட்டாக, OCTET STRING பைட் சரத்தை பல துகள்களின் வடிவத்தில் குறியாக்கம் செய்யலாம்.

எங்கள் pyasn1 பணிகளுக்கான மற்றொரு குறைபாடு என்னவென்றால், கொடுக்கப்பட்ட புலம் SEQUENCE இல் உள்ளதா இல்லையா என்பதை டிகோட் செய்யப்பட்ட பொருட்களிலிருந்து புரிந்து கொள்ள இயலாமை. எடுத்துக்காட்டாக, கட்டமைப்பில் Smth விருப்பப் புலத்தின் புல வரிசை இருந்தால், அது உள்வரும் தரவிலிருந்து முற்றிலும் இல்லாமல் இருக்கலாம் (விரும்பினால்), அல்லது அது இருக்கக்கூடும், ஆனால் பூஜ்ஜிய நீளம் (காலியான பட்டியல்). பொதுவாக, இதை தீர்மானிக்க முடியவில்லை. பெறப்பட்ட தரவின் செல்லுபடியை கண்டிப்பாக சரிபார்க்க இது அவசியம். ASN.1 திட்டங்களின் பார்வையில் "முழுமையாக இல்லாத" தரவுகளுடன் சில சான்றிதழ் ஆணையம் ஒரு சான்றிதழை வழங்கும் என்று கற்பனை செய்து பாருங்கள்! எடுத்துக்காட்டாக, “TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı” சான்றிதழ் அதிகாரம் அதன் ரூட் சான்றிதழில் அனுமதிக்கப்பட்ட வரம்புகளை மீறியது. RFC 5280 பொருள் கூறுகளின் நீளத்தின் வரம்புகள் - திட்டத்தின் படி நேர்மையாக டிகோட் செய்ய முடியாது. DER கோடெக்கிற்கு DEFAULT க்கு சமமான மதிப்பு பரிமாற்றத்தின் போது குறியாக்கம் செய்யப்படாமல் இருக்க வேண்டும் - இதுபோன்ற ஆவணங்கள் வாழ்க்கையில் நிகழும், மேலும் PyDERASN இன் முதல் பதிப்பு வேண்டுமென்றே அத்தகைய தவறான (DER பார்வையில்) நடத்தையை அனுமதித்தது. பின்னோக்கிய பொருத்தம்.

மற்றொரு வரம்பு என்னவென்றால், ஒரு குறிப்பிட்ட பொருள் எந்த வடிவத்தில் (BER/DER) கட்டமைப்பில் குறியிடப்பட்டது என்பதை எளிதாகக் கண்டறிய இயலாமை. எடுத்துக்காட்டாக, CMS தரநிலை செய்தி BER-குறியீடு செய்யப்பட்டுள்ளது என்று கூறுகிறது, ஆனால் கிரிப்டோகிராஃபிக் கையொப்பம் உருவாக்கப்படும் SignedAttrs புலம் DER இல் இருக்க வேண்டும். நாம் DER மூலம் டீகோட் செய்தால், CMS இன் செயலாக்கத்திலேயே தோல்வியடைவோம்; BER மூலம் டீகோட் செய்தால், கையொப்பமிடப்பட்டAttrs எந்த வடிவத்தில் இருந்தது என்பது எங்களுக்குத் தெரியாது. இதன் விளைவாக, TLVSeeker (இது pyasn1 இல் அனலாக் இல்லை) கையொப்பமிடப்பட்டAttrs புலங்கள் ஒவ்வொன்றின் இருப்பிடத்தையும் தேட வேண்டும், மேலும் தனித்தனியாக, வரிசைப்படுத்தப்பட்ட பிரதிநிதித்துவத்திலிருந்து அதை எடுத்து, DER உடன் டிகோட் செய்யவும்.

அடிக்கடி நிகழும் புலங்களால் வரையறுக்கப்பட்டவற்றை தானாகவே செயலாக்கும் திறன் எங்களுக்கு மிகவும் விரும்பத்தக்கதாக இருந்தது. ASN.1 கட்டமைப்பை டிகோடிங் செய்த பிறகு, கட்டமைப்பு புலத்தில் குறிப்பிடப்பட்டுள்ள பொருள் அடையாளங்காட்டியின் அடிப்படையில் தேர்ந்தெடுக்கப்பட்ட திட்டத்தின் படி மேலும் செயலாக்கப்பட வேண்டிய பல புலங்கள் எங்களிடம் இருக்கக்கூடும். பைதான் குறியீட்டில், இதன் பொருள் என்றால் எழுதுவது மற்றும் எந்த புலத்திற்கும் குறிவிலக்கியை அழைப்பது.

PyDERASN இன் தோற்றம்

அட்லஸில், சில சிக்கல்களைக் கண்டறியும் போது அல்லது நாங்கள் பயன்படுத்தும் இலவச நிரல்களை மேம்படுத்தும்போது பேட்ச்களை மேலே அனுப்புகிறோம். நாங்கள் பலமுறை pyasn1 க்கு மேம்பாடுகளைச் சமர்ப்பித்தோம், ஆனால் pyasn1 இன் குறியீடு புரிந்துகொள்ள எளிதானது அல்ல, சில சமயங்களில் இணக்கமற்ற API மாற்றங்கள் நம்மைத் தோற்கடிக்கும். கூடுதலாக, நாங்கள் ஜெனரேட்டிவ் டெஸ்டிங் மூலம் சோதனைகளை எழுதப் பழகிவிட்டோம், இது pyasn1 இல் இல்லை.

ஒரு நல்ல நாள், எனக்கு அது போதும் என்று முடிவு செய்தேன், __slot__s, ஆஃப்செட்கள் மற்றும் அழகாகக் காட்டப்பட்ட குமிழ்கள் ஆகியவற்றைக் கொண்டு எனது சொந்த நூலகத்தை எழுத முயற்சிக்க வேண்டிய நேரம் இது! ASN.1 கோடெக்கை உருவாக்கினால் மட்டும் போதாது - நமது சார்பு திட்டங்கள் அனைத்தையும் அதற்கு மாற்ற வேண்டும், மேலும் இவை ASN.1 கட்டமைப்புகளுடன் வேலை செய்யும் நூறாயிரக்கணக்கான கோடுகள். அதாவது, அதற்கான தேவைகளில் ஒன்று: தற்போதைய pyasn1 குறியீட்டின் மொழிபெயர்ப்பின் எளிமை. எனது அனைத்து விடுமுறையையும் கழித்த நான், இந்த நூலகத்தை எழுதி, எல்லா திட்டங்களையும் அதற்கு மாற்றினேன். சோதனைகளுடன் கிட்டத்தட்ட 100% கவரேஜ் இருப்பதால், நூலகம் முழுவதுமாக செயல்பட்டது.

PyDERASN, இதேபோல், கிட்டத்தட்ட 100% சோதனை கவரேஜ் உள்ளது. சிறந்த நூலகத்துடன் உருவாக்கும் சோதனையைப் பயன்படுத்துகிறது கருதுகோள். அதுவும் மேற்கொள்ளப்பட்டது குழப்பம் py-afl- நான் 32 அணு இயந்திரங்களில் சாப்பிடுகிறேன். எங்களிடம் நடைமுறையில் பைதான்2 குறியீடு எதுவும் இல்லை என்ற போதிலும், PyDERASN இன்னும் அதனுடன் பொருந்தக்கூடிய தன்மையைப் பராமரிக்கிறது மற்றும் இதன் காரணமாக மட்டுமே உள்ளது ஆறு போதை. மேலும், இது எதிராக சோதிக்கப்படுகிறது ASN.1:2008 இணக்க சோதனை தொகுப்பு.

அதனுடன் பணிபுரியும் கொள்கை pyasn1 ஐப் போன்றது - உயர்நிலை பைதான் பொருள்களுடன் பணிபுரிதல். ASN.1 திட்டங்களின் விளக்கம் ஒத்ததாகும்.

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

இருப்பினும், PyDERASN சில வலுவான தட்டச்சுகளின் ஒற்றுமையைக் கொண்டுள்ளது. pyasn1 இல், ஒரு புலம் CMSVersion(INTEGER) வகையாக இருந்தால், அது int அல்லது INTEGER என ஒதுக்கப்படும். PyDERASN கண்டிப்பாக ஒதுக்கப்பட்ட பொருள் CMSVersion ஆக இருக்க வேண்டும். Python3 குறியீட்டை எழுதுவதைத் தவிர, நாங்கள் பயன்படுத்துகிறோம் சிறுகுறிப்புகளைத் தட்டச்சு செய்தல், எனவே எங்கள் செயல்பாடுகளில் def func(serial, contents) போன்ற தெளிவற்ற வாதங்கள் இருக்காது, ஆனால் def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), மற்றும் PyDERASN அத்தகைய குறியீட்டை பராமரிக்க உதவுகிறது.

அதே நேரத்தில், PyDERASN இந்த தட்டச்சுக்கு மிகவும் வசதியான சலுகைகளைக் கொண்டுள்ளது. pyasn1 ஆனது SubjectKeyIdentifier().subtype(implicitTag=Tag(...)) புலத்தை SubjectKeyIdentifier() க்கு ஒரு பொருளை ஒதுக்க அனுமதிக்கவில்லை (தேவையான IMPLICIT TAG இல்லாமல்) மற்றும் பொருட்களை அடிக்கடி நகலெடுத்து மீண்டும் உருவாக்க வேண்டியிருந்தது. மாற்றப்பட்ட IMPLICIT/வெளிப்படையான குறிச்சொற்கள். PyDERASN கண்டிப்பாக அடிப்படை வகையை மட்டுமே கவனிக்கிறது - இது தானாக ஏற்கனவே இருக்கும் ASN.1 ஸ்கீமாவில் இருந்து டேக்குகளை மாற்றும். இது பயன்பாட்டுக் குறியீட்டை பெரிதும் எளிதாக்குகிறது.

டிகோடிங்கின் போது பிழை ஏற்பட்டால், pyasn1 இல் அது சரியாக எங்கு நடந்தது என்பதைப் புரிந்துகொள்வது எளிதல்ல. எடுத்துக்காட்டாக, ஏற்கனவே மேலே குறிப்பிட்டுள்ள துருக்கிய சான்றிதழில், பின்வரும் பிழையைப் பெறுவோம்: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:defined by 2.5.4.10:utf8String) (138 இல்) திருப்தியற்ற வரம்புகள்: 1 ⇐ ⇐ 77 ASN .64 கட்டமைப்புகளை எழுதும் போது மக்கள் தவறு செய்யலாம், மேலும் இது பயன்பாடுகளில் பிழைத்திருத்தத்தை எளிதாக்குகிறது அல்லது பிற தரப்பினரின் குறியிடப்பட்ட ஆவணங்களில் உள்ள சிக்கல்களைக் கண்டறிகிறது.

PyDERASN இன் முதல் பதிப்பு BER குறியாக்கத்தை ஆதரிக்கவில்லை. இது மிகவும் பின்னர் தோன்றியது மற்றும் இன்னும் நேர மண்டலங்களுடன் UTCTime/GeneralizedTime செயலாக்கத்தை ஆதரிக்கவில்லை. இது எதிர்காலத்தில் வரும், ஏனென்றால் திட்டம் முக்கியமாக எனது ஓய்வு நேரத்தில் எழுதப்பட்டுள்ளது.

மேலும், முதல் பதிப்பில் புலங்களால் வரையறுக்கப்பட்ட எந்த வேலையும் இல்லை. சில மாதங்கள் கழித்து இது வாய்ப்பு உருவானது மற்றும் தீவிரமாகப் பயன்படுத்தத் தொடங்கியது, பயன்பாட்டுக் குறியீட்டைக் கணிசமாகக் குறைத்தது - ஒரு டிகோடிங் செயல்பாட்டில், முழு கட்டமைப்பையும் மிகவும் ஆழமாக பிரிக்க முடிந்தது. இதைச் செய்ய, ஸ்கீமா எந்த புலங்கள் எதை "வரையறுக்க" என்பதைக் குறிப்பிடுகிறது. எடுத்துக்காட்டாக, 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))),
    )

உள்ளடக்க வகை id_signedData மதிப்புடன் OID ஐக் கொண்டிருந்தால், SignedData திட்டத்தின்படி உள்ளடக்கப் புலம் (அதே வரிசையில் உள்ளது) டிகோட் செய்யப்பட வேண்டும் என்று கூறுகிறது. ஏன் பல அடைப்புக்குறிகள் உள்ளன? EnvelopedData கட்டமைப்புகளில் உள்ளதைப் போல, ஒரு புலம் ஒரே நேரத்தில் பல புலங்களை "வரையறுக்க" முடியும். வரையறுக்கப்பட்ட புலங்கள் டிகோட் பாதை என்று அழைக்கப்படுவதன் மூலம் அடையாளம் காணப்படுகின்றன - இது அனைத்து கட்டமைப்புகளிலும் உள்ள எந்த உறுப்புகளின் சரியான இருப்பிடத்தைக் குறிப்பிடுகிறது.

வரைபடத்தில் இந்த வரையறைகளை உடனடியாகச் சேர்க்க நீங்கள் எப்போதும் விரும்பவில்லை அல்லது எப்போதும் வாய்ப்பில்லை. மூன்றாம் தரப்பு திட்டத்தில் மட்டுமே OIDகள் மற்றும் கட்டமைப்புகள் அறியப்படும் போது பயன்பாடு சார்ந்த வழக்குகள் இருக்கலாம். PyDERASN ஆனது கட்டமைப்பை டிகோடிங் செய்யும் நேரத்தில் இந்த வரையறைகளை அமைக்கும் திறனை வழங்குகிறது:

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

இணைக்கப்பட்ட அனைத்து சான்றிதழ்களுக்கும் CMS SignedData இல், அவற்றின் அனைத்து நீட்டிப்புகளையும் (AuthorityKeyIdentifier, BasicConstraints, SubjectSignTool, முதலியன) டிகோட் செய்யவும். டிகோட் பாதையின் மூலம் எந்த உறுப்பை "பதிலீடு" செய்ய வேண்டும், அது ஸ்கீமாவில் குறிப்பிடப்பட்டதைப் போல வரையறுக்கிறது.

இறுதியாக, PyDERASN இலிருந்து இயங்கும் திறனைக் கொண்டுள்ளது கட்டளை வரி ASN.1 கோப்புகளை டீகோடிங் செய்வதற்கு மற்றும் ரிச் அழகான அச்சிடுதல். நீங்கள் ஒரு தன்னிச்சையான ASN.1 ஐ டிகோட் செய்யலாம் அல்லது தெளிவாக வரையறுக்கப்பட்ட திட்டத்தைக் குறிப்பிடலாம் மற்றும் இது போன்ற ஒன்றைப் பார்க்கலாம்:

பைடெராஸ்ன்: ஸ்லாட்டுகள் மற்றும் குமிழ்கள் கொண்ட ASN.1 நூலகத்தை நான் எப்படி எழுதினேன்

காட்டப்படும் தகவல்: ஆப்ஜெக்ட் ஆஃப்செட், டேக் நீளம், நீளம் நீளம், உள்ளடக்க நீளம், EOC இன் இருப்பு (எண்ட்-ஆஃப்-ஆக்டெட்ஸ்), BER என்கோடிங் பண்பு, காலவரையற்ற-நீள என்கோடிங் பண்பு, நீளம் மற்றும் வெளிப்படையான குறிச்சொல்லின் ஆஃப்செட் (ஏதேனும் இருந்தால்), கூடு கட்டும் ஆழம் கட்டமைப்புகளில் உள்ள பொருள், வெளிப்படையான/வெளிப்படையான குறிச்சொல் மதிப்பு, திட்டத்தின் படி பொருளின் பெயர், அதன் அடிப்படை ASN.1 வகை, வரிசை/தொகுப்புக்குள் உள்ள வரிசை எண், தேர்வு மதிப்பு (ஏதேனும் இருந்தால்), மனிதனால் படிக்கக்கூடிய பெயர் INTEGER/ENUMERATED/BIT STRING திட்டத்தின் படி, எந்த அடிப்படை வகையின் மதிப்பு , திட்டத்தில் இருந்து இயல்புநிலை/விருப்பக் கொடி, பொருள் தானாகவே டிகோட் செய்யப்பட்டதன் அடையாளமாக வரையறுக்கப்பட்டது மற்றும் OID ஆல் இது நடந்தது, மனிதனால் படிக்கக்கூடிய OID.

அழகான அச்சிடும் அமைப்பு சிறப்பாக வடிவமைக்கப்பட்டுள்ளது, இதனால் அது தனித்தனி கருவிகளைப் பயன்படுத்தி காட்சிப்படுத்தப்படும் பிபி பொருள்களின் வரிசையை உருவாக்குகிறது. ஸ்கிரீன்ஷாட் ரெண்டரரை எளிய வண்ண உரையில் காட்டுகிறது. JSON/HTML வடிவத்திலும் ரெண்டரர்கள் உள்ளன, இதனால் ASN.1 உலாவியில் உள்ளதைப் போன்றே ஹைலைட் செய்து பார்க்க முடியும். asn1js திட்டம்.

மற்ற நூலகங்கள்

இது இலக்கு அல்ல, ஆனால் PyDERASN கணிசமாக மாறியது வேகமாக pyasn1 ஐ விட. எடுத்துக்காட்டாக, மெகாபைட் அளவுகளில் உள்ள CRL கோப்புகளை டிகோடிங் செய்ய அதிக நேரம் எடுக்கும், நீங்கள் இடைநிலை தரவு சேமிப்பக வடிவங்களைப் பற்றி (வேகமாக) யோசித்து, பயன்பாட்டு கட்டமைப்பை மாற்ற வேண்டும். pyasn1 CRL ஐ டிகோட் செய்கிறது CACert.org எனது மடிக்கணினியில் 20 நிமிடங்களுக்கு மேல் எடுக்கும், அதே சமயம் PyDERASN ஆனது 28 வினாடிகள் மட்டுமே ஆகும்! ஒரு திட்டம் உள்ளது asn1crypto, கிரிப்டோகிராஃபிக் கட்டமைப்புகளுடன் வேகமாக வேலை செய்வதை நோக்கமாகக் கொண்டது: இது 29 வினாடிகளில் அதே CRL ஐ டிகோட் செய்கிறது (முழுமையாக, சோம்பேறித்தனமாக இல்லை), ஆனால் Python3 (983 MiB க்கு எதிராக 498), மற்றும் Python3.5 (2) இன் கீழ் 1677 மடங்கு RAM ஐப் பயன்படுத்துகிறது. 488க்கு எதிராக), pyasn1 4.3 மடங்கு அதிகமாக (2093 மற்றும் 488) பயன்படுத்துகிறது.

நான் குறிப்பிட்டுள்ள asn1crypto ஐ நாங்கள் கருத்தில் கொள்ளவில்லை, ஏனெனில் திட்டம் இன்னும் ஆரம்ப நிலையில் உள்ளது மற்றும் நாங்கள் அதைப் பற்றி கேள்விப்பட்டிருக்கவில்லை. இப்போது நாம் அவருடைய திசையையும் பார்க்க மாட்டோம், ஏனென்றால் அதே பொதுமைப்படுத்தப்பட்ட நேரம் தன்னிச்சையான வடிவத்தை எடுக்கவில்லை என்பதை நான் உடனடியாகக் கண்டுபிடித்தேன், மேலும் தொடரின் போது அது ஒரு நொடியின் ஒரு பகுதியை அமைதியாக நீக்குகிறது. X.509 சான்றிதழ்களுடன் பணிபுரிவதற்கு இது ஏற்றுக்கொள்ளத்தக்கது, ஆனால் பொதுவாக இது வேலை செய்யாது.

இந்த நேரத்தில், PyDERASN என்பது எனக்கு தெரிந்த மிகவும் கண்டிப்பான இலவச Python/Go DER குறிவிலக்கியாகும். என் அன்பான கோவின் என்கோடிங்/asn1 லைப்ரரியில் கடுமையான சோதனை அல்ல பொருள் அடையாளங்காட்டி மற்றும் UTCTime/GeneralizedTime சரங்கள். சில சமயங்களில் கண்டிப்பு தடைபடலாம் (முதன்மையாக யாரும் சரிசெய்யாத பழைய பயன்பாடுகளுடன் பின்தங்கிய இணக்கத்தன்மை காரணமாக), எனவே PyDERASN கடந்து செல்ல முடியும் பல்வேறு அமைப்புகள் பலவீனமான காசோலைகள்.

திட்டக் குறியீடு முடிந்தவரை எளிமையாக இருக்க முயற்சிக்கிறது. முழு நூலகமும் ஒரே கோப்பு. தேவையற்ற செயல்திறன் மேம்படுத்தல்கள் மற்றும் DRY குறியீடு இல்லாமல், எளிதில் புரிந்து கொள்வதற்கு முக்கியத்துவம் கொடுத்து குறியீடு எழுதப்பட்டுள்ளது. இது, நான் ஏற்கனவே கூறியது போல், UTCTime/GeneralizedTime சரங்களின் முழு BER டிகோடிங்கை ஆதரிக்காது, அதே போல் உண்மையான, தொடர்புடைய OID, வெளிப்புற, இன்ஸ்டன்ஸ் ஆஃப், உட்பொதிக்கப்பட்ட PDV, CHARACTER STRING தரவு வகைகளை இது ஆதரிக்காது. மற்ற எல்லா நிகழ்வுகளிலும், பைத்தானில் மற்ற நூலகங்களைப் பயன்படுத்துவதை நான் தனிப்பட்ட முறையில் பார்க்கவில்லை.

எனது எல்லா திட்டங்களையும் போல பைகோஸ்ட், GoGOST, என்.என்.சி.பி., கோவிபிஎன், PyDERASN என்பது முற்றிலும் இலவச மென்பொருள், விதிமுறைகளின் கீழ் விநியோகிக்கப்பட்டது LGPLv3+, மற்றும் இலவச பதிவிறக்கம் கிடைக்கும். பயன்படுத்துவதற்கான எடுத்துக்காட்டுகள் உள்ளன இங்கே மற்றும் உள்ளே PyGOST சோதனைகள்.

செர்ஜி மத்வீவ், சைபர்பங்க், உறுப்பினர் SPO அறக்கட்டளை, பைதான்/கோ டெவலப்பர், தலைமை நிபுணர் FSUE "STC "அட்லஸ்".

ஆதாரம்: www.habr.com

கருத்தைச் சேர்