From ecd01a408e4656b6a42eb53e902f7ca886ee034f Mon Sep 17 00:00:00 2001 From: yihzhou <468340218@qq.com> Date: Tue, 8 Nov 2022 17:12:05 +0800 Subject: [PATCH] save --- .../java/racal/sunyard/main/SydApi4j.java | 424 +++++++++--------- src/test/java/sample/Shanghairenhang.java | 11 + 2 files changed, 224 insertions(+), 211 deletions(-) diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 2d68583..0d72f96 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -89,7 +89,7 @@ public class SydApi4j implements SydApi { public static void setLogFactory(ILogFactory logFactory) { SydApi4j.logFactory = logFactory; - SydApi4j.logger = logFactory.getLogger( SydApi4j.class ); + SydApi4j.logger = logFactory.getLogger(SydApi4j.class); } @@ -467,13 +467,13 @@ public class SydApi4j implements SydApi { packet.put("data", data); PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); - if(rFlag ==1){ + if (rFlag == 1) { data.put("rFlag", 'M'); } - if(rFlag ==2){ + if (rFlag == 2) { data.put("rFlag", 'S'); } - if(rFlag ==3){ + if (rFlag == 3) { data.put("rFlag", 'R'); } data.put("signatureDataType$option", 1); @@ -564,7 +564,7 @@ public class SydApi4j implements SydApi { } @Override - public boolean SYD_NakedVerify(int rFlag,byte[] orgData, byte[] sign, String sCertDN) { + public boolean SYD_NakedVerify(int rFlag, byte[] orgData, byte[] sign, String sCertDN) { Proto8004 proto = new Proto8004(); byte[] dn = new byte[256]; @@ -584,13 +584,13 @@ public class SydApi4j implements SydApi { packet.put("data", data); PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); - if(rFlag ==1){ + if (rFlag == 1) { data.put("rFlag", 'M'); } - if(rFlag ==2){ + if (rFlag == 2) { data.put("rFlag", 'S'); } - if(rFlag ==3){ + if (rFlag == 3) { data.put("rFlag", 'R'); } data.put("signatureDataType$option", 1); @@ -775,7 +775,7 @@ public class SydApi4j implements SydApi { byte[] dn = new byte[256]; byte[] s = null; try { - sCertDN = DnUtil.verifyDn( sCertDN ); + sCertDN = DnUtil.verifyDn(sCertDN); s = sCertDN.getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); @@ -878,7 +878,7 @@ public class SydApi4j implements SydApi { } @Override - public boolean detachedVerify(int rFlag,int dataType, byte[] orgData, String sign) { + public boolean detachedVerify(int rFlag, int dataType, byte[] orgData, String sign) { Proto8006 proto = new Proto8006(); // 填充数据 @@ -886,26 +886,26 @@ public class SydApi4j implements SydApi { HashMap data = new HashMap(); packet.put("data", data); PacketSN sn = PacketSN.gen(); - if(rFlag ==1){//RSA证书 + if (rFlag == 1) {//RSA证书 data.put("rFlag", 'D'); } - if(rFlag ==2){ + if (rFlag == 2) { data.put("rFlag", 'O'); } - if(rFlag ==3){ + if (rFlag == 3) { data.put("rFlag", 'U'); } packet.put("header", sn.getSn().array()); if (dataType == DATA_HASH) { - if(rFlag ==1){//RSA证书 + if (rFlag == 1) {//RSA证书 data.put("hashFlag", 'M'); } - if(rFlag ==2){ + if (rFlag == 2) { data.put("hashFlag", 'S'); } - if(rFlag ==3){ + if (rFlag == 3) { data.put("hashFlag", 'R'); } data.put("hash", orgData); @@ -1057,16 +1057,16 @@ public class SydApi4j implements SydApi { byte[] orgData, String sCertDN ) { - return detachedSign(pFlag,DATA_ORIGIN, orgData, sCertDN); + return detachedSign(pFlag, DATA_ORIGIN, orgData, sCertDN); } - public String detachedSign(int rFlag,int dataType, byte[] orgData, String sCertDN) { + public String detachedSign(int rFlag, int dataType, byte[] orgData, String sCertDN) { Proto8005 proto = new Proto8005(); byte[] dn = new byte[256]; byte[] s = null; try { - sCertDN = DnUtil.verifyDn( sCertDN ); + sCertDN = DnUtil.verifyDn(sCertDN); s = sCertDN.getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); @@ -1080,24 +1080,24 @@ public class SydApi4j implements SydApi { packet.put("data", data); PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); - if(rFlag ==1){//RSA证书加签方法 + if (rFlag == 1) {//RSA证书加签方法 data.put("rFlag", 'M'); } - if(rFlag ==2){ + if (rFlag == 2) { data.put("rFlag", 'S'); } - if(rFlag ==3){ + if (rFlag == 3) { data.put("rFlag", 'R'); } data.put("DN", dn); if (dataType == DATA_HASH) { - if(rFlag==1){ + if (rFlag == 1) { data.put("hashFlag", 'M'); } - if(rFlag==2){ + if (rFlag == 2) { data.put("hashFlag", 'S'); } - if(rFlag==3){ + if (rFlag == 3) { data.put("hashFlag", 'R'); } data.put("hash", orgData); @@ -1156,8 +1156,8 @@ public class SydApi4j implements SydApi { } @Override - public String SYD_DetachedSign(int rFlag,byte[] orgData, String sCertDN) { - return SYD_RSA_DetachedSign_HA(rFlag,orgData, sCertDN); + public String SYD_DetachedSign(int rFlag, byte[] orgData, String sCertDN) { + return SYD_RSA_DetachedSign_HA(rFlag, orgData, sCertDN); } @Override @@ -1282,7 +1282,7 @@ public class SydApi4j implements SydApi { } r.put("certDNs", certs.toArray(new String[0])); - // r.put("certDNlist", certs); + // r.put("certDNlist", certs); return r; } @@ -1407,8 +1407,8 @@ public class SydApi4j implements SydApi { if (debug) { System.out.println(i); } - if ( null != SydApi4j.logger ) { - SydApi4j.logger.debug( "{}", i ); + if (null != SydApi4j.logger) { + SydApi4j.logger.debug("{}", i); } } @@ -1416,8 +1416,8 @@ public class SydApi4j implements SydApi { if (debug) { System.out.print(i); } - if ( null != SydApi4j.logger ) { - SydApi4j.logger.debug("{}", i ); + if (null != SydApi4j.logger) { + SydApi4j.logger.debug("{}", i); } } @@ -1501,20 +1501,20 @@ public class SydApi4j implements SydApi { } catch (IOException e) { // 发送失败 - if ( null != ha_ip2 ) { + if (null != ha_ip2) { // HA 模式直接失败 e.printStackTrace(); throw new SydApiException("Socket write error", -2); } else { // 非 HA 模式检查重试 - socket = reConnect( new SydApiException("Socket write error", -2) ); - if ( null != socket ) { + socket = reConnect(new SydApiException("Socket write error", -2)); + if (null != socket) { // 补发数据 try { socket.getOutputStream().write(buff); socket.getOutputStream().flush(); - }catch ( IOException e2 ) { - socket = reConnect( new SydApiException("Socket re write error", -2) ); + } catch (IOException e2) { + socket = reConnect(new SydApiException("Socket re write error", -2)); } } } @@ -1660,7 +1660,7 @@ public class SydApi4j implements SydApi { } socket.setSoTimeout(timeout); } catch (Exception e) { - socket = reConnect( new SydApiException(-2) ); + socket = reConnect(new SydApiException(-2)); } @@ -1726,14 +1726,13 @@ public class SydApi4j implements SydApi { } /** - * * @param e 原始错误 * @throws SydApiException */ private Socket reConnect(SydApiException e) { - while ( this.retryWhenNetError > 0 ) { + while (this.retryWhenNetError > 0) { try { - println("Net error retry on " + this.retryWhenNetError ); + println("Net error retry on " + this.retryWhenNetError); Socket socket = new Socket(); SocketAddress address = new InetSocketAddress(ip, port); @@ -1746,10 +1745,10 @@ public class SydApi4j implements SydApi { // this.socket = socket; return socket; - } catch ( Exception e1 ){ - println("Exception when net error retry on " + this.retryWhenNetError ); + } catch (Exception e1) { + println("Exception when net error retry on " + this.retryWhenNetError); } finally { - this.retryWhenNetError --; + this.retryWhenNetError--; } } throw e; @@ -2384,32 +2383,32 @@ public class SydApi4j implements SydApi { data.put("msg", pInData); packet.put("data", data); - return repackEncrypt( packet ); + return repackEncrypt(packet); } public List SYMEncryptDecryptBatchData(int nAlg, String[] seesionKey, int fullmode, List pINdata) { int batchSize = pINdata.size(); - if ( batchSize < 1 || batchSize > 10 ) { + if (batchSize < 1 || batchSize > 10) { throw new IllegalArgumentException("批量数量错误"); } - if ( seesionKey.length != pINdata.size() ) { + if (seesionKey.length != pINdata.size()) { throw new IllegalArgumentException("密钥和数据数量不匹配"); } - if ( 0x0 != (byte) (nAlg & 0x1) ){ + if (0x0 != (byte) (nAlg & 0x1)) { // 解密 - for ( byte[]d : pINdata ) { - if ( d.length > 1040 ) { + for (byte[] d : pINdata) { + if (d.length > 1040) { throw new IllegalArgumentException("批量单数数据超长 1040"); } } } else { // 加密 - for ( byte[]d : pINdata ) { - if ( d.length > 1024 ) { + for (byte[] d : pINdata) { + if (d.length > 1024) { throw new IllegalArgumentException("批量单数数据超长 1024"); } } @@ -2417,50 +2416,50 @@ public class SydApi4j implements SydApi { ByteBuffer bb = ByteBuffer.allocate(10 * 1024); PacketSN sn = PacketSN.gen(); - bb.put( new byte[2] ); - bb.put( sn.getSn().array() ); - bb.put( "E0".getBytes() ); - bb.put( (byte) 0x34 ); // 批量加解密 - bb.put( (byte) batchSize ); // 批量数 - bb.put( (byte) ( 0x30 + nAlg) ); // 密钥模式 - bb.put( (byte) ( 0x31) ); // ECB - bb.put( (byte) ( 0x30) ); // ZEK + bb.put(new byte[2]); + bb.put(sn.getSn().array()); + bb.put("E0".getBytes()); + bb.put((byte) 0x34); // 批量加解密 + bb.put((byte) batchSize); // 批量数 + bb.put((byte) (0x30 + nAlg)); // 密钥模式 + bb.put((byte) (0x31)); // ECB + bb.put((byte) (0x30)); // ZEK // 填充多个密钥 - for ( String key : seesionKey ) { - bb.put( key.getBytes() ); + for (String key : seesionKey) { + bb.put(key.getBytes()); } - bb.put( (byte) ( 0x30) ); // 输入消息类型二进制 - bb.put( (byte) ( 0x30) ); // 输出消息类型二进制 + bb.put((byte) (0x30)); // 输入消息类型二进制 + bb.put((byte) (0x30)); // 输出消息类型二进制 - bb.put( (byte) ( 0x30 + fullmode) ); // 填充模式 - bb.put( "0000".getBytes() ); // 填充字符 - bb.put( (byte) ( 0x32) ); // 填充类型 + bb.put((byte) (0x30 + fullmode)); // 填充模式 + bb.put("0000".getBytes()); // 填充字符 + bb.put((byte) (0x32)); // 填充类型 // iv 暂未支持 // P 长度暂未支持 // 填充多个消息数据长度 - for ( byte[] data : pINdata ) { - bb.put( String.format("%03X", data.length).getBytes() ); + for (byte[] data : pINdata) { + bb.put(String.format("%03X", data.length).getBytes()); } // 填充多个消息数据 - for ( byte[] data : pINdata ) { - bb.put( data ); + for (byte[] data : pINdata) { + bb.put(data); } // 重新计算长度 int len = bb.position(); len -= 2; - byte[] lenArray = new byte[ 2 ]; - lenArray[0] = (byte)((len >> 8) & 0xFF); - lenArray[1] = (byte)( len & 0xFF); + byte[] lenArray = new byte[2]; + lenArray[0] = (byte) ((len >> 8) & 0xFF); + lenArray[1] = (byte) (len & 0xFF); - bb.put( 0, (byte)((len >> 8) & 0xFF) ); - bb.put( 1, (byte)( len & 0xFF) ); + bb.put(0, (byte) ((len >> 8) & 0xFF)); + bb.put(1, (byte) (len & 0xFF)); // 通信 synchronized (this) { @@ -2469,32 +2468,32 @@ public class SydApi4j implements SydApi { } bb.flip(); - bb.position( 12 ); + bb.position(12); byte[] code = new byte[2]; - bb.get( code ); + bb.get(code); - int retCode = Integer.valueOf( new String( code ) ); - if ( 0 != retCode ) { - throw new SydApiException( retCode ); + int retCode = Integer.valueOf(new String(code)); + if (0 != retCode) { + throw new SydApiException(retCode); } // 跳过输出模式 bb.get(); // 获取 N 个长度 - int[] lens = new int[ batchSize ]; - for ( int i = 0; i < batchSize; i++ ){ + int[] lens = new int[batchSize]; + for (int i = 0; i < batchSize; i++) { byte[] iLenArray = new byte[3]; - bb.get( iLenArray ); - lens[ i ] = Integer.valueOf( new String( iLenArray ), 16 ); + bb.get(iLenArray); + lens[i] = Integer.valueOf(new String(iLenArray), 16); } - Listret = new ArrayList(); + List ret = new ArrayList(); // 获取 N 个长度的数据 - for ( int l : lens ) { - byte[] d = new byte[ l ]; + for (int l : lens) { + byte[] d = new byte[l]; bb.get(d); - ret.add( d ); + ret.add(d); } return ret; } @@ -2726,26 +2725,26 @@ public class SydApi4j implements SydApi { @Override public RetWrap generateDEByDn(String certSerial, byte[] oData) { - if ( oData.length <= 4 * 1024 ) { - return generateDEByDnHsm( certSerial, oData ); + if (oData.length <= 4 * 1024) { + return generateDEByDnHsm(certSerial, oData); } else { - return generateDEByDnSoft( certSerial, oData ); + return generateDEByDnSoft(certSerial, oData); } } @Override - public RetWrap generateDEByDn(int alg,String certSerial, byte[] oData) { - if ( oData.length <= 4 * 1024 ) { - return generateDEByDnHsmRSA(alg, certSerial, oData ); + public RetWrap generateDEByDn(int alg, String certSerial, byte[] oData) { + if (oData.length <= 4 * 1024) { + return generateDEByDnHsmRSA(alg, certSerial, oData); } else { - return generateDEByDnSoftRSA( alg,certSerial, oData ); + return generateDEByDnSoftRSA(alg, certSerial, oData); } } public RetWrap generateDEByDnHsm(String certSerial, byte[] oData) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); byte[] dnBytes = null; try { @@ -2756,9 +2755,9 @@ public class SydApi4j implements SydApi { return generateDE(dnBytes, 3, 1, oData); } - public RetWrap generateDEByDnHsmRSA(int alg,String certSerial, byte[] oData) { + public RetWrap generateDEByDnHsmRSA(int alg, String certSerial, byte[] oData) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); byte[] dnBytes = null; try { @@ -2786,12 +2785,12 @@ public class SydApi4j implements SydApi { data.put("certificateDn", certSerial); } - if (alg == 3 || alg == 4 ) { + if (alg == 3 || alg == 4) { data.put("orgData", oData); } data.put("keyType", "X"); - if(alg == 4 ){ + if (alg == 4) { data.put("keyType", "L"); } @@ -2818,7 +2817,7 @@ 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")).getBytes() ); + 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() ); @@ -2883,11 +2882,9 @@ public class SydApi4j implements SydApi { } - - public RetWrap decryptDEByDNHsm(String certSerial, String pCipherKey) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); byte[] dnBytes = null; try { @@ -2900,7 +2897,7 @@ public class SydApi4j implements SydApi { public RetWrap decryptDEByDNHsmRSA(String certSerial, String pCipherKey) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); byte[] dnBytes = null; try { @@ -2941,7 +2938,7 @@ public class SydApi4j implements SydApi { Arrays.fill(data, (byte) 0); System.arraycopy(dnBytes, 0, data, 0, dnBytes.length); - ByteBuffer bb = ByteBuffer.allocate(2 + 8 + 2 + data.length +1 ); + ByteBuffer bb = ByteBuffer.allocate(2 + 8 + 2 + data.length + 1); // 2 报文总长 bb.put((byte) 0x01); bb.put((byte) 0x0B); @@ -2957,7 +2954,7 @@ public class SydApi4j implements SydApi { bb.put(data); // 加密 - bb.put((byte)0x31); + bb.put((byte) 0x31); synchronized (this) { // 响应解析 @@ -2993,7 +2990,7 @@ public class SydApi4j implements SydApi { public RetWrap generateDEByDnSoft(String certSerial, byte[] oData) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); RetWrap ret = new RetWrap(); byte[] dnBytes = null; @@ -3014,7 +3011,7 @@ public class SydApi4j implements SydApi { String pk = ByteUtils.toHexString(x509.getPublicKey().getEncoded()); if (!pk.startsWith("03420004")) { int i = pk.indexOf("03420004"); - if ( i >= 0 ) { + if (i >= 0) { pk = pk.substring(i); } else { pk = "03420004" + pk; @@ -3025,8 +3022,8 @@ public class SydApi4j implements SydApi { // 生成会话密钥 ret = SM2GenSessionKey(pk); String ciperKey = ret.get(SydApi.RET_CIPHER_KEY).toString(); - String sessionKeyByLMK = (String) ret.get(SydApi.RET_SESSION_KEY ); - ret.put(SydApi.RET_SESSION_KEY , sessionKeyByLMK.getBytes() ); + String sessionKeyByLMK = (String) ret.get(SydApi.RET_SESSION_KEY); + ret.put(SydApi.RET_SESSION_KEY, sessionKeyByLMK.getBytes()); println("ciperKey=" + ciperKey); println("sessionKeyByLMK=" + sessionKeyByLMK); @@ -3038,12 +3035,12 @@ public class SydApi4j implements SydApi { byte[] enData = (byte[]) retWrap.get("msg_all"); // 组织格式 - ContentInfo cms = genCMSEnvelopedData( Util.hexString2Bytes(ciperKey), enData, - x509.getSerialNumber().toString(16) , - dnToMap(issuser.getName() ) + ContentInfo cms = genCMSEnvelopedData(Util.hexString2Bytes(ciperKey), enData, + x509.getSerialNumber().toString(16), + dnToMap(issuser.getName()) ); - ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()).getBytes() ); + ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()).getBytes()); return ret; @@ -3055,9 +3052,9 @@ public class SydApi4j implements SydApi { } } - public RetWrap generateDEByDnSoftRSA(int alg,String certSerial, byte[] oData) { + public RetWrap generateDEByDnSoftRSA(int alg, String certSerial, byte[] oData) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); RetWrap ret = new RetWrap(); byte[] dnBytes = null; @@ -3078,7 +3075,7 @@ public class SydApi4j implements SydApi { String pk = ByteUtils.toHexString(x509.getPublicKey().getEncoded()); if (!pk.startsWith("3082010")) { int i = pk.indexOf("3082010"); - if ( i >= 0 ) { + if (i >= 0) { pk = pk.substring(i); } else { pk = "3082010" + pk; @@ -3089,8 +3086,8 @@ public class SydApi4j implements SydApi { // 生成会话密钥 ret = RSAGenSessionKey(pk); String ciperKey = ret.get(SydApi.RET_CIPHER_KEY).toString(); - String sessionKeyByLMK = (String) ret.get(SydApi.RET_SESSION_KEY ); - ret.put(SydApi.RET_SESSION_KEY , sessionKeyByLMK.getBytes() ); + String sessionKeyByLMK = (String) ret.get(SydApi.RET_SESSION_KEY); + ret.put(SydApi.RET_SESSION_KEY, sessionKeyByLMK.getBytes()); println("ciperKey=" + ciperKey); println("sessionKeyByLMK=" + sessionKeyByLMK); @@ -3102,12 +3099,12 @@ public class SydApi4j implements SydApi { byte[] enData = (byte[]) retWrap.get("msg_all"); // 组织格式 - ContentInfo cms = genCMSEnvelopedDataRSA( Util.hexString2Bytes(ciperKey), enData, - x509.getSerialNumber().toString(16) , - dnToMap(issuser.getName() ) + ContentInfo cms = genCMSEnvelopedDataRSA(Util.hexString2Bytes(ciperKey), enData, + x509.getSerialNumber().toString(16), + dnToMap(issuser.getName()) ); - ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()).getBytes() ); + ret.put(SydApi.RET_CIPHER_KEY, Util.encodeBase64(cms.getEncoded()).getBytes()); return ret; @@ -3119,43 +3116,43 @@ public class SydApi4j implements SydApi { } } - private static MapdnToMap(String dn) { - Mapmap = new HashMap(); + private static Map dnToMap(String dn) { + Map map = new HashMap(); String[] kvs = dn.split(","); - for ( String kv : kvs ) { + for (String kv : kvs) { String[] ps = kv.split("="); - map.put( ps[0].trim() , ps[1].trim() ); + map.put(ps[0].trim(), ps[1].trim()); } return map; } private RetWrap deCMSEnvelopedData(byte[] cms) { RetWrap ret = new RetWrap(); - ContentInfo info = SydCmsUtil.getContentInfo( cms ); + 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(); + ASN1Sequence seq2 = (ASN1Sequence) set.getObjectAt(0).toASN1Primitive(); // 会话密钥 - DEROctetString key = (DEROctetString) seq2.getObjectAt( 3 ); - ret.put("sessionKeyDer", key.getOctets() ); + DEROctetString key = (DEROctetString) seq2.getObjectAt(3); + ret.put("sessionKeyDer", key.getOctets()); // 密文段 - ASN1Sequence seq5 = (ASN1Sequence) seq.getObjectAt( 2 ).toASN1Primitive(); + ASN1Sequence seq5 = (ASN1Sequence) seq.getObjectAt(2).toASN1Primitive(); ASN1Sequence seq6 = (ASN1Sequence) seq5.getObjectAt(1).toASN1Primitive(); DEROctetString iv = (DEROctetString) seq6.getObjectAt(1).toASN1Primitive(); - ret.put("iv", iv.getOctets() ); + ret.put("iv", iv.getOctets()); ASN1TaggedObject tag = (ASN1TaggedObject) seq5.getObjectAt(2).toASN1Primitive(); DEROctetString data = (DEROctetString) tag.getObject(); - ret.put("enData", data.getOctets() ); + ret.put("enData", data.getOctets()); return ret; } - public static ContentInfo genCMSEnvelopedData(byte[] sessionKeyDer, byte[] enData, String sn, Mapissuer) throws UnsupportedEncodingException { + public static ContentInfo genCMSEnvelopedData(byte[] sessionKeyDer, byte[] enData, String sn, Map issuer) throws UnsupportedEncodingException { String tmpl = "3082014D06092A864886F70D010703A082013E3082013A0201003181F73081F40201003065305C310B300906035504061302434E3130302E060355040A0C274368696E612046696E616E6369616C2043657274696669636174696F6E20417574686F72697479311B301906035504030C1243464341205445535420534D32204F43413102051004282452300B06092A811CCF5501822D03047B307902203C3AF535307DA548DA02C0AD171D2BC24D22472B42E5E175FCAF2C5CD30B5443022100ED53E7594F35FFACEB57F05898123F78E5B2D045CC47D894CD2E7BD34D66DA1D042014BD71F8CDA9729093A7CC391E2009C5D5F007586C2EBFB55BC175A6E8BDA33E04104AB82510BFDDD4FEE79C3F107D6F7F94303B060A2A811CCF550601040201301B06072A811CCF55016804100000000000000000000000000000000080109FD3D4338DB19E672CC162AF5B9B03E9"; ContentInfo info = SydCmsUtil.getContentInfo(Util.hexString2Bytes(tmpl)); // 修改 @@ -3170,19 +3167,19 @@ public class SydApi4j implements SydApi { // 签发信息段 ASN1Sequence seq3 = (ASN1Sequence) seq2.getObjectAt(1).toASN1Primitive(); - ASN1Integer isn = (ASN1Integer) seq3.getObjectAt(1 ).toASN1Primitive(); - BeanUtil.setFieldValue( isn, "bytes", Util.hexString2Bytes( sn ) ); + ASN1Integer isn = (ASN1Integer) seq3.getObjectAt(1).toASN1Primitive(); + BeanUtil.setFieldValue(isn, "bytes", Util.hexString2Bytes(sn)); - ASN1Sequence seq4 = (ASN1Sequence) seq3.getObjectAt( 0 ).toASN1Primitive(); + ASN1Sequence seq4 = (ASN1Sequence) seq3.getObjectAt(0).toASN1Primitive(); ASN1Set setO = (ASN1Set) seq4.getObjectAt(1).toASN1Primitive(); ASN1Sequence seqO = (ASN1Sequence) setO.getObjectAt(0).toASN1Primitive(); DERUTF8String o = (DERUTF8String) seqO.getObjectAt(1).toASN1Primitive(); - BeanUtil.setFieldValue(o, "string", issuer.get("O").getBytes("UTF-8") ); + BeanUtil.setFieldValue(o, "string", issuer.get("O").getBytes("UTF-8")); ASN1Set setCN = (ASN1Set) seq4.getObjectAt(2).toASN1Primitive(); ASN1Sequence seqCn = (ASN1Sequence) setCN.getObjectAt(0).toASN1Primitive(); DERUTF8String Cn = (DERUTF8String) seqCn.getObjectAt(1).toASN1Primitive(); - BeanUtil.setFieldValue(Cn, "string", issuer.get("CN").getBytes("UTF-8") ); + BeanUtil.setFieldValue(Cn, "string", issuer.get("CN").getBytes("UTF-8")); // 密文段 ASN1Sequence seq5 = (ASN1Sequence) seq.getObjectAt(2).toASN1Primitive(); @@ -3192,7 +3189,7 @@ public class SydApi4j implements SydApi { return info; } - public static ContentInfo genCMSEnvelopedDataRSA(byte[] sessionKeyDer, byte[] enData, String sn, Mapissuer) throws UnsupportedEncodingException { + public static ContentInfo genCMSEnvelopedDataRSA(byte[] sessionKeyDer, byte[] enData, String sn, Map issuer) throws UnsupportedEncodingException { String tmpl = "308201d506092a864886f70d010703a08201c6308201c20201003182017c3082017802010030623059310b300906035504061302434e3130302e060355040a13274368696e612046696e616e6369616c2043657274696669636174696f6e20417574686f72697479311830160603550403130f434643412054455354204f4341313102052003470933300b06092a864886f70d01010104820100e0f8d8cf94321e7b41452845e98d5998d8c0af8aaf63a5c67a05c27c82eac3f7251d0374e59a53af39898de43a6ed9e8ca642cf3b9d19be7529be767491452b990938199384f5f7f244055ed6472e29fec18103f868109cde28f40641ddaa3c408d0629c05ec8f34b1d629975f03e05734c9931f4eae9fce912a0f8e7f726b02f3696b31c6155c191b245c8ebbb381da6f19a0b5e00e3006a3084f6519874c871ae054eae1f723aaf20982d78864b72153e47960e606cc448ece1f75a8a2f08aab2b8773af1569089253c46b7c4deab20d47a671a7f5bf06546087b98885507b69bd186c73a658efbcdd2edd5b55ea515c38729dd386425132cd5a95b5cd8e2d303d060a2a811ccf550601040201301d060960864801650304012a041000000000000000000000000000000000801043cfb263acadf7f0a5071fd7f94282ab"; ContentInfo info = SydCmsUtil.getContentInfo(Util.hexString2Bytes(tmpl)); // 修改 @@ -3207,11 +3204,11 @@ public class SydApi4j implements SydApi { // 签发信息段 ASN1Sequence seq3 = (ASN1Sequence) seq2.getObjectAt(1).toASN1Primitive(); - ASN1Integer isn = (ASN1Integer) seq3.getObjectAt(1 ).toASN1Primitive(); - BeanUtil.setFieldValue( isn, "bytes", Util.hexString2Bytes( sn ) ); + ASN1Integer isn = (ASN1Integer) seq3.getObjectAt(1).toASN1Primitive(); + BeanUtil.setFieldValue(isn, "bytes", Util.hexString2Bytes(sn)); //签发者名称 - ASN1Sequence seq4 = (ASN1Sequence) seq3.getObjectAt( 0 ).toASN1Primitive(); + ASN1Sequence seq4 = (ASN1Sequence) seq3.getObjectAt(0).toASN1Primitive(); // ASN1Set setO = (ASN1Set) seq4.getObjectAt(1).toASN1Primitive(); // ASN1Sequence seqO = (ASN1Sequence) setO.getObjectAt(0).toASN1Primitive(); // DERUTF8String o = (DERUTF8String) seqO.getObjectAt(1).toASN1Primitive(); @@ -3231,26 +3228,26 @@ public class SydApi4j implements SydApi { } - public RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey){ - if ( pCipherKey.length <= 4 * 1024 ) { - return decryptDEByDNHsm( certSerial, new String(pCipherKey) ); + public RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey) { + if (pCipherKey.length <= 4 * 1024) { + return decryptDEByDNHsm(certSerial, new String(pCipherKey)); } else { - return decryptDEByDNSoft( certSerial, new String(pCipherKey) ); + return decryptDEByDNSoft(certSerial, new String(pCipherKey)); } } - public RetWrap decryptDEByDN(int alg,String certSerial, byte[] pCipherKey){ - if ( pCipherKey.length <= 4 * 1024 ) { - return decryptDEByDNHsmRSA( certSerial, new String(pCipherKey) ); + public RetWrap decryptDEByDN(int alg, String certSerial, byte[] pCipherKey) { + if (pCipherKey.length <= 4 * 1024) { + return decryptDEByDNHsmRSA(certSerial, new String(pCipherKey)); } else { - return decryptDEByDNSoftRSA( certSerial, new String(pCipherKey) ); + return decryptDEByDNSoftRSA(certSerial, new String(pCipherKey)); } } public RetWrap decryptDEByDNSoft(String certSerial, String pCipherKey) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); byte[] dnBytes = null; try { @@ -3262,8 +3259,8 @@ public class SydApi4j implements SydApi { RetWrap ret = null; try { - ret = deCMSEnvelopedData( Util.decodeBase64( pCipherKey ) ); - } catch ( Exception e) { + ret = deCMSEnvelopedData(Util.decodeBase64(pCipherKey)); + } catch (Exception e) { throw new IllegalArgumentException("数字信封解封格式错误"); } @@ -3273,11 +3270,11 @@ public class SydApi4j implements SydApi { // 解密原文 byte[] iv = (byte[]) ret.get("iv"); //new byte[32]; // Arrays.fill(iv, (byte) 0x30); - iv = Util.bytes2HexString( iv ).getBytes(); + iv = Util.bytes2HexString(iv).getBytes(); // 解密会话密钥 - ret = decryptDE(false, 1, dnBytes, Util.encodeBase64(sessionKeyDer) ); - String sessionKey = new String((byte[]) ret.get("SessionKey") ); + ret = decryptDE(false, 1, dnBytes, Util.encodeBase64(sessionKeyDer)); + String sessionKey = new String((byte[]) ret.get("SessionKey")); RetWrap retWrap = SYMEnDeData(false, 1, sessionKey, 1, 1, enData, iv, 0); byte[] data = (byte[]) retWrap.get("msg_all"); @@ -3289,7 +3286,7 @@ public class SydApi4j implements SydApi { public RetWrap decryptDEByDNSoftRSA(String certSerial, String pCipherKey) { - certSerial = DnUtil.verifyDn( certSerial ); + certSerial = DnUtil.verifyDn(certSerial); byte[] dnBytes = null; try { @@ -3301,8 +3298,8 @@ public class SydApi4j implements SydApi { RetWrap ret = null; try { - ret = deCMSEnvelopedData( Util.decodeBase64( pCipherKey ) ); - } catch ( Exception e) { + ret = deCMSEnvelopedData(Util.decodeBase64(pCipherKey)); + } catch (Exception e) { throw new IllegalArgumentException("数字信封解封格式错误"); } @@ -3312,13 +3309,13 @@ public class SydApi4j implements SydApi { // 解密原文 byte[] iv = (byte[]) ret.get("iv"); //new byte[32]; // Arrays.fill(iv, (byte) 0x30); - iv = Util.bytes2HexString( iv ).getBytes(); + iv = Util.bytes2HexString(iv).getBytes(); // 解密会话密钥 //ret = decryptDERSA(false, 1, dnBytes, Util.encodeBase64(sessionKeyDer) ); - ret = decryptDERSA(false, 1, dnBytes,sessionKeyDer); + ret = decryptDERSA(false, 1, dnBytes, sessionKeyDer); - String sessionKey = new String((byte[]) ret.get("SessionKey") ); + String sessionKey = new String((byte[]) ret.get("SessionKey")); RetWrap retWrap = SYMEnDeData(false, 2, sessionKey, 1, 1, enData, iv, 0); byte[] data = (byte[]) retWrap.get("msg_all"); @@ -3329,7 +3326,6 @@ public class SydApi4j implements SydApi { } - // 测试通过 @Override public RetWrap decryptDE(boolean pFlag, int model, byte[] certSerial, String pCipherKey) { @@ -3681,21 +3677,23 @@ public class SydApi4j implements SydApi { /** * 产生对称密钥,通过清算所公钥证书加密生成数字信封。 * 上清所 - * @param pcDnEN: 清算所的公钥证书 + * + * @param pcDnEN: 清算所的公钥证书 * @param pcDnSign:会员的私钥证书 - * @param pcData: 明文数据。 + * @param pcData: 明文数据。 * @return pcSignData: 签名数字信封 */ @Override - public String SYD_SignDigitalEnvelope(String pcDnEN, String pcDnSign, byte[] pcData){ - // 获取协议 + public String SYD_SignDigitalEnvelope(String pcDnEN, String pcDnSign, byte[] pcData) { + // 获取协议 Proto6A proto = new Proto6A(); // 填充数据 PacketSN sn = PacketSN.gen(); HashMap packet = new HashMap(); packet.put("header", sn.getSn().array()); HashMap data = new HashMap(); - try { data.put("alg$option", 3); + try { + data.put("alg$option", 3); //data.put("pFlag", "P"); data.put("certificateModel$option", 1); data.put("certificateDn", pcDnEN.getBytes("GBK")); @@ -3708,13 +3706,11 @@ public class SydApi4j implements SydApi { data.put("signCertificateDn", pcDnSign.getBytes("GBK")); data.put("signCertificateModel$option", 0); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } - - packet.put("data", data); // 渲染发送 耗时长 ByteBuffer bb = proto.rend(packet); @@ -3741,12 +3737,14 @@ public class SydApi4j implements SydApi { rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getString()); return (String) rw.get("CipherKey"); } + /** * 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。 * 上清所 - * @param pcDnDe: 会员的私钥证书 + * + * @param pcDnDe: 会员的私钥证书 * @param pcDnVerify: 清算所公钥证书 - * @param pcSignData: 签名数字信封数据。 + * @param pcSignData: 签名数字信封数据。 * @return pcData:原数据 */ @Override @@ -3768,7 +3766,7 @@ public class SydApi4j implements SydApi { data.put("certificateDn", pcDnVerify.getBytes("GBK")); data.put("key", pcSignData.getBytes("GBK")); data.put("keyType", "S"); - }catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); } @@ -3796,7 +3794,7 @@ public class SydApi4j implements SydApi { } RetWrap rw = new RetWrap(); rw.put("oData", ((PacketSection) ret.get("oData")).getBytes()); - byte[] odata = (byte[])rw.get("oData"); + byte[] odata = (byte[]) rw.get("oData"); return odata; // int orgCodeLen = Util.a2i(((PacketSection) ret.get("orgCodeLen")).getBytes(), 10); @@ -3812,8 +3810,6 @@ public class SydApi4j implements SydApi { } - - /** * 用指定的证书私钥对指定的数据进行数字签名。 * 网联 @@ -4516,9 +4512,9 @@ public class SydApi4j implements SydApi { // 测试通过 public String SM2GetPrivateKeyC(String privateKeyTag) { - if ( privateKeyTag.length() < 16 ) { + if (privateKeyTag.length() < 16) { privateKeyTag = "0000000000000000" + privateKeyTag; - privateKeyTag = privateKeyTag.substring( privateKeyTag.length() -16 ); + privateKeyTag = privateKeyTag.substring(privateKeyTag.length() - 16); privateKeyTag += "00000000001"; } @@ -4816,7 +4812,7 @@ public class SydApi4j implements SydApi { byte[] s = new byte[a]; bb.get(s, 0, a); - return Util.decodeBase64( SYMUtil.derSign2Base64Sign(s) ); + return Util.decodeBase64(SYMUtil.derSign2Base64Sign(s)); } @@ -5006,7 +5002,7 @@ public class SydApi4j implements SydApi { String base64Sign ) { String certNo = "1234567812345678"; - return SM2Verify(certNo, nOrgDataType, publicKey, orgData, Util.decodeBase64(base64Sign) ); + return SM2Verify(certNo, nOrgDataType, publicKey, orgData, Util.decodeBase64(base64Sign)); } @@ -5114,7 +5110,7 @@ public class SydApi4j implements SydApi { Proto75 proto = new Proto75(); //pset.getProtocolReqRender("75"); - sign = SYMUtil.base64Sign2DerSign( Util.encodeBase64(sign) ); + sign = SYMUtil.base64Sign2DerSign(Util.encodeBase64(sign)); // 填充数据 HashMap packet = new HashMap(); @@ -5864,7 +5860,7 @@ public class SydApi4j implements SydApi { @Override - public byte[] SM3Hash(String publicKey, String userId, byte[] msg){ + public byte[] SM3Hash(String publicKey, String userId, byte[] msg) { return SM3Hash(publicKey, null, null, userId, msg); } @@ -6072,7 +6068,7 @@ public class SydApi4j implements SydApi { } RetWrap rw = new RetWrap(); rw.put(SydApi.RET_CIPHER_KEY, - Util.bytes2HexString( ((PacketSection) ret.get("key")).getBytes() ) + Util.bytes2HexString(((PacketSection) ret.get("key")).getBytes()) ); rw.put(SydApi.RET_SESSION_KEY, (((PacketSection) ret.get("lmkHead")).getString() + @@ -6123,7 +6119,7 @@ public class SydApi4j implements SydApi { } RetWrap rw = new RetWrap(); rw.put(SydApi.RET_CIPHER_KEY, - Util.bytes2HexString( ((PacketSection) ret.get("key")).getBytes() ) + Util.bytes2HexString(((PacketSection) ret.get("key")).getBytes()) ); rw.put(SydApi.RET_SESSION_KEY, (((PacketSection) ret.get("lmkHead")).getString() + @@ -6457,7 +6453,6 @@ public class SydApi4j implements SydApi { /** - * 使用SM4算法进行加密,其中加密模式为CBC, * Ⅳ使用缺省值0X 00000000000000000000000000000000, * 补位模式为 PKCS5 PADDING 。 @@ -11395,29 +11390,29 @@ public class SydApi4j implements SydApi { // retWrap.put( "authenCode", authenCode.getBytes() ); //认证码 } - public byte[] attachedSignC(byte[] orgData, String sCertDN){ + public byte[] attachedSignC(byte[] orgData, String sCertDN) { String sign = attachedSign(orgData, sCertDN); return sign.getBytes(); } public String attachedSignSoft(byte[] orgData, String sCertDN) throws UnsupportedEncodingException { - sCertDN = DnUtil.verifyDn( sCertDN ); - String pk = this.GetDNPublicKey( SydApi.FOR_SIGN, sCertDN.getBytes("GBK") ); + sCertDN = DnUtil.verifyDn(sCertDN); + String pk = this.GetDNPublicKey(SydApi.FOR_SIGN, sCertDN.getBytes("GBK")); try { - byte[] hash = this.SM3Hash( pk, orgData ); + byte[] hash = this.SM3Hash(pk, orgData); String sign = this.detachedSign(0, hash, sCertDN); - return ASN1Util.addOriginDataToPKCS7Sign( orgData, sign ); + return ASN1Util.addOriginDataToPKCS7Sign(orgData, sign); } catch (IOException e) { e.printStackTrace(); throw new IllegalArgumentException("解析 pkcs7 签名格式时错误"); } } - private RetWrap attachedVerifySoftGetAll(byte[] sign){ + private RetWrap attachedVerifySoftGetAll(byte[] sign) { RetWrap ret = null; try { - ret = ASN1Util.takeOutOriginDataFromPKCS7Sign( new String(sign) ); + ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(new String(sign)); } catch (IOException e) { e.printStackTrace(); throw new IllegalArgumentException("解析 pkcs7 签名格式时错误"); @@ -11425,16 +11420,16 @@ public class SydApi4j implements SydApi { byte[] orgData = (byte[]) ret.get("orgData"); byte[] pk = (byte[]) ret.get("pk"); - byte[] hash = this.SM3Hash( Util.bytes2HexString( pk ), orgData ); + byte[] hash = this.SM3Hash(Util.bytes2HexString(pk), orgData); String sign2 = (String) ret.get("sign"); - boolean pass = this.detachedVerify( 0, hash , sign2); - if ( pass ) { + boolean pass = this.detachedVerify(0, hash, sign2); + if (pass) { ret.put("oData", orgData); String certInfo = (String) ret.get("cert"); certInfo = "-----BEGIN CERTIFICATE-----\r\n" + certInfo; certInfo = certInfo + "\r\n-----END CERTIFICATE-----\r\n"; - X509 x509 = GetX509CertInfo( certInfo ); + X509 x509 = GetX509CertInfo(certInfo); ret.put("x509", x509); return ret; } else { @@ -11442,10 +11437,10 @@ public class SydApi4j implements SydApi { } } - private boolean attachedVerifySoft(String sign){ + private boolean attachedVerifySoft(String sign) { RetWrap ret = null; try { - ret = ASN1Util.takeOutOriginDataFromPKCS7Sign( sign ); + ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(sign); } catch (IOException e) { e.printStackTrace(); throw new IllegalArgumentException("解析 pkcs7 签名格式时错误"); @@ -11453,15 +11448,16 @@ public class SydApi4j implements SydApi { byte[] orgData = (byte[]) ret.get("orgData"); byte[] pk = (byte[]) ret.get("pk"); - byte[] hash = this.SM3Hash( Util.bytes2HexString( pk ), orgData ); + byte[] hash = this.SM3Hash(Util.bytes2HexString(pk), orgData); String sign2 = (String) ret.get("sign"); - return this.detachedVerify( 0, hash , sign2); + return this.detachedVerify(0, hash, sign2); } - private boolean attachedVerifyRSA(int rFlag,String sign){ + private boolean attachedVerifyRSA(int rFlag, String sign) { RetWrap ret = null; + boolean verifyRSA = false; try { - ret = ASN1Util.takeOutOriginDataFromPKCS7Sign( sign ); + ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(sign); } catch (IOException e) { e.printStackTrace(); throw new IllegalArgumentException("解析 pkcs7 签名格式时错误"); @@ -11471,7 +11467,13 @@ public class SydApi4j implements SydApi { // byte[] pk = (byte[]) ret.get("pk"); // byte[] hash = this.SM3Hash( Util.bytes2HexString( pk ), orgData ); String sign2 = (String) ret.get("sign"); - return this.detachedVerify( rFlag,0, orgData , sign2); + if (orgData.length < 4096) { + verifyRSA= this.detachedVerify(rFlag, 1, orgData, sign2); + }else { + RetWrap hashData = this.countHash(0, 0, orgData, null); + verifyRSA= this.detachedVerify(2, 0, (byte[]) hashData.get("hash"), sign2); + } + return verifyRSA; } @@ -11513,10 +11515,10 @@ public class SydApi4j implements SydApi { public String attachedSignRSASoft(int rFlag,byte[] orgData, String sCertDN) throws UnsupportedEncodingException { sCertDN = DnUtil.verifyDn( sCertDN ); - String pk = this.GetDNPublicKey( SydApi.FOR_SIGN, sCertDN.getBytes("GBK") ); try { - byte[] hash = this.SM3Hash( pk, orgData ); - String sign = this.detachedSign(rFlag,0, hash, sCertDN); + RetWrap hashData = countHash(0, 0, orgData, null); + byte[] hash = (byte[]) hashData.get("hash"); + String sign = this.detachedSign(2,0, hash, sCertDN); return ASN1Util.addOriginDataToPKCS7Sign( orgData, sign ); } catch (IOException e) { e.printStackTrace(); diff --git a/src/test/java/sample/Shanghairenhang.java b/src/test/java/sample/Shanghairenhang.java index 1eb2aa1..f9def65 100644 --- a/src/test/java/sample/Shanghairenhang.java +++ b/src/test/java/sample/Shanghairenhang.java @@ -82,6 +82,17 @@ public class Shanghairenhang { + } + + @Test + public void testRenhang(){ + System.setProperty("com.sunyard.sydapi4j.debug", "true"); + SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); + SydApi4j api = (SydApi4j) builder.build(); + String attachedSign = api.attachedSign(2,orgData2k, RSA); + System.out.println(attachedSign); + boolean attachedVerify = api.attachedVerify(2,attachedSign); + System.out.println(attachedVerify); } } \ No newline at end of file