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 ΡΡŠΡ‰ΠΎ Π½Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ стандарт Π·Π°Ρ€Π°Π΄ΠΈ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° слоТност: «Най-извСстният TLV ΠΊΠΎΠ΄Π΅ΠΊ Π΅ ASN.1, Π½ΠΎ Π΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠΎ слоТСн ΠΈ сС оттСглямС ΠΎΡ‚ Π½Π΅Π³ΠΎΒ». Но, Π·Π° съТалСниС, днСс ΠΈΠΌΠ°ΠΌΠ΅ инфраструктури Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡ Π² ΠΊΠΎΠΈΡ‚ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ 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 ΠΎΡ‚ ОливиС Π”ΡŽΠ±ΡƒΠ°ΡΠΎΠ½, ASN.1 Complete ΠΎΡ‚ профСсор Π”ΠΆΠΎΠ½ Π›Π°Ρ€ΠΌΡƒΡ‚.

BER Π΅ Π±ΠΈΠ½Π°Ρ€Π΅Π½ Π±Π°ΠΉΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ PER, популярСн Π² ΠΌΠΎΠ±ΠΈΠ»Π½Π°Ρ‚Π° комуникация β€” Π±ΠΈΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½) TLV Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ВсСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ сС ΠΊΠΎΠ΄ΠΈΡ€Π° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π°: Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ (TΡ‚ΠΈΠΏ Π½Π° кодирния Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ (цяло число, Π½ΠΈΠ·, Π΄Π°Ρ‚Π° ΠΈ Ρ‚.Π½.), дълТина (LдълТина) Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ самото ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ (Value). BER Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ позволява Π΄Π° Π½Π΅ сС посочва стойността Π½Π° Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π°, Π·Π°Π΄Π°Π²Π°ΠΉΠΊΠΈ спСциална стойност Π·Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° дълТина ΠΈ Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°ΠΉΠΊΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ с ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ 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), "ΠΏΡ€Π΅ΠΌΠΈΠ½ΠΈ към слСдващия Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚", "ΡΡŠΠΎΠ±Ρ‰ΠΈ своСто отмСстванС ΠΈ дълТина Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅". Π’ΠΎΠ²Π° бСшС "Ρ€ΡŠΡ‡Π½ΠΎ" ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΏΡ€Π΅Π· ASN.1 DER-сСриализирани Π΄Π°Π½Π½ΠΈ. Но Ρ‚Π°ΠΊΠ° Π½Π΅ моТСшС Π΄Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ с BER-сСриализирани Π΄Π°Π½Π½ΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±Π°ΠΉΡ‚ΠΎΠ²Π°Ρ‚Π° Π½ΠΈΠ· OCTET STRING ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Π±ΠΈΠ»Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π° Π² няколко ΠΏΠ°Ρ€Ρ‡Π΅Ρ‚Π°.

Π”Ρ€ΡƒΠ³ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ Π·Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π½ΡƒΠΆΠ΄ΠΈ 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%-Π½ΠΎ ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅ с тСстовС, Ρ‚ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°ΡˆΠ΅ ΠΈ пълна работоспособност Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°.

PyDERASN ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΈΠΌΠ° практичСски 100%-Π½ΠΎ ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅ с тСстовС. Използва сС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ тСстванС с нСвСроятната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° hypothesis. ΠŸΡ€ΠΎΠ²Π΅Π΄ΠΎΡ…Π° сС ΠΈ fuzzing py-afl- Π½Π° 32-ядрСни машини. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ Π½ΠΈ остава ΠΊΠΎΠ΄ Π½Π° Python2, PyDERASN всС ΠΎΡ‰Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с Π½Π΅Π³ΠΎ ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ° СдинствСна ΡˆΠ΅ΡΡ‚ зависимост. ОсвСн Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΠΉ Π΅ тСстван спрямо ASNI.1:2008 тСстов Π½Π°Π±ΠΎΡ€ Π·Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡŠΡ‚ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π½Π΅Π³ΠΎ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° 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, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π·Π° Ρ‚ΠΈΠΏ, Π·Π°Ρ‚ΠΎΠ²Π° Π² Π½Π°ΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ няма нСпонятни Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° 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 с часови Π·ΠΎΠ½ΠΈ. Π’ΠΎΠ²Π° Ρ‰Π΅ Π΄ΠΎΠΉΠ΄Π΅ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ сС пишС основно Π² свободното Π²Ρ€Π΅ΠΌΠ΅.

