p7 证书相关
This commit is contained in:
parent
2e8ea4e077
commit
4404f89dd6
18
pom.xml
18
pom.xml
@ -76,6 +76,24 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bouncycastle</groupId>
|
||||||
|
<artifactId>bcpkix-jdk15on</artifactId>
|
||||||
|
<version>1.65</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bouncycastle</groupId>
|
||||||
|
<artifactId>bcprov-jdk15on</artifactId>
|
||||||
|
<version>1.65</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-all</artifactId>
|
||||||
|
<version>5.8.4.M1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--<dependency>-->
|
<!--<dependency>-->
|
||||||
<!--<groupId>club.fullstack</groupId>-->
|
<!--<groupId>club.fullstack</groupId>-->
|
||||||
<!--<artifactId>serialize</artifactId>-->
|
<!--<artifactId>serialize</artifactId>-->
|
||||||
|
|||||||
139
src/main/java/org/bouncycastle/cms/SydCmsUtil.java
Normal file
139
src/main/java/org/bouncycastle/cms/SydCmsUtil.java
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
package org.bouncycastle.cms;
|
||||||
|
|
||||||
|
import com.sunyard.SydApiException;
|
||||||
|
import org.bouncycastle.asn1.*;
|
||||||
|
import org.bouncycastle.asn1.cms.ContentInfo;
|
||||||
|
import org.bouncycastle.asn1.cms.EncryptedContentInfo;
|
||||||
|
import org.bouncycastle.asn1.cms.OriginatorInfo;
|
||||||
|
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
public class SydCmsUtil {
|
||||||
|
|
||||||
|
public static Object readContentInfo(
|
||||||
|
byte[] input) {
|
||||||
|
ASN1InputStream is = new ASN1InputStream(input);
|
||||||
|
Object v = null;
|
||||||
|
try {
|
||||||
|
v = is.readObject();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Map<String, Object> getEncryptedContentInfo(ASN1Encodable obj){
|
||||||
|
Map<String, Object>map = new HashMap<String, Object>();
|
||||||
|
ASN1Sequence seq = ASN1Sequence.getInstance(obj );
|
||||||
|
if (seq.size() < 2)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Truncated Sequence Found");
|
||||||
|
}
|
||||||
|
|
||||||
|
ASN1ObjectIdentifier contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0);
|
||||||
|
map.put( "contentType", contentType );
|
||||||
|
|
||||||
|
AlgorithmIdentifier contentEncryptionAlgorithm = AlgorithmIdentifier.getInstance(
|
||||||
|
seq.getObjectAt(1));
|
||||||
|
|
||||||
|
map.put( "contentEncryptionAlgorithm", contentEncryptionAlgorithm );
|
||||||
|
|
||||||
|
if (seq.size() > 2)
|
||||||
|
{
|
||||||
|
ASN1OctetString encryptedContent = ASN1OctetString.getInstance(
|
||||||
|
(ASN1TaggedObject)seq.getObjectAt(2), false);
|
||||||
|
map.put( "encryptedContent", encryptedContent );
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> getOriginatorInfo(ASN1TaggedObject obj,
|
||||||
|
boolean explicit){
|
||||||
|
Map<String, Object>map = new HashMap<String, Object>();
|
||||||
|
ASN1Sequence seq = ASN1Sequence.getInstance(obj, explicit);
|
||||||
|
switch (seq.size())
|
||||||
|
{
|
||||||
|
case 0: // empty
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0);
|
||||||
|
switch (o.getTagNo())
|
||||||
|
{
|
||||||
|
case 0 :
|
||||||
|
ASN1Set certs = ASN1Set.getInstance(o, false);
|
||||||
|
map.put("certs", certs);
|
||||||
|
break;
|
||||||
|
case 1 :
|
||||||
|
ASN1Set crls = ASN1Set.getInstance(o, false);
|
||||||
|
map.put("crls", crls);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Bad tag in OriginatorInfo: " + o.getTagNo());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ASN1Set certs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(0), false);
|
||||||
|
map.put("certs", certs);
|
||||||
|
ASN1Set crls = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(1), false);
|
||||||
|
map.put("crls", crls);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("OriginatorInfo too big");
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ContentInfo getContentInfo( byte[] input ) {
|
||||||
|
Object content = readContentInfo( input );
|
||||||
|
ASN1Sequence seq = ASN1Sequence.getInstance( content );
|
||||||
|
return new ContentInfo(seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> readCmsInfo( byte[] input ) throws CMSException {
|
||||||
|
Map<String, Object>map = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
Object content = readContentInfo( input );
|
||||||
|
ASN1Sequence seq = ASN1Sequence.getInstance( content );
|
||||||
|
ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier) seq.getObjectAt(0);
|
||||||
|
map.put("oid", oid);
|
||||||
|
|
||||||
|
seq = ASN1Sequence.getInstance((ASN1TaggedObject) seq.getObjectAt(1), true);
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
ASN1Integer version = (ASN1Integer)seq.getObjectAt(index++);
|
||||||
|
map.put( "version", version );
|
||||||
|
|
||||||
|
Object tmp = seq.getObjectAt(index++);
|
||||||
|
|
||||||
|
if (tmp instanceof ASN1TaggedObject)
|
||||||
|
{
|
||||||
|
OriginatorInfo originatorInfo = OriginatorInfo.getInstance((ASN1TaggedObject)tmp, false);
|
||||||
|
// Map<String, Object>originatorInfo = getOriginatorInfo((ASN1TaggedObject)tmp, false);
|
||||||
|
map.put( "originatorInfo", originatorInfo );
|
||||||
|
tmp = seq.getObjectAt(index++);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASN1Set recipientInfos = ASN1Set.getInstance(tmp);
|
||||||
|
map.put( "recipientInfos", recipientInfos );
|
||||||
|
|
||||||
|
EncryptedContentInfo encryptedContentInfo = EncryptedContentInfo.getInstance( seq.getObjectAt(index++) );
|
||||||
|
// Map<String, Object> encryptedContentInfo = getEncryptedContentInfo(seq.getObjectAt(index++));
|
||||||
|
map.put( "encryptedContentInfo", encryptedContentInfo );
|
||||||
|
|
||||||
|
if(seq.size() > index)
|
||||||
|
{
|
||||||
|
ASN1Set unprotectedAttrs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(index), false);
|
||||||
|
map.put( "unprotectedAttrs", unprotectedAttrs );
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
package racal.sunyard.main;
|
package racal.sunyard.main;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import com.sunyard.RetWrap;
|
import com.sunyard.RetWrap;
|
||||||
import com.sunyard.SYMEnDeLongData;
|
import com.sunyard.SYMEnDeLongData;
|
||||||
import com.sunyard.SydApi;
|
import com.sunyard.SydApi;
|
||||||
@ -10,7 +11,6 @@ import com.sunyard.proto.Packet;
|
|||||||
import com.sunyard.proto.PacketSection;
|
import com.sunyard.proto.PacketSection;
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
import com.sunyard.proto.section.SectionValue;
|
import com.sunyard.proto.section.SectionValue;
|
||||||
import com.sunyard.proto.value.Str;
|
|
||||||
import com.sunyard.trans.Alg;
|
import com.sunyard.trans.Alg;
|
||||||
import com.sunyard.trans.FullMode;
|
import com.sunyard.trans.FullMode;
|
||||||
import com.sunyard.trans.PacketSN;
|
import com.sunyard.trans.PacketSN;
|
||||||
@ -19,7 +19,18 @@ import com.sunyard.util.CoderUtil;
|
|||||||
import com.sunyard.util.FileUtil;
|
import com.sunyard.util.FileUtil;
|
||||||
import com.sunyard.util.MyUtil;
|
import com.sunyard.util.MyUtil;
|
||||||
import com.sunyard.util.SYMUtil;
|
import com.sunyard.util.SYMUtil;
|
||||||
import racal.sunyard.main.dto.*;
|
import org.bouncycastle.asn1.ASN1Sequence;
|
||||||
|
import org.bouncycastle.asn1.ASN1Set;
|
||||||
|
import org.bouncycastle.asn1.ASN1TaggedObject;
|
||||||
|
import org.bouncycastle.asn1.DEROctetString;
|
||||||
|
import org.bouncycastle.asn1.cms.ContentInfo;
|
||||||
|
import org.bouncycastle.cms.SydCmsUtil;
|
||||||
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
|
||||||
|
import racal.sunyard.main.dto.DTO77;
|
||||||
|
import racal.sunyard.main.dto.DTO78;
|
||||||
|
import racal.sunyard.main.dto.DTO79;
|
||||||
|
import racal.sunyard.main.dto.DTO7A;
|
||||||
import racal.sunyard.main.proto.*;
|
import racal.sunyard.main.proto.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@ -27,14 +38,22 @@ import java.net.InetSocketAddress;
|
|||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
import java.nio.Buffer;
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
import java.security.NoSuchProviderException;
|
||||||
|
import java.security.Security;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.security.cert.CertificateFactory;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class SydApi4j implements SydApi {
|
public class SydApi4j implements SydApi {
|
||||||
|
|
||||||
|
static {
|
||||||
|
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean debug = false;
|
private static boolean debug = false;
|
||||||
|
|
||||||
private static long sTime = System.currentTimeMillis();
|
private static long sTime = System.currentTimeMillis();
|
||||||
@ -976,7 +995,6 @@ public class SydApi4j implements SydApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param certData
|
* @param certData
|
||||||
* @param organizationId
|
* @param organizationId
|
||||||
* @return
|
* @return
|
||||||
@ -1916,6 +1934,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 对指定报文数据进行SM4加密
|
* 对指定报文数据进行SM4加密
|
||||||
|
*
|
||||||
* @param type 密钥类型。0: ZEK,1: TEK
|
* @param type 密钥类型。0: ZEK,1: TEK
|
||||||
* @param userId 生成密钥时的机构号。
|
* @param userId 生成密钥时的机构号。
|
||||||
* @param index 密钥索引
|
* @param index 密钥索引
|
||||||
@ -2057,6 +2076,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 对指定报文数据进行SM4解密
|
* 对指定报文数据进行SM4解密
|
||||||
|
*
|
||||||
* @param type 密钥类型。0: ZEK,1: TEK
|
* @param type 密钥类型。0: ZEK,1: TEK
|
||||||
* @param userId 生成密钥时的机构号
|
* @param userId 生成密钥时的机构号
|
||||||
* @param index 密钥索引
|
* @param index 密钥索引
|
||||||
@ -2327,6 +2347,208 @@ public class SydApi4j implements SydApi {
|
|||||||
return decryptDE(true, 1, dnBytes, pCipherKey);
|
return decryptDE(true, 1, dnBytes, pCipherKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过 DN 查找证书
|
||||||
|
*
|
||||||
|
* @param dn
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getCertByDn(String dn) throws UnsupportedEncodingException {
|
||||||
|
byte[] dnBytes = null;
|
||||||
|
try {
|
||||||
|
dnBytes = dn.getBytes("gbk");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
return getCertByDn(dnBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCertByDn(byte[] dnBytes) {
|
||||||
|
// 8010 指令,没有指令配置文件
|
||||||
|
|
||||||
|
// head
|
||||||
|
PacketSN sn = PacketSN.gen();
|
||||||
|
HashMap<String, Object> packet = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
// data
|
||||||
|
byte[] data = new byte[256];
|
||||||
|
Arrays.fill(data, (byte) 0);
|
||||||
|
System.arraycopy(dnBytes, 0, data, 0, dnBytes.length);
|
||||||
|
|
||||||
|
ByteBuffer bb = ByteBuffer.allocate(2 + 8 + 2 + data.length +1 );
|
||||||
|
// 2 报文总长
|
||||||
|
bb.put((byte) 0x01);
|
||||||
|
bb.put((byte) 0x0B);
|
||||||
|
|
||||||
|
// 8 SN
|
||||||
|
bb.put(sn.getSn().array());
|
||||||
|
|
||||||
|
// 2 CMD
|
||||||
|
bb.put((byte) 0x80);
|
||||||
|
bb.put((byte) 0x10);
|
||||||
|
|
||||||
|
// 256 Data
|
||||||
|
bb.put(data);
|
||||||
|
|
||||||
|
// 加密
|
||||||
|
bb.put((byte)0x31);
|
||||||
|
|
||||||
|
synchronized (this) {
|
||||||
|
// 响应解析
|
||||||
|
bb = syncRead(syncSend(bb));
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] success = new byte[2];
|
||||||
|
Arrays.fill(success, (byte) 0);
|
||||||
|
|
||||||
|
byte[] ret = new byte[2];
|
||||||
|
bb.position(12);
|
||||||
|
bb.get(ret);
|
||||||
|
|
||||||
|
if (!Arrays.equals(ret, success)) {
|
||||||
|
throw new SydApiException("获取证书异常", ret[0] * 256 + ret[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] len = new byte[2];
|
||||||
|
bb.get(len);
|
||||||
|
|
||||||
|
int l = len[0] * 256 + len[1];
|
||||||
|
byte[] cert = new byte[l];
|
||||||
|
bb.get(cert);
|
||||||
|
|
||||||
|
return new String(cert);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static X509Certificate getX509Certificate(InputStream is) throws CertificateException,
|
||||||
|
NoSuchProviderException {
|
||||||
|
CertificateFactory cf = CertificateFactory.getInstance("X.509", BouncyCastleProvider.PROVIDER_NAME);
|
||||||
|
return (X509Certificate) cf.generateCertificate(is);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RetWrap generateDEByDnSoft(String certSerial, String oData) {
|
||||||
|
RetWrap ret = new RetWrap();
|
||||||
|
byte[] dnBytes = null;
|
||||||
|
try {
|
||||||
|
dnBytes = certSerial.getBytes("gbk");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询完整证书
|
||||||
|
String cert = getCertByDn(dnBytes);
|
||||||
|
println("cert=" + cert);
|
||||||
|
|
||||||
|
try {
|
||||||
|
X509Certificate x509 = getX509Certificate(new ByteArrayInputStream(cert.getBytes()));
|
||||||
|
|
||||||
|
String pk = ByteUtils.toHexString(x509.getPublicKey().getEncoded());
|
||||||
|
if (!pk.startsWith("03420004")) {
|
||||||
|
int i = pk.indexOf("03420004");
|
||||||
|
if ( i >= 0 ) {
|
||||||
|
pk = pk.substring(i);
|
||||||
|
} else {
|
||||||
|
pk = "03420004" + pk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 生成会话密钥
|
||||||
|
ret = SM2GenSessionKey(pk);
|
||||||
|
String ciperKey = ret.get(SydApi.RET_CIPHER_KEY).toString();
|
||||||
|
String sessionKeyByLMK = ret.get(SydApi.RET_SESSION_KEY).toString();
|
||||||
|
|
||||||
|
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);
|
||||||
|
byte[] enData = (byte[]) retWrap.get("msg_all");
|
||||||
|
|
||||||
|
// 组织格式
|
||||||
|
ContentInfo cms = genCMSEnvelopedData(Util.hexString2Bytes(ciperKey), enData);
|
||||||
|
|
||||||
|
ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()));
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
} catch (SydApiException syde) {
|
||||||
|
throw syde;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new SydApiException("生成数字信封错误", -5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private RetWrap deCMSEnvelopedData(byte[] cms) throws CMSException {
|
||||||
|
// RetWrap ret = new RetWrap();
|
||||||
|
// ContentInfo info = SydCmsUtil.getContentInfo( cms );
|
||||||
|
// // 修改
|
||||||
|
// ASN1Sequence seq = (ASN1Sequence) info.getContent().toASN1Primitive();
|
||||||
|
//
|
||||||
|
// ASN1Set set = ASN1Set.getInstance(seq.getObjectAt(1).toASN1Primitive());
|
||||||
|
// ASN1Sequence seq2 = (ASN1Sequence) set.getObjectAt( 0 ).toASN1Primitive();
|
||||||
|
//
|
||||||
|
// // 会话密钥
|
||||||
|
// DEROctetString key = (DEROctetString) seq2.getObjectAt( 3 );
|
||||||
|
// ret.put("sessionKeyDer", key.getOctets() );
|
||||||
|
//
|
||||||
|
// // 密文段
|
||||||
|
// ASN1Sequence seq5 = (ASN1Sequence) seq.getObjectAt( 2 ).toASN1Primitive();
|
||||||
|
// ASN1TaggedObject tag = (ASN1TaggedObject) seq5.getObjectAt(2).toASN1Primitive();
|
||||||
|
// DEROctetString data = (DEROctetString) tag.getObject();
|
||||||
|
// ret.put("enData", data.getOctets() );
|
||||||
|
// return ret;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static ContentInfo genCMSEnvelopedData(byte[] sessionKeyDer, byte[] enData) {
|
||||||
|
String tmpl = "3082014D06092A864886F70D010703A082013E3082013A0201003181F73081F40201003065305C310B300906035504061302434E3130302E060355040A0C274368696E612046696E616E6369616C2043657274696669636174696F6E20417574686F72697479311B301906035504030C1243464341205445535420534D32204F43413102051004282452300B06092A811CCF5501822D03047B307902203C3AF535307DA548DA02C0AD171D2BC24D22472B42E5E175FCAF2C5CD30B5443022100ED53E7594F35FFACEB57F05898123F78E5B2D045CC47D894CD2E7BD34D66DA1D042014BD71F8CDA9729093A7CC391E2009C5D5F007586C2EBFB55BC175A6E8BDA33E04104AB82510BFDDD4FEE79C3F107D6F7F94303B060A2A811CCF550601040201301B06072A811CCF55016804100000000000000000000000000000000080109FD3D4338DB19E672CC162AF5B9B03E9";
|
||||||
|
ContentInfo info = SydCmsUtil.getContentInfo(Util.hexString2Bytes(tmpl));
|
||||||
|
// 修改
|
||||||
|
ASN1Sequence seq = (ASN1Sequence) info.getContent().toASN1Primitive();
|
||||||
|
|
||||||
|
ASN1Set set = ASN1Set.getInstance(seq.getObjectAt(1).toASN1Primitive());
|
||||||
|
ASN1Sequence seq2 = (ASN1Sequence) set.getObjectAt(0).toASN1Primitive();
|
||||||
|
|
||||||
|
// 会话密钥
|
||||||
|
DEROctetString key = (DEROctetString) seq2.getObjectAt(3);
|
||||||
|
BeanUtil.setFieldValue(key, "string", sessionKeyDer);
|
||||||
|
|
||||||
|
// 签发信息段
|
||||||
|
ASN1Sequence seq3 = (ASN1Sequence) seq2.getObjectAt(1).toASN1Primitive();
|
||||||
|
System.out.println(seq3);
|
||||||
|
|
||||||
|
// 密文段
|
||||||
|
ASN1Sequence seq4 = (ASN1Sequence) seq.getObjectAt(2).toASN1Primitive();
|
||||||
|
ASN1TaggedObject tag = (ASN1TaggedObject) seq4.getObjectAt(2).toASN1Primitive();
|
||||||
|
DEROctetString data = (DEROctetString) tag.getObject();
|
||||||
|
BeanUtil.setFieldValue(data, "string", enData);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RetWrap decryptDEByDNSoft(String certSerial, String pCipherKey) {
|
||||||
|
byte[] dnBytes = null;
|
||||||
|
try {
|
||||||
|
dnBytes = certSerial.getBytes("gbk");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetWrap ret = deCMSEnvelopedData( Util.decodeBase64( pCipherKey ) );
|
||||||
|
|
||||||
|
// 解密会话密钥
|
||||||
|
|
||||||
|
decryptDE(false, 1, dnBytes, pCipherKey);
|
||||||
|
|
||||||
|
// 解密原文
|
||||||
|
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 测试通过
|
// 测试通过
|
||||||
@Override
|
@Override
|
||||||
public RetWrap decryptDE(boolean pFlag, int model, byte[] certSerial, String pCipherKey) {
|
public RetWrap decryptDE(boolean pFlag, int model, byte[] certSerial, String pCipherKey) {
|
||||||
@ -2434,6 +2656,7 @@ public class SydApi4j implements SydApi {
|
|||||||
/**
|
/**
|
||||||
* 用指定的证书私钥对指定的数据进行数字签名。
|
* 用指定的证书私钥对指定的数据进行数字签名。
|
||||||
* 银联
|
* 银联
|
||||||
|
*
|
||||||
* @param pCertSerial 输入。签名 X509 证书的序列号。
|
* @param pCertSerial 输入。签名 X509 证书的序列号。
|
||||||
* @param userId 输入。用户id。
|
* @param userId 输入。用户id。
|
||||||
* @param pOrgData 输入。 待签名的原始数据。
|
* @param pOrgData 输入。 待签名的原始数据。
|
||||||
@ -2487,6 +2710,7 @@ public class SydApi4j implements SydApi {
|
|||||||
/**
|
/**
|
||||||
* 用指定证书对指定的原始数据进行数字签名验证。
|
* 用指定证书对指定的原始数据进行数字签名验证。
|
||||||
* 银联
|
* 银联
|
||||||
|
*
|
||||||
* @param pCertSerial 输入。 签名 X509 证书的序列号。
|
* @param pCertSerial 输入。 签名 X509 证书的序列号。
|
||||||
* @param userId 输入。用户id。
|
* @param userId 输入。用户id。
|
||||||
* @param pOrgData 输入。 待签名的原始数据。
|
* @param pOrgData 输入。 待签名的原始数据。
|
||||||
@ -2538,6 +2762,7 @@ public class SydApi4j implements SydApi {
|
|||||||
/**
|
/**
|
||||||
* 用指定的证书私钥对指定的数据进行数字签名。
|
* 用指定的证书私钥对指定的数据进行数字签名。
|
||||||
* 网联
|
* 网联
|
||||||
|
*
|
||||||
* @param pCertSerial 输入。签名 X509 证书的序列号。
|
* @param pCertSerial 输入。签名 X509 证书的序列号。
|
||||||
* @param pOrgData 输入。 待签名的原始数据。
|
* @param pOrgData 输入。 待签名的原始数据。
|
||||||
* @return 签名数据(BASE64 编码)。
|
* @return 签名数据(BASE64 编码)。
|
||||||
@ -2590,6 +2815,7 @@ public class SydApi4j implements SydApi {
|
|||||||
/**
|
/**
|
||||||
* 用指定证书对指定的原始数据进行数字签名验证。
|
* 用指定证书对指定的原始数据进行数字签名验证。
|
||||||
* 网联
|
* 网联
|
||||||
|
*
|
||||||
* @param pCertSerial 输入。 签名 X509 证书的序列号。
|
* @param pCertSerial 输入。 签名 X509 证书的序列号。
|
||||||
* @param pOrgData 输入。 待签名的原始数据。
|
* @param pOrgData 输入。 待签名的原始数据。
|
||||||
* @param pSignData 输入。 签名数据(BASE64 编码)。
|
* @param pSignData 输入。 签名数据(BASE64 编码)。
|
||||||
@ -3144,6 +3370,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过密钥索引获得 SM2 公钥(DER 编码)。
|
* 通过密钥索引获得 SM2 公钥(DER 编码)。
|
||||||
|
*
|
||||||
* @param privateKeyTag 指示用户密钥存储区的27位地址,27位的索引号:16位机构号+3位密钥类型+8位密钥索引号
|
* @param privateKeyTag 指示用户密钥存储区的27位地址,27位的索引号:16位机构号+3位密钥类型+8位密钥索引号
|
||||||
* @return 公钥数据的der编码
|
* @return 公钥数据的der编码
|
||||||
*/
|
*/
|
||||||
@ -3228,6 +3455,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出一个SM2私钥。
|
* 导出一个SM2私钥。
|
||||||
|
*
|
||||||
* @param privateKeyTag 要导出密钥的索引,27位的索引号:16位机构号+3位密钥类型+8位密钥索引号
|
* @param privateKeyTag 要导出密钥的索引,27位的索引号:16位机构号+3位密钥类型+8位密钥索引号
|
||||||
* @return LMK下加密的私钥
|
* @return LMK下加密的私钥
|
||||||
*/
|
*/
|
||||||
@ -3391,6 +3619,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过SN获取证书信息
|
* 通过SN获取证书信息
|
||||||
|
*
|
||||||
* @param sn sn
|
* @param sn sn
|
||||||
* @param nCertType 证书类型,0:签名证书, 1:加密证书
|
* @param nCertType 证书类型,0:签名证书, 1:加密证书
|
||||||
* @return
|
* @return
|
||||||
@ -3408,6 +3637,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过sn或机构号获取证书
|
* 通过sn或机构号获取证书
|
||||||
|
*
|
||||||
* @param flag 0: SN,1: 机构号
|
* @param flag 0: SN,1: 机构号
|
||||||
* @param userId 根据flag确定传入的数据
|
* @param userId 根据flag确定传入的数据
|
||||||
* @param nCertType 证书类型,0:签名证书, 1:加密证书
|
* @param nCertType 证书类型,0:签名证书, 1:加密证书
|
||||||
@ -3481,6 +3711,7 @@ public class SydApi4j implements SydApi {
|
|||||||
public String SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData) {
|
public String SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData) {
|
||||||
return SM2SignC(flag, "1234567812345678", privateKey, publicKey, orgData);
|
return SM2SignC(flag, "1234567812345678", privateKey, publicKey, orgData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 测试通过
|
// 测试通过
|
||||||
@Override
|
@Override
|
||||||
public String SM2SignC(int flag, String uid, String privateKey, byte[] publicKey, byte[] orgData) {
|
public String SM2SignC(int flag, String uid, String privateKey, byte[] publicKey, byte[] orgData) {
|
||||||
@ -3854,6 +4085,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 用私钥加密数据
|
* 用私钥加密数据
|
||||||
|
*
|
||||||
* @param alg 算法标识,0:RSA 1:SM2
|
* @param alg 算法标识,0:RSA 1:SM2
|
||||||
* @param sk 指示私钥位置的标记,数字为存储私钥的索引,除了全 9 表示使用由命令中提供的密钥。
|
* @param sk 指示私钥位置的标记,数字为存储私钥的索引,除了全 9 表示使用由命令中提供的密钥。
|
||||||
* @param data 数据
|
* @param data 数据
|
||||||
@ -3894,6 +4126,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 用公钥解密数据
|
* 用公钥解密数据
|
||||||
|
*
|
||||||
* @param alg 算法标识,0:RSA 1:SM2
|
* @param alg 算法标识,0:RSA 1:SM2
|
||||||
* @param pk 公钥的 DER 编码
|
* @param pk 公钥的 DER 编码
|
||||||
* @param data 数据
|
* @param data 数据
|
||||||
@ -3967,6 +4200,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 非对称公钥加密
|
* 非对称公钥加密
|
||||||
|
*
|
||||||
* @param alg 算法标识,0 = RSA 1 = SM2
|
* @param alg 算法标识,0 = RSA 1 = SM2
|
||||||
* @param pk 公钥的 DER 编码
|
* @param pk 公钥的 DER 编码
|
||||||
* @param data 数据
|
* @param data 数据
|
||||||
@ -3978,6 +4212,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 非对称私钥解密
|
* 非对称私钥解密
|
||||||
|
*
|
||||||
* @param alg 算法标识:0 = RSA 1 = SM2
|
* @param alg 算法标识:0 = RSA 1 = SM2
|
||||||
* @param sk 私钥值,LMK下加密的私钥
|
* @param sk 私钥值,LMK下加密的私钥
|
||||||
* @param data 密文数据(DER 编码)
|
* @param data 密文数据(DER 编码)
|
||||||
@ -4332,6 +4567,7 @@ public class SydApi4j implements SydApi {
|
|||||||
/**
|
/**
|
||||||
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
|
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
|
||||||
* 输入的sm2密文结构为C1C2C3格式
|
* 输入的sm2密文结构为C1C2C3格式
|
||||||
|
*
|
||||||
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
|
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
|
||||||
* @param enData 加密的数据,base64 编码。
|
* @param enData 加密的数据,base64 编码。
|
||||||
* @param keyType 密钥类型,0:签名证书, 1:加密证书。
|
* @param keyType 密钥类型,0:签名证书, 1:加密证书。
|
||||||
@ -4382,6 +4618,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算SM3散列值
|
* 计算SM3散列值
|
||||||
|
*
|
||||||
* @param publicKey 公钥的 DER 编码(可以为空)
|
* @param publicKey 公钥的 DER 编码(可以为空)
|
||||||
* @param csn 证书序号
|
* @param csn 证书序号
|
||||||
* @param cdn 证书DN
|
* @param cdn 证书DN
|
||||||
@ -4460,8 +4697,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
bb.put(String.format("%04d", content.length).getBytes());
|
bb.put(String.format("%04d", content.length).getBytes());
|
||||||
bb.put(content);
|
bb.put(content);
|
||||||
}
|
} else if (null == publicKey) {
|
||||||
else if (null == publicKey) {
|
|
||||||
|
|
||||||
// 无公钥
|
// 无公钥
|
||||||
|
|
||||||
@ -4469,8 +4705,7 @@ public class SydApi4j implements SydApi {
|
|||||||
bb.put("".getBytes());
|
bb.put("".getBytes());
|
||||||
bb.put(String.format("%04d", 0).getBytes());
|
bb.put(String.format("%04d", 0).getBytes());
|
||||||
bb.put("".getBytes());
|
bb.put("".getBytes());
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// 传入公钥
|
// 传入公钥
|
||||||
bb.put(String.format("%02d", 16).getBytes());
|
bb.put(String.format("%02d", 16).getBytes());
|
||||||
bb.put("1234567812345678".getBytes());
|
bb.put("1234567812345678".getBytes());
|
||||||
@ -4555,7 +4790,6 @@ public class SydApi4j implements SydApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac) {
|
public byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac) {
|
||||||
|
|
||||||
@ -4797,6 +5031,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 数字信封加密数据 会员定制格式
|
* 数字信封加密数据 会员定制格式
|
||||||
|
*
|
||||||
* @param keyValue 公钥值
|
* @param keyValue 公钥值
|
||||||
* @param inPutDataStr 报文明文
|
* @param inPutDataStr 报文明文
|
||||||
* @param msgId 设备认证内容
|
* @param msgId 设备认证内容
|
||||||
@ -4973,6 +5208,7 @@ public class SydApi4j implements SydApi {
|
|||||||
* 使用SM4算法进行加密,其中加密模式为CBC,
|
* 使用SM4算法进行加密,其中加密模式为CBC,
|
||||||
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
||||||
* 补位模式为 PKCS5 PADDING 。
|
* 补位模式为 PKCS5 PADDING 。
|
||||||
|
*
|
||||||
* @param keyType 密钥类型 0: ZEK,1: TEK
|
* @param keyType 密钥类型 0: ZEK,1: TEK
|
||||||
* @param key 密钥
|
* @param key 密钥
|
||||||
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
||||||
@ -5094,6 +5330,7 @@ public class SydApi4j implements SydApi {
|
|||||||
* 使用SM4算法进行加密,其中加密模式为CBC,
|
* 使用SM4算法进行加密,其中加密模式为CBC,
|
||||||
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
||||||
* 补位模式为 PKCS5 PADDING 。
|
* 补位模式为 PKCS5 PADDING 。
|
||||||
|
*
|
||||||
* @param isEn 是否加密
|
* @param isEn 是否加密
|
||||||
* @param keyType 密钥类型 0: ZEK,1: TEK
|
* @param keyType 密钥类型 0: ZEK,1: TEK
|
||||||
* @param key 密钥
|
* @param key 密钥
|
||||||
@ -5148,6 +5385,7 @@ public class SydApi4j implements SydApi {
|
|||||||
* 使用SM4算法进行加密,其中加密模式为CBC,
|
* 使用SM4算法进行加密,其中加密模式为CBC,
|
||||||
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
||||||
* 补位模式为 PKCS5 PADDING 。
|
* 补位模式为 PKCS5 PADDING 。
|
||||||
|
*
|
||||||
* @param keyType 密钥类型 0: ZEK,1: TEK
|
* @param keyType 密钥类型 0: ZEK,1: TEK
|
||||||
* @param key 密钥
|
* @param key 密钥
|
||||||
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
||||||
@ -5186,6 +5424,7 @@ public class SydApi4j implements SydApi {
|
|||||||
* 使用SM4算法进行解密,其中加密模式为CBC,
|
* 使用SM4算法进行解密,其中加密模式为CBC,
|
||||||
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
||||||
* 补位模式为 PKCS5 PADDING 。
|
* 补位模式为 PKCS5 PADDING 。
|
||||||
|
*
|
||||||
* @param keyType 密钥类型 0: ZEK,1: TEK
|
* @param keyType 密钥类型 0: ZEK,1: TEK
|
||||||
* @param key 密钥
|
* @param key 密钥
|
||||||
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
||||||
@ -5303,6 +5542,7 @@ public class SydApi4j implements SydApi {
|
|||||||
* 使用SM4算法进行解密,其中加密模式为CBC,
|
* 使用SM4算法进行解密,其中加密模式为CBC,
|
||||||
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
||||||
* 补位模式为 PKCS5 PADDING 。
|
* 补位模式为 PKCS5 PADDING 。
|
||||||
|
*
|
||||||
* @param keyType 密钥类型 0: ZEK,1: TEK
|
* @param keyType 密钥类型 0: ZEK,1: TEK
|
||||||
* @param key 密钥
|
* @param key 密钥
|
||||||
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
|
||||||
@ -6011,6 +6251,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成一个MAC
|
* 生成一个MAC
|
||||||
|
*
|
||||||
* @param alg 算法,0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
|
* @param alg 算法,0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
|
||||||
* @param keyType 密钥类型,0-TAK 1-ZAK
|
* @param keyType 密钥类型,0-TAK 1-ZAK
|
||||||
* @param AK 密钥
|
* @param AK 密钥
|
||||||
@ -7927,6 +8168,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 自动 4k 分包
|
* 自动 4k 分包
|
||||||
|
*
|
||||||
* @param keyType
|
* @param keyType
|
||||||
* @param mode
|
* @param mode
|
||||||
* @param key
|
* @param key
|
||||||
@ -9591,9 +9833,6 @@ public class SydApi4j implements SydApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 17.9 角色认证(+) -> -> : code = 2 ( 0x2 ) msg = 签名验证错误
|
* 17.9 角色认证(+) -> -> : code = 2 ( 0x2 ) msg = 签名验证错误
|
||||||
*
|
*
|
||||||
@ -9856,8 +10095,8 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询设备证书信息
|
* 查询设备证书信息
|
||||||
* @return
|
*
|
||||||
* equipType: 设备型号
|
* @return equipType: 设备型号
|
||||||
* equipNo: 设备序号
|
* equipNo: 设备序号
|
||||||
* equipPk: 设备密钥公钥
|
* equipPk: 设备密钥公钥
|
||||||
* authSign: 授权签名
|
* authSign: 授权签名
|
||||||
@ -10022,8 +10261,7 @@ public class SydApi4j implements SydApi {
|
|||||||
*
|
*
|
||||||
* @param orgData 待签名数据
|
* @param orgData 待签名数据
|
||||||
* @param sCertDN 证书DN
|
* @param sCertDN 证书DN
|
||||||
* @return
|
* @return 符合PKCS7标准的签名结果
|
||||||
* 符合PKCS7标准的签名结果
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String attachedSign(byte[] orgData, String sCertDN) {
|
public String attachedSign(byte[] orgData, String sCertDN) {
|
||||||
@ -10131,8 +10369,7 @@ public class SydApi4j implements SydApi {
|
|||||||
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
|
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
|
||||||
*
|
*
|
||||||
* @param sign 已签名数据
|
* @param sign 已签名数据
|
||||||
* @return
|
* @return 返回CERT_INFO结构的证书数据
|
||||||
* 返回CERT_INFO结构的证书数据
|
|
||||||
*/
|
*/
|
||||||
public X509 attachedVerifyAndGetX509(String sign) {
|
public X509 attachedVerifyAndGetX509(String sign) {
|
||||||
RetWrap retWrap = attachedVerifyAndGetAll(sign);
|
RetWrap retWrap = attachedVerifyAndGetAll(sign);
|
||||||
|
|||||||
@ -4,15 +4,13 @@ import com.sunyard.RetWrap;
|
|||||||
import com.sunyard.SydApi;
|
import com.sunyard.SydApi;
|
||||||
import com.sunyard.cert.X509;
|
import com.sunyard.cert.X509;
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.Base64;
|
|
||||||
|
|
||||||
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 衡泰例子
|
* 衡泰例子
|
||||||
@ -25,7 +23,7 @@ public class TestHT {
|
|||||||
public void before() {
|
public void before() {
|
||||||
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
// 通过设置debug的属性开启debug,如果不设置则默认不打开
|
||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000);
|
api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
|
||||||
// api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000);
|
// api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +37,46 @@ public class TestHT {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDecryptDE5() throws UnsupportedEncodingException {
|
||||||
|
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
||||||
|
String oData = "00001111222233";
|
||||||
|
|
||||||
|
RetWrap retWrap = api.generateDEByDn(dn, oData);
|
||||||
|
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
System.out.println("数字信封: " + cipherKey);
|
||||||
|
|
||||||
|
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
|
||||||
|
System.out.println("原数据: " + retWrap1.get("oData"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDecryptDE5Soft1() throws UnsupportedEncodingException {
|
||||||
|
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
||||||
|
String oData = "00001111222233";
|
||||||
|
|
||||||
|
RetWrap retWrap = api.generateDEByDnSoft(dn, oData);
|
||||||
|
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
System.out.println("数字信封: " + cipherKey);
|
||||||
|
|
||||||
|
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
|
||||||
|
System.out.println("原数据: " + retWrap1.get("oData"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDecryptDE5Soft2() throws UnsupportedEncodingException {
|
||||||
|
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
||||||
|
String oData = "00001111222233";
|
||||||
|
|
||||||
|
RetWrap retWrap = api.generateDEByDn(dn, oData);
|
||||||
|
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
System.out.println("数字信封: " + cipherKey);
|
||||||
|
|
||||||
|
RetWrap retWrap1 = api.decryptDEByDNSoft(dn, cipherKey);
|
||||||
|
System.out.println("原数据: " + retWrap1.get("oData"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 测试通过
|
// 测试通过
|
||||||
// 73
|
// 73
|
||||||
@ -121,19 +159,19 @@ public class TestHT {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDecryptDE5() throws UnsupportedEncodingException {
|
public void getCert(){
|
||||||
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
||||||
String oData = "00001111222233";
|
String cert = api.GetX509CertFileBySN("1111111111111151", SydApi.FOR_ENCRYPT );
|
||||||
|
System.out.println( cert );
|
||||||
RetWrap retWrap = api.generateDEByDn(dn, oData);
|
|
||||||
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
|
|
||||||
System.out.println("数字信封: " + cipherKey);
|
|
||||||
|
|
||||||
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
|
|
||||||
System.out.println("原数据: " + retWrap1.get("oData"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程演示
|
* 流程演示
|
||||||
*/
|
*/
|
||||||
|
|||||||
83
src/test/java/com/sunyard/sydapi/util/SydCmsUtilTest.java
Normal file
83
src/test/java/com/sunyard/sydapi/util/SydCmsUtilTest.java
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
package com.sunyard.sydapi.util;
|
||||||
|
|
||||||
|
import com.sunyard.RetWrap;
|
||||||
|
import com.sunyard.SydApi;
|
||||||
|
import com.sunyard.proto.Util;
|
||||||
|
import org.bouncycastle.asn1.cms.ContentInfo;
|
||||||
|
import org.bouncycastle.cms.SydCmsUtil;
|
||||||
|
|
||||||
|
import org.bouncycastle.asn1.ASN1Sequence;
|
||||||
|
import org.bouncycastle.asn1.ASN1Set;
|
||||||
|
import org.bouncycastle.asn1.ASN1TaggedObject;
|
||||||
|
import org.bouncycastle.asn1.DEROctetString;
|
||||||
|
import org.bouncycastle.asn1.cms.ContentInfo;
|
||||||
|
import org.bouncycastle.cms.SydCmsUtil;
|
||||||
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
import racal.sunyard.main.SydApi4j;
|
||||||
|
|
||||||
|
|
||||||
|
public class SydCmsUtilTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test(){
|
||||||
|
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
|
||||||
|
|
||||||
|
try {
|
||||||
|
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
||||||
|
String oData = "00001111222233";
|
||||||
|
|
||||||
|
RetWrap retWrap = api.generateDEByDnSoft(dn, oData);
|
||||||
|
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
System.out.println("数字信封: " + cipherKey);
|
||||||
|
|
||||||
|
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
|
||||||
|
System.out.println("原数据: " + retWrap1.get("oData"));
|
||||||
|
}catch ( Exception e ) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if ( null != api ) {
|
||||||
|
api.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
|
||||||
|
|
||||||
|
String tmpl = "3082014D06092A864886F70D010703A082013E3082013A0201003181F73081F40201003065305C310B300906035504061302434E3130302E060355040A0C274368696E612046696E616E6369616C2043657274696669636174696F6E20417574686F72697479311B301906035504030C1243464341205445535420534D32204F43413102051004282452300B06092A811CCF5501822D03047B307902203C3AF535307DA548DA02C0AD171D2BC24D22472B42E5E175FCAF2C5CD30B5443022100ED53E7594F35FFACEB57F05898123F78E5B2D045CC47D894CD2E7BD34D66DA1D042014BD71F8CDA9729093A7CC391E2009C5D5F007586C2EBFB55BC175A6E8BDA33E04104AB82510BFDDD4FEE79C3F107D6F7F94303B060A2A811CCF550601040201301B06072A811CCF55016804100000000000000000000000000000000080109FD3D4338DB19E672CC162AF5B9B03E9";
|
||||||
|
|
||||||
|
System.out.println( SydCmsUtil.class.getClassLoader() );
|
||||||
|
|
||||||
|
ContentInfo info = SydCmsUtil.getContentInfo(Util.hexString2Bytes( tmpl ) );
|
||||||
|
|
||||||
|
System.out.println( info );
|
||||||
|
|
||||||
|
info = SydApi4j.genCMSEnvelopedData(new byte[0], new byte[0]);
|
||||||
|
|
||||||
|
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
|
||||||
|
|
||||||
|
try {
|
||||||
|
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
|
||||||
|
String oData = "00001111222233";
|
||||||
|
|
||||||
|
RetWrap retWrap = api.generateDEByDnSoft(dn, oData);
|
||||||
|
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
|
||||||
|
System.out.println("数字信封: " + cipherKey);
|
||||||
|
|
||||||
|
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
|
||||||
|
System.out.println("原数据: " + retWrap1.get("oData"));
|
||||||
|
}catch ( Exception e ) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if ( null != api ) {
|
||||||
|
api.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user