PythonでのGOST暗号化によるPKCS#11トークンのサポート。パートIII-PyKCS11ラッパー

画像それはです あなたを伝えるために時間ロシアの暗号化のサポートが追加されたか PyKCS11プロジェクト。それはすべて、PyKCS11プロジェクトの開発者と潜在的な消費者とのでGOST R34.10-2012アルゴリズムのサポートの可能性についてのやり取りに出くわしたときに始まり ました。この通信で、 PkCS11の作成者は、ロシアの暗号アルゴリズムのサポートは、標準化されるまで含めるつもりはないと述べました。

私が彼にそれをするように頼んだとき、彼は私に同じ考えを表明しました。そして、それを行うだけでなく、適切なプログラムコードを送信しました。



画像



その後、コードをリポジトリにフォークして適切に編集することが可能だと考えました。ロシアの暗号化をサポートするPyKCS11プロジェクトは こちらです。



I.ロシアの暗号アルゴリズムのサポートを追加する



だから何が行われたのか。私は実際にPyKCS11プロジェクトの作者からのヒントの1つに従いました:

私が提案できるのは、GOSTをサポートしてPyKCS11を拡張するために、必要な定数名と関数を使用してPyKCS11_GOST.pyファイルを作成することです。

(GOSTをサポートするためにPyKCS11を拡張する定数と関数の名前を使用してPyKCS11_GOST.pyファイルを作成することをお勧めします。)



TC-26によってPKCS#11に対して承認されたすべての定数は、srcフォルダーに配置された1つのファイルpkcs11t_gost.hに統合されました。

//-26
#define NSSCK_VENDOR_PKCS11_RU_TEAM 0xd4321000 
#define NSSCK_VENDOR_PKSC11_RU_TEAM NSSCK_VENDOR_PKCS11_RU_TEAM
#define CK_VENDOR_PKCS11_RU_TEAM_TC26 NSSCK_VENDOR_PKCS11_RU_TEAM
#define CKK_GOSTR3410_512 	0xd4321003UL
#define CKK_KUZNYECHIK 		0xd4321004UL
#define CKK_MAGMA 		0xd4321005UL
#define CKK_GOSTR3410_256 	0xd4321006UL
#define CKP_PKCS5_PBKD2_HMAC_GOSTR3411_TC26_V1 	0xd4321801UL
#define CKP_PKCS5_PBKD2_HMAC_GOSTR3411_2012_256 0xd4321002UL
#define CKP_PKCS5_PBKD2_HMAC_GOSTR3411_2012_512 0xd4321003UL
#define CKM_GOSTR3410_512_KEY_PAIR_GEN		0xd4321005UL
#define CKM_GOSTR3410_512			0xd4321006UL
#define CKM_GOSTR3410_WITH_GOSTR3411		0x00001202
#define CKM_GOSTR3410_WITH_GOSTR3411_12_256	0xd4321008UL
#define CKM_GOSTR3410_WITH_GOSTR3411_12_512	0xd4321009UL
#define CKM_GOSTR3410_12_DERIVE			0xd4321007UL
#define CKM_GOSR3410_2012_VKO_256		0xd4321045UL
#define CKM_GOSR3410_2012_VKO_512		0xd4321046UL
#define CKM_KDF_4357				0xd4321025UL
#define CKM_KDF_GOSTR3411_2012_256		0xd4321026UL
#define CKM_KDF_TREE_GOSTR3411_2012_256		0xd4321044UL
#define CKM_GOSTR3410_PUBLIC_KEY_DERIVE		0xd432100AUL
#define CKM_LISSI_GOSTR3410_PUBLIC_KEY_DERIVE	0xd4321037UL
#define CKM_GOST_GENERIC_SECRET_KEY_GEN		0xd4321049UL
#define CKM_GOST_CIPHER_KEY_GEN			0xd4321048UL
#define CKM_GOST_CIPHER_ECB			0xd4321050UL
#define CKM_GOST_CIPHER_CBC			0xd4321051UL
#define CKM_GOST_CIPHER_CTR			0xd4321052UL
#define CKM_GOST_CIPHER_OFB			0xd4321053UL
#define CKM_GOST_CIPHER_CFB			0xd4321054UL
#define CKM_GOST_CIPHER_OMAC			0xd4321055UL
#define CKM_GOST_CIPHER_KEY_WRAP		0xd4321059UL
#define CKM_GOST_CIPHER_ACPKM_CTR		0xd4321057UL
#define CKM_GOST_CIPHER_ACPKM_OMAC		0xd4321058UL
#define CKM_GOST28147_PKCS8_KEY_WRAP		0xd4321036UL
#define CKM_GOST_CIPHER_PKCS8_KEY_WRAP		0xd432105AUL
#define CKM_GOST28147_CNT			0xd4321825UL
#define CKM_KUZNYECHIK_KEY_GEN			0xd4321019UL
#define CKM_KUZNYECHIK_ECB			0xd432101AUL
#define CKM_KUZNYECHIK_CBC			0xd432101EUL
#define CKM_KUZNYECHIK_CTR			0xd432101BUL
#define CKM_KUZNYECHIK_OFB			0xd432101DUL
#define CKM_KUZNYECHIK_CFB			0xd432101CUL
#define CKM_KUZNYECHIK_OMAC			0xd432101FUL
#define CKM_KUZNYECHIK_KEY_WRAP			0xd4321028UL
#define CKM_KUZNYECHIK_ACPKM_CTR		0xd4321042UL
#define CKM_KUZNYECHIK_ACPKM_OMAC		0xd4321043UL
#define CKM_MAGMA_KEY_GEN			0xd432102AUL
#define CKM_MAGMA_ECB				0xd4321018UL
#define CKM_MAGMA_CBC				0xd4321023UL
#define CKM_MAGMA_CTR				0xd4321020UL
#define CKM_MAGMA_OFB				0xd4321022UL
#define CKM_MAGMA_CFB				0xd4321021UL
#define CKM_MAGMA_OMAC				0xd4321024UL
#define CKM_MAGMA_KEY_WRAP			0xd4321029UL
#define CKM_MAGMA_ACPKM_CTR			0xd4321040UL
#define CKM_MAGMA_ACPKM_OMAC			0xd4321041UL
#define CKM_GOSTR3411_12_256			0xd4321012UL
#define CKM_GOSTR3411_12_512			0xd4321013UL
#define CKM_GOSTR3411_12_256_HMAC		0xd4321014UL
#define CKM_GOSTR3411_12_512_HMAC		0xd4321015UL
#define CKM_PBA_GOSTR3411_WITH_GOSTR3411_HMAC	0xd4321035UL
#define CKM_TLS_GOST_KEY_AND_MAC_DERIVE		0xd4321033UL
#define CKM_TLS_GOST_PRE_MASTER_KEY_GEN		0xd4321031UL
#define CKM_TLS_GOST_MASTER_KEY_DERIVE		0xd4321032UL
#define CKM_TLS_GOST_PRF			0xd4321030UL
#define CKM_TLS_GOST_PRF_2012_256		0xd4321016UL
#define CKM_TLS_GOST_PRF_2012_512		0xd4321017UL
#define CKM_TLS_TREE_GOSTR3411_2012_256		0xd4321047UL
      
      





