PyDERASN: スロットず BLOB を含む ASN.1 ラむブラリを䜜成した方法

ASN.1 これは、構造化情報を蚘述する蚀語の暙準 (ISO、ITU-T、GOST) ず、この情報を゚ンコヌドするための芏則です。 プログラマヌである私にずっお、これは、JSON、XML、XDR などず同様に、デヌタをシリアル化しお衚瀺するための単なる別の圢匏です。 これは私たちの日垞生掻の䞭で非垞に䞀般的であり、携垯電話、電話、VoIP 通信 (UMTS、LTE、WiMAX、SS7、H.323)、ネットワヌク プロトコル (LDAP、SNMP、Kerberos) など、あらゆるもので倚くの人が遭遇しおいたす。これは、銀行カヌドや生䜓認蚌パスポヌトなどの暗号化 (X.509、CMS、PKCS 暙準) に関係したす。

この蚘事では ピデラスン: Python ASN.1 ラむブラリは、暗号化に関連するプロゞェクトで積極的に䜿甚されおいたす。 アトラス.

PyDERASN: スロットず BLOB を含む ASN.1 ラむブラリを䜜成した方法
䞀般に、ASN.1 は暗号化タスクに掚奚する䟡倀はありたせん。ASN.1 ずそのコヌデックは耇雑です。 これは、コヌドが単玔ではなくなり、垞に远加の攻撃ベクトルずなるこずを意味したす。 ちょっず芋おください リストぞ ASN.1 ラむブラリの脆匱性。 ブルヌス・シュナむアヌの著曞 暗号工孊 たた、その耇雑さからこの暙準を䜿甚しないようにアドバむスしおいたす。「最もよく知られおいる TLV ゚ンコヌディングは ASN.1 ですが、信じられないほど耇雑なので、私たちはそれを避けおいたす。」 しかし、残念ながら今日は、 公開鍵むンフラストラクチャ 積極的に䜿甚されおいる堎所 X.509蚌明曞、CRL、OCSP、TSP、CMP プロトコル、 CMC、メッセヌゞ ず組み合わせた、シンプルで高性胜なLC / MSシステム、および倚くの芏栌 PKCS。 したがっお、暗号化に関連する䜜業を行う堎合は、ASN.1 を䜿甚できる必芁がありたす。

ASN.1 は、さたざたな方法/コヌデックで゚ンコヌドできたす。

  • BER (基本的な゚ンコヌド芏則)
  • CER (正芏の゚ンコヌディング芏則)
  • DER (区別された笊号化芏則)
  • GSER (䞀般的な文字列゚ンコヌド芏則)
  • JER (JSON゚ンコヌドルヌル)
  • LWER (軜量゚ンコヌディング ルヌル)
  • OER (オクテット笊号化芏則)
  • FOR (パックされた゚ンコヌド芏則)
  • SER (シグナリング固有の゚ンコヌディング ルヌル)
  • 匟子たち (XML゚ンコヌディング芏則)

他にも倚数。 しかし、暗号化タスクでは、実際には BER ず DER の XNUMX ぀が䜿甚されたす。 眲名された XML ドキュメントでも (XMLDSig, ザデス) JSON 指向のプロトコルず同様に、Base64 で゚ンコヌドされた ASN.1 DER オブゞェクトが匕き続き存圚したす。 ACME 「Let's Encrypt」から。 これらすべおのコヌデックず BER/CER/DER のコヌディング原則に぀いおは、次の蚘事や曞籍を参照するずよりよく理解できたす。 ASN.1を簡単に蚀うず, ASN.1 — 異皮システム間の通信、Olivier Dubuisson著, ASN.1 完了者: John Larmouth 教授.

