PyDERASN: ΠΊΠ°ΠΊ я написал ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с slots and blobs

ASN.1 это стандарт (ISO, ITU-T, Π“ΠžΠ‘Π’) языка ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» кодирования этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Для мСня ΠΊΠ°ΠΊ программиста это просто Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сСриализации ΠΈ прСдставлСния Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Ρ€Π°Π²Π½Π΅ с JSON, XML, XDR ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ. Он ΠΊΡ€Π°ΠΉΠ½Π΅ распространён Π² нашСй ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, ΠΈ с Π½ΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ: Π² сотовой, Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠΉ, VoIP связи (UMTS, LTE, WiMAX, SS7, H.323), Π² сСтСвых ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ… (LDAP, SNMP, Kerberos), Π²ΠΎ всём, Ρ‡Ρ‚ΠΎ касаСтся ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ (X.509, CMS, PKCS-стандарты), Π² банковских ΠΊΠ°Ρ€Ρ‚Π°Ρ… ΠΈ биомСтричСских паспортах, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π³Π΄Π΅ Π΅Ρ‰Ρ‘.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассматриваСтся PyDERASN: Python ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰Π°ΡΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… связанных с ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ Π² АтласС.

PyDERASN: ΠΊΠ°ΠΊ я написал ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с slots and blobs
Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ ASN.1 для криптографичСских Π·Π°Π΄Π°Ρ‡ Π½Π΅ стоит: ASN.1 ΠΈ Π΅Π³ΠΎ ΠΊΠΎΠ΄Π΅ΠΊΠΈ β€” слоТны. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ прост, Π° это всСгда лишний Π²Π΅ΠΊΡ‚ΠΎΡ€ Π°Ρ‚Π°ΠΊΠΈ. Достаточно ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° список уязвимостСй Π² ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…. Π‘Ρ€ΡŽΡ Π¨Π½Π°ΠΉΠ΅Ρ€ Π² своСй Cryptography engineering Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ совСтуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот стандарт ΠΈΠ·-Π·Π° Π΅Π³ΠΎ слоТности: Β«The best-known TLV encoding is ASN.1, but it is incredibly complex and we shy away from itΒ». Но, ΠΊ соТалСнию, сСгодня ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ инфраструктуры ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ X.509 сСртификаты, CRL, OCSP, TSP, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ CMP, CMC, сообщСния CMS, ΠΈ масса стандартов PKCS. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ приходится ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ASN.1, Ссли Π²Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ΡΡŒ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ связанным с ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ.

ASN.1 ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ мноТСством способов/ΠΊΠΎΠ΄Π΅ΠΊΠΎΠ²:

  • BER (Basic Encoding Rules)
  • CER (Canonical Encoding Rules)
  • DER (Distinguished Encoding Rules)
  • GSER (Generic String Encoding Rules)
  • JER (JSON Encoding Rules)
  • LWER (Light Weight Encoding Rules)
  • OER (Octet Encoding Rules)
  • PER (Packed Encoding Rules)
  • SER (Signalling specific Encoding Rules)
  • XER (XML Encoding Rules)

ΠΈ рядом Π΄Ρ€ΡƒΠ³ΠΈΡ…. Но Π² криптографичСских Π·Π°Π΄Π°Ρ‡Π°Ρ… Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²Π°: BER ΠΈ DER. Π”Π°ΠΆΠ΅ Π² подписанных XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… (XMLDSig, XAdES) всё Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Base64-Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ASN.1 DER ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠ°ΠΊ ΠΈ Π² JSON-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ ACME ΠΎΡ‚ Let’s Encrypt-Π°. Π›ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ всСх этих ΠΊΠΎΠ΄Π΅ΠΊΠ°Ρ… ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… кодирования BER/CER/DER ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΡ‚Π°Ρ‚ΡŒΡΡ… ΠΈ ΠΊΠ½ΠΈΠ³Π°Ρ…: ASN.1 простыми словами, ASN.1 β€” Communication between heterogeneous systems by Olivier Dubuisson, ASN.1 Complete by Prof John Larmouth.

