Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ
ΠΠΎΠΎΠ±ΡΠ΅-ΡΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ ASN.1 Π΄Π»Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π·Π°Π΄Π°Ρ Π½Π΅ ΡΡΠΎΠΈΡ: 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-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ
(
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 Π±ΡΠ»ΠΈ ΠΈ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π΄ΠΎ ΡΠΈΡ
ΠΏΠΎΡ ΠΎΡΡΠ°ΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ: Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΠΈ, Π² 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Δ±Β» Π² ΡΠ²ΠΎΡΠΌ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ΅ Π²ΡΡΠ΅Π» Π·Π° Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅
ΠΡΡ ΠΎΠ΄Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ β Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π»Π΅Π³ΠΊΠΎ ΡΠ·Π½Π°ΡΡ, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ (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%-ΠΎΠ΅ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ ΡΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ
ΠΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ 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 ΠΊΠΎΠ΄, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈ
ΠΡΠΈ ΡΡΠΎΠΌ Π² 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 ΠΏΠΎΠ»ΡΠΌΠΈ. Π§Π΅ΡΠ΅Π· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΡΠ΅Π² ΡΡΠ°
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 ΠΈΠΌΠ΅Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈΠ·
ΠΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π΄Π»ΠΈΠ½Π° ΡΡΠ³Π°, Π΄Π»ΠΈΠ½Π° Π΄Π»ΠΈΠ½Ρ, Π΄Π»ΠΈΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ, Π½Π°Π»ΠΈΡΠΈΠ΅ 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 ΠΊΠ°ΠΊ Π²
ΠΡΡΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
ΠΡΠΎ Π½Π΅ Π±ΡΠ»ΠΎ ΡΠ΅Π»ΡΡ, Π½ΠΎ PyDERASN ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ
asn1crypto, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ», ΠΌΡ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠΎΠΆΠ΄Π°Π»ΡΡ, ΠΈ ΠΌΡ Π½Π΅ ΡΠ»ΡΡΠ°Π»ΠΈ ΠΏΡΠΎ Π½Π΅Π³ΠΎ. Π‘Π΅ΠΉΡΠ°Ρ Π±Ρ ΡΠΎΠΆΠ΅ Π½Π΅ ΡΡΠ°Π»ΠΈ ΡΠΌΠΎΡΡΠ΅ΡΡ Π² Π΅Π³ΠΎ ΡΡΠΎΡΠΎΠ½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΡ ΡΡΠ°Π·Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΡΠΎΡ ΠΆΠ΅ GeneralizedTime ΠΎΠ½ Π½Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, Π° ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ½ ΠΌΠΎΠ»ΡΠ° ΡΠ±ΠΈΡΠ°Π΅Ρ Π΄ΠΎΠ»ΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΠΎ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ X.509 ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°ΠΌΠΈ, Π½ΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ.
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, PyDERASN ΡΠ°ΠΌΡΠΉ ΡΡΡΠΎΠ³ΠΈΠΉ ΠΈΠ· ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ
Python/Go DER-Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠΎΠ² ΠΌΠ½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
. Π encoding/asn1 Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΌΠ½ΠΎΡ Π»ΡΠ±ΠΈΠΌΠΎΠ³ΠΎ Go
ΠΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΡΠ°ΡΠ°Π΅ΡΡΡ Π±ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌ. ΠΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° β ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ». ΠΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½ Ρ ΡΠΏΠΎΡΠΎΠΌ Π½Π° ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, Π±Π΅Π· ΠΈΠ·Π»ΠΈΡΠ½ΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ DRY-ΠΊΠΎΠ΄Π°. Π Π½ΡΠΌ Π½Π΅Ρ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ BER-Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ UTCTime/GeneralizedTime ΡΡΡΠΎΠΊ, Π° ΡΠ°ΠΊΠΆΠ΅ REAL, RELATIVE OID, EXTERNAL, INSTANCE OF, EMBEDDED PDV, CHARACTER STRING ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ . ΠΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ Π»ΠΈΡΠ½ΠΎ Ρ Π½Π΅ Π²ΠΈΠΆΡ ΡΠΌΡΡΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Python Π΄ΡΡΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
ΠΠ°ΠΊ ΠΈ Π²ΡΠ΅ ΠΌΠΎΠΈ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΡΠΈΠΏΠ°
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com