このリストには、(GOST R 34.10-2012)GOST R 34.10-2012に準拠した署名の形成と検証、および暗号化(GOST R34.12-2015およびGOSTR 34.13-2015-暗号化アルゴリズムGrasshopperおよびMagma)の両方に必要なメカニズムが含まれています。 。当然、GOST R34.11-2012ハッシュアルゴリズムもここにあります。

GOST定数をモジュールビルドプロセスに含めるには、pkcs11t_gost.hファイルのincludeステートメントをpkcs11.iファイル(SWIGのファイル)に追加する必要があります。

%include "pkcs11t_gost.h"
      
      





オペレーターの前

%include "pkcs11lib.h"
      
      





しかし、それだけではありません。 getMechanismListメソッド(スクリプトPKCS11 / __ init__。py)では、コードがCKM_VENDOR_DEFINEDより大きいメカニズムの出力がブロックされます(これは、PyKCS11プロジェクトの作成者が記述したものとまったく同じです)(0x80000000L)。新しいアルゴリズムのGOST定数はこの制限に該当することに注意してください。少なくともGOSTの場合は削除する必要があるため、getMechanismListメソッドのコードを新しいコードに置き換えます。

    def getMechanismList(self, slot):
        """
        C_GetMechanismList

        :param slot: slot number returned by :func:`getSlotList`
        :type slot: integer
        :return: the list of available mechanisms for a slot
        :rtype: list
        """
        mechanismList = PyKCS11.LowLevel.ckintlist()
        rv = self.lib.C_GetMechanismList(slot, mechanismList)
        if rv != CKR_OK:
            raise PyKCS11Error(rv)
        m = []
#  
#define NSSCK_VENDOR_PKCS11_RU_TEAM 0xd4321000 
        for x in range(len(mechanismList)):
            mechanism = mechanismList[x]
            if mechanism >= CKM_VENDOR_DEFINED:
                if mechanism >= CKM_VENDOR_DEFINED and mechanism < 0xd4321000:
                    k = 'CKM_VENDOR_DEFINED_0x%X' % (mechanism - CKM_VENDOR_DEFINED)
                    CKM[k] = mechanism
                    CKM[mechanism] = k
            m.append(CKM[mechanism])
        return m