BER являСтся Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Π±Π°ΠΉΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ PER, популярный Π² сотовой связи β€” Π±ΠΈΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½) TLV-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт кодируСтся Π² Π²ΠΈΠ΄Π΅: тэга (Tag), ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ элСмСнта (Ρ†Π΅Π»ΠΎΠ΅ число, строка, Π΄Π°Ρ‚Π°, ΠΈ Ρ‚.Π΄.), Π΄Π»ΠΈΠ½Ρ‹ (Length) содСрТимого ΠΈ самого содСрТимого (Value). BER ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ позволяСт Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹, выставляя особоС indefinite length Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ оканчивая сообщСниС End-Of-Octets ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ. ΠšΡ€ΠΎΠΌΠ΅ кодирования Π΄Π»ΠΈΠ½Ρ‹, Π² BER ΠΌΠ½ΠΎΠ³ΠΎ вариативности Π² способС кодирования Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • INTEGER, OBJECT IDENTIFIER, BIT STRING ΠΈ Π΄Π»ΠΈΠ½Π° элСмСнта ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ (Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² минимальной Ρ„ΠΎΡ€ΠΌΠ΅);
  • BOOLEAN являСтся истинным ΠΏΡ€ΠΈ любом Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΌ содСрТимого;
  • BIT STRING ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ «лишниС» Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹;
  • BIT STRING, OCTET STRING ΠΈ всС ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ строковыС Ρ‚ΠΈΠΏΡ‹, Π² Ρ‚ΠΎΠΌ числС Π΄Π°Ρ‚Π°/врСмя, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π±ΠΈΡ‚Ρ‹ Π½Π° кусочки (chunk) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎ врСмя (Π΄Π΅)кодирования Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ извСстна;
  • UTCTime/GeneralizedTime ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ способы задания смСщСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½Ρ‹ ΠΈ «лишниС» Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Π΄ΠΎΠ»ΠΈ сСкунд;
  • DEFAULT значСния SEQUENCE ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅Ρ‚;
  • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния послСдних Π±ΠΈΡ‚ Π² BIT STRING ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ТСланию Π½Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ;
  • SEQUENCE (OF)/SET (OF) ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ порядок элСмСнтов.

Из-Π·Π° всСго Π²Ρ‹ΡˆΠ΅Π½Π°Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ β€” Π½Π΅ всСгда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ подмноТСство ΠΏΡ€Π°Π²ΠΈΠ»: DER β€” Тёстко Ρ€Π΅Π³Π»Π°ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ допустимый способ кодирования, Ρ‡Ρ‚ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ для криптографичСских Π·Π°Π΄Π°Ρ‡, Π³Π΄Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° сдСлаСт подпись ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. DER ΠΈΠΌΠ΅Π΅Ρ‚ сущСствСнный нСдостаток: Π΄Π»ΠΈΠ½Ρ‹ всСх элСмСнтов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ извСстны Π²ΠΎ врСмя кодирования, Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. CER ΠΊΠΎΠ΄Π΅ΠΊ Π»ΠΈΡˆΡ‘Π½ этого нСдостатка, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ гарантируя ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ…. К соТалСнию (ΠΈΠ»ΠΈ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ слоТныС Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Ρ‹?), ΠΎΠ½ Π½Π΅ стал популярСн. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΡ‹ встрСчаСм «смСшанноС» использованиС BER ΠΈ DER Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈ CER ΠΈ DER ΡΠ²Π»ΡΡŽΡ‚ΡΡ подмноТСством BER, Ρ‚ΠΎ любой BER-Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ способСн ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с pyasn1

На Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΌΡ‹ пишСм ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° Python связанных с ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ. И нСсколько Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ Π²Ρ‹Π±ΠΎΡ€Π° свободных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ практичСски Π½Π΅ Π±Ρ‹Π»ΠΎ: Π»ΠΈΠ±ΠΎ это ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ просто Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†Π΅Π»ΠΎΠ΅ число ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ структуры, Π»ΠΈΠ±ΠΎ это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° 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 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°), Β«ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ тэгу», «сообщи свой offset ΠΈ Π΄Π»ΠΈΠ½Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ ΠΌΡ‹ находимся». Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Β«Ρ€ΡƒΡ‡Π½ΠΎΠ΅Β» Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ASN.1 DER-сСриализованным Π΄Π°Π½Π½Ρ‹ΠΌ. Но Ρ‚Π°ΠΊ нСльзя Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с BER-сСриализованными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, байтовая строка OCTET STRING ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² Π²ΠΈΠ΄Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… chunk-ΠΎΠ².

