DN reverse bug fix

This commit is contained in:
cheney
2022-06-21 18:14:28 +08:00
parent 15124bf487
commit 3cd9e78990
10 changed files with 2824 additions and 2867 deletions
+3 -3
View File
@@ -226,7 +226,7 @@ public interface SydGenApi {
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/
RetWrap generateDEByDn(String certSerial, String oData);
RetWrap generateDEByDn(String certSerial, byte[] oData);
/**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
@@ -240,7 +240,7 @@ public interface SydGenApi {
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/
RetWrap generateDE(byte[] certSerial, int alg, int model, String oData);
RetWrap generateDE(byte[] certSerial, int alg, int model, byte[] oData);
/**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
@@ -308,7 +308,7 @@ public interface SydGenApi {
* KCV 会话密钥的检验值,HEX 格式,长度为 36H。
* orgCode 如果有机构码的话会返回机构码
*/
RetWrap decryptDEByDN(String certSerial, String pCipherKey);
RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey);
/**
* 接收用私钥解密数字信封,还原对称密钥。
+5 -5
View File
@@ -177,7 +177,7 @@ interface SydAttachedSVApi {
* @return
* 符合PKCS7标准的签名结果
*/
String attachedSign(byte[] orgData, String sCertDN);
byte[] attachedSign(byte[] orgData, String sCertDN);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
@@ -186,7 +186,7 @@ interface SydAttachedSVApi {
* @param sign 已签名数据
* @return true 验签通过 false 验签失败
*/
boolean attachedVerify(String sign);
boolean attachedVerify(byte[] sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
@@ -195,7 +195,7 @@ interface SydAttachedSVApi {
* @param sign 已签名数据
* @return 成功返回签名的原数据,失败则报错
*/
String attachedVerifyRD(String sign);
byte[] attachedVerifyRD(byte[] sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
@@ -206,7 +206,7 @@ interface SydAttachedSVApi {
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
*/
X509 attachedVerifyAndGetX509(String sign);
X509 attachedVerifyAndGetX509(byte[] sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
@@ -217,7 +217,7 @@ interface SydAttachedSVApi {
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
*/
RetWrap attachedVerifyAndGetAll(String sign);
RetWrap attachedVerifyAndGetAll(byte[] sign);
}
+10 -3
View File
@@ -1,6 +1,7 @@
package com.sunyard.util;
import java.util.LinkedHashMap;
import java.util.List;
public class DnUtil {
@@ -20,14 +21,20 @@ public class DnUtil {
return dn;
}
// 反转顺序
LinkedHashMap<String, String> map = dnToMap( dn );
String[] kvs = dn.split(",");
StringBuilder sb = new StringBuilder();
for ( String key : map.keySet() ) {
for ( String kv : kvs ) {
if ( sb.length() > 0 ) {
sb.insert(0, ",");
}
sb.insert(0, key + "=" + map.get( key ));
sb.insert(0, kv );
// if ( sb.length() > 0 ) {
// sb.append(",");
// }
// sb.append( key + "=" + map.get( key ) );
}
return sb.toString();
+40 -39
View File
@@ -2302,15 +2302,15 @@ public class SydApi4j implements SydApi {
}
@Override
public RetWrap generateDEByDn(String certSerial, String oData) {
if ( oData.length() <= 4 * 1024 ) {
public RetWrap generateDEByDn(String certSerial, byte[] oData) {
if ( oData.length <= 4 * 1024 ) {
return generateDEByDnHsm( certSerial, oData );
} else {
return generateDEByDnSoft( certSerial, oData );
}
}
public RetWrap generateDEByDnHsm(String certSerial, String oData) {
public RetWrap generateDEByDnHsm(String certSerial, byte[] oData) {
certSerial = DnUtil.verifyDn( certSerial );
@@ -2324,7 +2324,7 @@ public class SydApi4j implements SydApi {
}
@Override
public RetWrap generateDE(byte[] certSerial, int alg, int model, String oData) {
public RetWrap generateDE(byte[] certSerial, int alg, int model, byte[] oData) {
Proto6A proto = new Proto6A();
// 填充数据
PacketSN sn = PacketSN.gen();
@@ -2368,12 +2368,12 @@ public class SydApi4j implements SydApi {
throw new SydApiException(error.getInfo(), error.autoInt());
}
RetWrap rw = new RetWrap();
rw.put(SydApi.RET_CIPHER_KEY, ((PacketSection) ret.get("key")).getString());
rw.put(SydApi.RET_SESSION_KEY, ((PacketSection) ret.get("lmkHead")).getString() +
((PacketSection) ret.get("lmk")).getString()
rw.put(SydApi.RET_CIPHER_KEY, ((PacketSection) ret.get("key")).getBytes() );
rw.put(SydApi.RET_SESSION_KEY, (((PacketSection) ret.get("lmkHead")).getString() +
((PacketSection) ret.get("lmk")).getString()).getBytes()
);
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getString());
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getBytes());
return rw;
}
@@ -2528,7 +2528,7 @@ public class SydApi4j implements SydApi {
return (X509Certificate) cf.generateCertificate(is);
}
public RetWrap generateDEByDnSoft(String certSerial, String oData) {
public RetWrap generateDEByDnSoft(String certSerial, byte[] oData) {
certSerial = DnUtil.verifyDn( certSerial );
@@ -2561,15 +2561,15 @@ public class SydApi4j implements SydApi {
// 生成会话密钥
ret = SM2GenSessionKey(pk);
String ciperKey = ret.get(SydApi.RET_CIPHER_KEY).toString();
String sessionKeyByLMK = ret.get(SydApi.RET_SESSION_KEY).toString();
String ciperKey = new String( (byte[]) ret.get(SydApi.RET_CIPHER_KEY));
String sessionKeyByLMK = new String( (byte[]) ret.get(SydApi.RET_SESSION_KEY ));
println("ciperKey=" + ciperKey);
// 加密数据
byte[] iv = new byte[32];
Arrays.fill(iv, (byte) 0x30);
RetWrap retWrap = SYMEnDeData(true, 1, sessionKeyByLMK, 1, 1, oData.getBytes(), iv, 0);
RetWrap retWrap = SYMEnDeData(true, 1, sessionKeyByLMK, 1, 1, oData, iv, 0);
byte[] enData = (byte[]) retWrap.get("msg_all");
// 组织格式
@@ -2578,7 +2578,7 @@ public class SydApi4j implements SydApi {
dnToMap(issuser.getName() )
);
ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()));
ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()).getBytes() );
return ret;
@@ -2658,11 +2658,11 @@ public class SydApi4j implements SydApi {
return info;
}
public RetWrap decryptDEByDN(String certSerial, String pCipherKey){
if ( pCipherKey.length() <= 4 * 1024 ) {
return decryptDEByDNHsm( certSerial, pCipherKey );
public RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey){
if ( pCipherKey.length <= 4 * 1024 ) {
return decryptDEByDNHsm( certSerial, new String(pCipherKey) );
} else {
return decryptDEByDNSoft( certSerial, pCipherKey );
return decryptDEByDNSoft( certSerial, new String(pCipherKey) );
}
}
@@ -2683,7 +2683,7 @@ public class SydApi4j implements SydApi {
// 解密会话密钥
ret = decryptDE(false, 1, dnBytes, Util.encodeBase64(sessionKeyDer) );
String sessionKey = (String) ret.get("SessionKey");
String sessionKey = new String((byte[]) ret.get("SessionKey") );
// 解密原文
byte[] iv = new byte[32];
@@ -2747,19 +2747,19 @@ public class SydApi4j implements SydApi {
RetWrap rw = new RetWrap();
if (pFlag) {
rw.put("oData", ((PacketSection) ret.get("oData")).getString());
rw.put("oData", ((PacketSection) ret.get("oData")).getBytes());
}
int orgCodeLen = Util.a2i(((PacketSection) ret.get("orgCodeLen")).getBytes(), 10);
if (orgCodeLen != 0) {
rw.put("orgCode", ((PacketSection) ret.get("orgCode")).getString());
rw.put("orgCode", ((PacketSection) ret.get("orgCode")).getBytes());
}
rw.put(SydApi.RET_SESSION_KEY, ((PacketSection) ret.get("lmkHead")).getString() +
((PacketSection) ret.get("lmk")).getString()
rw.put(SydApi.RET_SESSION_KEY, (((PacketSection) ret.get("lmkHead")).getString() +
((PacketSection) ret.get("lmk")).getString()).getBytes()
);
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getString());
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getBytes());
return rw;
}
@@ -5141,14 +5141,15 @@ public class SydApi4j implements SydApi {
throw new SydApiException(error.getInfo(), error.autoInt());
}
RetWrap rw = new RetWrap();
rw.put(SydApi.RET_CIPHER_KEY, Util.bytes2HexString(
rw.put(SydApi.RET_CIPHER_KEY,
((PacketSection) ret.get("key")).getBytes()
));
rw.put(SydApi.RET_SESSION_KEY, ((PacketSection) ret.get("lmkHead")).getString() +
((PacketSection) ret.get("lmk")).getString()
);
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getString());
rw.put(SydApi.RET_SESSION_KEY, (((PacketSection) ret.get("lmkHead")).getString() +
((PacketSection) ret.get("lmk")).getString()).getBytes()
);
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getBytes());
return rw;
}
@@ -10412,7 +10413,7 @@ public class SydApi4j implements SydApi {
* @return 符合PKCS7标准的签名结果
*/
@Override
public String attachedSign(byte[] orgData, String sCertDN) {
public byte[] attachedSign(byte[] orgData, String sCertDN) {
sCertDN = DnUtil.verifyDn( sCertDN );
Proto8018 proto = new Proto8018();
@@ -10459,11 +10460,11 @@ public class SydApi4j implements SydApi {
throw new SydApiException(error.getInfo(), error.autoInt());
}
return ((PacketSection) ret.get("signature")).getString();
return ((PacketSection) ret.get("signature")).getString().getBytes();
}
@Override
public boolean attachedVerify(String sign) {
public boolean attachedVerify(byte[] sign) {
Proto8019 proto = new Proto8019();
// 填充数据
@@ -10473,7 +10474,7 @@ public class SydApi4j implements SydApi {
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("signData", sign.getBytes());
data.put("signData", sign);
data.put("flag$option", 0);
// 渲染发送
@@ -10506,12 +10507,12 @@ public class SydApi4j implements SydApi {
}
@Override
public String attachedVerifyRD(String sign) {
public byte[] attachedVerifyRD(byte[] sign) {
RetWrap retWrap = attachedVerifyAndGetAll(sign);
if (retWrap == null)
return null;
return (String) retWrap.get("oData");
return (byte[]) retWrap.get("oData");
}
/**
@@ -10521,15 +10522,15 @@ public class SydApi4j implements SydApi {
* @param sign 已签名数据
* @return 返回CERT_INFO结构的证书数据
*/
public X509 attachedVerifyAndGetX509(String sign) {
RetWrap retWrap = attachedVerifyAndGetAll(sign);
public X509 attachedVerifyAndGetX509(byte[] sign) {
RetWrap retWrap = attachedVerifyAndGetAll( sign);
if (retWrap == null)
return null;
return (X509) retWrap.get("x509");
}
public RetWrap attachedVerifyAndGetAll(String sign) {
public RetWrap attachedVerifyAndGetAll(byte[] sign) {
Proto8019 proto = new Proto8019();
// 填充数据
@@ -10539,7 +10540,7 @@ public class SydApi4j implements SydApi {
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("signData", sign.getBytes());
data.put("signData", sign);
data.put("flag$option", 1);
// 渲染发送
@@ -10579,7 +10580,7 @@ public class SydApi4j implements SydApi {
RetWrap retWrap = new RetWrap();
retWrap.put("x509", x509);
retWrap.put("oData", new String(oDataB));
retWrap.put("oData", oDataB );
return retWrap;
}