diff --git a/DProto/A4.xml b/DProto/A4.xml
index c37c8fd..1650285 100644
--- a/DProto/A4.xml
+++ b/DProto/A4.xml
@@ -110,7 +110,12 @@
\ No newline at end of file
diff --git a/DProto/MS.xml b/DProto/MS.xml
index 1ec41a0..c144bab 100644
--- a/DProto/MS.xml
+++ b/DProto/MS.xml
@@ -167,7 +167,7 @@
if( 0 == $packet.data.dataType$option ){
return $packet.data.msg.length
} else {
- return $packet.data.msg.length() /2
+ return ($packet.data.msg.length / 2) as int
}
}
@@ -175,7 +175,7 @@
if ( 0 == $packet.data.mode$option ) {
return 16;
} else {
- return 32;
+ return 16;
}
}
diff --git a/DProto/MU.xml b/DProto/MU.xml
index d0c9f1e..e59be20 100644
--- a/DProto/MU.xml
+++ b/DProto/MU.xml
@@ -133,7 +133,7 @@
if ( 0 == $packet.data.mode$option ) {
return 16;
} else {
- return 32;
+ return 16;
}
}
diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx
index abe8fc7..c2ffbaa 100644
Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ
diff --git a/src/main/java/com/sunyard/inf/SydCryptionApi.java b/src/main/java/com/sunyard/inf/SydCryptionApi.java
index 7f253af..2e892f2 100644
--- a/src/main/java/com/sunyard/inf/SydCryptionApi.java
+++ b/src/main/java/com/sunyard/inf/SydCryptionApi.java
@@ -179,6 +179,7 @@ interface SydSYMApi {
* @param fullMode 填充模式:0为饥饿模式,1为贪婪模式
* @param pInData 消息数据
* @param iv IV
+ * @param block 消息块号
* @return
* iv: IV 数据域
* msg_all: 消息数据
diff --git a/src/main/java/com/sunyard/inf/SydGenApi.java b/src/main/java/com/sunyard/inf/SydGenApi.java
index 55cbd76..cf6f0ae 100644
--- a/src/main/java/com/sunyard/inf/SydGenApi.java
+++ b/src/main/java/com/sunyard/inf/SydGenApi.java
@@ -44,6 +44,8 @@ public interface SydGenApi {
/**
* 生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥)
+ *
+ * 默认加密输出密钥的密钥方案为X,业务标识为N。
* @param mode 是否产生ZMK加密下的密钥,0-产生密钥。1-产生密钥并在ZMK下加密
* @param keyType 密钥类型
* @param solution 密钥方案(LMK) 密钥长度/LMK下加密密钥的方案。
diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java
index bd0ecce..2598fad 100644
--- a/src/main/java/racal/sunyard/main/SydApi4j.java
+++ b/src/main/java/racal/sunyard/main/SydApi4j.java
@@ -472,6 +472,7 @@ public class SydApi4j implements SydApi {
}
+ // 测试通过
@Override
public RetWrap genComposeKey(String[] keys) {
@@ -502,8 +503,8 @@ public class SydApi4j implements SydApi {
data.put("flag", 'N');
data.put("split", ";");
- data.put("zmk", "Z");
- data.put("lmk", "Z");
+ data.put("zmk", "X");
+ data.put("lmk", "X");
data.put("kcvType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -530,7 +531,7 @@ public class SydApi4j implements SydApi {
System.arraycopy(lmkHeads, 0, bs, 0, lmkHeads.length);
System.arraycopy(lmks, 0, bs, lmkHeads.length, lmks.length);
retWrap.put("lmkKey", bs);
- retWrap.put("keyCheck", ((PacketSection) ret.get("keyCheck")).getBytes());
+ retWrap.put("keyCheck", ((PacketSection) ret.get("kcv")).getBytes());
return retWrap;
}
}
@@ -538,6 +539,7 @@ public class SydApi4j implements SydApi {
}
+ // 测试通过
@Override
public RetWrap genComposeKey(String keyType, char keySolution, String keyClearPattern) {
@@ -2179,6 +2181,7 @@ public class SydApi4j implements SydApi {
return rw;
}
+ // 测试通过
@Override
public String GenerateRandom(int nRandomSize) {
//获取协议
@@ -2385,6 +2388,7 @@ public class SydApi4j implements SydApi {
}
+ // 测试通过
@Override
public RetWrap SM3Hash(int packSn, String userId, byte[] publicKey, byte[] msg, byte[] filterData) {
Proto76 proto = new Proto76();
@@ -2427,6 +2431,7 @@ public class SydApi4j implements SydApi {
}
}
+ // 测试通过
@Override
public RetWrap SM2OrRSAGenKeyPair(int keyType, String index, int length) {
@@ -2449,7 +2454,7 @@ public class SydApi4j implements SydApi {
packet.put("header", sn.getSn().array());
data.put("algorithmId$option", keyType);
data.put("keyLength", keyLength);
- //data.put("flag", "P");
+ data.put("flag", "P");
data.put("index", SYMUtil.genPrivateKeyMark(index, "000", "00000001"));
data.put("startTime", date);
data.put("endTime", date);
@@ -2608,6 +2613,7 @@ public class SydApi4j implements SydApi {
}
//1.1生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥)
+ // 测试通过
public RetWrap genSymKey(int mode, String keyType, char solution, String zmk) {
ProtoA0 proto = new ProtoA0();
HashMap packet = new HashMap();
@@ -3285,6 +3291,7 @@ public class SydApi4j implements SydApi {
}
}
+ // 测试通过
@Override
public byte[] encryptByPk(int alg, String pk, byte[] data) {
@@ -3751,6 +3758,7 @@ public class SydApi4j implements SydApi {
return ctx;
}
+ // 测试通过
@Override
public RetWrap SM2GenSessionKey(String publicKey) {
// 获取协议
@@ -4441,7 +4449,7 @@ public class SydApi4j implements SydApi {
* @return 所计算出的MAC hex 格式
*/
public byte[] MAC_Data(String TAK, String infoData, String IV) {
- ProtoMA proto = new ProtoMA();
+ ProtoMAXF proto = new ProtoMAXF();
// 填充数据
HashMap packet = new HashMap();
@@ -4458,8 +4466,6 @@ public class SydApi4j implements SydApi {
data.put("TAK", TAK);
-
- infoData += "80";
while (infoData.length() % 16 != 0) {
infoData += "00";
}
@@ -4504,6 +4510,7 @@ public class SydApi4j implements SydApi {
* @param iv IV
* @return 所计算出的MAC
*/
+ // 测试通过
public byte[] _calcPBOCMAC(int mode, int keyType, String key, byte[] odata, int block, byte[] iv) {
ProtoMU proto = new ProtoMU();
@@ -5297,6 +5304,7 @@ public class SydApi4j implements SydApi {
}
+ // 测试通过
@Override
public RetWrap outputKey(String keyType, char solution, String zmk, String key) {
@@ -5354,6 +5362,7 @@ public class SydApi4j implements SydApi {
return retWrap;
}
+ // 测试通过
@Override
public RetWrap inputKey(String keyType, char solution, String zmk, String key) {
@@ -5488,6 +5497,7 @@ public class SydApi4j implements SydApi {
* @return RetWrap
* lmkkey lmk 头 + LMK 加密下的密钥。
*/
+ // 测试通过
public RetWrap conversionKey(String keyType, String key, char solution) {
ProtoB0 proto = new ProtoB0();
@@ -5547,6 +5557,7 @@ public class SydApi4j implements SydApi {
* @return zmkKey: ZMK 加密下的ZPK
* keyCheck: 密钥校验值。
*/
+ // 测试通过
public RetWrap changZMK2LMK(String zmki, String zmk) {
ProtoBY proto = new ProtoBY();
@@ -5561,7 +5572,7 @@ public class SydApi4j implements SydApi {
data.put("zmk", zmk);
data.put("separator", ";");
data.put("zmkSolution", "X");
- data.put("lmkSolution", "Z");
+ data.put("lmkSolution", "X");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -5615,6 +5626,7 @@ public class SydApi4j implements SydApi {
* EQUIPNO: 设备机具号
* SOFTVERSION: 设备内部软件版本号
*/
+ // 测试通过
@Override
public RetWrap getVersion(String num) {
ProtoHV proto = new ProtoHV();
@@ -5835,6 +5847,7 @@ public class SydApi4j implements SydApi {
* @param infoData 加押数据
* @return MAC: 密押,默认为8H
*/
+ // 测试通过
public RetWrap impose(String keyType, String key, byte[] infoData) {
// 获取协议
Proto62 proto = new Proto62();
@@ -5887,6 +5900,7 @@ public class SydApi4j implements SydApi {
* @param infoData 加押数据
* @return 是否正确
*/
+ // 测试通过
public Boolean verifyImpose(String keyType, String key, byte[] secret, byte[] infoData) {
// 获取协议
Proto63 proto = new Proto63();
@@ -5938,6 +5952,7 @@ public class SydApi4j implements SydApi {
* @return infoLen: 返回原数据长度
* info: 信息数据
*/
+ // 测试通过
public RetWrap encryAndDecry(String keyType, String key, byte[] infoData) {
// 获取协议
Proto64 proto = new Proto64();
@@ -5979,7 +5994,7 @@ public class SydApi4j implements SydApi {
}
RetWrap rw = new RetWrap();
rw.put("infoLen", ((PacketSection) ret.get("infoLen")).getString());
- rw.put("info", ((PacketSection) ret.get("info")).getString());
+ rw.put("info", ((PacketSection) ret.get("info")).getBytes());
return rw;
}
@@ -5993,6 +6008,7 @@ public class SydApi4j implements SydApi {
* @return infoLen: 密文数据长度
* info: 密文数据
*/
+ // 测试通过
public RetWrap switchEncry(String keyType, String srcKey, String aimKey, byte[] infoData) {
// 获取协议
Proto65 proto = new Proto65();
@@ -6044,6 +6060,7 @@ public class SydApi4j implements SydApi {
* @param pin PIN数据
* @return PIN数据
*/
+ // 测试通过
public byte[] encryAndDecry4PIN(String key, byte[] pin) {
// 获取协议
Proto66 proto = new Proto66();
@@ -6184,6 +6201,7 @@ public class SydApi4j implements SydApi {
* @return keyLength: 公钥加密的密文长度
* key: 公钥加密的密文的DER编码
*/
+ // 测试通过
public RetWrap LMK2SM2(byte[] pk, String key) {
// 获取协议
Proto71 proto = new Proto71();
@@ -6220,7 +6238,7 @@ public class SydApi4j implements SydApi {
}
RetWrap rw = new RetWrap();
rw.put("keyLength", ((PacketSection) ret.get("keyLength")).getString());
- rw.put("key", ((PacketSection) ret.get("key")).getString());
+ rw.put("key", ((PacketSection) ret.get("key")).getBytes());
return rw;
}
@@ -6291,6 +6309,7 @@ public class SydApi4j implements SydApi {
* @return filterData: 过渡消息数据.只对“消息块号”为 2、1 时有效
* hash: hash
*/
+ // 测试通过
public RetWrap conutHash(int hashType, int packSn, byte[] msg, byte[] filterData) {
Proto7D proto = new Proto7D();
HashMap packet = new HashMap();
@@ -6339,6 +6358,7 @@ public class SydApi4j implements SydApi {
* @param checkValue 校验值
* @return 是否成功
*/
+ // 测试通过
public Boolean loadKey(String index, String key, String checkValue) {
ProtoLB proto = new ProtoLB();
HashMap packet = new HashMap();
@@ -6350,8 +6370,8 @@ public class SydApi4j implements SydApi {
data.put("indexFlag", "K");
data.put("index", index);
data.put("key", key);
- data.put("checkFlag", "P");
- data.put("checkValue", checkValue);
+// data.put("checkFlag", "P");
+// data.put("checkValue", checkValue);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date dt = new Date();
@@ -6394,6 +6414,7 @@ public class SydApi4j implements SydApi {
* @param index 索引地址,指示用户密钥存储区的27位地址
* @return key: 被加密的密钥
*/
+ // 测试通过
@Override
public RetWrap readKey(String index) {
ProtoLF proto = new ProtoLF();
@@ -6444,6 +6465,7 @@ public class SydApi4j implements SydApi {
* @param checkValue 校验值
* @return
*/
+ // 测试通过
public Boolean updateKey(String index, String key, String checkValue) {
ProtoLG proto = new ProtoLG();
HashMap packet = new HashMap();
@@ -6504,16 +6526,17 @@ public class SydApi4j implements SydApi {
* 数据转加密指令(Y0)(=) -> pass (注:密文数据那项不一定需要传加密出来的数据)
*
* @param srcType 源密钥类型
- * @param sca 源算法SCA
+ * @param sca 源算法SCA 1:DES, 2:3DES, 3:IDEA, 4:SM1, 5:AES, 6:SM4
* @param desKeyType 目的秘钥类型
- * @param dca 目的算法SCA
- * @param roundModel 加密模式
+ * @param dca 目的算法SCA 1:DES, 2:3DES, 3:IDEA, 4:SM1, 5:AES, 6:SM4
+ * @param roundModel 加密模式 1:ECB, 2:CBC, 3:CFB, 4:OFB
* @param sDEK 源秘钥DEK
* @param dDEK 目的秘钥DEK
* @param infoData 密文数据
* @param vector 向量
* @return byte[] 目的密钥加密的密文数据
*/
+ // 测试通过
public byte[] switchEncryY(String srcType, int sca, String desKeyType, int dca, int roundModel, String sDEK, String dDEK, byte[] infoData, String vector) {
ProtoY0 proto = new ProtoY0();
HashMap packet = new HashMap();
@@ -6524,10 +6547,10 @@ public class SydApi4j implements SydApi {
packet.put("header", sn.getSn().array());
data.put("srcKeyType", srcType);
- data.put("sca$option", sca);
+ data.put("sca$option", sca - 1);
data.put("desKeyType", desKeyType);
- data.put("dca$option", dca);
- data.put("roundModel$option", roundModel);
+ data.put("dca$option", dca - 1);
+ data.put("roundModel$option", roundModel - 1);
data.put("sDEK", sDEK);
data.put("dDEK", dDEK);
data.put("infoData", infoData);
@@ -6567,6 +6590,7 @@ public class SydApi4j implements SydApi {
* @param msg 消息块
* @return MAB: 当消息块号为“1”或“2”时,作为下一块的IV。当消息块号为“0”或“3”时,用于消息认证。
*/
+ // 测试通过
public RetWrap genMAB(int packSn, int keyType, int mode, String key, byte[] iv, byte[] msg) {
ProtoMS proto = new ProtoMS();
HashMap packet = new HashMap();
@@ -6578,9 +6602,9 @@ public class SydApi4j implements SydApi {
data.put("block$option", packSn);
data.put("keyType$option", keyType);
data.put("mode$option", mode);
- data.put("dataType$option", 0);
+ data.put("dataType$option", 1);
data.put("key", key);
- if (null != iv) {
+ if (null != iv && !"".equals(iv)) {
data.put("iv", iv);
}
data.put("msg", msg);
@@ -6615,6 +6639,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右 12 位
* @return LMK 对(02-03)下加密的导出 PINBLOCK。(PINBLOCK格式默认为 01 格式)
*/
+ // 测试通过
public String genPIN(String account) {
ProtoJA proto = new ProtoJA();
HashMap packet = new HashMap();
@@ -6720,6 +6745,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右 12 位
* @return 目的 ZPK 下加密的目的 PIN 块
*/
+ // 测试通过
@Override
public String transPINFromZPKToZPK(String zpk1, String zpk2, int sca, int dca, int spt, int dpt, String pin, String account) {
@@ -6735,12 +6761,12 @@ public class SydApi4j implements SydApi {
data.put("sourceZpk", zpk1);
data.put("purposeZpk", zpk2);
data.put("algorithmKey", 'P');
- data.put("sca$option", sca);
- data.put("dca$option", dca);
+ data.put("sca$option", sca - 1);
+ data.put("dca$option", dca - 1);
data.put("businessKey", 'N');
data.put("sourcePinBlock", pin);
- data.put("sourcePinBlockFormat", 06);
- data.put("purposePinBlockFormat", 06);
+ data.put("sourcePinBlockFormat", 01);
+ data.put("purposePinBlockFormat", 01);
data.put("account", account);
data.put("maxLength", 12);
@@ -6783,6 +6809,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右 12 位
* @return PIN 块,LMK 对(02-03)下加密的 PIN
*/
+ // 测试通过
public String transPINFromZPKToLMK(String zpk, int sca, int dca, int pt, String pin, String account) {
ProtoJE proto = new ProtoJE();
@@ -6796,8 +6823,8 @@ public class SydApi4j implements SydApi {
data.put("zpk", zpk);
data.put("algorithmKey", 'P');
- data.put("sca$option", sca);
- data.put("dca$option", dca);
+ data.put("sca$option", sca - 1);
+ data.put("dca$option", dca - 1);
data.put("businessKey", 'N');
data.put("PinBlock", pin);
data.put("pinBlockFormat", pt);
@@ -6854,8 +6881,8 @@ public class SydApi4j implements SydApi {
data.put("zpk", zpk);
data.put("algorithmKey", 'P');
- data.put("sca$option", sca);
- data.put("dca$option", dca);
+ data.put("sca$option", sca - 1);
+ data.put("dca$option", dca - 1);
data.put("businessKey", 'N');
data.put("PinBlock", pin);
data.put("pinBlockFormat", pt);
@@ -6901,6 +6928,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右 12 位
* @return 目的 ZPK 下加密的目的 PIN 块
*/
+ // 测试通过
public String transPINFromTPKToZPK(String tpk, String zpk, int sca, int dca, int spt, int dpt, String pin, String account) {
ProtoCA proto = new ProtoCA();
@@ -6914,8 +6942,8 @@ public class SydApi4j implements SydApi {
data.put("sourceZpk", tpk);
data.put("purposeZpk", zpk);
data.put("algorithmKey", 'P');
- data.put("sca$option", sca);
- data.put("dca$option", dca);
+ data.put("sca$option", sca - 1);
+ data.put("dca$option", dca - 1);
data.put("businessKey", 'N');
data.put("sourcePinBlock", pin);
data.put("sourcePinBlockFormat", spt);
@@ -6961,6 +6989,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右 12 位
* @return LMK 对(02-03)下加密的 PIN
*/
+ // 测试通过
public String transPINFromTPKToLMK(String zpk, int sca, int dca, int pt, String pin, String account) {
ProtoJC proto = new ProtoJC();
@@ -6974,8 +7003,8 @@ public class SydApi4j implements SydApi {
data.put("zpk", zpk);
data.put("algorithmKey", 'P');
- data.put("sca$option", sca);
- data.put("dca$option", dca);
+ data.put("sca$option", sca - 1);
+ data.put("dca$option", dca - 1);
data.put("businessKey", 'N');
data.put("PinBlock", pin);
data.put("pinBlockFormat", pt);
@@ -7016,6 +7045,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右12位
* @return LMK 对(02-03)下加密的 PIN
*/
+ // 测试通过
public String encryPIN(int alg, String pin, String account) {
ProtoBA proto = new ProtoBA();
@@ -7067,6 +7097,7 @@ public class SydApi4j implements SydApi {
* @param account 账号中去除校验位的最右12位。
* @return PIN
*/
+ // 测试通过
public String decryPIN(int alg, String PINBLOCK, String account) {
ProtoNG proto = new ProtoNG();
@@ -7136,8 +7167,8 @@ public class SydApi4j implements SydApi {
data.put("srcKey", srcKey);
data.put("desKey", desKey);
data.put("algorithmKey", 'P');
- data.put("dca$option", dca);
- data.put("sca$option", sca);
+ data.put("dca$option", dca - 1);
+ data.put("sca$option", sca - 1);
data.put("sPin", sPin);
data.put("sPinType$option", 0);
data.put("dPinType$option", 0);
@@ -7175,6 +7206,7 @@ public class SydApi4j implements SydApi {
* tmkKey: TMK 下加密的随机的 TAK
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap genTAK(String tmk) {
ProtoHA proto = new ProtoHA();
HashMap packet = new HashMap();
@@ -7186,8 +7218,8 @@ public class SydApi4j implements SydApi {
data.put("tmk", tmk);
data.put("businessKey", 'N');
data.put("separator", ";");
- data.put("tmkSolution", "Z");
- data.put("lmkSolution", "Z");
+ data.put("tmkSolution", "X");
+ data.put("lmkSolution", "X");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -7236,6 +7268,7 @@ public class SydApi4j implements SydApi {
* @return lmkKey: LMK 对 16-17 下加密的 TAK
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap transTAKFromZMKToLMK(String zmk, String tak) {
ProtoMF proto = new ProtoMF();
HashMap packet = new HashMap();
@@ -7248,8 +7281,8 @@ public class SydApi4j implements SydApi {
data.put("tak", tak);
data.put("businessKey", 'N');
data.put("separator", ";");
- data.put("zmkSolution", "Z");
- data.put("lmkSolution", "Z");
+ data.put("zmkSolution", "X");
+ data.put("lmkSolution", "X");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -7290,6 +7323,7 @@ public class SydApi4j implements SydApi {
* @return zmkKey: ZMK 下加密的 TAK
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap transTAKFromLMKToZMK(String zmk, String tak) {
ProtoMG proto = new ProtoMG();
HashMap packet = new HashMap();
@@ -7302,8 +7336,8 @@ public class SydApi4j implements SydApi {
data.put("tak", tak);
data.put("businessKey", 'N');
data.put("separator", ";");
- data.put("zmkSolution", "Z");
- data.put("lmkSolution", "Z");
+ data.put("zmkSolution", "X");
+ data.put("lmkSolution", "X");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -7344,6 +7378,7 @@ public class SydApi4j implements SydApi {
* @return tmkKey: 转换后的 TAK;TMK 下加密
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap transTAKFromLMKToTMK(String tmk, String tak) {
ProtoAG proto = new ProtoAG();
HashMap packet = new HashMap();
@@ -7356,8 +7391,8 @@ public class SydApi4j implements SydApi {
data.put("tak", tak);
data.put("businessKey", 'N');
data.put("separator", ";");
- data.put("tmkSolution", "Z");
- data.put("lmkSolution", "Z");
+ data.put("tmkSolution", "X");
+ data.put("lmkSolution", "U");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -7399,6 +7434,7 @@ public class SydApi4j implements SydApi {
* tmkKey: 当前的TMK (TPK或PVK)下加密的新密钥
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap genKeyByTMKOrTPKOrPVK(String tmk) {
ProtoHC proto = new ProtoHC();
HashMap packet = new HashMap();
@@ -7411,8 +7447,8 @@ public class SydApi4j implements SydApi {
data.put("tmk", tmk);
data.put("businessKey", 'N');
data.put("separator", ";");
- data.put("tmkSolution", "Z");
- data.put("lmkSolution", "Z");
+ data.put("tmkSolution", "X");
+ data.put("lmkSolution", "X");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -7462,6 +7498,7 @@ public class SydApi4j implements SydApi {
* @return tmkKey: 当前密钥下加密的存储密钥
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap tranKeyByTMKToAno(String tmkNow, String tmkStorage) {
ProtoAE proto = new ProtoAE();
HashMap packet = new HashMap();
@@ -7516,6 +7553,7 @@ public class SydApi4j implements SydApi {
* @return tmkKey: 当前密钥下加密的存储密钥
* keyCheck: 密钥校验值。
*/
+ // 测试通过
public RetWrap tranKeyByTMKFromZMKToLMK(String zmk, String tmk) {
ProtoFC proto = new ProtoFC();
HashMap packet = new HashMap();
@@ -7571,6 +7609,7 @@ public class SydApi4j implements SydApi {
* @return tmkKey: 当前密钥下加密的存储密钥
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap tranKeyByTMKFromLMKToZMK(String zmk, String tmk) {
ProtoFE proto = new ProtoFE();
HashMap packet = new HashMap();
@@ -7584,8 +7623,8 @@ public class SydApi4j implements SydApi {
data.put("tmk", tmk);
data.put("businessKey", 'N');
data.put("separator", ";");
- data.put("zmkSolution", "Z");
- data.put("lmkSolution", "Z");
+ data.put("zmkSolution", "X");
+ data.put("lmkSolution", "X");
data.put("keyCheckType", "0");
ByteBuffer bb = proto.rend(packet);
@@ -7627,6 +7666,7 @@ public class SydApi4j implements SydApi {
* zmkKey: 转换后的 ZPK
* keyCheck: 密钥校验值。
*/
+ // 测试通过
public RetWrap genZEKOrZAK(int key, String zmk) {
ProtoFI proto = new ProtoFI();
HashMap packet = new HashMap();
@@ -7707,6 +7747,7 @@ public class SydApi4j implements SydApi {
* @return lmkKey: 当标志位为1时为LMK26-27对下加密的ZAK,当标志位为0时为LMK30-31对下加密的ZEK。
* keyCheck: 密钥校验值。
*/
+ // 测试通过
public RetWrap tranZEAKFromZMKToLMK(int key, String zmk, String zekOrzak) {
ProtoFK proto = new ProtoFK();
HashMap packet = new HashMap();
@@ -7773,6 +7814,7 @@ public class SydApi4j implements SydApi {
* @return zmkKey: 转换后的 ZPK。
* keyCheck: 密钥校验值。
*/
+ // 测试通过
public RetWrap tranZEAKFromLMKToZMK(int key, String zmk, String zekOrzak) {
ProtoFM proto = new ProtoFM();
HashMap packet = new HashMap();
@@ -7838,6 +7880,7 @@ public class SydApi4j implements SydApi {
* @return zmkKey: zmk 头 + ZMK 加密下的ZPK。
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap genZPK(String zmk) {
ProtoIA proto = new ProtoIA();
HashMap packet = new HashMap();
@@ -7901,6 +7944,7 @@ public class SydApi4j implements SydApi {
* @return zpkKey: 转换后的 ZPK;由 LMK06-07 对加密
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap tranZPKFromZMKToLMK(String zmk, String zpk) {
ProtoFA proto = new ProtoFA();
HashMap packet = new HashMap();
@@ -7957,6 +8001,7 @@ public class SydApi4j implements SydApi {
* @return zpkKey: 转换后的 ZPK;
* keyCheck: 密钥校验值
*/
+ // 测试通过
public RetWrap tranZPKFromLMKToZMK(String zmk, String zpk) {
ProtoGC proto = new ProtoGC();
HashMap packet = new HashMap();
@@ -8073,6 +8118,7 @@ public class SydApi4j implements SydApi {
* @return lmkKey: lmk 头 + LMK 加密下的密钥。
* keyCheck:
*/
+ // 测试通过
public RetWrap composeKey(String keyType, String[] keys) {
ProtoA4 proto = new ProtoA4();
@@ -8128,7 +8174,7 @@ public class SydApi4j implements SydApi {
System.arraycopy(lmkHeads, 0, bs, 0, lmkHeads.length);
System.arraycopy(lmks, 0, bs, lmkHeads.length, lmks.length);
retWrap.put("lmkKey", bs);
- retWrap.put("keyCheck", ((PacketSection) ret.get("keyCheck")).getBytes());
+ retWrap.put("keyCheck", ((PacketSection) ret.get("kcv")).getBytes());
return retWrap;
}
}
@@ -8182,6 +8228,7 @@ public class SydApi4j implements SydApi {
}
//16.3由私钥解密随机密钥并以LMK加密输出(+) -> pass
+ // 测试通过
@Override
public RetWrap SM2ConfirmSessionKey(String sk, String cipherKey) {
// 获取协议
@@ -8241,6 +8288,7 @@ public class SydApi4j implements SydApi {
* key1: 密钥明文分量1
* key2: 密钥明文分量2
*/
+ // 测试通过
public RetWrap getPlainText(String key, int checkAlg) {
ProtoAB proto = new ProtoAB();
diff --git a/src/main/java/racal/sunyard/main/Vars.kt b/src/main/java/racal/sunyard/main/Vars.kt
deleted file mode 100644
index 5331bf6..0000000
--- a/src/main/java/racal/sunyard/main/Vars.kt
+++ /dev/null
@@ -1,410 +0,0 @@
-package racal.sunyard.cloud
-
-import com.sunyard.proto.PacketSection
-import java.nio.charset.Charset
-
-
-class Vars(val vars : Map = HashMap()) {
-
- private inline fun remove(n : List){
- try {
- var f : Any? = vars
- for( i in 0..n.size-2 ){
- val p = n.get(i)
- if ( p.startsWith("[") && p.endsWith("]") ){
- // 数组
- f as MutableList
- val istr = p.substring(1, p.length -1)
- var index = 0
- if ( "" == istr ){
- index = f.lastIndex
- }else{
- index = istr.toInt()
- if ( index < 0 ){
- index += f.size
- }
- }
- if (index < 0){
- index = 0
- }
- val fp = f.get( index )
- if ( null == fp ){
- return
- }else {
- f = fp
- }
-
- }else {
- f as MutableMap
- val fp = f.get( p )
- if ( null == fp){
- return
- }else{
- f = fp
- }
- }
- }
-
- val nl = n.last()
- if ( nl.startsWith("[") && nl.endsWith("]") ){
- f as MutableList
- val istr = nl.substring(1, nl.length -1)
- var index = 0
- if ( "" == istr ){
- index = f.lastIndex
- }else{
- index = istr.toInt()
- if ( index < 0 ){
- index += f.size
- }
- }
-
- if (index < 0){
- index = 0
- }
- f.removeAt( index )
-
- }else{
- f as MutableMap
- f.remove(nl)
- }
- }catch ( e : ClassCastException){
- throw e
- }
-
-
- }
-
- private inline fun _set(n : List, data : Any) {
- try {
- var f : Any? = vars
- for( i in 0..n.size-2 ){
- val p = n.get(i)
- if ( p.startsWith("[") && p.endsWith("]") ){
- // 数组
- f as MutableList
- val istr = p.substring(1, p.length -1)
- var index = 0
- if ( "" == istr ){
- index = f.size
- }else{
- index = istr.toInt()
- if ( index < 0 ){
- index += f.size
- }
- }
- if (index < 0){
- index = 0
- }
- var fp = f.get( index )
- if ( null == fp ){
- // 参考下一级推断类型
- val pp = n.get(i + 1)
- if( pp.startsWith("[") && pp.endsWith("]") ){
- fp = mutableListOf()
- }else{
- fp = mutableMapOf()
- }
- f.set( index, fp)
- }
-
- f = fp
-
-
- }else {
- f as MutableMap
- var fp = f.get( p )
- if ( null == fp){
- // 参考下一级推断类型
- val pp = n.get(i + 1)
- if( pp.startsWith("[") && pp.endsWith("]") ){
- fp = mutableListOf()
- }else{
- fp = mutableMapOf()
- }
-
- f.set( p, fp)
- }
- f = fp
- }
-
- }
-
- val nl = n.last()
- if ( nl.startsWith("[") && nl.endsWith("]") ){
- f as MutableList
- val istr = nl.substring(1, nl.length -1)
- var index = 0
- if ( "" == istr ){
- index = f.size
- }else{
- index = istr.toInt()
- if ( index < 0 ){
- index += f.size
- }
- }
- if (index < 0){
- index = 0
- }
- f.add( index , data)
-
- }else{
- f as MutableMap
- f.put(nl, data)
- }
- }catch ( e : ClassCastException){
- throw e
- }
-
- }
-
- private inline fun _get(n : List ) : Any? {
- try {
- var f : Any? = vars
- for( i in 0..n.size-1 ){
- val p = n.get(i)
- if ( p.startsWith("[") && p.endsWith("]") ){
- // 数组
- f as MutableList
- val istr = p.substring(1, p.length -1)
- var index = 0
- if ( "" == istr ){
- index = f.lastIndex
- }else{
- index = istr.toInt()
- if ( index < 0 ){
- index += f.size
- }
- }
- if (index < 0){
- index = 0
- }
- val fp = f.get( index )
- if ( null == fp ){
- return null
- }else {
- f = fp
- }
-
- }else {
- f as MutableMap
- val fp = f.get( p )
- if ( null == fp){
- return null
- }else{
- f = fp
- }
- }
-
- }
- return f
- }catch ( e : ClassCastException){
- throw e
- }
- }
-
-
- fun cp(from: String, to: String) {
- val v = _get( from.split(".") )
- if ( null != v ){
- set(to, v)
- }
- }
-
- fun mv(from: String, to: String) {
- val v = _get( from.split(".") )
- if ( null != v ){
- set(to, v)
- }
- rm( from )
- }
-
- fun map(name: String) {
- _set( name.split(".") , mutableMapOf() )
- }
-
- fun arr(name: String) {
- _set( name.split(".") , mutableListOf() )
- }
-
-
- fun get(name : String) : Any{
- val v = _get( name.split(".") )
- if ( null == v ){
- throw RuntimeException("$name 的值为 null")
- }
- return v
- }
-
- fun getInt(name: String): Int {
- val v = _get( name.split(".") )
- if( null == v ){
- return 0
- }else{
- if( v is Int ){
- return v as Int
- } else {
- return v.toString().toInt()
- }
- }
- }
-
- fun getStr(name: String): String {
- val v = _get( name.split(".") )
- if( null == v ){
- return ""
- }else{
- when( v ){
-
- v is PacketSection -> return (v as PacketSection).getString()
-
- v is ByteArray -> return String(v as ByteArray, Charset.forName("UTF-8") )
-
- else -> return v.toString()
- }
- }
- }
-
- fun getMap(name: String): MutableMap {
- try {
- val v = _get( name.split(".") )
- if( null == v ){
- return mutableMapOf()
- }else{
- return v as MutableMap
- }
- }catch (e : Exception){
- throw java.lang.RuntimeException("$name 的值不是一个 map")
- }
- }
-
- fun getArr(name: String): MutableList {
- try {
- val v = _get( name.split(".") )
- if( null == v ){
- return mutableListOf()
- }else{
- return v as MutableList
- }
- }catch (e : Exception){
- throw java.lang.RuntimeException("$name 的值不是一个 arr")
- }
- }
-
- fun put(name: String, value : Any ){
- _set( name.split("."), value )
- }
-
-
- fun set(name: String, value : Any ){
- val names = name.split(".")
-
- try {
- _set( names, value )
- }catch ( e : Exception){
- remove( names )
- _set( names, value )
- }
- }
-
- fun rm(name : String ){
- try {
- remove( name.split(".") )
- }catch (e : Exception){
- // pass 忽略异常
- }
-
- }
-
- fun contains(name: String) : Boolean {
- try {
- return null != _get( name.split(".") )
- }catch (e : Exception){
- // TODO 此处遇到过未知错误 故添加
- return false
- }
- }
-
-
- fun eq(k1: String, k2 : String): Boolean {
- try {
- val v1 = _get( k1.split(".") )
- val v2 = _get( k2.split(".") )
- if ( null == v1 && null == v2 ){
- return true
- }
- if ( (null != v1 && null == v2) ||
- (null == v1 && null != v2) ){
- return false
- }
-
- return v1!!.equals( v2 )
- }catch (e : Exception){
- return false
- }
- }
-
- fun eqs(key : String, other : String): Boolean {
- try {
- val v = getStr( key )
- return other.equals( v )
- }catch (e : Exception){
- return false
- }
- }
-
-
- fun bool(name: String): Boolean {
- val v = _get( name.split("."))
- if ( null == v ) {
- return false
- }else{
- when( v ){
-
- null -> {
- return false
- }
-
- is Boolean ->{
- return v
- }
-
- is Array<*> -> {
- return v.size > 0
- }
-
- is List<*> ->{
- return v.size > 0
- }
-
- is Map<*, *> ->{
- return v.size > 0
- }
-
- is String -> {
- return v.length > 0
- }
- }
- return true
-
- }
- }
-
- fun vars(): Set {
- return vars.keys
- }
-
-
- fun subVars(name : String) : Vars {
- if( contains( name ) ){
- val c = get( name )
- if( c is Map<*, *> ){
- return Vars( c as HashMap )
- }
- }
-
- map( name )
- val c = get( name )
- return Vars(c as HashMap)
- }
-}
diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java
index ca97706..52fa380 100644
--- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java
+++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java
@@ -7,10 +7,15 @@ import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
+import java.util.ArrayList;
+import java.util.Arrays;
+
public class TestAllMethods {
SydApi4j api;
+ String account = "157212737811";
+
@Before
public void before() {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
@@ -28,20 +33,67 @@ public class TestAllMethods {
}
public void printRetWrap(RetWrap rw) {
+ printRetWrap(rw, false);
+ }
+
+ /**
+ * 输出
+ * @param rw
+ */
+ public void printRetWrap(RetWrap rw, boolean flag) {
for (String s : rw.keySet()) {
- System.out.println(s + ":" + rw.get(s));
+
+ 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(Util.hexString2Bytes(Util.bytes2HexString((byte[]) o))));
+ }
+ } else {
+ System.out.println(s + ":" + o);
+ }
}
}
+ /**
+ * 将hex类型的数组转为byte型
+ * {"X0404894E7B8DE129B4FF4EF9889E56A2", "X94D35D86EF1F3213D55C47822F87D385"}
+ * 转为
+ * [583034303438393445374238444531323942344646344546393838394535364132, 583934443335443836454631463332313344353543343738323246383744333835]
+ * @param strs
+ * @return
+ */
+ public String[] strArr2BytesStrArr(String[] strs) {
+ String[] requestStrs = new String[strs.length];
+
+ for (int i = 0, len = strs.length; i < len; i++) {
+ String changeStr = Util.bytes2HexString(strs[i].getBytes());
+ requestStrs[i] = changeStr;
+ }
+
+ return requestStrs;
+ }
+
+ /**
+ * 删除字符串中的空格
+ * @param str
+ * @return
+ */
+ public String changeStr(String str) {
+ return str.replaceAll(" ", "");
+ }
+
+
// A0 1.1.1 对称密钥产生,
- // 验证成功
+ // 测试通过
@Test
public void testGenSymmetricKey() {
RetWrap retWrap = api.genSymmetricKey("000", 'X');
- String lmkKey = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("lmkKey"))));
- String keyCheck = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("keyCheck"))));
- System.out.println("lmkKey:" + lmkKey);
- System.out.println("keyCheck:" + keyCheck);
+
+ printRetWrap(retWrap);
}
// 002D3030303030303030
@@ -53,17 +105,13 @@ public class TestAllMethods {
// 58
// A0 1.1.2 对称密钥产生, 对比之前添加了可产生ZMK加密下的密钥,
- // 验证成功
+ // 测试通过
@Test
public void testGenSymKey() {
// 此密钥方案为: 1A+K+27位的索引号
RetWrap retWrap = api.genSymKey(1, "000", 'X', "SK999999999999000000000000000");
- String lmkKey = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("lmkKey"))));
- String zmkKey = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("zmkKey"))));
- String keyCheck = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("keyCheck"))));
- System.out.println("lmkKey:" + lmkKey);
- System.out.println("zmkKey:" + zmkKey);
- System.out.println("keyCheck:" + keyCheck);
+
+ printRetWrap(retWrap);
}
// 00000000
@@ -74,6 +122,13 @@ public class TestAllMethods {
// 密钥成份1:X0404894E7B8DE129B4FF4EF9889E56A2
// 密钥成份2:X94D35D86EF1F3213D55C47822F87D385
+ // 003300000000000000004135
+ // 3030
+ // 58
+ // 4639334538393745423345383636413346314233324432303232324245333446
+ // 314246383237
+
+ // 测试通过
// A4
@Test
public void testComposeKey() {
@@ -83,19 +138,652 @@ public class TestAllMethods {
printRetWrap(rw);
}
+ // 00503030303030303030
+ // 4136
+ // 303030
+ // 584141414141414141414141414141414142424242424242424242424242424242
+ // 583934443335443836454631463332313344353543343738323246383744333835
+ // 58
+
// 00000000
// A6
// 000
// ZMK:XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB
// ZMK下加密的密钥:X94D35D86EF1F3213D55C47822F87D385
// X
+
+ // 测试通过
+ // A6
@Test
public void testInputKey() {
- RetWrap retWrap = api.inputKey("000", '0', "XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB", "X94D35D86EF1F3213D55C47822F87D385");
+ RetWrap retWrap = api.inputKey("000", 'X', "XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB", "X94D35D86EF1F3213D55C47822F87D385");
printRetWrap(retWrap);
}
- // 00000000A8000XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBX0404894E7B8DE129B4FF4EF9889E56A2X
-// public void test
+ // 00000000
+ // A8
+ // 000
+ // XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB
+ // X0404894E7B8DE129B4FF4EF9889E56A2
+ // X
+
+ // 测试通过
+ // A8
+ @Test
+ public void testOutputKey() {
+ RetWrap retWrap = api.outputKey("000", 'X', "XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB", "X94D35D86EF1F3213D55C47822F87D385");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // B0
+ @Test
+ public void testConversionKey() {
+ RetWrap retWrap = api.conversionKey("000", "X0404894E7B8DE129B4FF4EF9889E56A2", 'U');
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // AA
+ @Test
+ public void testAAGenComposeKey() {
+ RetWrap retWrap = api.genComposeKey("000", 'Y', "0404894E7B8DE129B4FF4EF9889E56A2129B4FF4EF9889E5");
+ printRetWrap(retWrap);
+ }
+
+ // 005130303030303030304759
+ // 32
+ // 583034303438393445374238444531323942344646344546393838394535364132
+ // 583934443335443836454631463332313344353543343738323246383744333835
+ // 3B
+ // 58
+ // 58
+ // 30
+
+ // 测试通过
+ // GY
+ @Test
+ public void testGYGenComposeKey() {
+ String[] strs = {"X0404894E7B8DE129B4FF4EF9889E56A2", "X94D35D86EF1F3213D55C47822F87D385"};
+
+ RetWrap retWrap = api.genComposeKey(strArr2BytesStrArr(strs));
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // BY
+ @Test
+ public void testChangZMK2LMK() {
+ String[] strs = {"X0404894E7B8DE129B4FF4EF9889E56A2", "X94D35D86EF1F3213D55C47822F87D385"};
+ RetWrap retWrap = api.changZMK2LMK(strs[0], strs[1]);
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // IA
+ @Test
+ public void testGenZPK() {
+ RetWrap retWrap = api.genZPK("X94D35D86EF1F3213D55C47822F87D385");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // FA
+ @Test
+ public void testTranZPKFromZMKToLMK() {
+ RetWrap retWrap = api.tranZPKFromZMKToLMK("X94D35D86EF1F3213D55C47822F87D385", "51101CCAFBFE8300");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // GC
+ @Test
+ public void testTranZPKFromLMKToZMK() {
+ RetWrap retWrap = api.tranZPKFromLMKToZMK("X94D35D86EF1F3213D55C47822F87D385", "958FA085C014833A");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // FI
+ @Test
+ public void testGenZEKOrZAK() {
+ RetWrap retWrap = api.genZEKOrZAK(0, "X94D35D86EF1F3213D55C47822F87D385");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // FK
+ @Test
+ public void testTranZEAKFromZMKToLMK() {
+ RetWrap retWrap = api.tranZEAKFromZMKToLMK(0, "X94D35D86EF1F3213D55C47822F87D385", "3B4887E5E9FDF339");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // FM
+ @Test
+ public void testTranZEAKFromLMKToZMK() {
+ RetWrap retWrap = api.tranZEAKFromLMKToZMK(0, "X94D35D86EF1F3213D55C47822F87D385", "1D969301FFA4FB13");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // HC
+ @Test
+ public void testGenKeyByTMKOrTPKOrPVK() {
+ RetWrap retWrap = api.genKeyByTMKOrTPKOrPVK("X94D35D86EF1F3213D55C47822F87D385");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // AE
+ @Test
+ public void testTranKeyByTMKToAno() {
+ RetWrap retWrap = api.tranKeyByTMKToAno("7E3F0E0A2335046B", "162FDF5B93DFE4B8");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // FC
+ @Test
+ public void testTranKeyByTMKFromZMKToLMK() {
+ RetWrap retWrap = api.tranKeyByTMKFromZMKToLMK("X94D35D86EF1F3213D55C47822F87D385", "51101CCAFBFE8300");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // FE
+ @Test
+ public void testTranKeyByTMKFromLMKToZMK() {
+ RetWrap retWrap = api.tranKeyByTMKFromLMKToZMK("X0404894E7B8DE129B4FF4EF9889E56A2", "X94D35D86EF1F3213D55C47822F87D385");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // HA
+ @Test
+ public void testGenTAK() {
+ RetWrap retWrap = api.genTAK("X0404894E7B8DE129B4FF4EF9889E56A2");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // MF
+ @Test
+ public void testTransTAKFromZMKToLMK() {
+ RetWrap retWrap = api.transTAKFromZMKToLMK("X94D35D86EF1F3213D55C47822F87D385", "X46928685CAFD050DBF5CCFC049E41BF5");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // MG
+ @Test
+ public void testTransTAKFromLMKToZMK() {
+ RetWrap retWrap = api.transTAKFromLMKToZMK("X94D35D86EF1F3213D55C47822F87D385", "X36CC70E4274AA879AD9AE5596124DFA7");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // AG
+ @Test
+ public void testTransTAKFromLMKToTMK() {
+ RetWrap retWrap = api.transTAKFromLMKToTMK("X94D35D86EF1F3213D55C47822F87D385", "X36CC70E4274AA879AD9AE5596124DFA7");
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // JA
+ @Test
+ public void testGenPIN() {
+ String s = api.genPIN("157212737811");
+ System.out.println(s);
+ }
+
+ // 00713030303030303030
+ // 4343
+ // 583034303438393445374238444531323942344646344546393838394535364132
+ // 583934443335443836454631463332313344353543343738323246383744333835
+ // 50
+ // 31
+ // 31
+ // 3132
+ // 33373532373544313235363334384341
+ // 3031
+ // 3031
+ // 313537323132373337383131
+
+ // 测试通过
+ // CC
+ @Test
+ public void testTransPINFromZPKToZPK() {
+ String s = api.transPINFromZPKToZPK("X0404894E7B8DE129B4FF4EF9889E56A2", "X94D35D86EF1F3213D55C47822F87D385", 1, 1, 1, 1, "375275D1256348CA", "157212737811");
+ System.out.println(s);
+ }
+
+ // 测试通过
+ // JE
+ @Test
+ public void testTransPINFromZPKToLMK() {
+ String str = api.transPINFromZPKToLMK("X0404894E7B8DE129B4FF4EF9889E56A2", 1, 1, 01, "375275D1256348CA", "157212737811");
+ System.out.println(str);
+ }
+
+ // 测试通过
+ // JG
+ @Test
+ public void testTransPINFromLMKToZPK() {
+ String s = api.transPINFromLMKToZPK("958FA085C014833A", 1, 1, 01, "54367430851C073B", "157212737811");
+ System.out.println(s);
+ }
+
+ // 测试通过
+ // CA
+ @Test
+ public void testTransPINFromTPKToZPK() {
+ String s = api.transPINFromTPKToZPK("189A8A973A9FF7CF", "F4663B51F823CFDC", 1, 1, 1, 1, "5162F23A8354424E", "157212737811");
+ System.out.println(s);
+ }
+
+ // 测试通过
+ // JC
+ @Test
+ public void testTransPINFromTPKToLMK() {
+ String zpk = "189A8A973A9FF7CF";
+ String pin = "5162F23A8354424E";
+ String s = api.transPINFromTPKToLMK(zpk, 1, 1, 1, pin, account);
+ System.out.println(s);
+ }
+
+ // 测试通过
+ // BA
+ @Test
+ public void testEncryPIN() {
+ String pin = "06157212FFFFFFFF";
+ String s = api.encryPIN(0, pin, account);
+ System.out.println(s);
+ }
+
+ // 测试通过
+ // NG
+ @Test
+ public void testDecryPIN() {
+ String pin = "EB53196BFAD34C39";
+ String s = api.decryPIN(0, pin, account);
+ System.out.println(s);
+ }
+
+
+ // 006E00000000000000004342303030303030584B303030303030303030303030303030313030303030303030303031584B30303030303030303030303030303032303030303030303030303250313131313239384430324231433742433945303130313135373231323733373831314E
+
+ // CB
+ @Test
+ public void testTransPinFrOneKeyToAno() {
+ String srcKey = "XK000000000000000100000000001";
+ String desKey = "XK000000000000000200000000002";
+ String sPin = "11298D02B1C7BC9E";
+ String s = api.transPinFrOneKeyToAno("000", "000", srcKey, desKey, 1, 1, sPin, account);
+ System.out.println(s);
+ }
+
+ // 003B3030303030303030
+ // 4D41
+ // 583430423631363946363334393530363034304236313639463633343935303630
+ // 31353732313237333738313130303030
+
+ // 测试通过
+ // MAXF
+ @Test
+ public void testMAC_Data() {
+ String key = "X40B6169F6349506040B6169F63495060";
+ String macData = "1572127378110000";
+ byte[] bytes = api.MAC_Data( key, macData, null);
+
+ System.out.println(new String(bytes));
+ }
+
+
+ // MA
+ @Test
+ public void testMACCalc() {
+
+ }
+
+ // MC
+ @Test
+ public void testMACCheck() {
+
+ }
+
+ String key = "X40B6169F6349506040B6169F63495060";
+ String msg = "AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB";
+
+ // 测试通过
+ // MS
+ @Test
+ public void testGenMAB() {
+ RetWrap retWrap = api.genMAB(1, 0, 1, key, null, msg.getBytes());
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // MU
+ @Test
+ public void test_calcPBOCMAC() {
+ byte[] bytes = api._calcPBOCMAC(1, 0, key, msg.getBytes(), 1, null);
+ System.out.println(new String(bytes));
+ }
+
+ // 00643030303030303030
+ // 4530
+ // 31
+ // 30
+ // 32
+ // 30
+ // 583430423631363946363334393530363034304236313639463633343935303630
+ // 31
+ // 31
+ // 30303030303030303030303030303030
+ // 303130
+ // 4141414141414141414141414141414142424242424242424242424242424242
+
+ // E0
+ @Test
+ public void testSYMEnDeData() {
+ String iv = "0000000000000000";
+ RetWrap retWrap = api.SYMEnDeData(true, 0, key, 2, 1, msg.getBytes(), iv.getBytes(), 1);
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // Y0
+ @Test
+ public void testSwitchEncryY() {
+ String sDEK = "X40B6169F6349506040B6169F63495060";
+ String dDEK = "X94D35D86EF1F3213D55C47822F87D385";
+ String infoData = "93B0FB7F609A16E0C2D6BD0AC4AE0297";
+
+ byte[] bytes = api.switchEncryY("000", 2, "001", 2, 1, sDEK, dDEK, infoData.getBytes(), "0");
+ System.out.println(new String(bytes));
+ }
+
+ // 测试通过
+ // LB
+ @Test
+ public void testLoadKey() {
+ String index = "000000000000000300000000004";
+ String key = "X94D35D86EF1F3213D55C47822F87D385";
+ Boolean check = api.loadKey(index, key, null);
+ System.out.println(check);
+ }
+
+ // 测试通过
+ // LF
+ @Test
+ public void testReadKey() {
+ String index = "000000000000000300000000003";
+ RetWrap retWrap = api.readKey(index);
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // LG
+ @Test
+ public void testUpdateKey() {
+ String index = "000000000000000300000000003";
+ String key = "X94D35D86EF1F3213D55C47822F87D385";
+ Boolean aBoolean = api.updateKey(index, key, "0000000000000000");
+ System.out.println(aBoolean);
+ }
+
+ // 测试通过
+ // 77
+ @Test
+ public void testEncryptByPk() {
+ String pk = "034200041CD47354867E12B9D138F098413C47D42EDEB2AD402EAB431C0C7AC2FE2D6DE9C67273C643C709F2A749188941B7FA7F9FF14F8E7D19316936DB4D4954FF3819";
+ String data = "FFFFFFFFFFFFFFFF";
+
+ byte[] bytes = api.encryptByPk(1, pk, data.getBytes());
+ System.out.println(Util.bytes2HexString(bytes));
+ }
+
+ // 78
+ @Test
+ public void testDecryptBySkC() {
+ String userId = "0000000000000001";
+ String data = "30 78 02 20 78 E2 C1 C9 72 1F 77 00 55 76 A3 1F 3F 99 18 E0 3D AC A8 7F 5B 48 27 52 51 D8 54 49 BD 70 A6 EC 02 20 46 B4 24 14 27 EB 96 81 D4 93 A1 7E 03 E0 37 24 94 C6 A0 5D 12 F2 06 BA 15 0A FD 67 2C 82 9A 90 04 20 4D 3E 6D 0F 4C 5D CC 2A 18 5F 01 B8 51 F7 F7 A2 EF 13 C7 D8 66 46 C8 34 5D A8 38 F6 04 D1 D3 61 04 10 7E 21 C5 BF 01 91 62 D3 FC 67 8C 85 55 12 3B B5";
+
+ byte[] bytes = api.decryptBySkC(1, userId, Util.hexString2Bytes(changeStr(data)));
+ System.out.println(Util.bytes2HexString(bytes));
+ }
+
+ // 7C
+ @Test
+ public void testRSAVerify() {
+
+ }
+
+ // 测试通过
+ // 7D
+ @Test
+ public void testConutHash() {
+ String data = "0101010101010101";
+// RetWrap retWrap = api.conutHash(1, 0, data.getBytes(), null);
+
+ String filterData = "67 E6 09 6A 85 AE 67 BB 72 F3 6E 3C 3A F5 4F A5 7F 52 0E 51 8C 68 05 9B AB D9 83 1F 19 CD E0 5B 80 00 00 00 00 00 00 00 30 31 30 31 30 31 30 31 30 31 30 31 30 31 30 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 20 00 00 00";
+ RetWrap retWrap = api.conutHash(1, 3, data.getBytes(), Util.hexString2Bytes(changeStr(filterData)));
+
+ System.out.println("hash:" + Util.bytes2HexString((byte[]) retWrap.get("hash")));
+ }
+
+ // 测试通过
+ // E2
+ @Test
+ public void testSM2GenKeyPair() {
+ RetWrap retWrap = api.SM2GenKeyPair();
+ printRetWrap(retWrap, true);
+ }
+
+ // 测试通过
+ // E2
+ @Test
+ public void testSM2OrRSAGenKeyPair() {
+ String index = "0000000000000001";
+
+ // SM2
+// RetWrap retWrap = api.SM2OrRSAGenKeyPair(1, index, 0);
+
+ // RSA
+ RetWrap retWrap = api.SM2OrRSAGenKeyPair(0, index, 1024);
+ printRetWrap(retWrap, true);
+ }
+
+ // 测试通过
+ // 72
+ @Test
+ public void testSM2GenSessionKey() {
+
+ String pk = "03 42 00 04 1C D4 73 54 86 7E 12 B9 D1 38 F0 98 41 3C 47 D4 2E DE B2 AD 40 2E AB 43 1C 0C 7A C2 FE 2D 6D E9 C6 72 73 C6 43 C7 09 F2 A7 49 18 89 41 B7 FA 7F 9F F1 4F 8E 7D 19 31 69 36 DB 4D 49 54 FF 38 19 ";
+
+ RetWrap retWrap = api.SM2GenSessionKey(changeStr(pk));
+ printRetWrap(retWrap);
+ }
+
+ // 73
+ @Test
+ public void testSM2ConfirmSessionKeyC() {
+
+// RetWrap retWrap = api.SM2ConfirmSessionKeyC();
+// printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // 73
+ @Test
+ public void testSM2ConfirmSessionKey() {
+
+ String sk = "00 01 00 00 6F D3 0C 96 79 22 C2 53 9B 47 3B 51 65 D7 9C 49 71 7A 5A 54 AA 24 9A 4F 8B AC DF 30 0B 31 59 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ";
+ String cipherKey = "30 78 02 20 61 2F 7E C1 4F 59 DB 2A C2 A9 FB 2E 13 61 69 3C 88 B3 6D 14 99 5B E8 B8 B7 53 5F 03 90 BB D2 DC 02 20 34 69 BA 09 93 08 0F 13 1F A1 EB 2C 2A 20 C5 48 18 32 A6 7E B6 07 E5 39 84 6B 9D 70 E9 1B 5D 5D 04 20 C5 EE D4 44 10 60 62 ED 77 74 C2 4D C1 71 12 2A 64 FF CA 48 CC 6E 44 EC BC 75 D2 31 DE 7E D0 D7 04 10 41 48 E5 D7 54 65 AE 2E 35 F5 07 84 06 4B 70 D6 ";
+ RetWrap retWrap = api.SM2ConfirmSessionKey(changeStr(sk), changeStr(cipherKey));
+ printRetWrap(retWrap);
+ }
+
+ // 74
+ @Test
+ public void testSYD_SM2_Sign_HA() {
+
+ }
+
+ // 75
+ @Test
+ public void testSYD_SM2_Verify_HA() {
+
+ }
+
+ // 测试通过
+ // 76
+ @Test
+ public void testSM3Hash() {
+
+ String userId = "1572127378000000";
+ String publicKey = "03 42 00 04 1C D4 73 54 86 7E 12 B9 D1 38 F0 98 41 3C 47 D4 2E DE B2 AD 40 2E AB 43 1C 0C 7A C2 FE 2D 6D E9 C6 72 73 C6 43 C7 09 F2 A7 49 18 89 41 B7 FA 7F 9F F1 4F 8E 7D 19 31 69 36 DB 4D 49 54 FF 38 19";
+ String msg = "0101010101010101";
+
+ RetWrap retWrap = api.SM3Hash(1, userId, Util.hexString2Bytes(changeStr(publicKey)), msg.getBytes(), null);
+ printRetWrap(retWrap, true);
+ }
+
+ // 测试通过
+ // 71
+ @Test
+ public void testLMK2SM2() {
+
+ String pk = "03 42 00 04 1C D4 73 54 86 7E 12 B9 D1 38 F0 98 41 3C 47 D4 2E DE B2 AD 40 2E AB 43 1C 0C 7A C2 FE 2D 6D E9 C6 72 73 C6 43 C7 09 F2 A7 49 18 89 41 B7 FA 7F 9F F1 4F 8E 7D 19 31 69 36 DB 4D 49 54 FF 38 19 ";
+ String key = "U5FAC0E768937E43D64FE2692F5F8C79F";
+
+ RetWrap retWrap = api.LMK2SM2(Util.hexString2Bytes(changeStr(pk)), key);
+ printRetWrap(retWrap, true);
+ }
+
+ // 60
+ @Test
+ public void testGetTransmissionKey() {
+ RetWrap retWrap = api.getTransmissionKey();
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // Y8
+ @Test
+ public void testGenerateRandom() {
+ String s = api.GenerateRandom(16);
+ System.out.println(s);
+ }
+
+ // 测试通过
+ // AB
+ @Test
+ public void testGetPlainText() {
+ String key = "U51B737CE0EE1A14A6411B64EDE56020B";
+
+ RetWrap r = api.getPlainText(key, 0);
+ printRetWrap(r);
+ }
+
+ // 测试通过
+ // 62
+ @Test
+ public void testImpose() {
+
+ String key = "U51B737CE0EE1A14A6411B64EDE56020B";
+ String msg = "0101010101010101";
+
+ RetWrap retWrap = api.impose("002", key, msg.getBytes());
+ printRetWrap(retWrap);
+ }
+
+ // 测试通过
+ // 63
+ @Test
+ public void testVerifyImpose() {
+
+ String key = "U51B737CE0EE1A14A6411B64EDE56020B";
+
+ String secret = "3DCA1AD1";
+
+ String msg = "0101010101010101";
+
+ Boolean aBoolean = api.verifyImpose("002", key, secret.getBytes(), msg.getBytes());
+ System.out.println(aBoolean);
+ }
+
+ // 测试通过
+ // 64
+ @Test
+ public void testEncryAndDecry() {
+ String key = "U51B737CE0EE1A14A6411B64EDE56020B";
+ String infoData = "01010101";
+
+ RetWrap retWrap = api.encryAndDecry("002", key, infoData.getBytes());
+ printRetWrap(retWrap, true);
+ }
+
+ // 测试通过
+ // 65
+ @Test
+ public void testSwitchEncry() {
+ String srcKey = "U51B737CE0EE1A14A6411B64EDE56020B";
+ String aimKey = "X94D35D86EF1F3213D55C47822F87D385";
+ String infoData = "88888888";
+
+ RetWrap retWrap = api.switchEncry("002", srcKey, aimKey, infoData.getBytes());
+ printRetWrap(retWrap, true);
+ }
+
+ // 测试通过
+ // 66
+ @Test
+ public void testEncryAndDecry4PIN() {
+ String key = "U51B737CE0EE1A14A6411B64EDE56020B";
+ String pin = "06156760";
+
+ byte[] bytes = api.encryAndDecry4PIN(key, pin.getBytes());
+
+ System.out.println(Util.bytes2HexString(bytes));
+ }
+
+ // 67
+ @Test
+ public void testswitchEncry4PIN() {
+ String srcKey = "U51B737CE0EE1A14A6411B64EDE56020B";
+ String aimKey = "X94D35D86EF1F3213D55C47822F87D385";
+ String infoData = "6157212";
+
+ byte[] bytes = api.switchEncry4PIN(srcKey, aimKey, infoData.getBytes());
+ System.out.println(Util.bytes2HexString(bytes));
+ }
+
+ // QQ
+ @Test
+ public void testRSAGetPublicKeyC() {
+ String userId = "0000000000000001";
+
+ String s = api.RSAGetPublicKeyC(userId, 1);
+ System.out.println(s);
+ }
+
+ // HI
+ @Test
+ public void testGetStatus() {
+ RetWrap status = api.getStatus();
+ printRetWrap(status);
+ }
+
+ // 测试通过
+ // HV
+ @Test
+ public void testGetVersion() {
+ RetWrap version = api.getVersion(null);
+ printRetWrap(version);
+ }
}