Π”Ρ€ΡƒΠ³ΠΎΠΉ нСдостаток для Π½Π°ΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ pyasn1 β€” Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, присутствовало Π»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² SEQUENCE ΠΈΠ»ΠΈ Π½Π΅Ρ‚. НапримСр, Ссли структура содСрТит ΠΏΠΎΠ»Π΅ Field SEQUENCE OF Smth OPTIONAL, Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠ³Π»ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… (OPTIONAL), Π° ΠΌΠΎΠ³Π»ΠΎ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈ этом Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ (пустой список). Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС этого нСльзя Π±Ρ‹Π»ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ. А это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Тёсткой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ валидности ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΠΉ Ρ†Π΅Π½Ρ‚Ρ€ выпустил Π±Ρ‹ сСртификат с Β«Π½Π΅ совсСм» Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ASN.1-схСм Π΄Π°Π½Π½Ρ‹ΠΌΠΈ! НапримСр ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΠΉ Ρ†Π΅Π½Ρ‚Ρ€ Β«TÜRKTRUST Elektronik Sertifika Hizmet SağlayΔ±cΔ±sΔ±Β» Π² своём ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ сСртификатС Π²Ρ‹ΡˆΠ΅Π» Π·Π° допустимыС RFC 5280 Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° subject β€” Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ чСстно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ схСмС. DER ΠΊΠΎΠ΄Π΅ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π΅, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ DEFAULT-Π½ΠΎΠΌΡƒ, Π½Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ β€” Π² ΠΆΠΈΠ·Π½ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ, ΠΈ пСрвая вСрсия PyDERASN Π΄Π°ΠΆΠ΅ осознанно допускала Ρ‚Π°ΠΊΠΎΠ΅ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ (с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния DER) ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€Π°Π΄ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ β€” Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ (BER/DER) Π±Ρ‹Π» Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² структурС. НапримСр, CMS стандарт Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ сообщСниС BER-кодируСтся, Π½ΠΎ ΠΏΠΎΠ»Π΅ signedAttrs, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ формируСтся криптографичСская подпись, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π² DER. Если ΠΌΡ‹ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌ DER-ΠΎΠΌ, Ρ‚ΠΎ ΡƒΠΏΠ°Π΄Ρ‘ΠΌ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ самой CMS, Ссли Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌ BER-ΠΎΠΌ, Ρ‚ΠΎ Π½Π΅ ΡƒΠ·Π½Π°Π΅ΠΌ Π² ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ Π±Ρ‹Π» signedAttrs. Π’ ΠΈΡ‚ΠΎΠ³Π΅ придётся TLVSeeker-ΠΎΠΌ (Π°Π½Π°Π»ΠΎΠ³Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ Π² pyasn1) ΠΈΡΠΊΠ°Ρ‚ΡŒ мСстополоТСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· signedAttrs ΠΏΠΎΠ»Π΅ΠΉ, ΠΈ Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, достав ΠΈΠ· сСриализованного прСдставлСния, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DER-ΠΎΠΌ.

ΠžΡ‡Π΅Π½ΡŒ ΠΆΠ΅Π»Π°Π½Π½ΠΎΠΉ Π±Ρ‹Π»Π° для нас Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ автоматичСской ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ DEFINED BY ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ часто. ПослС дСкодирования ASN.1 структуры Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ мноТСство ANY ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ дальшС ΠΏΠΎ схСмС, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΠΎΠΉ Π½Π° основС OBJECT IDENTIFIER Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π² ΠΏΠΎΠ»Π΅ структуры. Π’ Python ΠΊΠΎΠ΄Π΅ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ написаниС if ΠΈ дальнСйший Π²Ρ‹Π·ΠΎΠ² Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° для ANY поля.

ПоявлСниС PyDERASN

Π’ АтласС ΠΌΡ‹ рСгулярно, найдя ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΠ»ΠΈ дорабатывая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ свободныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, отправляСм ΠΏΠ°Ρ‚Ρ‡ΠΈ Π½Π°Π²Π΅Ρ€Ρ…. Π’ pyasn1 ΠΌΡ‹ нСсколько Ρ€Π°Π· отправляли Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½ΠΎ ΠΊΠΎΠ΄ pyasn1 Π½Π΅ самый простой для понимания ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π² Π½Ρ‘ΠΌ происходили нСсовмСстимыС измСнСния API, бившиС нас ΠΏΠΎ Ρ€ΡƒΠΊΠ°ΠΌ. Плюс ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΊ написанию тСстов с Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ тСстированиСм, Ρ‡Π΅Π³ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ Π² pyasn1.

