package jmeter; import sample.SydUtils; import com.google.gson.Gson; import com.sunyard.SydApiException; import com.sunyard.entity.ImportResult; import com.sunyard.proto.Util; import org.apache.commons.lang3.StringUtils; 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.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.*; public class Test4Jmeter extends AbstractJavaSamplerClient { private String SM2dn ; private String RSAdn ; private String ip ; private int port; private String ip2 ; private String oData; private String sign; private String detachedSign; private byte[] orgData; private int type; private static ThreadLocal api; private int dataLength; private String cert; private String nodes; private String snmpIP; private String snmpPort; private String snmpOID; private String snmpCommunity; private int timeout; private int logSwitch; /** * 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数 * @return Arguments对象 */ @Override public Arguments getDefaultParameters() { Arguments arguments = new Arguments(); arguments.addArgument("SM2dn", "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz"); arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"); arguments.addArgument("orgData", "null"); arguments.addArgument("ip", "172.1.41.139"); arguments.addArgument("ip2", "172.1.41.96"); arguments.addArgument("port", "8889"); arguments.addArgument("timeout", "3000"); arguments.addArgument("logSwitch", "1"); // arguments.addArgument("ip2", "172.16.17.161"); arguments.addArgument("dataLength", "1024"); arguments.addArgument("type", "1"); arguments.addArgument("sign", "12345678"); arguments.addArgument("detachedSign", "12345678"); arguments.addArgument("cert", ""); arguments.addArgument("nodes", "172.1.41.139:8889;172.1.41.96:8889"); arguments.addArgument("snmpIP", "172.1.41.139"); arguments.addArgument("snmpPort", "162"); arguments.addArgument("snmpOID", "1.3.6.1.4.1.9999"); arguments.addArgument("snmpCommunity", "public"); return arguments; } /** * 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作 * @param context 可以获取jmeter传递过来的参数 */ @Override public void setupTest(JavaSamplerContext context) { //对成员变量初始化 SM2dn = context.getParameter("SM2dn"); RSAdn = context.getParameter("RSAdn"); oData = context.getParameter("orgData"); ip = context.getParameter("ip"); ip2 = context.getParameter("ip2"); port = context.getIntParameter("port"); timeout = context.getIntParameter("timeout"); logSwitch = context.getIntParameter("logSwitch"); // ip2 = context.getParameter("ip2"); dataLength = context.getIntParameter("dataLength"); type = context.getIntParameter("type"); sign = context.getParameter("sign"); detachedSign = context.getParameter("detachedSign"); cert = context.getParameter("cert"); nodes = context.getParameter("nodes"); snmpIP = context.getParameter("snmpIP"); snmpPort = context.getParameter("snmpPort"); snmpOID = context.getParameter("snmpOID"); snmpCommunity = context.getParameter("snmpCommunity"); System.getProperty("com.sunyard.sydapi4j.debug", "false"); System.setProperty("com.sunyard.dnsort", "false"); api = new ThreadLocal() { @Override public SydApi4j initialValue() { // // SydApiBuilder builder = new SydApiBuilder().setIp(ip); // final SydApi4j api = (SydApi4j) builder.build(); SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout); final SydApi4j api1 = (SydApi4j) new SydApi4j(); return api1; } }; } /** * 真正的测试代码块,jmeter按照配置的逻辑执行该方法 * @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数 * @return SampleResult对象用于封装结果 */ @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { SampleResult sr = new SampleResult(); //设置标签 sr.setSampleLabel("testDemo"); //设置开始标志,否则无法统计tps等 sr.sampleStart(); SydUtils sydUtils = null; try { if ("null".equals(oData)) { orgData = null; } else { orgData = oData.getBytes(); //SM2裸签 } sydUtils = new SydUtils(ip, ip2, port, timeout); // orgData = new byte[dataLength]; //执行业务逻辑 switch(type){ case 1: // api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null); // byte[] nakedSign = api.get().SYD_NakedSign(orgData,SM2dn); byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn); if (logSwitch == 1) { System.out.println("p1签名(hex):"+ Util.bytes2HexString(nakedSign)); } sr.setResponseCodeOK(); //sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName()); break; case 2: // api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ; // boolean flag = api.get().SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn); boolean flag = sydUtils.SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn); if (logSwitch == 1) { System.out.println("p1验签:"+ flag); } sr.setResponseCodeOK(); //sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName()); break; case 3: //RSA裸签 api.get().SYD_NakedSign(1, RSAdn,orgData,(byte[])null); sr.setResponseCodeOK(); //sr.setResponseData(Util.encodeBase64(nakedSign2), StandardCharsets.UTF_8.displayName()); break; case 4: api.get().SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null); sr.setResponseCodeOK(); //sr.setResponseData(String.valueOf(nakedVerify2), StandardCharsets.UTF_8.displayName()); break; case 5: // api.get().detachedSign(1, orgData, SM2dn); //p7 detached签名 String detachedSign1 = sydUtils.detachedSign(orgData, SM2dn); if (logSwitch == 1) { System.out.println("p7 detach签名:"+ detachedSign1); } sr.setResponseCodeOK(); //sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName()); break; case 6: // api.get().detachedVerify(1, orgData, sign); //p7 detached验签 // boolean ver = api.get().detachedVerify(orgData, detachedSign); boolean ver = sydUtils.detachedVerify(orgData, detachedSign); if (logSwitch == 1) { System.out.println("p7 detach验签:"+ ver); } sr.setResponseCodeOK(); //sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName()); break; case 7: api.get().detachedSign(2,1, orgData, RSAdn); sr.setResponseCodeOK(); //sr.setResponseData(detSign2, StandardCharsets.UTF_8.displayName()); break; case 8: api.get().detachedVerify(2,2, orgData, sign); sr.setResponseCodeOK(); //sr.setResponseData(String.valueOf(detV2), StandardCharsets.UTF_8.displayName()); break; case 9: api.get().attachedSignHsm(orgData, SM2dn); sr.setResponseCodeOK(); //sr.setResponseData(attSign1, StandardCharsets.UTF_8.displayName()); break; case 10: api.get().attachedVerify( sign.getBytes()); sr.setResponseCodeOK(); // sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName()); break; case 11: api.get().attachedSignRSAHsm(2, orgData, RSAdn); sr.setResponseCodeOK(); // sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName()); break; case 12: api.get().attachedVerifyRSA(2, sign); sr.setResponseCodeOK(); // sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName()); break; case 13: api.get().generateDE(SM2dn.getBytes(), 3, 1, orgData); // byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY); sr.setResponseCodeOK(); // sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName()); break; case 14: api.get().decryptDE(true, 1, SM2dn.getBytes(), sign);; // byte[] oData = (byte[]) denSM2.get("oData"); sr.setResponseCodeOK(); // sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName()); break; case 15: api.get().generateDE(RSAdn.getBytes(), 4, 1, orgData); // byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY); sr.setResponseCodeOK(); //sr.setResponseData(new String(cipherKeyRSA), StandardCharsets.UTF_8.displayName()); break; case 16: api.get().decryptDERSA(true, 1, RSAdn.getBytes(), sign); // byte[] oDataRSA = (byte[]) denRSA.get("oData"); sr.setResponseCodeOK(); //sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName()); break; case 17: String cert1 = api.get().getCertBySign(detachedSign); System.out.println("根据p7签名值获取的证书为:" + cert1); sr.setResponseCodeOK(); break; case 18: testAhnx(sydUtils); sr.setResponseCodeOK(); break; case 19: testImportCert(); sr.setResponseCodeOK(); break; case 20: boolean delFlag = api.get().deleteCert(SM2dn); System.out.println("删除证书成功:"+ delFlag); break; case 21: SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout); break; case 22: api.get().connect(ip, port, "", timeout); break; case 23: api.get().disconnect(); break; default: sr.setResponseCodeOK(); sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName()); break; } sr.setSuccessful(true); }catch (SydApiException e){ e.printStackTrace(); sr.setResponseCode(String.valueOf(e.getRetCode())); sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName()); sr.setSuccessful(false); }finally { if (sydUtils != null) { sydUtils.disconnect(); } sr.sampleEnd(); } return sr; } public void testAhnx(SydUtils sydUtils) { //裸签 byte[] nakedSign = sydUtils.SYD_NakedSign(orgData,SM2dn); //裸签验签 boolean ver = sydUtils.SYD_NakedVerify(orgData,nakedSign, SM2dn); //detach签名 String detachedSign = sydUtils.detachedSign(orgData, SM2dn); //detach验签 boolean ver1 = sydUtils.detachedVerify(orgData, detachedSign); // testImportCert(); } private void testImportCert(){ List masterNodes = Arrays.asList(StringUtils.split(nodes, ";")); Map map = new HashMap<>(); map.put("snmp.target.ip", snmpIP); map.put("snmp.target.port", snmpPort); map.put("enterprise.oid", snmpOID); map.put("snmp.community", snmpCommunity); map.put("snmp.version", "1"); Gson gson = new Gson(); String snmpConfig = gson.toJson(map); SydApi4j sydApi4j = new SydApi4j(); String cert21 = convertToPem(Base64.getDecoder().decode(cert)); ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert21, "12345678", snmpConfig); System.out.println("证书导入结果:" + gson.toJson(importResult)); } private String convertToPem(byte[] derCert){ // 使用Base64编码器(兼容RFC 4648,每行64字符) StringWriter writer = new StringWriter(); writer.write("-----BEGIN CERTIFICATE-----\n"); // 将DER转换为Base64并分割为每行64字符 String base64Cert = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(derCert); writer.write(base64Cert); // 如果Base64编码的字符串没有以换行结束,则添加换行 if (!base64Cert.endsWith("\n")) { writer.write("\n"); } writer.write("-----END CERTIFICATE-----\n"); return writer.toString(); } /** * 测试完成后执行,一般用于关闭资源 * @param context 上下文对象,可用于获取jmeter传递的参数 */ @Override public void teardownTest(JavaSamplerContext context) { System.runFinalization(); if (api != null) { api.get().disconnect(); api.remove(); } } }