Saatnya
memberi tahu Anda bagaimana dukungan untuk kriptografi Rusia ditambahkan ke
proyek PyKCS11 . Semuanya dimulai ketika saya menemukan
korespondensi antara pengembang proyek PyKCS11 dan calon konsumen tentang kemungkinan dukungan algoritma GOST R 34.10-2012 di dalamnya. Dalam korespondensi ini,
penulis PkCS11 mengatakan bahwa dia tidak akan menyertakan dukungan untuk algoritma kripto Rusia sampai mereka distandarisasi.
Dia mengungkapkan ide yang sama kepada saya ketika saya memintanya untuk melakukannya. Dan tidak hanya untuk melakukannya, tetapi mengirim kode program yang sesuai:
Setelah itu, saya menganggap mungkin untuk memasukkan kode ke dalam repositori saya dan melakukan pengeditan yang sesuai. Proyek PyKCS11 dengan dukungan kriptografi Rusia ada di sini .
I. Menambahkan dukungan untuk algoritme kripto Rusia
Jadi apa yang telah dilakukan. Saya sebenarnya mengikuti salah satu tip dari penulis proyek PyKCS11:
Apa yang dapat saya usulkan kepada Anda adalah membuat file PyKCS11_GOST.py dengan nama dan fungsi konstan yang Anda inginkan untuk memperluas PyKCS11 dengan dukungan GOST.
(Saya mungkin menyarankan Anda membuat file PyKCS11_GOST.py dengan nama konstanta dan fungsi yang ingin Anda kembangkan PyKCS11 untuk mendukung GOST.)
Semua konstanta yang disetujui oleh TC-26 untuk PKCS # 11 telah digabungkan menjadi satu file pkcs11t_gost.h, ditempatkan di folder src:
//-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
Daftar ini mencakup mekanisme yang diperlukan untuk pembentukan dan verifikasi tanda tangan sesuai dengan (GOST R 34.10-2012) GOST R 34.10-2012, dan enkripsi (GOST R 34.12-2015 dan GOST R 34.13-2015 - algoritma enkripsi Belalang dan Magma) . Secara alami, algoritma hashing GOST R 34.11-2012 juga ada di sini.
Agar konstanta GOST disertakan dalam proses pembuatan modul, Anda perlu menambahkan pernyataan include ke file pkcs11t_gost.h ke file pkcs11.i (file untuk SWIG)
%include "pkcs11t_gost.h"
di depan operator
%include "pkcs11lib.h"
Tapi itu belum semuanya. Dalam metode getMechanismList (skrip PKCS11 / __ init__.py), keluaran dari mekanisme yang kodenya lebih besar dari CKM_VENDOR_DEFINED diblokir (inilah yang ditulis oleh penulis proyek PyKCS11) (0x80000000L). Perhatikan bahwa konstanta GOST untuk algoritme baru termasuk dalam batasan ini. Anda harus menghapusnya setidaknya untuk GOST, jadi kami akan mengganti kode metode getMechanismList dengan yang baru:
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
Perhatikan juga bahwa meskipun modul menyertakan semua mekanisme yang ditentukan dalam file include pkcs11t.h dan pkcs11t_gost.h untuk pkcs11 v.2.40, tidak semua mekanisme ini dapat diterapkan. Masalahnya adalah beberapa di antaranya memerlukan struktur parameter tertentu. Ini berlaku khususnya untuk mekanisme CKM_RSA_PKCS_OAEP, yang memerlukan parameter dalam bentuk struktur CK_RSA_PKCS_OAEP_PARAMS, dan untuk mekanisme CKM_PKCS5_PBKD2, yang mengharapkan parameter dalam bentuk struktur CK_PKCS5_PBKD2_PARAMS. Ada mekanisme lain juga. Tetapi karena penulis telah mengimplementasikan struktur terpisah untuk mekanisme terpisah (untuk CKM_RSA_PKCS_OAEP yang sama), tidak akan sulit untuk mengimplementasikan dukungan untuk struktur parameter untuk mekanisme lain. Jadi, jika ada yang perlu bekerja dengan wadah PKCS # 12,maka Anda harus mengimplementasikan dukungan untuk struktur CK_PKCS5_PBKD2_PARAMS.
Semua ini mengacu pada mekanisme kriptografi yang agak kompleks.
Tapi semua yang menyangkut hashing, pembentukan verifikasi tanda tangan elektronik, dan akhirnya, enkripsi, semuanya berfungsi dengan baik. Tapi pertama-tama Anda perlu menyusun proyek.
II. Membangun pembungkus PyKCS11 dengan dukungan GOST
Ini tidak berbeda dengan membuat pembungkus PkCS11 asli, kecuali Anda perlu mendapatkan kode sumbernya di sini .
Selanjutnya, ikuti petunjuk untuk membuat dan menginstal paket PyKCS11.
Pengujian membutuhkan token dengan dukungan kriptografi Rusia. Di sini kami maksud GOST R 34.10-2012 dan GOST R 34.11-2012. Ini bisa berupa token perangkat keras, misalnya RuTokenECP-2.0, atau perangkat lunak atau token cloud.
Anda dapat menginstal token perangkat lunak atau mengakses token cloud menggunakan utilitas cryptoarmpkcs.
Setelah memulai utilitas, Anda harus pergi ke
tab "Buat token": Di tab tersebut Anda dapat menemukan petunjuk untuk mendapatkan dan menginstal token.
AKU AKU AKU. Menguji algoritme Rusia
Untuk pengujian, Anda dapat menggunakan skrip yang ada di folder testGost:
- ckm_kuznyechik_cbc.py
- ckm_gostr3411_12_256.py
- ckm_gostr3410_with_gostr3411_12_256.py
- ckm_gostr3410_512.py
Untuk pengujian, data awal diambil dari GOST yang sesuai dan dari rekomendasi TK-26.
Mekanisme berikut diuji dalam skrip ini:
1. Pembuatan pasangan kunci:
- CKM_GOSTR3410_512_KEY_PAIR_GEN (GOST R 34.10-2012 dengan panjang kunci 1024 bit)
- CKM_GOSTR3410_KEY_PAIR_GEN (GOST R 34.10-2012 dengan panjang kunci 512 bit)
2. Pembentukan dan verifikasi tanda tangan elektronik:
- CKM_GOSTR3410
- CKM_GOSTR3410_512
- CKM_GOSTR3410_WITH_GOSTR3411_12_256
3. Hashing:
- CKM_GOSTR3411_12_256
4. Enkripsi / Dekripsi
- CKM_KUZNYECHIK_CBC
Membuat pasangan kunci memungkinkan pemegang token mendapatkan kunci pribadi yang dapat ditandatanganinya, misalnya, permintaan sertifikat. Permintaan sertifikat dapat dikirim ke pusat sertifikasi dan sertifikat dapat dikeluarkan di sana. Pemilik sertifikat dapat mengimpornya ke token tempat penyimpanan kunci privat. Pemilik token sekarang memiliki sertifikat pribadi dengan kunci pribadi yang dapat dia gunakan untuk menandatangani dokumen.
Nah, jika dia membutuhkan security mode khusus, maka dia bisa mengenkripsi dokumen tersebut menggunakan salah satu algoritma yaitu Magma atau Belalang. Semua ini, tentu saja, jika token itu sendiri mendukung mekanisme ini, paket PyKCS11 hanyalah perantara.
Ini menyimpulkan cerita kami terkait dengan dukungan token dengan kriptografi Rusia dengan Python.