Fitur kluster instans HSM dari Cloud Hardware Security Module (CloudHSM) memungkinkan Anda mengelompokkan instans HSM yang melayani tujuan bisnis yang sama di berbagai zona ketersediaan dalam satu Wilayah. Aplikasi Anda kemudian dapat menggunakan algoritma polling untuk memilih HSM yang sesuai dan melakukan operasi kriptografi dengan kunci yang sama. Arsitektur ini menjamin kelangsungan bisnis, ketersediaan tinggi untuk komputasi kriptografi, load balancing, serta skalabilitas horizontal bagi aplikasi Anda. Topik ini menjelaskan cara menggunakan kluster instans HSM.
Untuk membuat kluster HSM untuk instans perangkat keras KMS, lihat Konfigurasikan kluster HSM untuk instans perangkat keras KMS.
Metode sinkronisasi kluster
Sinkronisasi kluster mereplikasi data, seperti kunci, sertifikat SSL, dan informasi pengguna, dari HSM utama ke HSM anak. Metode sinkronisasi kluster tergantung pada kapan Anda membeli HSM:
Untuk HSM yang dibeli pada atau setelah 9 Januari 2025: Saat Anda membuat kluster, metode sinkronisasi kluster secara default menggunakan sinkronisasi otomatis. Anda tidak perlu melakukan sinkronisasi kluster secara manual ketika data pada HSM utama berubah.
Untuk HSM yang dibeli sebelum 9 Januari 2025: Saat Anda membuat kluster, metode sinkronisasi kluster secara default menggunakan sinkronisasi manual. Anda harus melakukan sinkronisasi kluster secara manual setiap kali data pada HSM utama berubah. Untuk meningkatkan kluster ke sinkronisasi otomatis, hubungi kami.
PeringatanPeningkatan ini bersifat ireversibel dan melibatkan risiko berikut. Kami sangat menyarankan untuk melakukan peningkatan ini selama jam sepi.
Untuk pengguna instans manajemen kunci perangkat keras KMS:
Operasi control plane: Operasi seperti membuat dan menghapus kunci tidak didukung selama peningkatan. Operasi tersebut akan dilanjutkan secara otomatis setelah peningkatan selesai.
Operasi data plane: Operasi seperti enkripsi dan dekripsi tidak terpengaruh selama peningkatan.
Untuk pengguna lainnya: Anda harus meningkatkan HSM SDK yang digunakan oleh aplikasi Anda.
Operasi control plane: Operasi seperti membuat dan menghapus kunci tidak didukung selama peningkatan. Operasi tersebut akan dilanjutkan secara otomatis setelah peningkatan selesai.
Operasi data plane: Untuk beberapa arsitektur bisnis, terdapat risiko gangguan layanan selama peningkatan.
Prasyarat
-
Anda telah membeli mesin kriptografi. Untuk informasi lebih lanjut, lihat Beli Mesin Kriptografi.
-
Beli instans ECS yang menjalankan Windows dan ditempatkan di VPC yang sama dengan instans HSM. Untuk informasi lebih lanjut, lihat Panduan Cepat untuk instans ECS berbasis Windows.
CatatanAnda menggunakan instans ECS ini untuk menginstal tool manajemen HSM, bukan sebagai server bisnis.
Langkah 1: Buat dan aktifkan kluster
Kluster terdiri dari satu HSM utama dan beberapa HSM anak. Semua HSM dalam satu kluster harus berada dalam VPC yang sama, tetapi dapat ditempatkan di subnet yang sama atau berbeda.
Jika Anda telah mengonfigurasi pengaturan kluster saat membeli instans GVSM, Cloud Hardware Security Module akan secara otomatis membuat kluster berdasarkan pengaturan tersebut. Lewati langkah ini.
Aktifkan instans HSM utama.
-
Buka halaman VSMs di Konsol CloudHSM. Di bilah navigasi atas, pilih Wilayah tujuan.
-
Di halaman VSMs, temukan instans HSM yang telah Anda buat. Di kolom Actions, klik Enable.
-
Di kotak dialog Configure HSM Instance, konfigurasikan instans HSM lalu klik OK. Setelah konfigurasi berhasil, Status instans HSM berubah menjadi Enabled.
Parameter
Deskripsi
VPC ID
Pilih VPC tempat instans HSM disambungkan.
PentingVPC ini harus sama dengan VPC yang disambungkan ke instans ECS Anda.
VPC Subnet
Pilih Blok CIDR subnet VPC tempat instans HSM berada.
Private IP Address
Tetapkan alamat IP pribadi untuk instans HSM.
Penting-
Alamat IP pribadi harus termasuk dalam Blok CIDR subnet VPC. Jika tidak, konfigurasi akan gagal.
-
Alamat IP yang berakhiran 253, 254, atau 255 adalah alamat IP cadangan sistem. Jangan gunakan alamat tersebut.
Configure HSM Whitelist
Konfigurasikan daftar putih untuk mengakses instans HSM. Anda dapat memasukkan satu alamat IP atau Blok CIDR per baris. Anda dapat memasukkan hingga 10 entri.
-
Jika tidak ada daftar putih yang dikonfigurasi, semua alamat IP dapat mengakses instans HSM.
-
Jika daftar putih dikonfigurasi, hanya permintaan dari alamat IP dalam daftar putih yang diizinkan. Permintaan dari alamat IP lainnya ditolak.
Penting-
Jika Anda membuat kluster HSM dan mengonfigurasi daftar putih untuk kluster tersebut, daftar putih kluster memiliki prioritas lebih tinggi daripada daftar putih instans HSM individual dalam kluster.
Contohnya, jika daftar putih instans HSM dalam kluster adalah 10.10.10.10 dan daftar putih kluster adalah 172.16.0.1, Anda hanya dapat mengakses instans HSM dari 172.16.0.1.
-
Anda tidak dapat mengonfigurasi 0.0.0.0/0 (untuk mengizinkan semua alamat IP sumber).
Demi alasan keamanan, kami tidak menyarankan mengizinkan semua alamat IP sumber. Untuk mengizinkan semua alamat IP sumber untuk pengujian sementara, biarkan daftar putih kosong.
-
-
Buat kluster HSM.
Temukan instans HSM utama dan klik Create Cluster di kolom Actions.
Di panel Create and Activate Cluster, konfigurasikan kluster.
Parameter
Deskripsi
Cluster Name
Masukkan nama kustom untuk kluster. Nama harus unik dan tidak boleh melebihi 24 karakter.
Configure Whitelist
Tentukan alamat IP yang dapat mengakses kluster. Jika tidak ada daftar putih yang dikonfigurasi, semua alamat IP dapat mengakses kluster. Jika daftar putih dikonfigurasi, permintaan dari alamat IP di luar daftar putih akan ditolak.
Anda dapat memasukkan satu alamat IP atau Blok CIDR per baris. Anda dapat memasukkan hingga 10 entri.
Penting-
Daftar putih kluster memiliki prioritas lebih tinggi daripada daftar putih instans HSM individual dalam kluster. Contohnya, jika daftar putih instans HSM dalam kluster adalah 10.10.10.10 dan daftar putih kluster adalah 172.16.0.1, Anda hanya dapat mengakses instans HSM dari 172.16.0.1.
-
Anda tidak dapat mengonfigurasi 0.0.0.0/0 (untuk mengizinkan semua alamat IP sumber).
Demi alasan keamanan, kami tidak menyarankan mengizinkan semua alamat IP sumber. Untuk mengizinkan semua alamat IP sumber untuk pengujian sementara, biarkan daftar putih kosong.
Specify vSwitches
Pilih vSwitch di zona yang diperlukan berdasarkan kebutuhan bisnis Anda.
Anda harus mengonfigurasi minimal dua vSwitch agar berhasil membuat dan mengaktifkan kluster HSM.
-
Inisialisasi instans HSM, lalu klik Next.
CatatanAnda hanya dapat mengaktifkan kluster ketika status HSM utama adalah Initialized.
Metode inisialisasi
Prosedur
Metode 1: Inisialisasi satu klik di Konsol CloudHSM
PentingAnda hanya dapat menggunakan inisialisasi satu-klik jika HSM Anda adalah HSM serbaguna (GVSM) dan Anda tidak memerlukan dukungan UKEY.
-
Di bagian bawah panel Create and Activate Cluster, klik Initialize the master HSM with a few clicks.
-
Di kotak dialog Initialize Instance, klik OK.
Inisialisasi diperkirakan memakan waktu 1 hingga 5 menit. Harap tunggu. Setelah inisialisasi selesai, klik ikon
di samping Selected Master HSM:. Status berubah menjadi Initialized. Jangan melakukan inisialisasi ulang HSM utama dalam status ini.Metode 2: Inisialisasi menggunakan tool manajemen instans HSM
PentingTool manajemen client HSM hanya berjalan di Windows.
Di bagian bawah panel Create and Activate Cluster, klik Download HSM instance management tool.
Ekstrak paket perangkat lunak HSM. Kemudian, rujuk bagian Initial Initialization dalam panduan pengguna yang terdapat dalam paket tersebut untuk menyelesaikan inisialisasi.
-
Ikuti petunjuk di layar untuk menambahkan HSM anak ke kluster, lalu klik Complete.
(Opsional) Langkah 2: Konfigurasikan autentikasi TLS mutual
Generasi otomatis
Hanya instans GVSM yang mendukung generasi sertifikat otomatis saat Anda membeli HSM. Dalam skenario ini, HSM secara otomatis menghasilkan sertifikat. Anda hanya perlu mengonfigurasi sertifikat pada SDK client, karena HSM secara otomatis men-deploy-nya ke server.
Deploy sertifikat di client.
Unduh sertifikat client dari Konsol dan deploy ke client Anda.
Di halaman detail HSM, klik Get Cluster Certificate. Folder yang diunduh berisi file-file berikut:
certs/ ├── client.p12 (Sertifikat client dalam format PKCS12, yang berisi sertifikat client dan kunci privat) ├── client.pem (Sertifikat client dalam format PEM) ├── rootca.key (Kunci privat CA) ├── rootca.pem (Sertifikat CA dalam format PEM) ├── server.p12 (Sertifikat server dalam format PKCS12) └── passphrase (Passphrase untuk sertifikat PKCS12 dengan ekstensi .p12)Deploy file client.p12 dan rootca.pem ke client. Di file konfigurasi client, Anda juga harus mengonfigurasi path file untuk client.p12 dan rootca.pem, serta nilai passphrase. Untuk informasi lebih lanjut, rujuk dokumentasi yang terdapat dalam paket yang Anda unduh dari Konsol.
Deploy sertifikat di server.
HSM secara otomatis men-deploy sertifikat ke instans HSM. Tidak diperlukan tindakan tambahan.
Periode validitas default untuk sertifikat adalah 10 tahun. Sebelum sertifikat kedaluwarsa, HSM secara otomatis menghasilkan sertifikat baru dan melakukan rotasi sertifikat server. Jangan gunakan tool manajemen instans HSM untuk membuat administrator UKEY. Jika tidak, rotasi sertifikat akan gagal.
Generasi manual
GVSM mendukung generasi sertifikat otomatis. Namun, jika Anda tidak mengaktifkan opsi ini saat pembelian, ikuti langkah-langkah berikut untuk menghasilkan dan men-deploy sertifikat secara manual.
Hasilkan sertifikat.
Ekstrak file yang diunduh dan jalankan tool generasi sertifikat untuk menghasilkan sertifikat CA, sertifikat client, dan sertifikat server.
CatatanTool ini bersifat lintas platform dan dapat dijalankan di komputer lokal, instans ECS, atau lingkungan lain yang didukung.
Ini adalah tool bantuan dari Alibaba Cloud. Jika Anda dapat menghasilkan file sertifikat yang diperlukan sendiri, Anda dapat melewati penggunaan tool ini.
Windows
Metode 1: Di folder Windows, klik ganda file hsm_certificate_generate.exe untuk menjalankannya. File sertifikat dihasilkan di folder certs.
CatatanMetode ini menetapkan password default untuk file sertifikat PKCS12 (.p12) dan file kunci privat CA (.key) menjadi
12345678. Untuk menentukan password kustom, gunakan Metode 2.Metode 2: Buka direktori Windows dan jalankan perintah berikut. File sertifikat dihasilkan di folder certs.
./hsm_certificate_generate -dir ./certs -pswd 12345678Parameter
-dirmenentukan direktori output. Parameter-pswdmenentukan password untuk file sertifikat PKCS12 (.p12) dan file kunci privat CA (.key).
Linux
Buka direktori Linux dan jalankan perintah berikut. File sertifikat dihasilkan di folder certs.
./hsm_certificate_generate -dir ./certs -pswd 12345678Parameter
-dirmenentukan direktori output. Parameter-pswdmenentukan password untuk file sertifikat PKCS12 (.p12) dan file kunci privat CA (.key).macOS
Buka direktori darwin dan jalankan perintah berikut. File sertifikat dihasilkan di folder certs.
./hsm_certificate_generate -dir ./certs -pswd 12345678Parameter
-dirmenentukan direktori output. Parameter-pswdmenentukan password untuk file sertifikat PKCS12 (.p12) dan file kunci privat CA (.key).Setelah perintah berhasil dijalankan, file-file berikut dihasilkan di folder certs:
certs/ ├── client.p12 (Sertifikat client dalam format PKCS12, yang berisi sertifikat client dan kunci privat) ├── client.pem (Sertifikat client dalam format PEM) ├── rootca.key (Kunci privat CA) ├── rootca.pem (Sertifikat CA dalam format PEM) ├── server.p12 (Sertifikat server dalam format PKCS12) └── server.pem (Sertifikat server dalam format PEM)
Deploy sertifikat di client.
Deploy file client.p12 dan rootca.pem ke client. Di file konfigurasi client, Anda juga harus mengonfigurasi path file untuk client.p12 dan rootca.pem, serta password yang Anda tentukan saat menghasilkan sertifikat. Untuk informasi lebih lanjut, rujuk dokumentasi yang terdapat dalam paket yang Anda unduh dari Konsol.
Deploy sertifikat di server.
Instal tool manajemen instans HSM di instans ECS.
PentingTool manajemen instans HSM hanya berjalan di Windows.
Klik ikon unduh
di kolom Specifications untuk HSM utama untuk mengunduh tool manajemen instans HSM.Ekstrak paket HSM yang diunduh, temukan file
PKIManager-X.X.X.X.exe, lalu unggah ke instans ECS. Untuk informasi lebih lanjut, lihat Transfer file ke instans Windows.
Gunakan tool manajemen instans HSM untuk mengonfigurasi HSM utama.
Di instans ECS, gunakan tool manajemen instans HSM untuk terhubung ke GVSM utama.
Klik ganda
PKIManager-X.X.X.X.exeuntuk membuka tool manajemen instans HSM. Pilih System > TCP/IP Connection.Di kotak dialog TCP/IP Connection, masukkan IP address dan Port untuk HSM utama. Port-nya adalah 8020.
Temukan alamat IP HSM utama di kolom IP Address daftar instans HSM. HSM utama adalah instans yang diidentifikasi sebagai Master HSM di kolom Cluster.
Di kotak dialog PKIManager, klik Connect. Di kotak dialog PKIManager yang muncul, klik OK, lalu klik Login.
CatatanUntuk meningkatkan keamanan, kami menyarankan Anda mendaftarkan akun administrator untuk login berikutnya. Untuk informasi lebih lanjut, lihat Bagian 2.1.3. Register Administrator dan 2.1.2. Administrator Logon dalam GVSM User Management Manual, yang disertakan bersama tool manajemen instans HSM.
Gunakan tool manajemen instans HSM untuk menyelesaikan konfigurasi berikut.
Parameter
Aksi
Konfigurasikan sertifikat client (
client.pem)Pilih Key Management > Client Management.
Di kotak dialog Client Certificate Management, klik Import Certificate.
Di kotak dialog Import Certificate, atur Certificate Type menjadi International TLS Client RSA Certificate [pem], pilih sertifikat client (
client.pem) yang dihasilkan oleh tool, lalu klik Import.
Konfigurasikan sertifikat server (
server.p12)Pilih Instance Monitoring Information > Server Management.
Di kotak dialog Server p12 Certificate Management, klik Import Certificate.
Di kotak dialog Import Certificate, atur Certificate Type menjadi International TLS Server RSA Certificate [p12], pilih sertifikat server (
server.p12) yang dihasilkan oleh tool, lalu masukkan Certificate Password. Password ini adalah yang Anda atur saat generasi sertifikat. Jika tidak diatur, default-nya adalah 12345678.Klik Import.
Konfigurasikan properti port perangkat untuk GVSM utama
Pilih .
Di kotak dialog Host Port Properties, konfigurasikan parameter berikut:
Socket KeepAlive Time: 60
Message Header Length: 0
Message Encoding Format: ASCII
Host Service Communication Mode: Bidirectional Communication
Host Service Communication Protocol: TLSv1.2
Klik Reset.
Klik Restart Now, lalu klik OK.
Langkah 3: Sinkronkan data kluster
Jika Cluster Type adalah Manual Cluster Synchronization: Anda harus menyinkronkan kluster setelah pembuatan dan aktivasi awal, atau ketika data pada HSM utama berubah. Sinkronisasi tidak diperlukan saat melakukan scaling out kluster.
Jika Cluster Type adalah Automatic Cluster Synchronization: Sinkronisasi dilakukan secara otomatis. HSM utama secara otomatis menyinkronkan kunci baru, sertifikat SSL yang dikonfigurasi, dan informasi pengguna ke HSM anak.
Sinkronisasi kluster memakan waktu sekitar 5 menit. Lakukan operasi ini selama jam sepi untuk menghindari gangguan layanan.
Di halaman VSMs, temukan instans HSM utama target. Di kolom Cluster Type daftar instans, periksa jenis sinkronisasi (Manual Cluster Synchronization / Automatic Cluster Synchronization).
Jika Cluster Type adalah Manual Cluster Synchronization, Anda harus menyinkronkan kluster.
Di kolom Actions, klik Synchronize Cluster. Di kotak dialog yang muncul, klik Synchronize Cluster lagi.
Langkah 4: Buat dan gunakan kunci enkripsi
Paket perangkat lunak HSM mencakup panduan developer HSM dan program uji SDK. Anda dapat menggunakan panduan developer untuk memanggil Operasi API dan mengelola instans HSM Anda.
Anda dapat mengunduh paket perangkat lunak HSM di halaman VSMs di Konsol CloudHSM. Temukan instans HSM target, klik kolom Specifications, lalu klik Download HSM instance management tool. Ekstrak file yang diunduh untuk mendapatkan paket perangkat lunak HSM.
Sebagai contoh, untuk HSM serbaguna (GVSM), temukan kasus uji APITest.java di direktori Alibaba CloudHSM GVSM Software Package>SDK>JAVA>Server HSM Interface Documentation>Test Demo yang diekstrak. Anda dapat menggunakan kasus uji ini untuk menguji instans HSM. Berikut adalah contoh kode:
Ganti alamat IP (192.168.XX.XX) dalam kasus uji dengan alamat IP pribadi yang ditetapkan untuk instans HSM Anda.
package cn.tass.hsm;
import cn.tass.SJJ1507.devices.RasKeyUtils;
import cn.tass.common.kits.Padding;
import cn.tass.exceptions.TAException;
import cn.tass.hsm.GHSMAPI;
import cn.tass.kits.Forms;
import cn.tass.hsm.Host;
import cn.tass.hsm.LogConfig;
import cn.tass.util.encoders.Base64;
import org.junit.Test;
import javax.naming.ConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class APITest {
LogConfig logConfig = new LogConfig("error", "./");
Host host1 = new Host("GHSM", -3, "192.168.XX.XX", 8019, 5);
List<Host> hosts = new ArrayList<Host>() {{
add(host1);
}};
String config =
"{"
+ "[LOGGER];"
+ "logsw=debug,error;logPath=./;"
+ "[HOST 1];"
+ "hsmModel=GHSM;"
+ "host=192.168.XX.XX;linkNum=-3;"
+ "port=8019;"
+ "timeout=5;"
+ "}";
// GHSMAPI api = GHSMAPI.getInstance(hosts, logConfig);
GHSMAPI api = GHSMAPI.getInstance(config);
/**
* Kunci simetris yang dienkripsi oleh LMK
*/
byte[] symmetricKey = Forms.hexStringToByteArray("669C1CEDDA****5D727EA727558B5");
byte[] verifyValue = Forms.hexStringToByteArray("BD85****4D88");
byte[] symmetricKey1 = Forms.hexStringToByteArray("93EF12C958****C3EFDBC7B37642D");
byte[] verifyValue1 = Forms.hexStringToByteArray("7830****B8E6");
/**
* Ciphertext kunci sesi yang dienkripsi oleh LMK
*/
byte[] symmetricKeyKEK = Forms.hexStringToByteArray("2E80A42018****BCF639F644629E8");
/**
* Nilai verifikasi kunci sesi
*/
byte[] verifyValueMAC = Forms.hexStringToByteArray("734D****3E38");
/**
* Ciphertext yang dilindungi oleh kunci proteksi
*/
byte[] protectionKey = Forms.hexStringToByteArray("2EACE685C5EB2638D120*****60CD44210B43C894A77C");
/**
* MAC ciphertext yang dilindungi oleh kunci proteksi
*/
byte[] protectionMAC = Forms.hexStringToByteArray("0CB8****E487");
/**
* Kunci publik RSA dalam encoding DER
*/
byte[] publicKeyRSA = Forms.hexStringToByteArray("308186028180E14CAAFFCEC6D014457D7CA3E943********BE8B795E10474954FE01BAAC63532520069465FA62EDB266AADEBB020103");
/**
* Kunci privat RSA yang dienkripsi oleh LMK
*/
byte[] privateKeyRSA = Forms.hexStringToByteArray("000202703D0652C7027B7D94B45A896646A9DC7C********571BC7CE29B67920538D509C58B1D8F966AF7E5321CDB2386164844D2BCB");
/**
* Kunci privat RSA yang dienkripsi oleh kunci proteksi
*/
byte[] privateKeyRSAKEK = Forms.hexStringToByteArray("6B2FB2BCC75604ABF5761FFA1027FF16324E3038********B01795D0ABE2D9695208542DC2FF8161AFD6F774E8D524B1DE6096530783");
/**
* MAC RSA
*/
byte[] privateKeyRSAKEKMAC = Forms.hexStringToByteArray("701A****9760");
/**
* Kunci privat RSA yang dienkripsi oleh KEK
*/
byte[] privateKeyKEK = Forms.hexStringToByteArray("7A833CC0FAFBA6EC063DF4827B8FD91FF4B9A69F********1E02C312ABFC68F454D11EFCF1E0609584D06B09A08599D7A0BF5D63BB9F");
/**
* MAC kunci privat RSA yang dienkripsi oleh KEK
*/
byte[] privateKeyRSAMAC = Forms.hexStringToByteArray("06E5****36DE");
/**
* Kunci privat SM2 yang dienkripsi oleh KEK
*/
byte[] privateKeySM2KEK = Forms.hexStringToByteArray("D3C5F579038C8BF34698****EF6044210B43C894A77C");
/**
* MAC kunci privat SM2 yang dienkripsi oleh KEK
*/
byte[] privateKeySM2MAC = Forms.hexStringToByteArray("83E4****0D15");
/**
* Kunci publik SM2 dalam encoding DER
*/
byte[] privateKeySM2DER = Forms.hexStringToByteArray("3059301306072A8648CE3D020106082A811CCF55********42A53790967A1368B7084F6EFED51FC848D1E3B5370A99BDCB64D17C2F");
/**
* Kunci privat SM2 yang dienkripsi oleh LMK
*/
byte[] privateKeySM2 = Forms.hexStringToByteArray("66C9DDB0D6400EE05947****21908C4F5CA6457B435F");
/**
* Kunci privat SM2 yang dilindungi oleh kunci proteksi
*/
byte[] privateKeyKEKSM2 = Forms.hexStringToByteArray("D3C5F579038C8BF3A162****F99644210B43C894A77C");
/**
* MAC SM2
*/
byte[] privateKeyKEKSM2MAC = Forms.hexStringToByteArray("B982****8232");
/**
* Kunci SM2 yang dihasilkan secara acak 1002
*/
byte[] publicSM2 = Forms.hexStringToByteArray("3059301306072A8648CE3D020106082A811CCF55********6913D902C4C9B8A84A3F96ADDD7BEF537D61404D56E58A68C756AEFD40");
byte[] privateSM2 = Forms.hexStringToByteArray("6F26783DCE6D45B84D3F****2FA68D1A3B721C09BB28");
/**
* Digest data yang dihitung oleh algoritma MD5
*/
byte[] md5 = Forms.hexStringToByte("D41D8CD98F00B204E9800998ECF8427E");
/**
* Digest data yang dihitung oleh algoritma SM3
*/
byte[] sm3 = Forms.hexStringToByte("E559D3DE421E81967DD68B28B55E0C26B03FCE10B8A8E5C4E6067497729D40D3");
/**
*
*/
byte[] b = Forms.hexStringToByteArray("00000000000000000000000000000000");
public APITest() throws TAException, ConfigurationException {
}
/**
* Hasilkan kunci simetris
*
* @throws TAException
*/
@Test
public void genSymmKey() throws TAException {
ArrayList<byte[]> bytes = api.genSymmKey(3);
System.out.println("Kunci simetris yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Nilai verifikasi kunci simetris: " + Forms.byteToHexString(bytes.get(1)));
}
///////////////////////////////////////////////////////////////////////////
// Data uji 1015
///////////////////////////////////////////////////////////////////////////
byte[] sm4Key = Forms.hexStringToByte("EE828FCCFA****468B1FECCE81192");
byte[] sm4CV = Forms.hexStringToByte("BCC2****2764");
byte[] sm4ProKeyCipher = Forms.hexStringToByte("7C78B0D533****E9277504181C23F");
byte[] sm4ProKeyCipherCV = Forms.hexStringToByte("8849****FB73");
byte[] newSM4 = Forms.hexStringToByte("AE62E4E90F****AECE0AC9923B885");
byte[] newSM4KeyMAC = Forms.hexStringToByte("F7EBEA9FD3****4E7EAAC9B7BE362");
byte[] newSM4KeyTag = Forms.hexStringToByte("7C05A01A54****E0C8597DBED6D6D");
byte[] sm4Key2 = Forms.hexStringToByte("40F7B1FA35****EB13491B119A4AB");
byte[] sm4Key2CV = Forms.hexStringToByte("955C****9C51");
/**
* Hasilkan kunci simetris dan lindungi dengan kunci proteksi
*
* @throws TAException
*/
@Test
public void generateProtectionKey() throws TAException {
/**
* SM4
* Kunci simetris yang dienkripsi oleh LMK: B36847D6E86EAB69E4EEB65558A2626C
* Nilai verifikasi kunci simetris: 713CA557C1FE2AAB
*/
ArrayList<byte[]> bytes = api.proGenSymmKey(Forms.hexStringToByteArray("B36847D6E8****4EEB65558A2626C"),
TACryptConst.KEY_ALG_SM4, Forms.hexStringToByteArray("713C****2AAB"), TACryptConst.KEY_ALG_SM4, b,
TACryptConst.ENC_MODE_GCM,b, b);
System.out.println("Ciphertext kunci sesi yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Nilai verifikasi kunci sesi: " + Forms.byteToHexString(bytes.get(1)));
System.out.println("Ciphertext kunci sesi yang dienkripsi oleh kunci proteksi: " + Forms.byteToHexString(bytes.get(2)));
System.out.println("Nilai MAC kunci sesi: " + Forms.byteToHexString(bytes.get(3)));
System.out.println("Tag: " + Forms.byteToHexString(bytes.get(4)));
}
/**
* Enkripsi dan dekripsi data menggunakan kunci simetris
*
* @throws TAException
*/
@Test
public void generalDataEnc() throws TAException {
// byte[] bytes = api.symmKeyDataEnc(sm4Key,TACryptConst.ENC_MODE_ECB,TACryptConst.KEY_TYPE_RULE, TACryptConst.KEY_ALG_SM4,
// "0000000000000000".getBytes(), b);
// System.out.println("Hasil enkripsi SM4: " + Forms.byteToHexString(bytes));
// byte[] bytes1 = api.generalDataDec(sm4Key,TACryptConst.ENC_MODE_ECB, TACryptConst.KEY_TYPE_RULE, TACryptConst.KEY_ALG_SM4, bytes, b);
// System.out.println("Hasil dekripsi SM4: " + new String(bytes1));
// byte[] paddingData = Padding.PKCS5Padding(Forms.hexStringToByte("30820122300D06092A864886F70D010101050003********FE2D80A275BF5D096D2E07BA9ED5A75A10D425B03B84BB57990203010001"), 16);
// byte[] bytes = api.symmKeyDataEnc(28,TACryptConst.ENC_MODE_CBC,TACryptConst.KEY_TYPE_RULE, TACryptConst.KEY_ALG_AES128,
// paddingData, b);
// System.out.println("Hasil enkripsi AES: " + Forms.byteToHexString(bytes));
byte[] bytes1 = api.generalDataDec(Forms.hexStringToByte("789F01F9CC****429D7EAB215ABA1"),TACryptConst.ENC_MODE_CBC, TACryptConst.KEY_TYPE_RULE, TACryptConst.KEY_ALG_AES128,
Forms.hexStringToByte("AE6BA9133D0D4BB0090882E33F03D905D7797852********B1C0079352310E974EB1155A759374004095E2256B0ADC3BFFFF150AF071"), b);
System.out.println("Hasil dekripsi AES: " + Forms.byteToHexString(bytes1));
}
/**
* Enkripsi dan dekripsi data menggunakan kunci simetris yang dilindungi oleh kunci proteksi
*
* @throws TAException
*/
@Test
public void protectionKeyEncrypt() throws TAException {
ArrayList<byte[]> bytes = api.proKeyEncData(sm4Key, TACryptConst.KEY_ALG_SM4, sm4CV,
Forms.hexStringToByte("C0C64CD82E3B2DC8C8F4****F5BA4F0BCF7AC04E08E8"),
b, Forms.hexStringToByte("75F2C068A5****F0BCF7AC04E08E8"), TACryptConst.ENC_MODE_CBC,
b, new byte[0], new byte[0], TACryptConst.KEY_ALG_AES256, 1, 3,
new byte[16], TACryptConst.KEY_ALG_SM4, TACryptConst.ENC_MODE_GCM,
"mingwenshuju".getBytes(), new byte[12], new byte[2]);
System.out.println("Ciphertext: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Tag: " + Forms.byteToHexString(bytes.get(1)));
byte[] bytes1 = api.proKeyDecData(sm4Key, TACryptConst.KEY_ALG_SM4, sm4CV, Forms.hexStringToByte("C0C64CD82E3B2DC8C8F4****F5BA4F0BCF7AC04E08E8"), b, Forms.hexStringToByte("75F2C068A5****F0BCF7AC04E08E8"), TACryptConst.ENC_MODE_CBC,
b, new byte[0], new byte[0], TACryptConst.KEY_ALG_AES256, 1, 3, new byte[16], TACryptConst.KEY_ALG_SM4, TACryptConst.ENC_MODE_GCM,
bytes.get(0), new byte[12], new byte[2], bytes.get(1));
System.out.println("Teks biasa setelah dekripsi: " + new String(bytes1));
}
byte[] srcRSACipher = Forms.hexStringToByte("83E265207D4566C7704DF9E6170181378CA028FB********508F919F4C0B3F2F7C0B79E661001B79FB0F0205A97CECFBE25DC4C711EA");
byte[] srcRSACipherMAC = Forms.hexStringToByte("948D994479****72E54468349B3E5");
byte[] srcRSACipherTag = Forms.hexStringToByte("9C8A7CB4C6****75F0681ED497EDF");
byte[] srcRSApublicKey = Forms.hexStringToByteArray("308186028180E14CAAFFCEC6D014457D7CA3E943********BE8B795E10474954FE01BAAC63532520069465FA62EDB266AADEBB020103");
/**
* Kunci privat RSA yang dienkripsi oleh LMK
*/
byte[] srcRSAprivateKey = Forms.hexStringToByteArray("000202703D0652C7027B7D94B45A896646A9DC7C********571BC7CE29B67920538D509C58B1D8F966AF7E5321CDB2386164844D2BCB");
byte[] srcSM2Cipher = Forms.hexStringToByte("83E260209C09CEF21E1A****0B8D670537112DFB030F");
byte[] srcSM2CipherMAC = Forms.hexStringToByte("7DF725131F****F029550F2F073E9");
byte[] srcSM2CipherTag = Forms.hexStringToByte("A2181C5822****E37C072987D1B7E");
byte[] srcSM2publicKey = Forms.hexStringToByteArray("3059301306072A8648CE3D020106082A811CCF55********F8D3F9E5A31C7DE80940637E036B2D6FD36A0F586D4CDC3A610A269E89");
byte[] srcSM2privateKey = Forms.hexStringToByteArray("79E62264C314D1D3279D****F2BC777F8CBE7EC55699");
/**
* Enkripsi dan dekripsi paket data besar
*/
@Test
public void bigDataEnc() throws TAException {
byte[] enc = api.bigDataEnc(Forms.hexStringToByteArray("6DF7292D86****81F7C94DDC967A0"), "AES/ECB/PKCS5Padding", "demaxiyazhili".getBytes(), new byte[0]);
System.out.println(Forms.byteToHexString(enc));
byte[] dec = api.bigDataDec(Forms.hexStringToByteArray("6DF7292D86****81F7C94DDC967A0"), "AES/ECB/PKCS5Padding", enc, new byte[0]);
System.out.println(new String(dec));
}
/**
* Hitung dan verifikasi MAC
*/
@Test
public void mac() throws TAException {
byte[] bytes = api.calMac(1, 0, 2, sm4Key, 7, "1111111111111111".getBytes(),
new byte[16]);
System.out.println("Hasil perhitungan MAC: " + Forms.byteToHexString(bytes));
boolean b = api.verifyMAC(1, 0, 2, sm4Key, 7, "1111111111111111".getBytes(),
new byte[16], bytes);
System.out.println("Hasil verifikasi MAC: " + b);
}
/**
* Hitung HMAC
*/
@Test
public void hmac() throws TAException {
ArrayList<byte[]> hmac = api.hmac(20, 0, 2, sm4Key, new byte[0], "shuyaojisuandeshuju".getBytes());
for (int i = 0; i < hmac.size(); i++) {
System.out.println(Forms.byteToHexString(hmac.get(i)));
}
}
/**
* Hasilkan pasangan kunci RSA dengan kunci privat yang dienkripsi oleh LMK
*/
@Test
public void generateRSAKeyPair() throws TAException, IOException {
ArrayList<byte[]> bytes = api.genRSAKey(2048, 65537);
System.out.println("Kunci publik dalam encoding DER: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Kunci privat yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(1)));
}
/**
* Hasilkan pasangan kunci RSA dengan kunci privat yang dienkripsi oleh kunci proteksi
*/
@Test
public void protectionKeyRSA() throws TAException, IOException {
ArrayList<byte[]> bytes = api.proGenRSAKey (sm4Key, TACryptConst.KEY_ALG_SM4, sm4CV, 2048, 3,
b, TACryptConst.ENC_MODE_ECB, b, new byte[2]);
System.out.println("Kunci publik dalam encoding DER: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Kunci privat yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(1)));
System.out.println("Ciphertext kunci privat yang dienkripsi oleh kunci proteksi: " + Forms.byteToHexString(bytes.get(2)));
System.out.println("Panjang MAC kunci privat asimetris: " + Forms.byteToHexString(bytes.get(3)));
}
/**
* Tanda tangan dan verifikasi menggunakan kunci privat RSA
*/
byte[] privateRSA = Forms.hexStringToByte("000204B07672172F114E8E847A5FB9EC3DD32CD1********AE837EB0B233D98470234F3EAD29C2DAB368CF5463151BCB266DEF496D8E");
byte[] publicRSA = Forms.hexStringToByte("3082010902820100EED2CF3C2E3624D65718E0F1********556D927F5DA9529C22D5C701B8B1BB7836D351A815A69116110203010001");
byte[] publicR77 = Forms.hexStringToByte("3082010A0282010100A636C484374F9F039EB431********FE2D80A275BF5D096D2E07BA9ED5A75A10D425B03B84BB57990203010001");
@Test
public void RSApriSign() throws TAException, IOException {
byte[] bytes = api.RSAPriKeySign(privateRSA,TACryptConst.PADDING_MODE_NO, 4, 0,
0, 0, Forms.hexStringToByte("9ECA5459BA0B5CA0****55E9DC2B6FFA85CE"));
System.out.println("Hasil signature: " + Forms.byteToHexString(bytes));
boolean b = api.RSAPubVerify(publicRSA,TACryptConst.PADDING_MODE_PKCS15, TACryptConst.DIGEST_ALG_SHA256, 0,
0, 0, bytes, Forms.hexStringToByte("9ECA5459BA0B5CA0****55E9DC2B6FFA85CE"));
System.out.println("Hasil verifikasi signature: " + b);
// ArrayList<byte[]> bytes1 = RasKeyUtils.loadDerRsaPublicKey(publicR77);
// for (int i = 0; i < bytes1.size(); i++) {
// System.out.println(Forms.byteToHexString(bytes1.get(i)));
// }
//
// byte[] bytes = api.RSAPriKeySign(77,TACryptConst.PADDING_MODE_PSS, TACryptConst.DIGEST_ALG_SHA256, TACryptConst.MGF,
// TACryptConst.DIGEST_ALG_SHA256, 10, "1234567890".getBytes());
// System.out.println("Hasil signature: " + Forms.byteToHexString(bytes));
// boolean b = api.RSAPubVerify(publicR77,TACryptConst.PADDING_MODE_PSS, TACryptConst.DIGEST_ALG_SHA256, TACryptConst.MGF,
// TACryptConst.DIGEST_ALG_SHA256, 10, bytes, "1234567890".getBytes());
// System.out.println("Hasil verifikasi signature: " + b);
}
/**
* Enkripsi dan dekripsi RSA
*/
@Test
public void RSAencdata() throws TAException {
byte[] bytes = api.RSAPubEncData(11, 1, TACryptConst.DIGEST_ALG_SHA256, new byte[0], Forms.hexStringToByte("{createTime=1606380202000, createUserId=144, ip=124.204.XX.XX, key=SYJHD202011266020179058, orderNumber=SYJHD202011266020179058, productId=161391, scene=SYJHD}"));
System.out.println("Hasil enkripsi kunci publik: " + Forms.byteToHexString(bytes));
byte[] bytes1 = api.RSAPriDecData(11, 1, TACryptConst.DIGEST_ALG_SHA256,new byte[0], bytes);
System.out.println("Hasil dekripsi kunci privat: " + Forms.byteToHexString(bytes1));
}
/**
* Dekripsi menggunakan kunci privat RSA yang dilindungi oleh kunci proteksi
*/
@Test
public void priDecryptRSA() throws TAException {
byte[] bytes = api.proRSAPriKeyDec (sm4Key, TACryptConst.KEY_ALG_SM4 , sm4CV, srcRSACipher, b, srcRSACipherMAC, TACryptConst.DIGEST_ALG_SHA256,
b, new byte[2], srcRSACipherTag, 2, TACryptConst.MGF, TACryptConst.DIGEST_ALG_SHA256,new byte[0], Forms.hexStringToByteArray("BFA03DB9BD0A4DE4809B59B04BF663E8E541B0CF********5FD9E0A80116771AC436ED1EDE46CF272FD1DD4D3A5174D2D178D9A21F3D"));
System.out.println("Teks biasa setelah dekripsi: " + Forms.byteToHexString(bytes));
}
/**
* Tanda tangan menggunakan kunci privat RSA yang dilindungi oleh kunci proteksi
*/
@Test
public void privateSignRSA() throws TAException, IOException {
byte[] bytes = api.proRSAPriKeyDecSign(sm4Key, TACryptConst.KEY_ALG_SM4, sm4CV, srcRSACipher, b, srcRSACipherMAC, TACryptConst.DIGEST_ALG_SHA256,
b, new byte[2], srcRSACipherTag, TACryptConst.DIGEST_ALG_SHA256, "1234567890".getBytes(), TACryptConst.PADDING_MODE_PSS, TACryptConst.MGF, TACryptConst.DIGEST_ALG_SHA256, 10);
System.out.println("Hasil signature: " + Forms.byteToHexString(bytes));
boolean b = api.RSAPubVerify(srcRSApublicKey,TACryptConst.PADDING_MODE_PSS, TACryptConst.DIGEST_ALG_SHA256, TACryptConst.MGF, TACryptConst.DIGEST_ALG_SHA256, 10, bytes, "1234567890".getBytes());
System.out.println("Hasil verifikasi signature: " + b);
}
/**
* Konversi enkripsi kunci asimetris RSA dari kunci proteksi 1 ke kunci proteksi 2
*/
@Test
public void RSAConversionEncryption() throws TAException {
ArrayList<byte[]> bytes = api.conversionEncryption(0, TACryptConst.KEY_ALG_SM4, sm4Key, sm4CV, TACryptConst.KEY_TYPE_RSA,
-1, srcRSACipher, b, srcRSACipherMAC, TACryptConst.ENC_MODE_GCM, b, new byte[2], srcRSACipherTag,
0,
TACryptConst.KEY_ALG_SM4, sm4Key2, sm4Key2CV, b, TACryptConst.ENC_MODE_ECB, b, new byte[2]);
for (int i = 0; i < bytes.size(); i++) {
System.out.println("Item " + i + ": " + Forms.byteToHexString(bytes.get(i)));
}
}
/**
* Impor kunci simetris yang dilindungi oleh kunci asimetris RSA
*/
@Test
public void tets1() throws TAException {
ArrayList<byte[]> bytes = api.RSAProImplSymm(srcRSAprivateKey, 2, TACryptConst.DIGEST_ALG_SHA256, new byte[10], 200,
TACryptConst.KEY_ALG_SM4, Forms.hexStringToByteArray("5C59EBCD0A48E51038853E490C76AD83122964E3********AD4FCF0A1D20DC5A0AAB878DADC04903CCE5B3D06219FDB4497905FBEA9E"), "916-zjl".getBytes());
System.out.println("Kunci simetris yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Nilai verifikasi kunci simetris: " + Forms.byteToHexString(bytes.get(1)));
}
/* ***************************************************************************************************** */
/**
* Hasilkan pasangan kunci SM2/ECC dengan kunci privat yang dienkripsi oleh kunci proteksi
*/
@Test
public void generateProtectionKeySM2() throws TAException {
ArrayList<byte[]> bytes = api.proGenSM2OrECCKey (sm4Key, TACryptConst.KEY_ALG_SM4, sm4CV, 0x0007,
b, TACryptConst.ENC_MODE_GCM, b, new byte[16]);
System.out.println("Kunci publik dalam encoding DER: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Kunci privat yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(1)));
System.out.println("Ciphertext kunci privat yang dienkripsi oleh kunci proteksi: " + Forms.byteToHexString(bytes.get(2)));
System.out.println("MAC kunci privat asimetris: " + Forms.byteToHexString(bytes.get(3)));
System.out.println("Tag: " + Forms.byteToHexString(bytes.get(4)));
}
/**
* Hasilkan pasangan kunci SM2 dengan kunci privat yang dienkripsi oleh LMK
*/
@Test
public void generateSM2Key() throws TAException {
ArrayList<byte[]> bytes = api.genSM2Key();
System.out.println("Kunci publik dalam encoding DER: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Kunci privat yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(1)));
}
/**
* Hasilkan pasangan kunci ECC dengan kunci privat yang dienkripsi oleh LMK
*/
@Test
public void generateECCKey() throws TAException {
ArrayList<byte[]> bytes = api.genECCKey(0x0007);
System.out.println("Kunci publik dalam encoding DER: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Kunci privat yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(1)));
}
byte[] data = Forms.hexStringToByte("20D90A83A4654FB8****0371B374F76DEFA5");
/**
* Tanda tangan dan verifikasi ECC
*/
@Test
public void ECCPrivateKeySign() throws TAException {
byte[] bytes = api.priKeySign(0x0007, Forms.hexStringToByteArray("61971383CD4D760CF77C****4C1C935F18B4CCCFBF3A"), data);
System.out.println("Hasil signature ECC: " + Forms.byteToHexString(bytes));
boolean b = api.pubKeyVerify(0x0007, Forms.hexStringToByteArray("3059301306072A8648CE3D020106082A811CCF55********1ACA51CB99CD452FA11B5B6BBB4AA31C2DBCC696FC57C8F9F8F01948FE"), data, bytes);
System.out.println("Hasil verifikasi signature ECC: " + b);
}
/**
* Tanda tangan dan verifikasi SM2
*/
@Test
public void TestSm2() throws TAException {
byte[] bytes = api.priKeySign(0x0007, privateKeySM2, sm3);
System.out.println("Hasil signature: " + Forms.byteToHexString(bytes));
boolean b = api.pubKeyVerify(0x0007, privateKeySM2DER, sm3, bytes);
System.out.println("Hasil verifikasi signature: " + b);
}
@Test
public void SM2Sign() throws TAException {
byte[] baInData = "2222222222222222".getBytes();
//7. Hitung digest SM3
System.out.println("Digest data: SM3");
String sAlg = "SM3";
byte[] baUserId = new byte[0];
byte[] baPubKey = Forms.hexStringToByteArray("3059301306072A8648CE3D020106082A811CCF55********9A1AD40BEEE37267F8F1F97E67BCE29A4E1CCAB0979A1E85F81010E042");
byte[] baHashInitRes = api.HashInit(sAlg, baUserId, baPubKey);
byte[] baHashUpdateRes = api.HashUpdate(baHashInitRes, baInData);
byte[] baHashSm3 = api.HashFinalize(baHashUpdateRes);
System.out.println(String.format("Digest data: %s", Forms.byteToHexString(baHashSm3)));
//8. Tanda tangan dan verifikasi kunci asimetris
System.out.println("Tanda tangan dan verifikasi asimetris: SM2");
int iCurveId = 0x0007;
System.out.println(String.format("Data asli (nilai hash): %s", Forms.byteToHexString(baHashSm3)));
byte[] baSignatureSm2 = api.priKeySign(iCurveId, 2, baHashSm3);
System.out.println(String.format("Signature: %s", Forms.byteToHexString(baSignatureSm2)));
boolean blVerifyResSm2 = api.pubKeyVerify(iCurveId, baPubKey, baHashSm3, baSignatureSm2);
System.out.println(blVerifyResSm2);
}
byte[] sm2 = Forms.hexStringToByte("3059301306072A8648CE3D020106082A811CCF55********55A4C790CDE94A1B179CC12A39A856755F6677E87905BD903987425AF3");
byte[] sm2PrivateKey = Forms.hexStringToByte("4F23C664B68C8A38B31F****66976CEA234A749F031D");
/**
* Enkripsi dan dekripsi SM2
*/
@Test
public void TestSM2EncAndDec() throws TAException {
byte[] bytes = api.SM2PubKeyEnc(888, Forms.hexStringToByte("1111111111****111111111111111"));
System.out.println("Hasil enkripsi: " + Forms.byteToHexString(bytes));
byte[] bytes1 = api.SM2PriKeyDec(888, bytes);
System.out.println("Hasil dekripsi: " + Forms.byteToHexString(bytes1));
}
byte[] sm2Key = Forms.hexStringToByte("3059301306072A8648CE3D020106082A811CCF55********55A4C790CDE94A1B179CC12A39A856755F6677E87905BD903987425AF3");
byte[] sm2Cipher = Forms.hexStringToByte("83E260209C09CC3F0103****FD8880E68AC28BFFF0F3");
byte[] sm2CipherMAC = Forms.hexStringToByte("8184BE3669****B673814E59E7700");
byte[] sm2CipherTag = Forms.hexStringToByte("8FD638CA4D****213F5777253D192");
byte[] sm2PriKey = Forms.hexStringToByte("4F23C664B68C8A38B31F****66976CEA234A749F031D");
/**
* Dekripsi menggunakan kunci privat ECC/SM2 yang dilindungi oleh kunci proteksi
*/
@Test
public void protectionPrivateKeyDecrypt() throws TAException {
byte[] bytes = api.proPriKeyDec(sm4Key, TACryptConst.KEY_ALG_SM4, sm4CV, sm2Cipher, b, sm2CipherMAC, TACryptConst.ENC_MODE_GCM,
b, new byte[2], sm2CipherTag, Forms.hexStringToByteArray("E9C17D82604F992BB3AB8FE0F766441DACC05EB7********32FACEC8316B880499E6E70260333E9F29CEBCF3F8E10C151F79445276F6"));
System.out.println("Teks biasa setelah dekripsi: " + Forms.byteToHexString(bytes));
}
/**
* Tanda tangan menggunakan kunci privat ECC/SM2 yang dilindungi oleh kunci proteksi
*/
@Test
public void privateSignSM2() throws TAException {
byte[] bytes = api.proPriKeySign(sm4Key,TACryptConst.KEY_ALG_SM4 , sm4CV, sm2Cipher, b, sm2CipherMAC, TACryptConst.ENC_MODE_GCM,
b, new byte[2], sm2CipherTag, Forms.hexStringToByteArray("20D90A83A4654FB8****0371B374F76DEFA5"));
System.out.println("Hasil signature kunci privat ECC/SM2 (kunci privat dilindungi oleh kunci proteksi): " + Forms.byteToHexString(bytes));
boolean b = api.pubKeyVerify(7, sm2Key, Forms.hexStringToByteArray("20D90A83A4654FB8****0371B374F76DEFA5"), bytes);
System.out.println("Hasil verifikasi signature kunci publik ECC/SM2 (kunci privat dilindungi oleh kunci proteksi): " + b);
}
/**
* Impor kunci simetris yang dilindungi oleh kunci asimetris SM2
*/
@Test
public void SM2ImplKEK() throws TAException {
ArrayList<byte[]> bytes = api.SM2ImplKEK(sm2PriKey, 300, TACryptConst.KEY_ALG_SM4, Forms.hexStringToByteArray("9A9161F87BCBD3E9BC8866B8706E8F75B682DA27********13440F2DAD9AE786E3D73349D78FA7915B3CB633EFD9A88E638D93297934"), "914-zjl".getBytes());
System.out.println("Kunci simetris yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Nilai verifikasi kunci simetris: " + Forms.byteToHexString(bytes.get(1)));
}
/**
* Enkripsi konversi kunci asimetris SM2/ECC
*/
@Test
public void conversionEncryption() throws TAException {
ArrayList<byte[]> bytes = api.conversionEncryption(0, TACryptConst.KEY_ALG_SM4, sm4Key, sm4CV, 2,
-1, sm2Cipher, b, sm2CipherMAC, TACryptConst.ENC_MODE_GCM, b, new byte[2], sm2CipherTag, 0,
TACryptConst.KEY_ALG_SM4, sm4Key2, sm4Key2CV, b, TACryptConst.ENC_MODE_GCM, b, new byte[2]);
for (int i = 0; i < bytes.size(); i++) {
System.out.println("Item " + i + ": " + Forms.byteToHexString(bytes.get(i)));
}
}
/**
* Operasi digest dan pad data digest
*/
@Test
public void testGenHash() throws TAException {
byte[] hash = genHash();
System.out.println("Hasil digest: " + Forms.byteToHexString(hash));
// Verifikasi hasil digest yang benar
String string = "704423DF78242B08E821F7F8FA05A5325AA1BD842BE4EB9827C765DFFF434C1A";
byte[] bytes3 = genHash();
System.out.println("Hasil verifikasi: " + Arrays.equals(Forms.hexStringToByteArray(string),bytes3));
String wrongHash = "669523DF78242B08E821F7F8FA05A5325AA1KD842BE4EB9827C765DFFF434C1A";
System.out.println("Hasil verifikasi salah: " + Arrays.equals(Forms.hexStringToByteArray(wrongHash),bytes3));
}
public byte[] genHash() throws TAException {
byte[] bytes2 = api.HashInit("SM3", new byte[0], privateKeySM2DER);
byte[] bytes = api.HashUpdate(bytes2, Forms.hexStringToByteArray("1234567890"));
byte[] bytes1 = api.HashFinalize(bytes);
return bytes1;
}
/**
* Hasilkan bilangan acak
*/
@Test
public void genRandom() throws TAException {
String s = api.genRandom(15);
System.out.println(s);
}
/**
* Dapatkan status HSM
*/
@Test
public void getHSMstatus() throws TAException {
String hsMstatus = api.getHSMstatus();
System.out.println(hsMstatus);
}
/**
* LMK ke KEK
* @throws TAException
*/
@Test
public void test3() throws TAException {
ArrayList<byte[]> bytes = api.LMKToKEK(TACryptConst.KEY_ALG_SM4, TACryptConst.ENC_MODE_GCM, b,
new byte[2], 0, sm4Key,
new byte[0], new byte[0], 5, 0,
1, 0, TACryptConst.KEY_ALG_SM4,
sm4Key2, new byte[16]);
System.out.println("Ciphertext kunci yang dienkripsi oleh kunci proteksi: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Output MAC saat menghasilkan MAC: " + Forms.byteToHexString(bytes.get(1)));
System.out.println("Tag: " + Forms.byteToHexString(bytes.get(2)));
System.out.println("Nilai verifikasi kunci: " + Forms.byteToHexString(bytes.get(3)));
}
/**
* Konversi kunci terenkripsi lain ke kunci yang dienkripsi oleh LMK
* @throws TAException
*/
@Test
public void otherEncKeyToLMLEncKey() throws TAException {
ArrayList<byte[]> bytes = api.otherEncKeyToLMLEncKey(0, 7, 6,
Forms.hexStringToByteArray("00000000000000000000000000000000"),
Forms.hexStringToByteArray("00000000000000000000000000000000"),
Forms.hexStringToByteArray("71802E75BD****996A9B9DA6616E9"),
0, Forms.hexStringToByteArray("B36847D6E8****4EEB65558A2626C"),
new byte[0], new byte[0], 5, -1,-1, new byte[0], 0, 7,
Forms.hexStringToByte("9940568000****9C7F45977D291AA"));
System.out.println("============= Kunci proteksi adalah kunci simetris =============");
for (int i = 0; i < bytes.size(); i++) {
System.out.println(Forms.byteToHexString(bytes.get(i)));
}
ArrayList<byte[]> bytes2 = api.otherEncKeyToLMLEncKey(2, -1, -1,
new byte[0], new byte[0], new byte[0],
888, new byte[0], new byte[0],
new byte[0], 1,
1, 1, new byte[0], 0, 7,
Forms.hexStringToByte("7C78EAFE26890D48096AB8141B1D5890BF1921DD********5329ADED546F44C52C8F49EAC46647650D9B983224E9E005CFCAA88B019D"));
System.out.println("============= Kunci proteksi adalah kunci ECC =============");
for (int i = 0; i < bytes2.size(); i++) {
System.out.println(Forms.byteToHexString(bytes2.get(i)));
}
ArrayList<byte[]> bytes1 = api.otherEncKeyToLMLEncKey(1, -1, -1,
new byte[0], new byte[0], new byte[0],
11, new byte[0], new byte[0], new byte[0], 3,
1, 1, new byte[0], 0, 7,
Forms.hexStringToByte("6149EE02F14EE6420BC2B462003CCCE2413CE491********E2CE400522E06DCBAB44213A85B668764EC33EE71D372F5A904252A539AA"));
System.out.println("============= Kunci proteksi adalah kunci RSA =============");
for (int i = 0; i < bytes1.size(); i++) {
System.out.println(Forms.byteToHexString(bytes1.get(i)));
}
}
@Test
public void enveopEncAndDec() throws TAException {
byte[] bytes = api.enveopEnc(sm2Key, "1111111111111111".getBytes());
System.out.println("Hasil enkapsulasi amplop digital: " + Forms.byteToHexString(bytes));
byte[] bytes1 = api.enveopDec(sm2PriKey, bytes);
System.out.println("Hasil dekapsulasi amplop digital: " + new String(bytes1));
}
/**
* Enkripsi konversi kunci simetris & enkripsi konversi asimetris
*/
@Test
public void symmetryConversionEncryptionAES256() throws TAException {
ArrayList<byte[]> bytes = api.conversionEncryption(0, TACryptConst.KEY_ALG_AES256,
Forms.hexStringToByteArray("5BD90CDDBC8645B4****96B6E52CC003D04F"),
Forms.hexStringToByteArray("F8B6****4FD3"),
TACryptConst.KEY_TYPE_SYMMETRY,
TACryptConst.KEY_ALG_AES256,
Forms.hexStringToByteArray("CFE8E3D44F753D3F****88EF70B54E65E232"), b,
Forms.hexStringToByteArray("8F2440B220****7D8D807A832A19F"), TACryptConst.ENC_MODE_GCM, b, new byte[22],
Forms.hexStringToByteArray("B5294D5910****80774B61BA48FA4"),
0,
TACryptConst.KEY_ALG_SM4, sm4Key2, sm4Key2CV, b, TACryptConst.ENC_MODE_CBC, b, new byte[12]);
for (int i = 0; i < bytes.size(); i++) {
System.out.println("Item " + i + ": " + Forms.byteToHexString(bytes.get(i)));
}
}
/**
* Enkripsi konversi kunci simetris & enkripsi konversi asimetris
*/
@Test
public void symmetryConversionEncryption() throws TAException {
ArrayList<byte[]> bytes = api.conversionEncryption(0, TACryptConst.KEY_ALG_SM4,
Forms.hexStringToByteArray("CBDCCE3378****E0B3BAA46CF3557"),
Forms.hexStringToByteArray("F668****C2AD"),
0,TACryptConst.KEY_ALG_SM4,
Forms.hexStringToByteArray("6BFC84C39C****6C7FA2A30C912A1"), b,
Forms.hexStringToByteArray("AB75C62580****39327B45881F589"), TACryptConst.ENC_MODE_GCM,
b, new byte[0], Forms.hexStringToByteArray("4A501743FA****4A0A8705192C1C8"),0,
TACryptConst.KEY_ALG_SM4,
Forms.hexStringToByteArray("CBDCCE3378****E0B3BAA46CF3557"),
Forms.hexStringToByteArray("F668****C2AD"), b, TACryptConst.ENC_MODE_GCM, b, new byte[0]);
for (int i = 0; i < bytes.size(); i++) {
System.out.println("Item " + i + ": " + Forms.byteToHexString(bytes.get(i)));
}
}
/**
* Enkripsi konversi kunci simetris & enkripsi konversi asimetris
*/
@Test
public void symmetryConversionEncryption1() throws TAException {
ArrayList<byte[]> bytes = api.conversionEncryption(0, TACryptConst.KEY_ALG_SM4, sm4Key, sm4CV,
TACryptConst.KEY_TYPE_ECC_OR_SM2,
TACryptConst.KEY_ALG_SM4,
Forms.hexStringToByteArray("83E260209C09CC3FEFDE****27A17AEB2C8919E1E4CF"), b,
Forms.hexStringToByteArray("E60EFC4882****F68D0EB622298FB"),
TACryptConst.ENC_MODE_GCM, b, new byte[16],
Forms.hexStringToByteArray("B200ED220D****C4438649057EB02"),
0,
TACryptConst.KEY_ALG_SM4, sm4Key, sm4CV, b, TACryptConst.ENC_MODE_GCM, b, new byte[16]);
for (int i = 0; i < bytes.size(); i++) {
System.out.println("Item " + i + ": " + Forms.byteToHexString(bytes.get(i)));
}
}
/**
* Impor CMK asimetris yang dilindungi oleh CMK simetris
*/
@Test
public void importCMKByCMK() throws TAException {
ArrayList<byte[]> bytes = api.importCMKByCMK("zjlimpl".getBytes(), 7,
6, // Identifier algoritma enkripsi DomainKey untuk enkripsi CMK
new byte[16], // Data IV yang digunakan untuk dekripsi mode ECB
new byte[16], // Data autentikasi yang digunakan untuk dekripsi mode GCM
Forms.hexStringToByteArray("566F7CE9E5****F02D7A7667E3F7C"), // Nilai MAC yang digunakan untuk dekripsi mode GCM
Forms.hexStringToByteArray("DA23B170CE****772B3F2AE2CCA97"),// Ciphertext kunci
Forms.hexStringToByteArray("7192C7C6F1****FE8A51BA9256C87"), // Tag GCM
6, // Mode enkripsi kunci proteksi
new byte[16],// IV kunci proteksi
new byte[16], // Data AAD autentikasi
Forms.hexStringToByteArray("8DE9DFEE4B****1C08A38BDD8A92F"), // Tag
5,// Mode padding enkripsi kunci proteksi
12, // Jenis kunci sesi
7, // Identifier algoritma untuk kunci asimetris CMK sesi
Forms.hexStringToByteArray("420B9FE23A2B162F3C4574919E9EBD44040F7C53********0B18990EF5C6F3A93AB80B41458311EA9F9A1890752427E24F5062AD4A"),// Ciphertext kunci privat sesi
"32-1".getBytes(),// Tag DomainKey sesi
6,// Identifier algoritma enkripsi DomainKey sesi untuk enkripsi CMK
new byte[16],// Konteks enkripsi sesi (data IV yang digunakan untuk enkripsi mode non-ECB)
new byte[16]// Data konteks autentikasi sesi (data autentikasi yang digunakan untuk enkripsi mode GCM)
);
System.out.println("Ciphertext kunci yang dienkripsi oleh kunci proteksi: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("MAC: " + Forms.byteToHexString(bytes.get(1)));
System.out.println("Tag: " + Forms.byteToHexString(bytes.get(2)));
System.out.println("Nilai verifikasi kunci: " + Forms.byteToHexString(bytes.get(3)));
}
@Test
public void testData() throws TAException {
// Hasilkan kunci simetris dan lindungi dengan kunci proteksi
ArrayList<byte[]> bytes = api.proGenSymmKey(603,
-1, null, TACryptConst.KEY_ALG_SM4, b,
TACryptConst.ENC_MODE_GCM,b, b);
System.out.println("Ciphertext kunci sesi yang dienkripsi oleh LMK: " + Forms.byteToHexString(bytes.get(0)));
System.out.println("Nilai verifikasi kunci sesi: " + Forms.byteToHexString(bytes.get(1)));
System.out.println("Ciphertext kunci sesi yang dienkripsi oleh kunci proteksi: " + Forms.byteToHexString(bytes.get(2)));
System.out.println("Nilai MAC kunci sesi: " + Forms.byteToHexString(bytes.get(3)));
System.out.println("Tag: " + Forms.byteToHexString(bytes.get(4)));
System.out.println("-------------------------------------------------");
// Enkripsi data menggunakan kunci simetris yang dilindungi oleh kunci proteksi
ArrayList<byte[]> bytes1 = api.proKeyEncData(603, -1, null,
bytes.get(2),
b, bytes.get(3), TACryptConst.ENC_MODE_GCM,
b, b, bytes.get(4),
TACryptConst.KEY_ALG_SM4, 0, 0,
new byte[16], TACryptConst.KEY_ALG_SM4, TACryptConst.ENC_MODE_GCM,
Forms.hexStringToByteArray("0000000000000000000000000000000000000000********353F49C7164DAE6C691FC25CD494D9A28D0F6C4B51F3BB9DC85ADDBE09"), new byte[16], new byte[16]);
System.out.println("Ciphertext: " + Forms.byteToHexString(bytes1.get(0)));
System.out.println("Tag: " + Forms.byteToHexString(bytes1.get(1)));
}
@Test
public void agreementKey() throws TAException {
// byte[] bytes = api.agreementKey(0x02CB, 4, 4, Forms.hexStringToByte("3076301006072A8648CE3D020106052B81040022********5645477442F9BF8BE9BF81EAD69CDA6C63FCF5244A383C57DDB62465E63B"));
// System.out.println("Hasil agreement secp384r1: " + Forms.byteToHexString(bytes));
// byte[] bytes1 = api.agreementKey(0x0007, 3, 6, Forms.hexStringToByte("3059301306072A8648CE3D020106082A811CCF55********DF9A3DF50D67073CF246FC3406337B50E987F2AC3943D2FF5C7ECAD197"));
// System.out.println("Hasil agreement 0x000: " + Forms.byteToHexString(bytes1));
// byte[] bytes2 = api.agreementKey(0x0007, 3, Forms.hexStringToByte("E59842CEEC68775E****F7DF23E08F7F6B8D"), Forms.hexStringToByte("3059301306072A8648CE3D020106082A811CCF55********B972EB19EA77A6AB74F345688B8458F1015885FCE435A4E3679DE0E34F"));
// System.out.println("Hasil agreement plaintext kunci privat eksternal 0x0007: " + Forms.byteToHexString(bytes2));
// byte[] bytes3 = api.agreementKey(0x039B, 0, 5, Forms.hexStringToByte("304A301406072A8648CE3D020106092B24030302********868F7D34BABEEB5A20F7DF5543091DD740DD3780B5EBEF631615571ADC"));
// System.out.println("Hasil agreement 0x039B: " + Forms.byteToHexString(bytes3));
byte[] bytesA = api.agreementKey(0x019F, 3, 13, Forms.hexStringToByte("3059301306072A8648CE3D020106082A8648CE3D********7558F1DA9AC8CDF5E7FA72C9931FA90EE06B3CE07E13A7845A05BA7C73"));
System.out.println(bytesA.length);
System.out.println("Hasil agreement 0x0007: " + Forms.byteToHexString(bytesA));
byte[] bytesB = api.agreementKey(0x019F, 3, 15, Forms.hexStringToByte("3059301306072A8648CE3D020106082A8648CE3D********C7AB0964E53872FBF0511FF6E7661CF94B7D82C8BF78D211B1FA73F271"));
System.out.println("Hasil agreement 0x0007: " + Forms.byteToHexString(bytesB));
}
/**
* Dapatkan detail kunci simetris berdasarkan indeks kunci
*/
@Test
public void getKeyInfo() throws TAException {
String[] keyInfo = api.getKeyInfo(66);
System.out.println(keyInfo[0]);
}
/**
* Dapatkan kunci publik RSA berdasarkan indeks kunci
*/
@Test
public void exportRSAPublicKey() throws TAException, IOException {
ArrayList<byte[]> keyInfo = api.exportRSAPublicKey(77,0);
System.out.println(Forms.byteToHexString(keyInfo.get(0)));
}
/**
* Dapatkan kunci publik ECC berdasarkan indeks kunci
*/
@Test
public void ExportEncPublicKey() throws TAException {
byte[] keyInfo = api.exportECCPublicKey(66,0);
System.out.println(Forms.byteToHexString(keyInfo));
}
@Test
public void generateAndSaveKey() throws Exception {
ArrayList<byte[]> symmKey = api.generateSymmKey(7, 32);
for (int i = 0; i < symmKey.size(); i++) {
System.out.println(Forms.byteToHexString(symmKey.get(i)));
}
boolean b = api.generateRSAKey(2048, 65537, 13);
System.out.println("Hasilkan dan simpan pasangan kunci RSA: " + (b ? "berhasil":"gagal"));
boolean b1 = api.generateECCKey(0x019F, 8);
System.out.println("Hasilkan dan simpan pasangan kunci ECC: " + (b1 ? "berhasil":"gagal"));
}
}