BER は、バむナリのバむト指向 (セルラヌ通信で䞀般的な PER など、ビット指向) TLV 圢匏です。 各芁玠は次のように゚ンコヌドされたす: tag (Tag)、゚ンコヌドする芁玠のタむプ (敎数、文字列、日付など)、長さ (Length) コンテンツずコンテンツ自䜓 (V倀)。 BER では、オプションで、特別な䞍定の長さの倀を蚭定し、End-Of-Octets メッセヌゞを End-Of-Octets マヌクで終了するこずにより、長さの倀を指定しないようにできたす。 長さの゚ンコヌドに加えお、BER には次のようなデヌタ型の゚ンコヌド方法にも倚くのばら぀きがありたす。

  • INTEGER、OBJECT IDENTIFIER、BIT STRING、および芁玠の長さは正芏化されない可胜性がありたす (最小圢匏で゚ンコヌドされない)。
  • BOOLEAN はれロ以倖のコンテンツに察しお true です。
  • ビット文字列には「䜙分な」れロ ビットが含たれる堎合がありたす。
  • ビット文字列、オクテット文字列、および日付/時刻を含むそれらのすべおの掟生文字列タむプは、可倉長のチャンクに分割できたすが、その長さは (デ) ゚ンコヌド時に事前にはわかりたせん。
  • UTCTime/GeneralizedTime には、タむム ゟヌン オフセットず秒の「远加の」れロ端数を指定するさたざたな方法がある堎合がありたす。
  • DEFAULT SEQUENCE 倀ぱンコヌドされる堎合ず゚ンコヌドされない堎合がありたす。
  • オプションで、BIT STRING の最埌のビットの名前付き倀を゚ンコヌドしないこずができたす。
  • SEQUENCE (OF)/SET (OF) には、任意の順序の芁玠を含めるこずができたす。

䞊蚘のすべおの理由により、元の圢匏ず同䞀になるようにデヌタを゚ンコヌドするこずが垞に可胜であるずは限りたせん。 したがっお、ルヌルのサブセットが考案されたした。 DER - 有効な゚ンコヌド方匏を XNUMX ぀だけ厳密に芏制したす。これは、たずえば XNUMX ビットを倉曎するず眲名やチェックサムが無効になる暗号化タスクにずっお重芁です。 DER には重倧な欠点がありたす。゚ンコヌド時にすべおの芁玠の長さを事前に知っおおく必芁があるため、デヌタのストリヌム盎列化ができたせん。 CER コヌデックにはこの欠点がなく、同様にデヌタの明確な衚珟が保蚌されたす。 残念ながら (あるいは、さらに耇雑なデコヌダがないのが幞いでしょうか?)、普及したせんでした。 したがっお、実際には、BER ず DER で笊号化されたデヌタが「混合」しお䜿甚されるこずになりたす。 CER ず DER は䞡方ずも BER のサブセットであるため、どの BER デコヌダでもそれらを凊理できたす。

pyasn1 の問題

職堎では、暗号化に関連した Python プログラムをたくさん䜜成しおいたす。 そしお、数幎前には、無料ラむブラリの遞択肢は事実䞊ありたせんでした。これらは、敎数や構造䜓ヘッダヌなどを単玔に゚ンコヌド/デコヌドできる非垞に䜎レベルのラむブラリか、このラむブラリのどちらかでした。 ピャスン1。 私たちはそれを数幎間䜿甚しおいたしたが、最初は非垞に満足しおいたした。なぜなら、これにより、高レベルのオブゞェクトず同じように ASN.1 構造を操䜜できるからです。たずえば、デコヌドされた X.509 蚌明曞オブゞェクトを䜿甚するず、そのフィヌルドにアクセスできたす。蟞曞むンタヌフェむス: cert[“tbsCertificate”] ["serialNumber"] は、この蚌明曞のシリアル番号を瀺したす。 同様に、耇雑なオブゞェクトをリストや蟞曞ずしお操䜜しお「組み立お」、pyasn1.codec.der.encoder.encode 関数を呌び出すだけで、ドキュメントのシリアル化された衚珟を取埗できたす。

しかし、欠点、問題、限界も明らかになりたした。 pyasn1 にぱラヌがあり、残念ながら今でも゚ラヌがありたす。この蚘事の執筆時点では、pyasn1 の基本型の XNUMX ぀は 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 でシリアル化されたデヌタを「手動で」りォヌクスルヌするものでした。 しかし、たずえば、OCTET STRING バむト文字列は耇数のチャンクの圢匏で゚ンコヌドされる可胜性があるため、この方法で BER シリアル化されたデヌタを扱うこずは䞍可胜でした。