Π’ ΠΏΡŠΡ€Π²Π°Ρ‚Π° вСрсия Π½Π΅ бСшС възмоТно Π΄Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ с ΠΏΠΎΠ»Π΅Ρ‚Π°, Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π°. Π‘Π»Π΅Π΄ няколко мСсСца Ρ‚Π°Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ сС появи ΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΡΡŠΠΊΡ€Π°Ρ‰Π°Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠ΄Π° Π½Π° прилоТСнията β€” с Π΅Π΄Π½Π° опСрация Π½Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ моТСшС Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ напълно цялата структура, Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½Π° дълбоко. Π—Π° Ρ‚ΠΎΠ²Π°, Π² схСмата сС Π·Π°Π΄Π°Π²Π°Ρ‚ ΠΊΠΎΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΊΠ°ΠΊΠ²ΠΎ «опрСдСлят». НапримСр, описаниС Π½Π° схСмата 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 Π² схСмата. МоТС Π΄Π° ΠΈΠΌΠ° спСцифични случаи Π·Π° прилоТСния, ΠΏΡ€ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ 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 (ΠΊΡ€Π°ΠΉ Π½Π° ΠΎΠΊΡ‚Π΅Ρ‚ΠΈΡ‚Π΅), ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Π·Π° BER ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Π·Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ с Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° дълТина, дълТина ΠΈ отмСстванС Π½Π° EXPLICIT Ρ‚Π°Π³ (Π°ΠΊΠΎ ΠΈΠΌΠ°), Π΄ΡŠΠ»Π±ΠΎΡ‡ΠΈΠ½Π° Π½Π° влоТСност Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π° Π² структуритС, IMPLICIT/EXPLICIT стойност Π½Π° Ρ‚Π°Π³Π°, ΠΈΠΌΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π° ΠΏΠΎ схСмата, нСговия основСн ASN.1 Ρ‚ΠΈΠΏ, ΠΏΠΎΡ€Π΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ Π² SEQUENCE/SET OF, стойност Π½Π° CHOICE (Π°ΠΊΠΎ ΠΈΠΌΠ°), Ρ‡Π΅Ρ‚ΠΈΠΌΠΎ ΠΈΠΌΠ΅ Π½Π° INTEGER/ENUMERATED/BIT STRING ΠΏΠΎ схСмата, стойност Π½Π° всякакъв основСн Ρ‚ΠΈΠΏ, DEFAULT/OPTIONAL Ρ„Π»Π°Π³ ΠΎΡ‚ схСмата, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ, Ρ‡Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΡŠΡ‚ Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ ΠΊΠ°Ρ‚ΠΎ DEFINED BY ΠΈ ΠΏΠΎ какъв OID Π΅ станало, Ρ‡Π΅Ρ‚ΠΈΠΌ OID.

БистСмата Π·Π° красиво Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π° Ρ‚Π°ΠΊΠ°, Ρ‡Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° послСдоватСлност PP ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ с ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ срСдства. На ΡΠΊΡ€ΠΈΠΉΠ½ΡˆΠΎΡ‚Π° Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ€Π΅Π½Π΄Π΅Ρ€Π° Π² ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Ρ†Π²Π΅Ρ‚Π΅Π½ тСкст. Има ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈ Π² 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 Π½Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° строга ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ строка UTCTime/GeneralizedTime. ΠŸΠΎΡ€ΠΎΠΉ слишком строгиС трСбования ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ (Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠ·-Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости со старыми прилоТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ), поэтому Π² PyDERASN Π²ΠΎ врСмя дСкодирования ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΎΠ±Π»Π΅ΠΊΡ‡Π°Π²Π°Ρ‰ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

Код Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° сС стрСми Π΄Π° бъдС максимално прост. Цялата Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΅ Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ». ΠšΠΎΠ΄ΡŠΡ‚ Π΅ написан с Π°ΠΊΡ†Π΅Π½Ρ‚ Π½Π° простота Π½Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ, Π±Π΅Π· излишна оптимизация Π½Π° производитСлността ΠΈ DRY ΠΊΠΎΠ΄. ΠšΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ спомСнах, Π² Π½Π΅Π³ΠΎ няма ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΏΡŠΠ»Π½ΠΎΠΏΡ€Π°Π²Π½ΠΎ BER Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° UTCTime/GeneralizedTime Π½ΠΈΠ·ΠΎΠ²Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΈ Π½ΠΈΠ·ΠΎΠ²Π΅ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ. Π’ΡŠΠ² всичкитС останали случаи, Π»ΠΈΡ‡Π½ΠΎ Π·Π° ΠΌΠ΅Π½ няма смисъл Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Python.

ΠšΠ°ΠΊΡ‚ΠΎ всички ΠΌΠΎΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, Ρ‚ΠΈΠΏΠ° PyGOST, GoGOST, NNCP, GoVPN, PyDERASN Π΅ напълно свободСн софтуСр, разпространяван ΠΏΡ€ΠΈ условията Π½Π° LGPLv3+, ΠΈ Π΅ Π½Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΎ свалянС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΈΠΌΠ° Ρ‚ΡƒΠΊ ΠΈ Π² тСстовСтС Π½Π° PyGOST.

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

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster