package com.sunyard.inf.customize; import com.sunyard.SydApiException; import com.sunyard.cert.X509; import com.sunyard.proto.Packet; import com.sunyard.proto.PacketSection; import com.sunyard.proto.Util; import com.sunyard.trans.PacketSN; import racal.sunyard.main.SydApi4j; import racal.sunyard.main.proto.Proto8003; import racal.sunyard.main.proto.Proto8004; import racal.sunyard.main.proto.Proto8012; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class SydSDNXApiImpl extends SydApi4j implements SydSDNXApi { public String nakedSign(byte[] orgData, String sCertDN) { Proto8003 proto = new Proto8003(); //pset.getProtocolReqRender("75"); byte[] dn = new byte[256]; byte[] s = null; try { s = sCertDN.getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.arraycopy(s, 0, dn, 0, s.length); // 填充数据 HashMap packet = new HashMap(); HashMap data = new HashMap(); packet.put("data", data); PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); data.put("signatureDataType$option", 1); data.put("DN", dn); data.put("data", orgData); // 渲染发送 ByteBuffer bb = proto.rend(packet); synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); } Packet p = proto.parse(bb); Map ret = p.toMap(); if ( !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) ) { throw new SydApiException("包序号不匹配", -4); } ret = (Map) ret.get("data"); PacketSection error = (PacketSection) ret.get("error"); byte[] be = error.getBytes(); if ( (0 != (be[0] ^ be[1]))) { throw new SydApiException(error.getInfo(), error.autoInt()); } return Util.encodeBase64(((PacketSection) ret.get("signature")).getBytes()); //return ((PacketSection) ret.get("signature")).getBytes(); } @Override public boolean SYD_NakedVerify(byte[] orgData, String sign, String organizationNum) { Proto8004 proto = new Proto8004(); //pset.getProtocolReqRender("75"); byte[] dn = new byte[256]; byte[] s = null; // 填充数据 HashMap packet = new HashMap(); HashMap data = new HashMap(); packet.put("data", data); PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); data.put("signatureDataType$option", 2); data.put("organizationNum", organizationNum); data.put("data", orgData); data.put("signature", Util.decodeBase64(sign)); data.put("returnSign$option", 0); // 渲染发送 ByteBuffer bb = proto.rend(packet); synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); } Packet p = proto.parse(bb, packet); Map ret = p.toMap(); if ( !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) ) { throw new SydApiException("包序号不匹配", -4); } ret = (Map) ret.get("data"); PacketSection error = (PacketSection) ret.get("error"); byte[] be = error.getBytes(); if ((0 != (be[0] ^ be[1]))) { throw new SydApiException(error.getInfo(), error.autoInt()); } return true; } @Override public X509 SYD_Get_X509_CertInfo_HA(String bNumber, byte[] orgData, String sign) { Proto8012 proto = new Proto8012(); //pset.getProtocolReqRender("75"); // 填充数据 HashMap packet = new HashMap(); HashMap data = new HashMap(); packet.put("data", data); PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); data.put("originData", orgData); data.put("signData", sign.getBytes()); data.put("flag$option", 2); data.put("organizationNum", bNumber); // 渲染发送 ByteBuffer bb = proto.rend(packet); synchronized (this) { // 响应解析 bb = syncRead(syncSend(bb)); } Packet p = proto.parse(bb, packet); Map ret = p.toMap(); if ( !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) ) { throw new SydApiException("包序号不匹配", -4); } ret = (Map) ret.get("data"); PacketSection error = (PacketSection) ret.get("error"); byte[] be = error.getBytes(); if ((0 != (be[0] ^ be[1]))) { throw new SydApiException(error.getInfo(), error.autoInt()); } PacketSection info = (PacketSection) ret.get("info"); byte[] pCertInfo = info.getBytes(); // X509 cinfo = new X509(); // cinfo.setIssuer(Util.toCleanString(pCertInfo, 0, 257)); // cinfo.setSerialNumber(Util.toCleanString(pCertInfo, 257, 65)); // cinfo.setSubject(Util.toCleanString(pCertInfo, 257 + 65, 257)); // cinfo.setNotBefore(Util.toCleanString(pCertInfo, 257 + 65 + 257, 15)); // cinfo.setNotAfter(Util.toCleanString(pCertInfo, 257 + 65 + 257 + 15, 15)); // byte[] blen = new byte[]{pCertInfo[257 + 65 + 257 + 15 + 15], pCertInfo[257 + 65 + 257 + 15 + 16]}; // int len = Util.b2i(blen); // byte[] pem = new byte[len]; // System.arraycopy(pCertInfo, 257 + 65 + 257 + 15 + 17, pem, 0, len); // String pp = new String(pem); // 解析证书 return GetX509CertInfo(new String(pCertInfo)); } }