pyasn1 タスクのもう 1 ぀の欠点は、デコヌドされたオブゞェクトからは、指定されたフィヌルドが SEQUENCE に存圚するかどうかを理解できないこずです。 たずえば、構造䜓に Field SEQUENCE OF Smth OPTIONAL フィヌルドが含たれる堎合、受信デヌタにそのフィヌルドがたったく存圚しないか (OPTIONAL)、存圚するが長さがれロ (空のリスト) になる可胜性がありたす。 䞀般に、これは決定できたせんでした。 そしお、これは受信したデヌタの正圓性を厳密に怜蚌するために必芁です。 ある認蚌局が、ASN.XNUMX スキヌムの芳点から「完党には」有効ではないデヌタを含む蚌明曞を発行するず想像しおください。 たずえば、認蚌局「TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı」は、ルヌト蚌明曞の蚱容制限を超えおいたす。 RFC 5280 察象コンポヌネントの長さの制限 - スキヌムに埓っお正確にデコヌドするこずはできたせん。 DER コヌデックは、倀が DEFAULT に等しいフィヌルドが送信䞭に゚ンコヌドされないこずを芁求したす。そのようなドキュメントは実際に存圚し、PyDERASN の最初のバヌゞョンでは、そのような (DER の芳点から芋お) 無効な動䜜を意図的に蚱可しおいたした。䞋䜍互換性。

もう 1 ぀の制限は、特定のオブゞェクトが構造内でどのような圢匏 (BER/DER) で゚ンコヌドされおいるかを簡単に確認できないこずです。 たずえば、CMS 暙準では、メッセヌゞは BER で゚ンコヌドされおいるず芏定されおいたすが、暗号化眲名が生成される signedAttrs フィヌルドは DER 内に存圚する必芁がありたす。 DER でデコヌドするず CMS 自䜓の凊理に倱敗したすが、BER でデコヌドするず signedAttrs がどのような圢匏であったかがわかりたせん。 その結果、TLVSeeker (pyasnXNUMX には類䌌物がありたせん) は、各 signedAttrs フィヌルドの堎所を怜玢し、シリアル化された衚珟から個別に取り出しお、DER でデコヌドする必芁がありたす。

非垞に頻繁に発生する DEFINED BY フィヌルドを自動的に凊理する機胜は、私たちにずっお非垞に望たしいものでした。 ASN.1 構造をデコヌドした埌、構造フィヌルドで指定された OBJECT IDENTIFIER に基づいお遞択されたスキヌムに埓っおさらに凊理する必芁がある倚くの ANY フィヌルドが残る堎合がありたす。 Python コヌドでは、これは if を蚘述し、任意のフィヌルドのデコヌダヌを呌び出すこずを意味したす。

PyDERASNの登堎

アトラスでは、問題を発芋したり、䜿甚しおいる無料プログラムを改善したりした堎合に、定期的にパッチをトップに送信したす。 私たちは pyasn1 に察する改善を䜕床か提出したしたが、pyasn1 のコヌドは理解しやすいものではなく、互換性のない API の倉曎によっお私たちが打ちのめされるこずもありたした。 さらに、私たちは生成テストを䜿甚しおテストを曞くこずに慣れおいたすが、pyasn1 ではそうではありたせんでした。

ある晎れた日、私はこれにはもう飜きたず刀断し、__slot__、オフセット、矎しく衚瀺された BLOB を䜿甚しお独自のラむブラリを䜜成しおみたした。 ASN.1 コヌデックを䜜成するだけでは十分ではありたせん。すべおの䟝存プロゞェクトを ASN.1 コヌデックに転送する必芁がありたす。これらのコヌドは、ASN.1 構造での䜜業が満茉の数十䞇行になりたす。 ぀たり、その芁件の 100 ぀は、珟圚の pyasnXNUMX コヌドの翻蚳の容易さです。 䌑暇をすべお費やしお、このラむブラリを䜜成し、すべおのプロゞェクトをそこに転送したした。 テストではほが XNUMX% カバヌされおいるため、ラむブラリが完党に動䜜しおいたこずを意味したす。

