package cmbpoc; import com.sunyard.SydApi; import com.sunyard.proto.Util; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import racal.sunyard.main.SydApi4j; import java.util.Random; public class JmeterTest extends AbstractJavaSamplerClient { private byte[] publicKey; private byte[] plainData; private byte[] encryptedData; private String sign; private int sleep = 1; private byte[] privateKey4Sign; private byte[] publicKey4Sign; private byte[] privateKey4Ende; private byte[] publicKey4Ende; private String ip ; private int port; private int timeout; private String ip2 ; private ThreadLocal api; @Override public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("function", "sleep"); params.addArgument("sleep", "1"); params.addArgument("plainDataLen", "1024"); params.addArgument("publicKey4Ende", "", "加密用的公钥"); params.addArgument("privateKey4Ende", "", "解密用的公钥"); params.addArgument("publicKey4Sign", "", "验签用的公钥"); params.addArgument("privateKey4Sign", "", "签名用的公钥"); params.addArgument("ip", "192.168.100.145"); params.addArgument("ip2", "172.1.41.96"); params.addArgument("port", "8889"); params.addArgument("timeout", "3000"); return params; } @Override public void setupTest(JavaSamplerContext context) { // 签名密钥对 String publicKey4Sign = context.getParameter("publicKey4Sign"); if ( null != publicKey4Sign && !publicKey4Sign.isEmpty()) { this.publicKey4Sign = Util.hexString2Bytes(publicKey4Sign); } String privateKey4Sign = context.getParameter("privateKey4Sign"); if ( null != privateKey4Sign && !privateKey4Sign.isEmpty()) { this.privateKey4Sign = Util.hexString2Bytes(privateKey4Sign); } // 加密密钥对 String publicKey4Ende = context.getParameter("publicKey4Ende"); if ( null != publicKey4Ende && !publicKey4Ende.isEmpty()) { this.publicKey4Ende = Util.hexString2Bytes(publicKey4Ende); } String privateKey4Ende = context.getParameter("privateKey4Ende"); if ( null != privateKey4Ende && !privateKey4Ende.isEmpty()) { this.privateKey4Ende = Util.hexString2Bytes(privateKey4Ende); } // 原始数据 int plainDataLen = context.getIntParameter("plainDataLen"); plainData = new byte[plainDataLen]; new Random().nextBytes(plainData); System.out.println("原始数据长度:" + plainDataLen); // 校准测试 sleep = context.getIntParameter("sleep", 1); // api ip = context.getParameter("ip"); ip2 = context.getParameter("ip2"); port = context.getIntParameter("port"); timeout = context.getIntParameter("timeout"); api = new ThreadLocal() { @Override public SydApi4j initialValue() { return (SydApi4j) new SydApi4j().connect(ip, port, null, timeout); } }; // 线程开始时准备解密、验签数据 String function = context.getParameter("function"); switch (function) { case "SYD_SM2_Decrypt": this.encryptedData = this.api.get().SYD_SM2Encrypt(this.publicKey4Ende, this.plainData); break; case "SYD_SM2_Verify": this.sign = this.api.get().SYD_SM2_Sign_HA(SydApi.DATA_HASH, this.privateKey4Sign, this.publicKey4Sign, this.plainData); break; default: break; } } @Override public SampleResult runTest(JavaSamplerContext context) { SampleResult result = new SampleResult(); // 调用待测函数 String function = context.getParameter("function"); result.sampleStart(); // 开始计时 try { switch (function) { case "SYD_SM2_Encrypt": this.api.get().SYD_SM2Encrypt(publicKey4Ende, this.plainData); break; case "SYD_SM2_Decrypt": this.api.get().SYD_SM2Decrypt(privateKey4Ende, this.encryptedData); break; case "SYD_SM2_Sign": this.api.get().SYD_SM2_Sign_HA(SydApi.DATA_HASH, privateKey4Sign, publicKey4Sign, this.plainData); break; case "SYD_SM2_Verify": this.api.get().SYD_SM2_Verify_HA(SydApi.DATA_HASH, publicKey4Sign, this.plainData, this.sign); break; case "sleep": Thread.sleep( this.sleep ); break; default: break; } // result.setResponseData(encrypted); // 可选 result.setSuccessful(true); result.setResponseCodeOK(); result.setResponseMessage( function + "执行成功" ); } catch (Exception e) { result.setSuccessful(false); result.setResponseCode("500"); result.setResponseMessage( function + "执行失败。" + e.getMessage()); } finally { result.sampleEnd(); // 结束计时 } return result; } @Override public void teardownTest(JavaSamplerContext context) { // 释放资源(如有) } }