This commit is contained in:
yihzhou
2023-09-18 10:49:04 +08:00
parent 6f833730c2
commit 9af716e87d
6 changed files with 655 additions and 641 deletions
@@ -1,297 +1,297 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.io.IOException;
import java.util.Base64;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
/**
* 甘肃银行数字货币
*/
public class TestGSYH {
SydApi4j api;
// 对方加密证书sn
String sn = "1004282452";
// 自己签名证书sn
String sn1 = "1004282451";
@Before
public void before() {
// 通过设置debug的属性开启debug,如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000);
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test02() {
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
// 2.
String data = "1111111111111111";
// 随机生成对称密钥,由指定的公钥加密生成数字信封
RetWrap retWrap = api.generateDEbyGS(sn, SydApi.ALG_SM4);
String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
// sm4加密账号等数据
byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data.getBytes());
// base64转码
byte[] dataEncBs64 = encoder.encode(dataEnc);
System.out.println("dataEncBs64: " + Util.bytes2HexString(dataEncBs64));
// 将sm2加密后的数据进行base64转码
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] cipherKeyBs64 = encoder.encode(cipherKey.getBytes());
// 3.
// 报文正文
String msg = "12313146464564";
// 对报文正文签名(内部会计算hash)
String msgSign = api.netGSSign(sn1, msg.getBytes());
// base64转码
byte[] msgSignBs64 = encoder.encode(msgSign.getBytes());
// -------------下面为城银清算步骤-----------------
// 7.
// base64解码
byte[] msgSignB = decoder.decode(msgSignBs64);
// 对报文验签
boolean b = api.netGSVerify(sn1, msg.getBytes(), new String(msgSignB));
System.out.println("验签结果: " + b);
// 8.
byte[] cipherKeyB = decoder.decode(cipherKeyBs64);
// 解密数字信封获取对称密钥
RetWrap retWrap1 = api.decryptDE(sn, new String(cipherKeyB));
sessionKey = (String) retWrap1.get(SydApi.RET_SESSION_KEY);
// 9.
// 使用对称密钥解密报文
dataEnc = decoder.decode(dataEncBs64);
byte[] bytes1 = api.SYMDecryptData(SydApi.NALG_SM4, sessionKey, dataEnc);
System.out.println("data: " + new String(bytes1));
}
// 测试通过
// 8017
@Test
public void testGetX509CertFileBySN() {
String sn2 = "3C93000000000025";
/**
* 通过证书序号 sn 获取的 X509 证书文件。
* @param sn sn,证书序号
* @param nCertType 证书类型,0:签名证书, 1:加密证书
* @return base64 编码的证书
*/
String s = api.GetX509CertFileBySN(sn2, SydApi.FOR_SIGN);
System.out.println(s);
/**
* 输入 X509 格式的证书,获取证书信息。
* @param pCert base64 编码的证书
* @return 证书信息类
* 证书信息类,包含:颁发者DN、 证书序列号、 证书主题、证书有效期的起始时间、证书有效期的终止时间、DER编码的公钥。
*/
X509 x509 = api.GetX509CertInfo(s);
System.out.println("证书主题DN: " + x509.getSubject());
}
@Test
public void testimportCertAddHT() {
String cert1 = "MIIB4TCCAYSgAwIBAgIIPJMAAAAAACswDAYIKoEcz1UBg3UFADAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QwHhcNMTcxMTE3MDIzMDUxWhcNMjMwMTI1MDIzMDUxWjBZMQswCQYDVQQGEwJDTjELMAkGA1UECAwCWkoxCzAJBgNVBAcMAkhaMQ4wDAYDVQQKDAVISkpZUzERMA8GA1UECwwIMDAwMDAwMDAxDTALBgNVBAMMBDIyMjIwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATxqegqlmc/lduzBaKREyeNuPf78RA3wfJuhAv8zymLwQ6doefs1Iul+kMOukhfwY9aEhVdqws34FZMm2vs1+wXo2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFHfjFl72707A6s+YVuGvEuyvFWTMMAwGCCqBHM9VAYN1BQADSQAwRgIhALzg7+QW7RU4phv+4arEv0IOeaA6dtR8VT4Bwin9oHTWAiEA9kLESGiYm8L5Htf7GBXgH+pk7BJ68clml41B/ejZglI=";
String jgh = "00000000";
/**
* 上传指定证书到加密设备,并在证书前后加上begin和end
* @param certData 证书的字节数组
* @param organizationId 机构号的字节数组
* @return
*/
RetWrap retWrap = api.importCertAddHT(cert1, jgh.getBytes());
System.out.println(retWrap);
}
// 8012
@Test
public void testSYD_Get_X509_CertInfo_HA1() {
String orgData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<Document xmlns=\"urn:cbcc:std:dcep:2020:tech:xsd:ccms.903.001.02\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
" <CertNtfctn>\n" +
" <GrpHdr>\n" +
" <MsgId>20211230001190300000000032001000</MsgId>\n" +
" <CreDtTm>2021-12-30T09:27:49</CreDtTm>\n" +
" <InstgPty>\n" +
" <InstgDrctPty>G4000131000016</InstgDrctPty>\n" +
" </InstgPty>\n" +
" <InstdPty>\n" +
" <InstdDrctPty>C1175662000017</InstdDrctPty>\n" +
" </InstdPty>\n" +
" </GrpHdr>\n" +
" <CertNtfctnInf>\n" +
" <ChgTp>CC00</ChgTp>\n" +
" <CertTp>CS01</CertTp>\n" +
" </CertNtfctnInf>\n" +
" </CertNtfctn>\n" +
"</Document>";
String sign = "MIID3QYKKoEcz1UGAQQCAqCCA80wggPJAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICxDCCAsAwggJjoAMCAQICEBAAAAAAAAAAAAAAEEJYBCMwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1" +
"UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjEwMTExMDk1MjI1WhcNMjIwMTExMDk1MjI1WjB2MQswCQYDVQQGEwJjbjEVMBMGA1UECgwMQ0ZDQSBURVNUIENBMQ8wDQYDVQQLDAZDQ0ZDQ0IxF" +
"DASBgNVBAsMC0VudGVycHJpc2VzMSkwJwYDVQQDDCAwNDFAODkwNDI5MDA5OTk5RkRAQ0JDQ0AwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABExU5zuJ3pVl49mS3rTBwUcPuiI/zDR/w117PkpCgJ7m0kGyyorj1h2bxM62PthpNy99KPnk9gEvS696ZE5s8LGjgeowgecw" +
"HwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsMTY4NzY" +
"uY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUypxjmN7VBcoruhBRWmmFNv9yG1IwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYIKoEcz1UBg3UFAANJADBGAiEA1IQTRQf5aaDJzzVxWLRml1ZSqQd9FPFeKZJnbzGQIQMCIQD/gY5+H1nytcVAx8hGtUPssklmI+9+vTdOF5LaKMR+jzGB3T" +
"CB2gIBATBwMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIQEAAAAAAAAAAAAAAQQlgEIzAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgXmjY/FIR8" +
"qudmZGsIQUivZDt3/73dGojVjj5L76OcJICIAHu0G242uYPY2B8zMkGw7kQ1C1xgRipEmlC1GWwMCz0";
/**
* 验签并从签名中获取证书并上载到加密机
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 证书信息(包含公钥字段)
*/
X509 x509 = api.SYD_Get_X509_CertInfo_HA(orgData.getBytes(), sign);
System.out.println("证书公钥: " + Util.bytes2HexString(x509.getPubKey()));
}
// 测试通过
// 78
@Test
public void testSM2DecryptC() {
String certId = "1111111111111151";
String publicKey = "034200048043AF118B45629857DB693105849B2617FED249D59DFD29BE9A891ADEE7441A2D8C62020953DAEF038184E0244310CF2123C507F26F5380FFECC8D53E79B24E";
String orgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes());
System.out.println("加密后的数据: " + s);
System.out.println("加密后的数据解base64: " + Util.bytes2HexString(Base64.getDecoder().decode(s)));
byte[] bytes = api.SM2DecryptC(certId, s);
System.out.println("decData:" + new String(bytes));
}
// 测试通过
// 78
@Test
public void testSM2DecryptOrder2() {
String userId = "8015";
String orgData = "FfffffffffffffFfffffffffffffffff";
// 通过用户id获取公钥
String publicKey = api.SM2GetPublicKeyC(userId, SydApi.FOR_SIGN);
/**
* 用指定的 SM2 公钥对指定的密文数据进行加密。
* 输出的sm2密文结构为C1C2C3格式
* @param publicKey 公钥钥串,DER 编码,HEX 格式。
* @param pOrgData 加密的数据。
* @return 加密的数据 base64 编码。
*/
String s = api.SM2EncryptOrder(Util.hexString2Bytes(publicKey), orgData.getBytes());
System.out.println("加密后的数据: " + s);
/**
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
* 输入的sm2密文结构为C1C2C3格式
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
* @param enData 加密的数据,base64 编码。
* @param keyType 密钥类型,0:签名证书, 1:加密证书。
* @return 明文数据。
*/
byte[] bytes = api.SM2DecryptOrder(userId, s, SydApi.FOR_SIGN);
System.out.println("decData:" + new String(bytes));
}
@Test
public void testDecryptDE4() {
String sn = "1004282452";
String orgCode = "00001111222233";
/**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
*
* @param certSerial 对*方 X509 证书的序列号。
* @param orgCode 机构码
* @return RetWrap 包含 CipherKey, SessionKey, KCV
* CipherKey 公钥加密的会话密钥 ,BASE64 编码
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/
RetWrap retWrap = api.generateDEbyGS(sn, orgCode);
String CipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
String kcv = (String) retWrap.get(SydApi.RET_KCV);
printRetWrap(retWrap);
/**
* 接收用私钥解密数字信封,还原对称密钥。
*
* @param pCertSerial 输入。 对方 X509 证书的序列号。
* @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码
* @return RetWrap 包含 SessionKey KCV
* SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文
* KCV 会话密钥的检验值,HEX 格式,长度为 36H。
* orgCode 如果有机构码的话会返回机构码
*/
RetWrap retWrap1 = api.decryptDE(sn, CipherKey);
printRetWrap(retWrap1);
}
// =========================工具方法=====================
public static void printRetWrap(RetWrap rw) {
printRetWrap(rw, false);
}
/**
* 输出
* @param rw
*/
public static void printRetWrap(RetWrap rw, boolean flag) {
for (String s : rw.keySet()) {
Object o = rw.get(s);
if (o instanceof String) {
System.out.println(s + ":" + o);
} else if (o instanceof byte[]) {
if (flag) {
System.out.println(s + ": " + Util.bytes2HexString((byte[]) o));
} else {
System.out.println(s + ": " + new String((byte[]) o));
}
} else {
System.out.println(s + ":" + o);
}
}
}
}
//package com.sunyard.sydapi.test;
//
//import com.sunyard.RetWrap;
//import com.sunyard.SydApi;
//import com.sunyard.cert.X509;
//import com.sunyard.proto.Util;
//import org.junit.After;
//import org.junit.Before;
//import org.junit.Test;
//import racal.sunyard.main.SydApi4j;
//
//import java.io.IOException;
//import java.util.Base64;
//
//import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
//
///**
// * 甘肃银行数字货币
// */
//public class TestGSYH {
//
// SydApi4j api;
// // 对方加密证书sn
// String sn = "1004282452";
// // 自己签名证书sn
// String sn1 = "1004282451";
//
// @Before
// public void before() {
// // 通过设置debug的属性开启debug,如果不设置则默认不打开
// System.setProperty("com.sunyard.sydapi4j.debug", "true");
// api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000);
//
// }
//
// @After
// public void after() {
// try {
// this.api.disconnect();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
// @Test
// public void test02() {
// Base64.Encoder encoder = Base64.getEncoder();
// Base64.Decoder decoder = Base64.getDecoder();
//
// // 2.
// String data = "1111111111111111";
// // 随机生成对称密钥,由指定的公钥加密生成数字信封
// RetWrap retWrap = api.generateDEbyGS(sn, SydApi.ALG_SM4);
// String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
//
// // sm4加密账号等数据
// byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data.getBytes());
// // base64转码
// byte[] dataEncBs64 = encoder.encode(dataEnc);
//
// System.out.println("dataEncBs64: " + Util.bytes2HexString(dataEncBs64));
//
// // 将sm2加密后的数据进行base64转码
// String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
// byte[] cipherKeyBs64 = encoder.encode(cipherKey.getBytes());
//
// // 3.
// // 报文正文
// String msg = "12313146464564";
// // 对报文正文签名(内部会计算hash)
// String msgSign = api.netGSSign(sn1, msg.getBytes());
// // base64转码
// byte[] msgSignBs64 = encoder.encode(msgSign.getBytes());
//
//
// // -------------下面为城银清算步骤-----------------
// // 7.
// // base64解码
// byte[] msgSignB = decoder.decode(msgSignBs64);
// // 对报文验签
// boolean b = api.netGSVerify(sn1, msg.getBytes(), new String(msgSignB));
// System.out.println("验签结果: " + b);
//
// // 8.
// byte[] cipherKeyB = decoder.decode(cipherKeyBs64);
// // 解密数字信封获取对称密钥
// RetWrap retWrap1 = api.decryptDE(sn, new String(cipherKeyB));
// sessionKey = (String) retWrap1.get(SydApi.RET_SESSION_KEY);
//
// // 9.
// // 使用对称密钥解密报文
// dataEnc = decoder.decode(dataEncBs64);
// byte[] bytes1 = api.SYMDecryptData(SydApi.NALG_SM4, sessionKey, dataEnc);
// System.out.println("data: " + new String(bytes1));
// }
//
// // 测试通过
// // 8017
// @Test
// public void testGetX509CertFileBySN() {
// String sn2 = "3C93000000000025";
//
// /**
// * 通过证书序号 sn 获取的 X509 证书文件。
// * @param sn sn,证书序号
// * @param nCertType 证书类型,0:签名证书, 1:加密证书
// * @return base64 编码的证书
// */
// String s = api.GetX509CertFileBySN(sn2, SydApi.FOR_SIGN);
// System.out.println(s);
//
// /**
// * 输入 X509 格式的证书,获取证书信息。
// * @param pCert base64 编码的证书
// * @return 证书信息类
// * 证书信息类,包含:颁发者DN、 证书序列号、 证书主题、证书有效期的起始时间、证书有效期的终止时间、DER编码的公钥。
// */
// X509 x509 = api.GetX509CertInfo(s);
// System.out.println("证书主题DN: " + x509.getSubject());
// }
//
//
// @Test
// public void testimportCertAddHT() {
// String cert1 = "MIIB4TCCAYSgAwIBAgIIPJMAAAAAACswDAYIKoEcz1UBg3UFADAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QwHhcNMTcxMTE3MDIzMDUxWhcNMjMwMTI1MDIzMDUxWjBZMQswCQYDVQQGEwJDTjELMAkGA1UECAwCWkoxCzAJBgNVBAcMAkhaMQ4wDAYDVQQKDAVISkpZUzERMA8GA1UECwwIMDAwMDAwMDAxDTALBgNVBAMMBDIyMjIwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATxqegqlmc/lduzBaKREyeNuPf78RA3wfJuhAv8zymLwQ6doefs1Iul+kMOukhfwY9aEhVdqws34FZMm2vs1+wXo2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFHfjFl72707A6s+YVuGvEuyvFWTMMAwGCCqBHM9VAYN1BQADSQAwRgIhALzg7+QW7RU4phv+4arEv0IOeaA6dtR8VT4Bwin9oHTWAiEA9kLESGiYm8L5Htf7GBXgH+pk7BJ68clml41B/ejZglI=";
//
// String jgh = "00000000";
//
// /**
// * 上传指定证书到加密设备,并在证书前后加上begin和end
// * @param certData 证书的字节数组
// * @param organizationId 机构号的字节数组
// * @return
// */
// RetWrap retWrap = api.importCertAddHT(cert1, jgh.getBytes());
// System.out.println(retWrap);
// }
//
// // 8012
// @Test
// public void testSYD_Get_X509_CertInfo_HA1() {
//
// String orgData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
// "<Document xmlns=\"urn:cbcc:std:dcep:2020:tech:xsd:ccms.903.001.02\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
// " <CertNtfctn>\n" +
// " <GrpHdr>\n" +
// " <MsgId>20211230001190300000000032001000</MsgId>\n" +
// " <CreDtTm>2021-12-30T09:27:49</CreDtTm>\n" +
// " <InstgPty>\n" +
// " <InstgDrctPty>G4000131000016</InstgDrctPty>\n" +
// " </InstgPty>\n" +
// " <InstdPty>\n" +
// " <InstdDrctPty>C1175662000017</InstdDrctPty>\n" +
// " </InstdPty>\n" +
// " </GrpHdr>\n" +
// " <CertNtfctnInf>\n" +
// " <ChgTp>CC00</ChgTp>\n" +
// " <CertTp>CS01</CertTp>\n" +
// " </CertNtfctnInf>\n" +
// " </CertNtfctn>\n" +
// "</Document>";
//
// String sign = "MIID3QYKKoEcz1UGAQQCAqCCA80wggPJAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICxDCCAsAwggJjoAMCAQICEBAAAAAAAAAAAAAAEEJYBCMwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1" +
// "UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjEwMTExMDk1MjI1WhcNMjIwMTExMDk1MjI1WjB2MQswCQYDVQQGEwJjbjEVMBMGA1UECgwMQ0ZDQSBURVNUIENBMQ8wDQYDVQQLDAZDQ0ZDQ0IxF" +
// "DASBgNVBAsMC0VudGVycHJpc2VzMSkwJwYDVQQDDCAwNDFAODkwNDI5MDA5OTk5RkRAQ0JDQ0AwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABExU5zuJ3pVl49mS3rTBwUcPuiI/zDR/w117PkpCgJ7m0kGyyorj1h2bxM62PthpNy99KPnk9gEvS696ZE5s8LGjgeowgecw" +
// "HwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsMTY4NzY" +
// "uY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUypxjmN7VBcoruhBRWmmFNv9yG1IwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYIKoEcz1UBg3UFAANJADBGAiEA1IQTRQf5aaDJzzVxWLRml1ZSqQd9FPFeKZJnbzGQIQMCIQD/gY5+H1nytcVAx8hGtUPssklmI+9+vTdOF5LaKMR+jzGB3T" +
// "CB2gIBATBwMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIQEAAAAAAAAAAAAAAQQlgEIzAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgXmjY/FIR8" +
// "qudmZGsIQUivZDt3/73dGojVjj5L76OcJICIAHu0G242uYPY2B8zMkGw7kQ1C1xgRipEmlC1GWwMCz0";
//
// /**
// * 验签并从签名中获取证书并上载到加密机
// * @param orgData 待签名的原始数据
// * @param sign 签名数据
// * @return 证书信息(包含公钥字段)
// */
// X509 x509 = api.SYD_Get_X509_CertInfo_HA(orgData.getBytes(), sign);
// System.out.println("证书公钥: " + Util.bytes2HexString(x509.getPubKey()));
// }
//
//
// // 测试通过
// // 78
// @Test
// public void testSM2DecryptC() {
// String certId = "1111111111111151";
// String publicKey = "034200048043AF118B45629857DB693105849B2617FED249D59DFD29BE9A891ADEE7441A2D8C62020953DAEF038184E0244310CF2123C507F26F5380FFECC8D53E79B24E";
//
// String orgData = "FFFFFFFFFFFFFFFF";
// String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes());
//
// System.out.println("加密后的数据: " + s);
// System.out.println("加密后的数据解base64: " + Util.bytes2HexString(Base64.getDecoder().decode(s)));
//
// byte[] bytes = api.SM2DecryptC(certId, s);
//
// System.out.println("decData:" + new String(bytes));
// }
//
// // 测试通过
// // 78
// @Test
// public void testSM2DecryptOrder2() {
// String userId = "8015";
// String orgData = "FfffffffffffffFfffffffffffffffff";
//
// // 通过用户id获取公钥
// String publicKey = api.SM2GetPublicKeyC(userId, SydApi.FOR_SIGN);
//
// /**
// * 用指定的 SM2 公钥对指定的密文数据进行加密。
// * 输出的sm2密文结构为C1C2C3格式
// * @param publicKey 公钥钥串,DER 编码,HEX 格式。
// * @param pOrgData 加密的数据。
// * @return 加密的数据 base64 编码。
// */
// String s = api.SM2EncryptOrder(Util.hexString2Bytes(publicKey), orgData.getBytes());
//
// System.out.println("加密后的数据: " + s);
//
// /**
// * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
// * 输入的sm2密文结构为C1C2C3格式
// * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
// * @param enData 加密的数据,base64 编码。
// * @param keyType 密钥类型,0:签名证书, 1:加密证书。
// * @return 明文数据。
// */
// byte[] bytes = api.SM2DecryptOrder(userId, s, SydApi.FOR_SIGN);
//
// System.out.println("decData:" + new String(bytes));
// }
//
// @Test
// public void testDecryptDE4() {
// String sn = "1004282452";
// String orgCode = "00001111222233";
//
// /**
// * 产生对称密钥,通过公钥加密生成网联格式的数字信封。
// *
// * @param certSerial 对*方 X509 证书的序列号。
// * @param orgCode 机构码
// * @return RetWrap 包含 CipherKey, SessionKey, KCV
// * CipherKey 公钥加密的会话密钥 ,BASE64 编码
// * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
// * KCV 会话密钥的检验值,HEX 格式,长度为 32H。
// */
// RetWrap retWrap = api.generateDEbyGS(sn, orgCode);
// String CipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
// String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
// String kcv = (String) retWrap.get(SydApi.RET_KCV);
// printRetWrap(retWrap);
//
// /**
// * 接收用私钥解密数字信封,还原对称密钥。
// *
// * @param pCertSerial 输入。 对方 X509 证书的序列号。
// * @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码
// * @return RetWrap 包含 SessionKey KCV
// * SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文
// * KCV 会话密钥的检验值,HEX 格式,长度为 36H。
// * orgCode 如果有机构码的话会返回机构码
// */
// RetWrap retWrap1 = api.decryptDE(sn, CipherKey);
// printRetWrap(retWrap1);
// }
//
//
// // =========================工具方法=====================
//
// public static void printRetWrap(RetWrap rw) {
// printRetWrap(rw, false);
// }
//
// /**
// * 输出
// * @param rw
// */
// public static void printRetWrap(RetWrap rw, boolean flag) {
// for (String s : rw.keySet()) {
//
// Object o = rw.get(s);
// if (o instanceof String) {
// System.out.println(s + ":" + o);
// } else if (o instanceof byte[]) {
// if (flag) {
// System.out.println(s + ": " + Util.bytes2HexString((byte[]) o));
// } else {
// System.out.println(s + ": " + new String((byte[]) o));
// }
// } else {
// System.out.println(s + ":" + o);
// }
// }
// }
//}
@@ -1,113 +1,113 @@
package com.sunyard.sydapi.test;
import com.sunyard.trans.PacketSN;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
public class TestUtil {
public static void main(String[] args) throws Exception {
/* PacketSN sn = PacketSN.gen();
HashMap<String, Object> packet = new HashMap<String, Object>();
packet.put("header", sn.getSn().array());
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("alg$option", 0);
data.put("certificateModel$option", 0);
data.put("certificateSn", "113123");
data.put("keyType", "X");
packet.put("data", data);
SectionWrap s=new SectionWrap();
HashMap<String, Section> sc = new HashMap<String, Section>();
SectionValue s2=new SectionValue();
s2.setValue("L".getBytes());
sc.put("data",s2);
s.setSections(sc);*/
// HashMap<String, Object> packet = new HashMap<String, Object>();
// HashMap<String, Object> data = new HashMap<String, Object>();
// packet.put("data", data);
// PacketSN sn = PacketSN.gen();
// packet.put("header", sn.getSn().array());
// data.put("algorithmId$option", 0x1);
// data.put("keyLength", 256);
//package com.sunyard.sydapi.test;
//
// try {
// byte[] a=(byte[]) Util.eval("ResE2","getKeyLen",packet,null,null);
// System.out.println(a[0]);
// } catch (Exception e) {
// e.printStackTrace();
//import com.sunyard.trans.PacketSN;
//import org.junit.Test;
//import racal.sunyard.main.SydApi4j;
//
//import java.lang.reflect.Method;
//import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type;
//import java.text.SimpleDateFormat;
//import java.util.Arrays;
//import java.util.Calendar;
//import java.util.Date;
//import java.util.HashMap;
//
//public class TestUtil {
// public static void main(String[] args) throws Exception {
// /* PacketSN sn = PacketSN.gen();
// HashMap<String, Object> packet = new HashMap<String, Object>();
// packet.put("header", sn.getSn().array());
// HashMap<String, Object> data = new HashMap<String, Object>();
// data.put("alg$option", 0);
// data.put("certificateModel$option", 0);
// data.put("certificateSn", "113123");
// data.put("keyType", "X");
// packet.put("data", data);
// SectionWrap s=new SectionWrap();
// HashMap<String, Section> sc = new HashMap<String, Section>();
// SectionValue s2=new SectionValue();
// s2.setValue("L".getBytes());
// sc.put("data",s2);
// s.setSections(sc);*/
//// HashMap<String, Object> packet = new HashMap<String, Object>();
//// HashMap<String, Object> data = new HashMap<String, Object>();
//// packet.put("data", data);
//// PacketSN sn = PacketSN.gen();
//// packet.put("header", sn.getSn().array());
//// data.put("algorithmId$option", 0x1);
//// data.put("keyLength", 256);
////
//// try {
//// byte[] a=(byte[]) Util.eval("ResE2","getKeyLen",packet,null,null);
//// System.out.println(a[0]);
//// } catch (Exception e) {
//// e.printStackTrace();
//// }
//
//
//
// }
//
// /**
// * 获取所有方法
// */
// @Test
// public void getMethod() {
// Class<SydApi4j> jClass = SydApi4j.class;
//
// Method[] dm = jClass.getDeclaredMethods();
//
// System.out.println(dm.length);
//
// for (int i = 0; i < dm.length; i++) {
// Type[] types = dm[i].getGenericParameterTypes();
// System.out.print(dm[i].getName() + "(");
// for (int j = 0; j < types.length; j++) {
// Type type = types[j];
//
// System.out.print(getRealTypeName(type));
// if (j != types.length - 1) {
// System.out.print(", ");
// }
// }
// System.out.println(")");
// }
}
/**
* 获取所有方法
*/
@Test
public void getMethod() {
Class<SydApi4j> jClass = SydApi4j.class;
Method[] dm = jClass.getDeclaredMethods();
System.out.println(dm.length);
for (int i = 0; i < dm.length; i++) {
Type[] types = dm[i].getGenericParameterTypes();
System.out.print(dm[i].getName() + "(");
for (int j = 0; j < types.length; j++) {
Type type = types[j];
System.out.print(getRealTypeName(type));
if (j != types.length - 1) {
System.out.print(", ");
}
}
System.out.println(")");
}
}
public String getRealTypeName(Type type) {
String resultName = "";
if (type instanceof ParameterizedType) {
resultName = getRealName(type.getTypeName()) + "<";
Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments();
for (int z = 0; z < actualTypes.length; z++) {
resultName += getRealName(actualTypes[z].getTypeName());
if (z != actualTypes.length - 1) {
resultName += ", ";
}
}
resultName += ">";
} else {
resultName = getRealName(type.getTypeName());
}
return resultName.replace("$", ".");
}
public String getRealName(String typeName) {
if (typeName.contains(".") && typeName.contains("<")) {
typeName = typeName.substring(0, typeName.indexOf("<"));
return typeName.substring(typeName.lastIndexOf(".") + 1);
}
if (typeName.contains(".")) {
return typeName.substring(typeName.lastIndexOf(".") + 1);
}
return typeName;
}
}
// }
//
// public String getRealTypeName(Type type) {
//
// String resultName = "";
// if (type instanceof ParameterizedType) {
//
// resultName = getRealName(type.getTypeName()) + "<";
//
// Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments();
//
// for (int z = 0; z < actualTypes.length; z++) {
// resultName += getRealName(actualTypes[z].getTypeName());
// if (z != actualTypes.length - 1) {
// resultName += ", ";
// }
// }
// resultName += ">";
// } else {
// resultName = getRealName(type.getTypeName());
// }
//
// return resultName.replace("$", ".");
// }
//
// public String getRealName(String typeName) {
// if (typeName.contains(".") && typeName.contains("<")) {
// typeName = typeName.substring(0, typeName.indexOf("<"));
// return typeName.substring(typeName.lastIndexOf(".") + 1);
// }
//
// if (typeName.contains(".")) {
// return typeName.substring(typeName.lastIndexOf(".") + 1);
// }
//
// return typeName;
// }
//}