Π’ ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь я Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ это Ρ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ ΠΈ ΠΏΠΎΡ€Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с __slot__-Π°ΠΌΠΈ, offset-Π°ΠΌΠΈ ΠΈ прСкрасно ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΌΠΈ blob-Π°ΠΌΠΈ! ΠŸΡ€ΠΎΡΡ‚ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ASN.1 ΠΊΠΎΠ΄Π΅ΠΊ Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСдостаточно β€” Π½ΡƒΠΆΠ½ΠΎ пСрСвСсти всС наши Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° зависимыС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° Π½Π΅Ρ‘, Π° это сотни тысяч строк ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ASN.1-структурами. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ для Π½Π΅Ρ‘: Π»Ρ‘Π³ΠΊΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ pyasn1 ΠΊΠΎΠ΄Π°. ΠŸΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ² вСсь свой отпуск, я написал эту Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, всС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Π» Π½Π° Π½Π΅Ρ‘. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ практичСски 100%-Π½Ρ‹ΠΉ coverage тСстами, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΏΠΎΠ»Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

PyDERASN, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ практичСски 100%-ΠΎΠ΅ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ тСстированиС с Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ hypothesis. Π’Π°ΠΊΠΆΠ΅ проводился ΠΈ fuzzing py-afl-Π΅ΠΌ Π½Π° 32-Ρ… ядСрных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…. НС смотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас практичСски Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Python2 ΠΊΠΎΠ΄Π°, PyDERASN всё Ρ€Π°Π²Π½ΠΎ Π±Π»ΡŽΠ΄Ρ‘Ρ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π½ΠΈΠΌ ΠΈ ΠΈΠ·-Π·Π° этого ΠΈΠΌΠ΅Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ six Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ протСстирован Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² ASN.1:2008 compliance test suite.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ pyasn1 β€” Ρ€Π°Π±ΠΎΡ‚Π° с высокоуровнСнными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python. ОписаниС 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 ΠΊΠΎΠ΄, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈ typing annotations, поэтому Π² Π½Π°ΡˆΠΈΡ… функциях Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ нСпонятныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° def func(serial, contents), Π° def func(serial: CertificateSerialNumber, contents: EncapsulatedContentInfo), ΠΈ PyDERASN ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π±Π»ΡŽΡΡ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄.

ΠŸΡ€ΠΈ этом Π² PyDERASN Π΅ΡΡ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΠΎΠ±Π»Π°ΠΆΠΊΠΈ этой самой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. pyasn1 Π½Π΅ позволял Π² SubjectKeyIdentifier().subtype(implicitTag=Tag(…)) ΠΏΠΎΠ»Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ SubjectKeyIdentifier() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π±Π΅Π· Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ IMPLICIT TAG-Π°) ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ часто ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·-Π·Π° ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Ρ… IMPLICIT/EXPLICIT тэгов. PyDERASN строго Π±Π»ΡŽΠ΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ β€” тэги ΠΎΠ½ автоматичСски подставит ΠΈΠ· ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ схСмы ASN.1 структуры. Π­Ρ‚ΠΎ сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Если происходит ошибка Π²ΠΎ врСмя дСкодирования, Ρ‚ΠΎ Π² pyasn1 Π½Π΅ просто ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π°. НапримСр Π² ΡƒΠΆΠ΅ Π²Ρ‹ΡˆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π²ΡˆΠ΅ΠΌΡΡ Ρ‚ΡƒΡ€Π΅Ρ†ΠΊΠΎΠΌ сСртификатС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ: UTF8String (tbsCertificate:issuer:rdnSequence:3:0:value:DEFINED BY 2.5.4.10:utf8String) (at 138) unsatisfied bounds: 1 ⇐ 77 ⇐ 64 ΠŸΡ€ΠΈ написании ASN.1 структур люди ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡˆΠΈΠ±Π°Ρ‚ΡŒΡΡ, ΠΈ это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π»Π΅Π³Ρ‡Π΅ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ прилоТСния ΠΈΠ»ΠΈ Π²Ρ‹ΡΡΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ стороны.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии PyDERASN Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ BER-кодирования. Появилась сильно ΠΏΠΎΠ·ΠΆΠ΅ ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ Π΅Ρ‰Ρ‘ Π½Π΅ поддСрТиваСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° UTCTime/GeneralizedTime с часовыми поясами. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, вСдь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² основном Π² свободноС ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ врСмя.

