测试接口

This commit is contained in:
zhoubin
2021-09-15 16:13:09 +08:00
parent a9289bd0d1
commit 86118eaf4e
9 changed files with 988 additions and 52 deletions
@@ -54,7 +54,9 @@ public class SydApiException extends RuntimeException{
case 2:
this.msg = "签名验证错误 ";
break;
case 129:
this.msg = "没有该指令";
break;
case 32770:
this.msg = "签名验证错误(P7) ";
break;
+2 -2
View File
@@ -207,13 +207,13 @@ public interface SydGenApi {
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
* @param dn 对*方 X509 证书DN。
* @param nAlg 算法标识,0:AES,1:SM4
* @param alg 算法标识,0:AES,1:SM4
* @return RetWrap 包含 CipherKey SessionKey KCV
* CipherKey 公钥加密的会话密钥 ,BASE64 编码
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/
RetWrap generateDEByDn(byte[] dn, byte nAlg) throws Exception;
RetWrap generateDEByDn(byte[] dn, int alg) throws Exception;
/**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
+1 -1
View File
@@ -88,7 +88,7 @@ interface SydAttachedSVApi {
/**
* 采用 RSA 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param HashMark 证书号
* @param HashMark 哈希标识
* @param nOrgDataType 签名方式
* @param publicKey 公钥
* @param orgData 原始数据
+321 -12
View File
@@ -80,7 +80,7 @@ public class SydApi4j implements SydApi {
return 0;
}
// 测试通过
@Override
public RetWrap SYD_SM2GenKeyPair() {
ProtoQN proto = new ProtoQN();
@@ -379,7 +379,7 @@ public class SydApi4j implements SydApi {
packet.put("header", sn.getSn().array());
data.put("signatureDataType$option", 1);
data.put("DN", dn);
data.put("data", orgData);
data.put("signData", orgData);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
@@ -592,6 +592,7 @@ public class SydApi4j implements SydApi {
return detachedVerify(DATA_HASH, hash, sign);
}
// 测试通过
@Override
public String detachedSign(int dataType, byte[] orgData, String sCertDN) {
Proto8005 proto = new Proto8005(); //pset.getProtocolReqRender("75");
@@ -649,6 +650,7 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public boolean detachedVerify(int dataType, byte[] orgData, String sign) {
Proto8006 proto = new Proto8006(); //pset.getProtocolReqRender("75");
@@ -805,7 +807,7 @@ public class SydApi4j implements SydApi {
return detachedSign(DATA_ORIGIN, orgData, sCertDN);
}
// 测试通过
@Override
public boolean SYD_SM2_DetachedVerify_HA(
byte[] orgData,
@@ -814,7 +816,7 @@ public class SydApi4j implements SydApi {
return detachedVerify(DATA_ORIGIN, orgData, sign);
}
// 测试通过
@Override
public boolean SYD_DetachedVerify(byte[] orgData, String sign) {
return SYD_SM2_DetachedVerify_HA(orgData, sign);
@@ -885,6 +887,7 @@ public class SydApi4j implements SydApi {
return GetX509CertInfo(new String(pCertInfo));
}
// 测试通过
@Override
public RetWrap getAllCert(int dataFlag) throws UnsupportedEncodingException {
Proto8008 proto = new Proto8008();
@@ -950,6 +953,7 @@ public class SydApi4j implements SydApi {
return r;
}
// 测试通过
@Override
public RetWrap importCert(byte[] certData, byte[] organizationId) {
@@ -1814,6 +1818,7 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public RetWrap SYMEnDeData(Boolean isEn, int nAlg, String seesionKey, int roundmod, int fullMode, byte[] pInData, byte[] iv, int block) {
@@ -2043,8 +2048,7 @@ public class SydApi4j implements SydApi {
}
@Override
public RetWrap generateDEByDn(byte[] dn, byte nAlg) {
Integer alg = new Integer(nAlg);
public RetWrap generateDEByDn(byte[] dn, int alg) {
Proto6A proto = new Proto6A();
// 填充数据
PacketSN sn = PacketSN.gen();
@@ -2485,6 +2489,7 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public boolean RSAVerify(int HashMark, int nOrgDataType, byte[] publicKey, byte[] orgData, byte[] base64Sign) {
@@ -2499,6 +2504,7 @@ public class SydApi4j implements SydApi {
data.put("hashMark$option", HashMark);
data.put("signature", sign);
data.put("hashData", orgData);
data.put("infoData", orgData);
data.put("publicKey", publicKey);
ByteBuffer bb = proto.rend(packet);
@@ -2524,6 +2530,7 @@ public class SydApi4j implements SydApi {
}
}
// 测试通过
@Override
public byte[] RSASignC(String privateKeyIndex, int HashMark, int nOrgDataType, byte[] orgData) {
Proto7B proto = new Proto7B();
@@ -2668,6 +2675,7 @@ public class SydApi4j implements SydApi {
}
}
// 测试通过
@Override
public String RSAGetPublicKeyC(String userId, int nKeyTypes) {
@@ -2865,6 +2873,7 @@ public class SydApi4j implements SydApi {
return cinfo;
}
// 测试通过
@Override
public String GetX509CertFileC(String userId, int nCertType) {
@@ -2913,6 +2922,7 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public String SM2SignC(String pUserID, String certNo, int nOrgDataType, byte[] publicKey, byte[] orgData) {
@@ -3162,6 +3172,7 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public boolean SM2Verify(String certNo, int nOrgDataType, byte[] publicKey, byte[] orgData, String base64Sign) {
@@ -3348,6 +3359,7 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public byte[] decryptBySkC(int alg, String userId, byte[] data) {
byte[] algBin = 0 == alg ? DTO78.Req.Data.AlgorithmKeyOptions.OPVRSA.getBin() : DTO78.Req.Data.AlgorithmKeyOptions.OPVSM2.getBin();
@@ -4099,6 +4111,7 @@ public class SydApi4j implements SydApi {
return repackEncrypt(packet);
}
// 测试通过
@Override
public String GetDNPublicKey(int dnType, byte[] dn) {
@@ -4679,6 +4692,7 @@ public class SydApi4j implements SydApi {
* @param macLen MAC数据长度,1=4Byte 2=8Byte 3=16Byte(仅在SM4/AES 下有效)
* @return mac 值 hex 格式
*/
// 测试通过
@Override
public String MACCalc(int alg, int keyType, String AK, int fullMode, byte[] infoData, int macLen) {
ProtoMA proto = new ProtoMA();
@@ -4696,7 +4710,7 @@ public class SydApi4j implements SydApi {
data.put("fullMode$option", fullMode);
data.put("MACLen$option", macLen - 1);
data.put("key", AK.getBytes());
data.put("MACData", Util.bytes2HexString(infoData));
data.put("MACData", infoData);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
@@ -4765,8 +4779,8 @@ public class SydApi4j implements SydApi {
data.put("fullMode$option", fullMode);
data.put("MACLen$option", macLen - 1);
data.put("key", AK);
data.put("MAC", mac.getBytes());
data.put("MACData", Util.bytes2HexString(infoData));
data.put("MAC", mac);
data.put("MACData", infoData);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
@@ -4931,7 +4945,7 @@ public class SydApi4j implements SydApi {
return GenerateMIYA(AreaCode, Version, Alg, Data, MIYA_FULL_WEAK, MIYA_MAC_LEN_4);
}
// 测试通过
@Override
public String GenerateMIYA(String AreaCode, int Version, int Alg, byte[] Data, byte fullFlag, byte macLenFlag) {
if (Version < 0 || Version > 999) {
@@ -5009,6 +5023,7 @@ public class SydApi4j implements SydApi {
return VerifyMIYA(AreaCode, Version, Alg, mac, Data, MIYA_FULL_WEAK, MIYA_MAC_LEN_4);
}
// 测试通过
@Override
public boolean VerifyMIYA(String AreaCode, int Version, int Alg, String mac, byte[] Data, byte fullFlag, byte macLenFlag) {
@@ -5196,6 +5211,7 @@ public class SydApi4j implements SydApi {
*
* @param format 打印格式
*/
// 测试通过
public void setPrintFormat(String format) {
ProtoPA proto = new ProtoPA();
@@ -5751,10 +5767,10 @@ public class SydApi4j implements SydApi {
data.put("alg$option", alg);
data.put("fillKey$option", 1);
data.put("publicKey", publicKey);
/* data.put("AlgorithmKey1", "P");
data.put("AlgorithmKey1", "P");
data.put("EncryAlgorithm1$option", 1);
data.put("AlgorithmKey2", "Q");
data.put("EncryAlgorithm2$option", 0);*/
data.put("EncryAlgorithm2$option", 0);
packet.put("data", data);
// 渲染发送 耗时长
@@ -6110,6 +6126,7 @@ public class SydApi4j implements SydApi {
* @param infoData 密文PIN
* @return 密文PIN
*/
// 测试通过
public byte[] switchEncry4PIN(String srcKey, String aimKey, byte[] infoData) {
// 获取协议
Proto67 proto = new Proto67();
@@ -8703,6 +8720,108 @@ public class SydApi4j implements SydApi {
}
}
private byte[] _SYMEncryt(int storageType, String key, int algFlag, byte[] iv, int divNum, List<byte[]> divData, int[] divAlgFlag, List<byte[]> divIv, byte[] inputData) {
// 填充数据
PacketSN sn = PacketSN.gen();
ByteBuffer bb = ByteBuffer.allocate(10240);
byte[] ret = new byte[2];
bb.put(ret);
bb.put(sn.getSn().array());
bb.put("S0".getBytes());
//存储类型
bb.put(String.valueOf(storageType).getBytes());
if (1 == storageType) {
byte[] keyBytes = Util.hexString2Bytes(key);
// 外部密钥长度
bb.put(String.format("%04d", keyBytes.length).getBytes());
// 外部密钥
bb.put(keyBytes);
}
if (0 == storageType) {
String gId = "00000000" + key;
gId = gId.substring(gId.length() - 8, gId.length());
// 密钥索引
bb.put(("0000000000000000000" + gId).getBytes());
}
//算法类型支持算法:3DES、AES、SM1、SM4
bb.put(String.format("%02d", MyUtil.transAlg(algFlag)).getBytes());
bb.put(iv);
//密钥分散级数
bb.put(String.valueOf(divNum).getBytes());
// 分散因子
for (int i = 0; i < divNum; i++) {
bb.put(divData.get(i));
}
// 分散算法标识
for (int i = 0; i < divNum; i++) {
bb.put(String.format("%02d", MyUtil.transAlg(divAlgFlag[i])).getBytes());
}
// 分散算法的初始向量
for (int i = 0; i < divNum; i++) {
bb.put(divIv.get(i));
}
// 输入数据长度
bb.put(String.format("%04d", inputData.length).getBytes());
//输入数据
bb.put(inputData);
int len = bb.position() - 2;
bb.put(0, (byte) (0xFF & (len / 256)));
bb.put(1, (byte) (0xFF & (len % 256)));
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
bb.flip();
// 解析头部
bb.get(new byte[2], 0, 2);
// 解析header
byte[] header = new byte[8];
bb.get(header, 0, 8);
// 解析协议
bb.get(new byte[2], 0, 2);
if (!Arrays.equals(sn.getSn().array(), header)) {
throw new SydApiException("包序号不匹配", -4);
}
// 检测错误
byte[] error = new byte[2];
bb.get(error, 0, 2);
int e = Util.a2i(error, 16);
if (0 != e) {
throw new SydApiException(RetWrap.transMsg(e), e);
}
// 数据长度
byte[] infoLen = new byte[4];
bb.get(infoLen, 0, 4);
// 数据
byte[] info = new byte[Util.a2i(infoLen, 10)];
bb.get(info);
return info;
}
/**
* @param storageType 存储类型 0-使用内部密钥,1-使用外部密钥
* @param key 使用内部密钥时,该值传后八位密钥索引;使用外部密钥时,该值为外部密钥(hex格式)
@@ -8897,6 +9016,107 @@ public class SydApi4j implements SydApi {
}
}
private byte[] _genMAC(int storageType, String key, int algFlag, byte[] iv, int divNum, List<byte[]> divData, int[] divAlgFlag, List<byte[]> divIv, byte[] inputData, int macDataLen) {
// 填充数据
PacketSN sn = PacketSN.gen();
ByteBuffer bb = ByteBuffer.allocate(10240);
byte[] ret = new byte[2];
bb.put(ret);
bb.put(sn.getSn().array());
bb.put("S2".getBytes());
//存储类型
bb.put(String.valueOf(storageType).getBytes());
if (1 == storageType) {
byte[] keyBytes = Util.hexString2Bytes(key);
// 外部密钥长度
bb.put(String.format("%04d", keyBytes.length).getBytes());
// 外部密钥
bb.put(keyBytes);
}
if (0 == storageType) {
String gId = "00000000" + key;
gId = gId.substring(gId.length() - 8, gId.length());
// 密钥索引
bb.put(("0000000000000000000" + gId).getBytes());
}
//算法类型支持算法:3DES、AES、SM1、SM4
bb.put(String.format("%02d", MyUtil.transAlg(algFlag)).getBytes());
bb.put(iv);
//密钥分散级数
bb.put(String.valueOf(divNum).getBytes());
// 分散因子
for (int i = 0; i < divNum; i++) {
bb.put(divData.get(i));
}
// 分散算法标识
for (int i = 0; i < divNum; i++) {
bb.put(String.format("%02d", MyUtil.transAlg(divAlgFlag[i])).getBytes());
}
// 分散算法的初始向量
for (int i = 0; i < divNum; i++) {
bb.put(divIv.get(i));
}
// 输入数据长度
bb.put(String.format("%04d", inputData.length).getBytes());
//输入数据
bb.put(inputData);
// 需要的MAC长度
bb.put(String.format("%02d", macDataLen).getBytes());
int len = bb.position() - 2;
bb.put(0, (byte) (0xFF & (len / 256)));
bb.put(1, (byte) (0xFF & (len % 256)));
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
bb.flip();
// 解析头部
bb.get(new byte[2], 0, 2);
// 解析header
byte[] header = new byte[8];
bb.get(header, 0, 8);
// 解析协议
bb.get(new byte[2], 0, 2);
if (!Arrays.equals(sn.getSn().array(), header)) {
throw new SydApiException("包序号不匹配", -4);
}
// 检测错误
byte[] error = new byte[2];
bb.get(error, 0, 2);
int e = Util.a2i(error, 16);
if (0 != e) {
throw new SydApiException(RetWrap.transMsg(e), e);
}
// 数据
byte[] info = new byte[macDataLen];
bb.get(info);
return info;
}
/**
* @param keyIndex 密钥索引
* @param iv 仅当算法为3DES-CBC模式下有此域
@@ -8984,6 +9204,95 @@ public class SydApi4j implements SydApi {
}
}
private byte[] _genMacAndNextIv(String keyIndex, byte[] iv, int divNum, List<byte[]> divData, int[] divAlgFlag, List<byte[]> divIv, byte[] inputData) {
// 填充数据
PacketSN sn = PacketSN.gen();
ByteBuffer bb = ByteBuffer.allocate(10240);
byte[] ret = new byte[2];
bb.put(ret);
bb.put(sn.getSn().array());
bb.put("S3".getBytes());
String gId = "00000000" + keyIndex;
gId = gId.substring(gId.length() - 8);
// 密钥索引
bb.put(("0000000000000000000" + gId).getBytes());
// 算法类型支持算法:仅支持3DES-CBC
bb.put(String.format("%02d", 8).getBytes());
bb.put(iv);
//密钥分散级数
bb.put(String.valueOf(divNum).getBytes());
// 分散因子
for (int i = 0; i < divNum; i++) {
bb.put(divData.get(i));
}
// 分散算法标识
for (int i = 0; i < divNum; i++) {
bb.put(String.format("%02d", MyUtil.transAlg(divAlgFlag[i])).getBytes());
}
// 分散算法的初始向量
for (int i = 0; i < divNum; i++) {
bb.put(divIv.get(i));
}
// 输入数据长度
bb.put(String.format("%04d", inputData.length).getBytes());
//输入数据
bb.put(inputData);
int len = bb.position() - 2;
bb.put(0, (byte) (0xFF & (len / 256)));
bb.put(1, (byte) (0xFF & (len % 256)));
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
bb.flip();
// 解析头部
bb.get(new byte[2], 0, 2);
// 解析header
byte[] header = new byte[8];
bb.get(header, 0, 8);
// 解析协议
bb.get(new byte[2], 0, 2);
if (!Arrays.equals(sn.getSn().array(), header)) {
throw new SydApiException("包序号不匹配", -4);
}
// 检测错误
byte[] error = new byte[2];
bb.get(error, 0, 2);
int e = Util.a2i(error, 16);
if (0 != e) {
throw new SydApiException(RetWrap.transMsg(e), e);
}
// 数据
byte[] info = new byte[16];
bb.get(info);
return info;
}
/**
* @param storageType 存储类型,0-存储在内部 1-存储在外部
* @param algFlag 算法类型:仅支持RSA、SM2