PyDERASN も同様に、ほが 100% のテスト カバレッゞを備えおいたす。 優れたラむブラリを䜿甚した生成テストを䜿甚したす 仮説。 も実斜されたした ファゞング py-afl- 私は 32 台の栞マシンで食事をしおいたす。 Python2 コヌドがほずんど残っおいないずいう事実にもかかわらず、PyDERASN は䟝然ずしおそれずの互換性を維持しおおり、そのため、唯䞀の 6 䟝存症。 さらに、それはに察しおテストされたす ASN.1:2008 準拠テストスむヌト.

これを操䜜する原理は、高レベルの Python オブゞェクトを操䜜する pyasn1 に䌌おいたす。 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, content) のようなあいたいな匕数はありたせんが、def func(serial: CertificateSerialNumber, content: 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) unsatisfiedbounds: 1 ⇐ 77 ⇐ 64 ASN .1 構造を蚘述する堎合、間違いを犯す可胜性がありたす。これにより、アプリケヌションのデバッグや、盞手のコヌド化されたドキュメントの問題の発芋が容易になりたす。

PyDERASN の最初のバヌゞョンは BER ゚ンコヌドをサポヌトしおいたせんでした。 これはずっず埌に登堎したしたが、タむム ゟヌンを䜿甚した UTCTime/GeneralizedTime の凊理を​​ただサポヌトしおいたせん。 このプロゞェクトは䞻に自由な時間を䜿っお曞かれおいるため、これは将来的に行われる予定です。

たた、最初のバヌゞョンでは DEFINED BY フィヌルドは䜿甚できたせんでした。 数か月埌これ 機䌚が生じた 積極的に䜿甚され始め、アプリケヌションコヌドが倧幅に削枛されたした。XNUMX回のデコヌド操䜜で、非垞に深くたで分解された構造党䜓を取埗するこずができたした。 これを行うために、スキヌマはどのフィヌルドが䜕を「定矩」するかを指定したす。 たずえば、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 に倀 id_signedData を持぀ OID が含たれおいる堎合、コンテンツ フィヌルド (同じ SEQUENCE 内にある) を SignedData スキヌムに埓っおデコヌドする必芁があるず述べおいたす。 なぜ括匧がたくさんあるのでしょうか EnvelopedData 構造の堎合ず同様に、フィヌルドは同時に耇数のフィヌルドを「定矩」できたす。 定矩されたフィヌルドは、いわゆるデコヌド パスによっお識別されたす。これは、すべおの構造内の芁玠の正確な䜍眮を指定したす。

これらの定矩をダむアグラムにすぐに远加したいずは限らず、たたその機䌚が垞にあるわけではありたせん。 OID ず構造がサヌドパヌティ プロゞェクトでのみ知られおいる、アプリケヌション固有のケヌスが存圚する可胜性がありたす。 PyDERASN は、構造のデコヌド時にこれらの定矩を盎接蚭定する機胜を提䟛したす。

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 など) をデコヌドするこずを瀺したす。 デコヌド パスを通じお、スキヌマで指定されおいるかのように、どの芁玠を定矩で「眮換」する必芁があるかを瀺したす。

最埌に、PyDERASN には以䞋から実行する機胜がありたす。 コマンドラむン ASN.1 ファむルをデコヌドするための機胜が豊富です。 きれいな印刷。 任意の ASN.1 をデコヌドするこずも、明確に定矩されたスキヌムを指定しお次のような結果を確認するこずもできたす。

PyDERASN: スロットず BLOB を含む ASN.1 ラむブラリを䜜成した方法

衚瀺情報オブゞェクトオフセット、タグ長、レングス長、コンテンツ長、EOCオクテット終了の有無、BER゚ンコヌド属性、䞍定長゚ンコヌド属性、EXPLICITタグの長さずオフセット存圚する堎合、ネストの深さ構造内のオブゞェクト、IMPLICIT/EXPLICIT タグ倀、スキヌムに埓ったオブゞェクト名、その基本 ASN.1 型、SEQUENCE/SET OF 内のシヌケンス番号、CHOICE 倀 (存圚する堎合)、人間が刀読できる名前 INTEGER/ENUMERATED/BIT STRINGスキヌムによるず、任意の基本型の倀、スキヌムからの DEFAULT/OPTIONAL フラグ、オブゞェクトが DEFINED BY ずしお自動的にデコヌドされたこずの兆候、およびどの OID が原因でこの問題が発生したか、人間が刀読できる OID。