Π’Π°ΠΊΠΆΠ΅ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с DEFINED BY полями. Π§Π΅Ρ€Π΅Π· нСсколько мСсяцСв эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ появилась ΠΈ Π½Π°Ρ‡Π°Π»Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, сущСствСнно сокращая ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β€” Π·Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ дСкодирования ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ всю структуру Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Π½ΡƒΡŽ Π΄ΠΎ самой Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹. Для этого, Π² схСмС Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊΠΈΠ΅ поля Ρ‡Ρ‚ΠΎ Β«ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚Β». НапримСр, описаниС схСмы 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))),
    )

Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли contentType Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ OID с Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ id_signedData, Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ content (находящССся Π² этом ΠΆΠ΅ SEQUENCE) Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ схСмС SignedData. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ скобочСк? ПолС ΠΌΠΎΠΆΠ΅Ρ‚ Β«ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΒ» нСсколько ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΊΠ°ΠΊ это Π±Ρ‹Π²Π°Π΅Ρ‚ Π² EnvelopedData структурах. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡ‹Π΅ поля ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ decode path β€” ΠΎΠ½ΠΎ Π·Π°Π΄Π°Ρ‘Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ мСстополоТСниС любого элСмСнта Π²ΠΎ всСх структурах.

НС всСгда хочСтся ΠΈΠ»ΠΈ Π½Π΅ всСгда Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сразу ΠΆΠ΅ Π² схСму внСсти эти defines. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ application-specific случаи ΠΊΠΎΠ³Π΄Π° OID-Ρ‹ ΠΈ структуры извСстны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² стороннСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. PyDERASN прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ задания этих defines прямо Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ дСкодирования структуры:

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, ΠΈ Ρ‚.Π΄.). ΠœΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· decode path, ΠΊΠ°ΠΊΠΎΠΌΡƒ элСмСнту Π½ΡƒΠΆΠ½ΠΎ Β«ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒΒ» defines, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹Π» Π·Π°Π΄Π°Π½ Π² схСмС.

НаконСц, PyDERASN ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для дСкодирования ASN.1 Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ pretty printing. МоТно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ASN.1, Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‡Ρ‘Ρ‚ΠΊΠΎ Π·Π°Π΄Π°Π½Π½ΡƒΡŽ схСму ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:

PyDERASN: ΠΊΠ°ΠΊ я написал ASN.1 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с slots and blobs

ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠ°Ρ информация: смСщСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π΄Π»ΠΈΠ½Π° тэга, Π΄Π»ΠΈΠ½Π° Π΄Π»ΠΈΠ½Ρ‹, Π΄Π»ΠΈΠ½Π° содСрТимого, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ EOC (end-of-octets), ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ BER-кодирования, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ indefinite-length кодирования, Π΄Π»ΠΈΠ½Π° ΠΈ смСщСниС EXPLICIT тэга (Ссли Π΅ΡΡ‚ΡŒ), Π³Π»ΡƒΠ±ΠΈΠ½Π° влоТСнности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² структурах, IMPLICIT/EXPLICIT Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ тэга, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎ схСмС, Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ASN.1 Ρ‚ΠΈΠΏ, порядковый Π½ΠΎΠΌΠ΅Ρ€ Π²Π½ΡƒΡ‚Ρ€ΠΈ SEQUENCE/SET OF, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ CHOICE (Ссли Π΅ΡΡ‚ΡŒ), Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ INTEGER/ENUMERATED/BIT STRING ΠΏΠΎ схСмС, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ любого Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, DEFAULT/OPTIONAL Ρ„Π»Π°Π³ ΠΈΠ· схСмы, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» автоматичСски Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ DEFINED BY ΠΈ Π·Π° счёт ΠΊΠ°ΠΊΠΎΠ³ΠΎ OID-Π° это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ OID.

