ΡΠΎΠ²Π° Π΅ ΡΡΠ°Π½Π΄Π°ΡΡ (ISO, ITU-T, ΠΠΠ‘Π’) Π·Π° Π΅Π·ΠΈΠΊ, ΠΎΠΏΠΈΡΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠ° ΠΌΠ΅Π½ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡ, ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΡΠ΅ΡΠΈΠΉΠ½ΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Π½Π°ΡΠ°Π²Π½ΠΎ Ρ JSON, XML, XDR ΠΈ Π΄ΡΡΠ³ΠΈ. Π’ΠΎΠΉ Π΅ ΡΠΈΡΠΎΠΊΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅ΡΠΎ Π½ΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Ρ Ρ Π½Π΅Π³ΠΎ: Π² ΠΌΠΎΠ±ΠΈΠ»Π½Π°ΡΠ° ΠΈ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ (UMTS, LTE, WiMAX, SS7, H.323), Π² ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ (LDAP, SNMP, Kerberos), Π²ΡΠ² Π²ΡΠΈΡΠΊΠΎ, ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΡΠ° (X.509, CMS, PKCS ΡΡΠ°Π½Π΄Π°ΡΡΠΈ), Π² Π±Π°Π½ΠΊΠΎΠ²ΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈ ΠΈ Π±ΠΈΠΎΠΌΠ΅ΡΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΠ°ΡΠΏΠΎΡΡΠΈ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΡΠ°.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ : Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python Π·Π° ASN.1, Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΡΠ° Π² .

ΠΡΡΡΠ½ΠΎΡΡ, Π½Π΅ ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° ASN.1 Π·Π° ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ: ASN.1 ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΠ΄Π΅ΡΠΈ ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΊΠΎΠ΄ΡΡ Π½ΡΠΌΠ° Π΄Π° Π΅ ΠΏΡΠΎΡΡ, Π° ΡΠΎΠ²Π° Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π²Π΅ΠΊΡΠΎΡ Π·Π° Π°ΡΠ°ΠΊΠ°. ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅ ASN.1. ΠΡΡΡ Π¨Π½Π°ΠΉΠ΅Ρ Π² ΡΠ²ΠΎΡΡΠ° ΡΡΡΠΎ Π½Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡ ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ: Β«The best-known TLV encoding is ASN.1, but it is incredibly complex and we shy away from itΒ». ΠΠΎ Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π΄Π½Π΅Ρ ΠΈΠΌΠ°ΠΌΠ΅ Π² ΠΊΠΎΠΈΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ , CRL, OCSP, TSP, ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ CMP, , ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ , ΠΈ ΠΊΡΠΏ ΡΡΠ°Π½Π΄Π°ΡΡΠΈ . ΠΠ°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΌΠ΅Π΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ASN.1, Π°ΠΊΠΎ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΡΠ΅ Ρ Π½Π΅ΡΠΎ, ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΡΠ°.
ASN.1 ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΎ ΠΏΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π°ΡΠΈΠ½ΠΈ/ΠΊΠΎΠ΄Π΅ΡΠΈ:
- (Basic Encoding Rules)
- (Canonical Encoding Rules)
- (Distinguished Encoding Rules)
- (Generic String Encoding Rules)
- (JSON Encoding Rules)
- LWER (Light Weight Encoding Rules)
- (Octet Encoding Rules)
- (Packed Encoding Rules)
- SER (Signalling specific Encoding Rules)
- (XML Encoding Rules)
ΠΈ ΡΠ΅Π΄ΠΈΡΠ° Π΄ΡΡΠ³ΠΈ. ΠΠΎ Π² ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΄Π²Π°: BER ΠΈ DER. ΠΠΎΡΠΈ Π² ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ XML Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ (, ) Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ ΠΈΠΌΠ° Base64-ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ ASN.1 DER ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² JSON ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΎΡ Letβs Encrypt. ΠΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΊΠΎΠ΄Π΅ΡΠΈ ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π·Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° BER/CER/DER Π² ΡΡΠ°ΡΠΈΠΈ ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ: , , .
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, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ. ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΈΠ·Π±ΠΎΡΡΡ Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π±Π΅ΡΠ΅ ΠΏΠΎΡΡΠΈ Π½Π΅Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ: ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΡΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°, ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° . ΠΠΈΠ²Π΅Π΅Ρ ΠΌΠ΅ Ρ Π½Π΅Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π±ΡΡ ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ ΡΠ°Π±ΠΎΡΠ° Ρ 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Δ±β Π² ΡΠ²ΠΎΡ ΠΊΠΎΡΠ΅Π½Π΅Π½ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈΠ·Π»Π΅Π·Π΅ ΠΈΠ·Π²ΡΠ½ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈΡΠ΅ Π³ΡΠ°Π½ΠΈΡΠΈ Π½Π° Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° 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% ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Ρ ΡΡΠ΄Π΅ΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° . ΠΡΠΎΠ²Π΅ΠΆΠ΄Π°ΡΠ΅ ΡΠ΅ ΠΈ -Π΅ΠΌ Π½Π° 32-ΡΠ΄ΡΠ΅Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΠ΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΠΎΡΡΠΈ Π½ΡΠΌΠ°ΠΌΠ΅ Python2 ΠΊΠΎΠ΄, PyDERASN Π²ΡΠ΅ ΠΏΠ°ΠΊ Π·Π°ΠΏΠ°Π·Π²Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Π½Π΅Π³ΠΎ ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΠΎΠΉ Π΅ ΡΠ΅ΡΡΠ²Π°Π½ ΡΠΏΡΡΠΌΠΎ .
ΠΡΠΈΠ½ΡΠΈΠΏΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½Π΅Π³ΠΎ Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ Π½Π° 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 ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΠΈΠΌΠ° Π±ΠΎΠ³Π°ΡΠΎ . ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ASN.1 ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ ΡΠΎΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡ Π΅ΠΌΠ° ΠΈ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:

