diff --git a/src/test/java/cmbpoc/PerformanceTest.java b/src/test/java/cmbpoc/PerformanceTest.java new file mode 100644 index 0000000..435beb4 --- /dev/null +++ b/src/test/java/cmbpoc/PerformanceTest.java @@ -0,0 +1,139 @@ +package cmbpoc; + +import com.sunyard.RetWrap; +import com.sunyard.SydApi; +import com.sunyard.proto.Util; +import org.junit.*; +import racal.sunyard.main.SydApi4j; + +public class PerformanceTest { + + private SydApi4j api; + private byte[] privateKey4Ende; + private byte[] publicKey4Ende; + private byte[] orgData2K = new byte[2 * 1024]; + private byte[] orgData2M = new byte[2 * 1024 * 1024]; + private byte[] orgData10M = new byte[10 * 1024 * 1024]; + private static final int TEST_ROUNDS = 10; + + @Before + public void start() { + System.setProperty("com.sunyard.sydapi4j.debug", "false"); + this.api = (SydApi4j) new SydApi4j().connect("192.168.100.145", 8889, null, 30000); + this.publicKey4Ende = Util.hexString2Bytes("03420004AF3D4E55D26564C6C937E6EA9232691C01AC5E7916AD2136F788CE7C1E4D0AE8C4754DEC2F7F6A78962D51A171A6F5B4F11823390AEC8B5B0246CD2CCF8052B7"); + this.privateKey4Ende = Util.hexString2Bytes("00010000963F7C3A98B7810F52D2861A060E18A9D4D59796CF33967DD61EEDA091E1AD9B0000000000000000000000000000000000000000000000000000000000000000"); + } + + @After + public void stop() { + if (null != api) { + this.api.disconnect(); + this.api = null; + } + } + + @Test + public void SYD_SM2_Encrypt_Performance_2K() { + System.out.println("=== SYD_SM2_Encrypt Performance Test - 2K Data ==="); + long totalEncryptTime = 0; + long totalDecryptTime = 0; + + for (int i = 0; i < TEST_ROUNDS; i++) { + long encryptStart = System.currentTimeMillis(); + byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2K); + long encryptEnd = System.currentTimeMillis(); + + long decryptStart = System.currentTimeMillis(); + byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData); + long decryptEnd = System.currentTimeMillis(); + + totalEncryptTime += (encryptEnd - encryptStart); + totalDecryptTime += (decryptEnd - decryptStart); + + Assert.assertArrayEquals(orgData2K, deData); + } + + double avgEncryptTime = (double) totalEncryptTime / TEST_ROUNDS; + double avgDecryptTime = (double) totalDecryptTime / TEST_ROUNDS; + double encryptThroughput = (2.0 / avgEncryptTime) * 1000; + double decryptThroughput = (2.0 / avgDecryptTime) * 1000; + + System.out.println("Test Rounds: " + TEST_ROUNDS); + System.out.println("Data Size: 2KB"); + System.out.printf("Average Encrypt Time: %.2f ms%n", avgEncryptTime); + System.out.printf("Average Decrypt Time: %.2f ms%n", avgDecryptTime); + System.out.printf("Encrypt Throughput: %.2f KB/s%n", encryptThroughput); + System.out.printf("Decrypt Throughput: %.2f KB/s%n", decryptThroughput); + System.out.println(); + } + + @Test + public void SYD_SM2_Encrypt_Performance_2M() { + System.out.println("=== SYD_SM2_Encrypt Performance Test - 2M Data ==="); + long totalEncryptTime = 0; + long totalDecryptTime = 0; + + for (int i = 0; i < TEST_ROUNDS; i++) { + long encryptStart = System.currentTimeMillis(); + byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData2M); + long encryptEnd = System.currentTimeMillis(); + + long decryptStart = System.currentTimeMillis(); + byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData); + long decryptEnd = System.currentTimeMillis(); + + totalEncryptTime += (encryptEnd - encryptStart); + totalDecryptTime += (decryptEnd - decryptStart); + + Assert.assertArrayEquals(orgData2M, deData); + } + + double avgEncryptTime = (double) totalEncryptTime / TEST_ROUNDS; + double avgDecryptTime = (double) totalDecryptTime / TEST_ROUNDS; + double encryptThroughput = (2048.0 / avgEncryptTime) * 1000; + double decryptThroughput = (2048.0 / avgDecryptTime) * 1000; + + System.out.println("Test Rounds: " + TEST_ROUNDS); + System.out.println("Data Size: 2MB"); + System.out.printf("Average Encrypt Time: %.2f ms%n", avgEncryptTime); + System.out.printf("Average Decrypt Time: %.2f ms%n", avgDecryptTime); + System.out.printf("Encrypt Throughput: %.2f KB/s%n", encryptThroughput); + System.out.printf("Decrypt Throughput: %.2f KB/s%n", decryptThroughput); + System.out.println(); + } + + @Test + public void SYD_SM2_Encrypt_Performance_10M() { + System.out.println("=== SYD_SM2_Encrypt Performance Test - 10M Data ==="); + long totalEncryptTime = 0; + long totalDecryptTime = 0; + + for (int i = 0; i < TEST_ROUNDS; i++) { + long encryptStart = System.currentTimeMillis(); + byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData10M); + long encryptEnd = System.currentTimeMillis(); + + long decryptStart = System.currentTimeMillis(); + byte[] deData = this.api.SYD_SM2Decrypt(privateKey4Ende, enData); + long decryptEnd = System.currentTimeMillis(); + + totalEncryptTime += (encryptEnd - encryptStart); + totalDecryptTime += (decryptEnd - decryptStart); + + Assert.assertArrayEquals(orgData10M, deData); + } + + double avgEncryptTime = (double) totalEncryptTime / TEST_ROUNDS; + double avgDecryptTime = (double) totalDecryptTime / TEST_ROUNDS; + double encryptThroughput = (10240.0 / avgEncryptTime) * 1000; + double decryptThroughput = (10240.0 / avgDecryptTime) * 1000; + + System.out.println("Test Rounds: " + TEST_ROUNDS); + System.out.println("Data Size: 10MB"); + System.out.printf("Average Encrypt Time: %.2f ms%n", avgEncryptTime); + System.out.printf("Average Decrypt Time: %.2f ms%n", avgDecryptTime); + System.out.printf("Encrypt Throughput: %.2f KB/s%n", encryptThroughput); + System.out.printf("Decrypt Throughput: %.2f KB/s%n", decryptThroughput); + System.out.println(); + } +}