diff --git a/DProto/MS.xml b/DProto/MS.xml index c144bab..b72d457 100644 --- a/DProto/MS.xml +++ b/DProto/MS.xml @@ -172,10 +172,10 @@ } function retMacLen(){ - if ( 0 == $packet.data.mode$option ) { - return 16; + if ( 2 == $packet.data.mode$option ) { + return 32; } else { - return 16; + return 16; } } diff --git a/src/main/java/com/sunyard/SydApiException.java b/src/main/java/com/sunyard/SydApiException.java index 463bd8a..3171b7e 100644 --- a/src/main/java/com/sunyard/SydApiException.java +++ b/src/main/java/com/sunyard/SydApiException.java @@ -57,6 +57,12 @@ public class SydApiException extends RuntimeException{ case 129: this.msg = "没有该指令"; break; + + case 0x8006 : { + this.msg = "输入的数据格式错误"; + break; + } + case 32770: this.msg = "签名验证错误(P7) "; break; diff --git a/src/main/java/com/sunyard/inf/SydCertApi.java b/src/main/java/com/sunyard/inf/SydCertApi.java index 251f09b..d153121 100644 --- a/src/main/java/com/sunyard/inf/SydCertApi.java +++ b/src/main/java/com/sunyard/inf/SydCertApi.java @@ -54,6 +54,8 @@ public interface SydCertApi { int nKeyTypes ); + public String SM2GetPrivateKeyC(String privateKeyTag); + String SM2GetPublicKeyC_QX( int userId, int nKeyTypes diff --git a/src/main/java/com/sunyard/inf/SydCryptionApi.java b/src/main/java/com/sunyard/inf/SydCryptionApi.java index 821e34b..898299c 100644 --- a/src/main/java/com/sunyard/inf/SydCryptionApi.java +++ b/src/main/java/com/sunyard/inf/SydCryptionApi.java @@ -74,7 +74,6 @@ interface SydHashApi { public void MACCheck(int alg, int keyType, String AK, int fullMode, byte[] infoData, String mac); public String calcPBOCMAC(int mode, int keyType, String key, byte[] data, int block, byte[] iv); - } diff --git a/src/main/java/com/sunyard/inf/SydSVApi.java b/src/main/java/com/sunyard/inf/SydSVApi.java index 243bd52..6446d79 100644 --- a/src/main/java/com/sunyard/inf/SydSVApi.java +++ b/src/main/java/com/sunyard/inf/SydSVApi.java @@ -59,7 +59,7 @@ interface SydAttachedSVApi { * @return 签名结果 */ String SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData); - + String SM2SignC(int flag, String pUserID, String privateKey, byte[] publicKey, byte[] orgData); /** * SM2 私钥签名 * @param pUserID 使用者的 ID,最大长度为 16 位数字,右对齐。 diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index e9bade5..b065dc9 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -464,7 +464,8 @@ public class SydApi4j implements SydApi { PacketSection error = (PacketSection) ret.get("error"); byte[] be = error.getBytes(); if ((0 != (be[0] ^ be[1]))) { - + SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); + println("验签失败=" + e.toString() ); return false; } return true; @@ -711,6 +712,8 @@ public class SydApi4j implements SydApi { PacketSection error = (PacketSection) ret.get("error"); byte[] be = error.getBytes(); if ((0 != (be[0] ^ be[1]))) { + SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); + println("验签失败=" + e.toString() ); return false; } @@ -3475,9 +3478,12 @@ public class SydApi4j implements SydApi { * @param orgData 要签名的信息 * @return 签名结果 */ + public String SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData) { + return SM2SignC( flag, "1234567812345678", privateKey, publicKey, orgData); + } // 测试通过 @Override - public String SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData) { + public String SM2SignC(int flag, String uid, String privateKey, byte[] publicKey, byte[] orgData) { Proto74 proto = new Proto74(); @@ -3489,7 +3495,7 @@ public class SydApi4j implements SydApi { PacketSN sn = PacketSN.gen(); packet.put("header", sn.getSn().array()); data.put("signatureDataType$option", 1); - data.put("userId", "1234567812345678".getBytes()); + data.put("userId", uid.getBytes()); data.put("publicKey", publicKey); data.put("infoData", orgData); data.put("privateKeyTag", flag == 1 ? privateKey : "999999999999999999999999999"); @@ -3689,51 +3695,17 @@ public class SydApi4j implements SydApi { return ((PacketSection) ret.get("signature")).getString(); } - @Override public boolean SM2Verify( int nOrgDataType, byte[] publicKey, byte[] orgData, String base64Sign - ) { + ){ String certNo = "1234567812345678"; - //ProtocolRender render = pset.getProtocolReqRender("75"); - Proto75 proto = new Proto75(); - - byte[] sign = Util.decodeBase64(base64Sign); - - // 填充数据 - 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", nOrgDataType); - data.put("signature", sign); - data.put("userId", certNo.getBytes()); - data.put("infoData", orgData); - data.put("hashData", orgData); - data.put("publicKey", publicKey); - // 渲染发送 - ByteBuffer bb = proto.rend(packet); - //System.out.println(Util.bytes2HexString(Util.toArray(bb))); - synchronized (this) { - // 响应解析 - bb = syncRead(syncSend(bb)); - } - bb.position(12); - byte[] v = new byte[2]; - bb.get(v, 0, v.length); - String a = Util.bytes2HexString(v); - if ("3030".equals(a)) { - return true; - } else { - return false; - } + return SM2Verify(certNo, nOrgDataType, publicKey, orgData, base64Sign); } - @Override public String SM2Sign( int nOrgDataType, @@ -10071,6 +10043,9 @@ public class SydApi4j implements SydApi { PacketSection error = (PacketSection) ret.get("error"); byte[] be = error.getBytes(); if ((0 != (be[0] ^ be[1]))) { + SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); + println("验签失败=" + e.toString() ); + return false; }