ΠΠΎΠΊΠ°Π·Π²Π°Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π²ΠΊΠ»ΡΡΠ²Π°: ΠΈΠ·ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΠ°Π³Π°, Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ, Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° 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 ΠΊΠ°ΠΊΡΠΎ Π² ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΡΡΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
ΠΠ΅ Π±Π΅ΡΠ΅ ΡΠ΅Π»ΡΠ°, Π½ΠΎ PyDERASN ΡΡΠ°Π½Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΡ pyasn1. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° CRL ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΈ ΠΎΡ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΌΠΈΡΠ»ΠΈ Π·Π° ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ Π·Π° Π±ΡΡΠ·ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. pyasn1 Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ° CRL Π½Π° ΠΌΠΎΡ Π»Π°ΠΏΡΠΎΠΏ Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 20 ΠΌΠΈΠ½ΡΡΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ PyDERASN ΡΠ°ΠΌΠΎ Π·Π° 28 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ! ΠΠΌΠ° ΠΏΡΠΎΠ΅ΠΊΡ , ΡΠ΅Π»ΡΡ Π±ΡΡΠ·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ ΡΡΡΡΠΊΡΡΡΠΈ: ΡΠΎΠΉ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ° (ΠΈΠ·ΡΡΠ»ΠΎ, Π° Π½Π΅ Π»Π΅Π½ΠΈΠ²ΠΎ) ΡΡΡΠΈΡ ΡΠΎΠ·ΠΈ 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 Π΄ΡΡΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
ΠΠ°ΠΊΡΠΎ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΌΠΎΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΎΡ ΡΠΈΠΏΠ° , , , , PyDERASN Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ , ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π°Π½ ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ° Π½Π° , ΠΈ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅. ΠΠΌΠ° ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° ΠΈ Π² .
, , ΡΠ»Π΅Π½ , Python/Go-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ, Π³Π»Π°Π²Π΅Π½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