БистСма pretty printing-Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ сдСлана Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ PP-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ срСдствами. На screenshot-Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ renderer Π² простой Ρ†Π²Π΅Ρ‚Π½ΠΎΠΉ тСкст. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ renderer-Ρ‹ Π² JSON/HTML Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ с подсвСткой ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Π±Ρ€ΠΎΡƒΠ·Π΅Ρ€Π΅ ASN.1 ΠΊΠ°ΠΊ Π² asn1js ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π­Ρ‚ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ†Π΅Π»ΡŒΡŽ, Π½ΠΎ PyDERASN получился сущСствСнно Π±ΠΎΠ»Π΅Π΅ быстрым Ρ‡Π΅ΠΌ pyasn1. НапримСр, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ CRL Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя, Ρ‡Ρ‚ΠΎ придётся Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ хранСния Π΄Π°Π½Π½Ρ‹Ρ… (быстрых) ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. pyasn1 Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ CRL CACert.org Π½Π° ΠΌΠΎΡ‘ΠΌ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅ Π±ΠΎΠ»Π΅Π΅ 20 ΠΌΠΈΠ½ΡƒΡ‚, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ PyDERASN всСго Π·Π° 28 сСкунд! Π•ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ asn1crypto, Π½Π°Ρ†Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с криптографичСскими структурами: ΠΎΠ½ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ (ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Π½Π΅ Π»Π΅Π½ΠΈΠ²ΠΎ) этот ΠΆΠ΅ самый CRL Π·Π° 29 сСкунд, ΠΎΠ΄Π½Π°ΠΊΠΎ потрСбляСт ΠΏΠΎΡ‡Ρ‚ΠΈ Π² Π΄Π²Π° Ρ€Π°Π·Π° большС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΡ€ΠΈ запускС ΠΏΠΎΠ΄ Python3 (983 MiB ΠΏΡ€ΠΎΡ‚ΠΈΠ² 498-ΠΌΠΈ), ΠΈ Π² 3.5 Ρ€Π°Π·Π° ΠΏΠΎΠ΄ Python2 (1677 ΠΏΡ€ΠΎΡ‚ΠΈΠ² 488), Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ pyasn1 потрСбляСт Π°ΠΆ Π² 4.3 Ρ€Π°Π·Π° большС (2093 ΠΏΡ€ΠΎΡ‚ΠΈΠ² 488).

asn1crypto, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я упомянул, ΠΌΡ‹ Π½Π΅ рассматривали, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΅Ρ‰Ρ‘ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ зароТдался, ΠΈ ΠΌΡ‹ Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΏΡ€ΠΎ Π½Π΅Π³ΠΎ. БСйчас Π±Ρ‹ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ стали ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π΅Π³ΠΎ сторону, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ мною сразу ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ GeneralizedTime ΠΎΠ½ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, Π° ΠΏΡ€ΠΈ сСриализации ΠΎΠ½ ΠΌΠΎΠ»Ρ‡Π° ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ Π΄ΠΎΠ»ΠΈ сСкунды. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с X.509 сСртификатами, Π½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚.

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, PyDERASN самый строгий ΠΈΠ· свободных Python/Go DER-Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠ² ΠΌΠ½Π΅ извСстных. Π’ encoding/asn1 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ мною любимого Go Π½Π΅ строгая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° OBJECT IDENTIFIER ΠΈ UTCTime/GeneralizedTime строк. Иногда ΡΡ‚Ρ€ΠΎΠ³ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ (Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠ·-Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости со старыми прилоТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ), поэтому Π² PyDERASN Π²ΠΎ врСмя дСкодирования ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ настройки ΠΎΡΠ»Π°Π±Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° стараСтся Π±Ρ‹Ρ‚ΡŒ максимально простым. Вся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° β€” ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ». Код написан с ΡƒΠΏΠΎΡ€ΠΎΠΌ Π½Π° простоту понимания, Π±Π΅Π· ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ DRY-ΠΊΠΎΠ΄Π°. Π’ Π½Ρ‘ΠΌ Π½Π΅Ρ‚, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ BER-дСкодирования UTCTime/GeneralizedTime строк, Π° Ρ‚Π°ΠΊΠΆΠ΅ REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях Π»ΠΈΡ‡Π½ΠΎ я Π½Π΅ Π²ΠΈΠΆΡƒ смысла ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Как ΠΈ всС ΠΌΠΎΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Ρ‚ΠΈΠΏΠ° PyGOST, GoGOST, NNCP, GoVPN, PyDERASN являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ свободным ПО, распространяСмым Π½Π° условиях LGPLv3+, ΠΈ доступСн для бСсплатного скачивания. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования Π΅ΡΡ‚ΡŒ Ρ‚ΡƒΡ‚ ΠΈ Π² тСстах PyGOST.

Π‘Π΅Ρ€Π³Π΅ΠΉ ΠœΠ°Ρ‚Π²Π΅Π΅Π², ΡˆΠΈΡ„Ρ€ΠΎΠΏΠ°Π½ΠΊ, Ρ‡Π»Π΅Π½ Π€ΠΎΠ½Π΄Π° БПО, Python/Go-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Π³Π»Π°Π²Π½Ρ‹ΠΉ спСциалист Π€Π“Π£ΠŸ «НВЦ β€žΠΡ‚Π»Π°Ρβ€œ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