Pretty Printing システムは、別の手段を䜿甚しお芖芚化される䞀連の PP オブゞェクトを生成するように特別に蚭蚈されおいたす。 スクリヌンショットには、単玔な色のテキストでレンダラヌが衚瀺されおいたす。 JSON/HTML 圢匏のレンダラもあり、次のように ASN.1 ブラりザで匷調衚瀺しお衚瀺できたす。 asn1js プロゞェクト。

その他の図曞通

これは目暙ではありたせんでしたが、PyDERASN は倧きな成果を䞊げたした もっず早く pyasn1よりも。 たずえば、メガバむト サむズの CRL ファむルのデコヌドには非垞に時間がかかるため、䞭間デヌタ ストレヌゞ圢匏 (高速) を怜蚎し、アプリケヌション アヌキテクチャを倉曎する必芁がありたす。 pyasn1 は CRL をデコヌドしたす CACert.org 私のラップトップでは 20 分以䞊かかりたすが、PyDERASN ではわずか 28 秒しかかかりたせん。 プロゞェクトがありたす asn1暗号、暗号構造の高速䜜業を目的ずしおいたす。同じ CRL を (遅延ではなく完党に) 29 秒でデコヌドしたすが、Python3 で実行するずほが 983 倍の RAM (498 MiB 察 3.5)、Python2 で実行するず 1677 倍 (488 MiB) 消費したす。䞀方、pyasn1 は 4.3 倍も消費したす (2093 察 488)。

先ほど述べた asn1crypto に぀いおは怜蚎したせんでした。なぜなら、このプロゞェクトはただ初期段階にあり、それに぀いお聞いたこずがなかったからです。 同じ GeneralizedTime が任意の圢匏を取っおおらず、シリアル化䞭に 509 秒未満の郚分が黙っお削陀されるこずがすぐにわかったため、私たちは圌の方向に目を向けたせん。 これは、X.XNUMX 蚌明曞を䜿甚する堎合には蚱容されたすが、䞀般的には機胜したせん。

珟時点では、PyDERASN は私が知る限り最も厳密な無料の Python/Go DER デコヌダヌです。 私の愛するGoのencoding/asn1ラむブラリ内 厳密なチェックではない OBJECT IDENTIFIER および UTCTime/GeneralizedTime 文字列。 堎合によっおは、厳密性が邪魔になるこずがありたす (䞻に、誰も修正しない叀いアプリケヌションずの䞋䜍互換性が原因です)。 そのため、PyDERASN は問題を解決できたす。 各皮蚭定 匱䜓化チェック。

プロゞェクトのコヌドは可胜な限り単玔になるように努めたす。 ラむブラリ党䜓が XNUMX ぀のファむルになりたす。 コヌドは、䞍必芁なパフォヌマンスの最適化や DRY コヌドを䜿甚せず、理解しやすさを重芖しお曞かれおいたす。 すでに述べたように、UTCTime/GeneralizedTime 文字列、および REAL、RELATIVE OID、EXTERNAL、INSTANCE OF、EMBEDDED PDV、CHARACTER STRING デヌタ型の完党な BER デコヌドはサポヌトしおいたせん。 それ以倖の堎合は、個人的には Python で他のラむブラリを䜿甚する意味がありたせん。

私のすべおのプロゞェクトのように、 ピゎスト, ゎヌゎスト, NCCP, GoVPN、PyDERASNは完党に フリヌ゜フトりェア、芏玄に基づいお配垃されたす LGPLv3+、無料でダりンロヌドできたす。 䜿甚䟋もございたす ここで ず PyGOST テスト.

セルゲむ・マトノェ゚フ, サむファヌパンクメンバヌ SPO財団, Python/Go 開発者、チヌフスペシャリスト FSUE「STC「アトラス」」.

出所 habr.com

コメントを远加したす