1、导入证书时在证书前后添加begin,end并添加换行。2、生成数字信封支持P

This commit is contained in:
zhoubin
2022-01-05 10:08:01 +08:00
parent 8b01081adf
commit c3236d3547
9 changed files with 370 additions and 76 deletions
@@ -89,7 +89,7 @@ public interface SydCertApi {
);
/**
* 从签名中获取证书
* 从签名中获取证书并上载到加密机
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 证书信息(包含公钥字段)
@@ -120,4 +120,12 @@ public interface SydCertApi {
*/
RetWrap importCert(byte[] certData, byte[] organizationId);
/**
* 上传指定证书到加密设备,并在证书前后加上begin和end
* @param certData 证书的字节数组
* @param organizationId 机构号的字节数组
* @return
*/
RetWrap importCertAddHT(String certData, byte[] organizationId);
}
@@ -216,6 +216,18 @@ public interface SydGenApi {
*/
RetWrap generateDEByDn(byte[] dn, int alg, int model) throws Exception;
/**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
* @param certSerial 对*方 X509 证书的序列号。
* @param nAlg 算法标识,0:AES,1:SM4
* @return RetWrap 包含 CipherKey, SessionKey, KCV
* CipherKey 公钥加密的会话密钥 ,BASE64 编码
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/
RetWrap generateDEbyGS(String certSerial, byte nAlg);
/**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
@@ -34,21 +34,19 @@ public interface SydQNUCApi {
/**
* 用指定的证书私钥对指定的数据进行数字签名。使用外部公钥做hash
* 最大签名原始数据为8161byte
* @param publicKey 输入。公钥。
* @param pCertSerial 输入。签名 X509 证书的序列号。
* @param pOrgData 输入。 待签名的原始数据。
* @return 签名数据(BASE64 编码)。
*/
String netGSSign(String publicKey, String pCertSerial, byte[] pOrgData);
String netGSSign(String pCertSerial, byte[] pOrgData);
/**
* 用指定证书对指定的原始数据进行数字签名验证。使用外部公钥做hash
* @param publicKey 输入。公钥。
* @param pCertSerial 输入。 签名 X509 证书的序列号。
* @param pOrgData 输入。 待签名的原始数据。
* @param pSignData 输入。 签名数据(BASE64 编码)。
* @return true 表示验证正确;false 表示失败;
*/
boolean netGSVerify(String publicKey, String pCertSerial, byte[] pOrgData, String pSignData);
boolean netGSVerify(String pCertSerial, byte[] pOrgData, String pSignData);
}
@@ -171,4 +171,33 @@ public class CoderUtil {
}
}
/**
* 将证书前后加上begin和end,中间添加换行
* @param certData
* @return
*/
public static String certAddHT(String certData) {
final String head = "-----BEGIN CERTIFICATE-----\n";
final String tail = "-----END CERTIFICATE-----";
final String wrap = "\n";
int num = certData.length() % 64 == 0 ? certData.length() / 64: certData.length() / 64 + 1;
StringBuilder sb = new StringBuilder();
sb.append(head);
for (int i = 0; i < num; i++) {
String substring;
if (i == num - 1) {
substring = certData.substring(i * 64);
} else {
substring = certData.substring(i * 64, (i + 1) * 64);
}
sb.append(substring).append(wrap);
}
sb.append(tail);
return sb.toString();
}
}
+31 -6
View File
@@ -971,6 +971,19 @@ public class SydApi4j implements SydApi {
return r;
}
/**
*
* @param certData
* @param organizationId
* @return
*/
@Override
public RetWrap importCertAddHT(String certData, byte[] organizationId) {
String cert = CoderUtil.certAddHT(certData);
return importCert(Util.getSafeBytes(cert), organizationId);
}
// 测试通过
@Override
public RetWrap importCert(byte[] certData, byte[] organizationId) {
@@ -2114,8 +2127,17 @@ public class SydApi4j implements SydApi {
return rw;
}
@Override
public RetWrap generateDEbyGS(String certSerial, byte nAlg) {
return generateDE(1, certSerial, nAlg);
}
@Override
public RetWrap generateDE(String certSerial, byte nAlg) {
return generateDE(0, certSerial, nAlg);
}
public RetWrap generateDE(int pFlag, String certSerial, byte nAlg) {
// 获取协议
//ProtocolRender render = pset.getProtocolReqRender("6A");
Proto6A proto = new Proto6A();
@@ -2125,6 +2147,9 @@ public class SydApi4j implements SydApi {
packet.put("header", sn.getSn().array());
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("alg$option", nAlg - 0x30);
if (pFlag == 1) {
data.put("pFlag", 'P');
}
data.put("certificateModel$option", 0);
data.put("certificateSn", certSerial.getBytes());
data.put("keyType", "X");
@@ -2453,14 +2478,14 @@ public class SydApi4j implements SydApi {
return true;
}
public String netGSSign(String publicKey, String pCertSerial, byte[] pOrgData) {
byte[] hash = SM3Hash(publicKey, pOrgData);
return _netSign(pCertSerial, hash);
@Override
public String netGSSign(String pCertSerial, byte[] pOrgData) {
return _netSign(pCertSerial, pOrgData);
}
public boolean netGSVerify(String publicKey, String pCertSerial, byte[] pOrgData, String pSignData) {
byte[] hash = SM3Hash(publicKey, pOrgData);
return _netVerify(pCertSerial, hash, pSignData);
@Override
public boolean netGSVerify(String pCertSerial, byte[] pOrgData, String pSignData) {
return _netVerify(pCertSerial, pOrgData, pSignData);
}
// 测试通过