#ORIGINAL
#        for x in range(len(mechanismList)):
#            mechanism = mechanismList[x]
#            if mechanism >= CKM_VENDOR_DEFINED:
#                k = 'CKM_VENDOR_DEFINED_0x%X' % (mechanism - CKM_VENDOR_DEFINED)
#                CKM[k] = mechanism
#                CKM[mechanism] = k
#            m.append(CKM[mechanism])
#        return m
      
      







モジュールには、pkcs11 v.2.40のインクルードファイルpkcs11t.hおよびpkcs11t_gost.hで定義されているすべてのメカニズムが含まれていますが、これらのメカニズムのすべてを実装できるわけではないことにも注意してください。問題は、それらのいくつかが特定のパラメータ構造を必要とすることです。これは特に、CK_RSA_PKCS_OAEP_PARAMS構造の形式のパラメーターを必要とするCKM_RSA_PKCS_OAEPメカニズム、およびCK_PKCS5_PBKD2_PARAMS構造の形式のパラメーターを期待するCKM_PKCS5_PBKD2メカニズムに適用されます。他のメカニズムもあります。ただし、作成者は(同じCKM_RSA_PKCS_OAEPに対して)別々のメカニズムに別々の構造を実装しているため、他のメカニズムのパラメーター構造のサポートを実装することは難しくありません。したがって、PKCS#12コンテナーを使用する必要がある場合は、次に、CK_PKCS5_PBKD2_PARAMS構造のサポートを実装する必要があります。

これはすべて、かなり複雑な暗号化メカニズムを指します。

しかし、ハッシュ、電子署名の検証の形成、そして最後に暗号化に関係するすべてのものは、すべてうまく機能します。しかし、最初にプロジェクトをまとめる必要があります。



II。GOSTをサポートするPyKCS11ラッパーの構築



ここでソースコードを取得する必要あることを除いて、ネイティブPkCS11ラッパーのビルドと同じ です

次に、PyKCS11パッケージのビルドとインストールの手順に従います。

テストには、ロシア語の暗号化をサポートするトークンが必要です。ここでは、GOST R34.10-2012およびGOSTR34.11-2012を意味します。これは、RuTokenECP-2.0などのハードウェアトークン、またはソフトウェアトークンまたはクラウドトークンのいずれかです。

cryptoarmpkcsユーティリティを使用して、ソフトウェアトークンをインストールするか、クラウドトークンにアクセスできます。

ここからcryptoarmpkcsユーティリティをダウンロードできます。




ユーティリティを起動した後、



画像



[トークンの作成]タブに移動する必要がありますタブには、トークンを取得してインストールするための手順があります。



III。ロシアのアルゴリズムのテスト



テストには、testGostフォルダーにあるスクリプトを使用できます。

  • ckm_kuznyechik_cbc.py
  • ckm_gostr3411_12_256.py
  • ckm_gostr3410_with_gostr3411_12_256.py
  • ckm_gostr3410_512.py


テストのために、初期データは、対応するGOSTとTK-26の推奨事項の両方から取得されました。

これらのスクリプトでは、次のメカニズムがテストされてい

ます。1。キーペアの生成:

  • CKM_GOSTR3410_512_KEY_PAIR_GEN(GOST R 34.10-2012、キーの長さは1024ビット)
  • CKM_GOSTR3410_KEY_PAIR_GEN(GOST R 34.10-2012、512ビットのキー長)


2.電子署名の形成と検証:

  • CKM_GOSTR3410
  • CKM_GOSTR3410_512
  • CKM_GOSTR3410_WITH_GOSTR3411_12_256


3.ハッシュ:

  • CKM_GOSTR3411_12_256


4.暗号化/復号化

  • CKM_KUZNYECHIK_CBC




キーペアを生成すると、トークン所有者は、証明書要求などに署名できる秘密キーを取得できます。証明書の要求は認証センターに送信でき、そこで証明書を発行できます。証明書の所有者は、秘密鍵が保存されているトークンに証明書をインポートできます。トークンの所有者は、ドキュメントへの署名に使用できる秘密鍵を含む個人証明書を持っています。

特別なセキュリティモードが必要な場合は、MagmaまたはGrasshopperのいずれかのアルゴリズムを使用してドキュメントを暗号化できます。もちろん、トークン自体がこれらのメカニズムをサポートしている場合、PyKCS11パッケージは単なる仲介者です。

これで、Pythonでのロシア語暗号化によるトークンのサポートに関連するストーリーは終わりです。



All Articles