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

ASN.1 Ρ‚ΠΎΠ²Π° Π΅ стандарт (ISO, ITU-T, Π“ΠžΠ‘Π’) Π·Π° Π΅Π·ΠΈΠΊ, описващ структурирана информация, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π·ΠΈ информация. Π—Π° ΠΌΠ΅Π½ ΠΊΠ°Ρ‚ΠΎ програмист, Ρ‚ΠΎΠ²Π° Π΅ просто ΠΎΡ‰Π΅ Π΅Π΄ΠΈΠ½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° сСрийно ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ ΠΈ прСдставянС Π½Π° Π΄Π°Π½Π½ΠΈ, Π½Π°Ρ€Π°Π²Π½ΠΎ с JSON, XML, XDR ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ. Π’ΠΎΠΉ Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ разпространСн Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅Ρ‚ΠΎ Π½ΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€Π° сС ΡΠ±Π»ΡŠΡΠΊΠ²Π°Ρ‚ с Π½Π΅Π³ΠΎ: Π² ΠΌΠΎΠ±ΠΈΠ»Π½Π°Ρ‚Π° ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Π° комуникация (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 β€” ΠžΠ±Ρ‰ΡƒΠ²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ…Π΅Ρ‚Π΅Ρ€ΠΎΠ³Π΅Π½Π½ΠΈ систСми ΠΎΡ‚ ОливиС Π”ΡŽΠ±ΠΈΡΠΎΠ½, ASN.1 Complete ΠΎΡ‚ ΠΏΡ€ΠΎΡ„. Π”ΠΆΠΎΠ½ Π›Π°Ρ€ΠΌΠ°ΡƒΡ‚.

BER Π΅ Π±ΠΈΠ½Π°Ρ€Π΅Π½ Π±Π°ΠΉΡ‚-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ PER, популярСн Π² ΠΌΠΎΠ±ΠΈΠ»Π½Π°Ρ‚Π° комуникация β€” Π±ΠΈΡ‚ΠΎΠ²ΠΎ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½) TLV Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. ВсСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ сС ΠΊΠΎΠ΄ΠΈΡ€Π° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π°: Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ (Tag), ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‰ Ρ‚ΠΈΠΏa Π½Π° кодируСмия Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ (цяло число, Π½ΠΈΠ·, Π΄Π°Ρ‚Π° ΠΈ Ρ‚.Π½.), дълТина (Length) Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ самото ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ (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 Π±Π°ΠΉΡ‚Π°
                     . . . . . . 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-ΠΎΠ²Π΅ ΠΈ Π±Π»ΠΎΠ±ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π° сС Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ прСкрасно! ΠŸΡ€ΠΎΡΡ‚ΠΎ Π΄Π° създам ASN.1 ΠΊΠΎΠ΄Π΅ΠΊ Π½Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ - Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° прСнСса всичкитС Π½ΠΈ взаимозависими ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π½Π° нСя, Π° Ρ‚ΠΎΠ²Π° са стотици хиляди Ρ€Π΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄, Π² ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с ASN.1 структури. ВоСст, Π΅Π΄Π½ΠΎ ΠΎΡ‚ изискванията бСшС: лСсно прСносимост Π½Π° тСкущия pyasn1 ΠΊΠΎΠ΄. Π˜Π·Ρ€Π°Π·Ρ…ΠΎΠ΄Π²Π°ΠΉΠΊΠΈ цялата си отпуска, написах Ρ‚Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΈ прСнСсох всички ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π½Π° нСя. ПонСТС Ρ‚Π΅ ΠΈΠΌΠ°Ρ‚ практичСски 100% ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅ с тСстовС, Ρ‚ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°ΡˆΠ΅ ΠΈ пълна функционалност Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°.

PyDERASN, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΈΠΌΠ° практичСски 100% ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅ с тСстовС. Използва сС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ тСстванС с чудСсната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° hypothesis. ΠŸΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°ΡˆΠ΅ сС ΠΈ fuzzing py-afl-Π΅ΠΌ Π½Π° 32-ядрСни машини. НСзависимо ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ нямамС Python2 ΠΊΠΎΠ΄, PyDERASN всС ΠΏΠ°ΠΊ Π·Π°ΠΏΠ°Π·Π²Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с Π½Π΅Π³ΠΎ ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ° СдинствСна ΡˆΠ΅ΡΡ‚ зависимост. ОсвСн Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΠΉ Π΅ тСстван спрямо ASN.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 с часови Π·ΠΎΠ½ΠΈ. Π’ΠΎΠ²Π° Ρ‰Π΅ Π΄ΠΎΠΉΠ΄Π΅ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ сС пишС основно Π² свободното ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π° Π²Ρ€Π΅ΠΌΠ΅.

Π’ ΠΏΡŠΡ€Π²Π°Ρ‚Π° вСрсия Π½Π΅ бСшС Π½Π°Π»ΠΈΡ‡Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с ΠΏΠΎΠ»Π΅Ρ‚Π° 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 Π² схСмата. ΠœΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ спСцифични Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ случаи, ΠΊΠΎΠ³Π°Ρ‚ΠΎ 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 MiB), ΠΈ 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 ΠΈ CHARACTER STRING Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ. Π’ΡŠΠ² всички останали случаи Π»ΠΈΡ‡Π½ΠΎ Π°Π· Π½Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌ смисъл Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π² Python Π΄Ρ€ΡƒΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

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

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

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

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