优化通信
This commit is contained in:
parent
09f5516792
commit
c9a224f810
@ -45,6 +45,9 @@ public class SydApiException extends RuntimeException{
|
|||||||
case 4:
|
case 4:
|
||||||
msg = "DER 编码格式错误(公钥) ";
|
msg = "DER 编码格式错误(公钥) ";
|
||||||
break;
|
break;
|
||||||
|
case 0xd:
|
||||||
|
msg = "公钥加密错误";
|
||||||
|
break;
|
||||||
case 21:
|
case 21:
|
||||||
msg = "输入的数据格式错误 ";
|
msg = "输入的数据格式错误 ";
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -2586,49 +2586,69 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
private ByteBuffer read(Socket socket) throws IOException {
|
private ByteBuffer read(Socket socket) throws IOException {
|
||||||
InputStream is = socket.getInputStream();
|
InputStream is = socket.getInputStream();
|
||||||
int d;
|
byte[] buf = new byte[2];
|
||||||
int high = is.read();
|
int offset = 0;
|
||||||
int low = is.read();
|
int remaining = 2;
|
||||||
int len = (high << 8) + low;
|
while (remaining > 0) {
|
||||||
|
int read = is.read(buf, offset, remaining);
|
||||||
|
if (read == -1) {
|
||||||
|
throw new EOFException("Expected 2 bytes, but reached end of stream after reading " + offset + " byte(s)");
|
||||||
|
}
|
||||||
|
offset += read;
|
||||||
|
remaining -= read;
|
||||||
|
}
|
||||||
|
int len = ((buf[0] & 0xFF) << 8) | (buf[1] & 0xFF);
|
||||||
|
|
||||||
len += 2;
|
len += 2;
|
||||||
|
|
||||||
if(debug){
|
if(debug){
|
||||||
print("H\t");
|
print("接收数据\t");
|
||||||
println(Integer.toHexString(high));
|
// print("H=");
|
||||||
print("L\t");
|
// print(Integer.toHexString(high));
|
||||||
println(Integer.toHexString(low));
|
// print("\tL=");
|
||||||
print("Len\t");
|
// print(Integer.toHexString(low));
|
||||||
|
print("\tLen=");
|
||||||
println(len);
|
println(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ByteBuffer bb = ByteBuffer.allocate(len);
|
ByteBuffer bb = ByteBuffer.allocate(len);
|
||||||
bb.put((byte) (high & 0xFF));
|
bb.put(buf);
|
||||||
|
// bb.put((byte) (high & 0xFF));
|
||||||
//println(String.format("%d %d %s",len, bb.position() -1, Util.bytes2HexString(new byte[]{(byte) (high & 0xFF)})));
|
//println(String.format("%d %d %s",len, bb.position() -1, Util.bytes2HexString(new byte[]{(byte) (high & 0xFF)})));
|
||||||
|
|
||||||
bb.put((byte) (low & 0xFF));
|
// bb.put((byte) (low & 0xFF));
|
||||||
//println(String.format("%d %d %s",len, bb.position() -1, Util.bytes2HexString(new byte[]{(byte) (low & 0xFF)})));
|
//println(String.format("%d %d %s",len, bb.position() -1, Util.bytes2HexString(new byte[]{(byte) (low & 0xFF)})));
|
||||||
|
|
||||||
|
// int d = 0;
|
||||||
|
// while (true) {
|
||||||
|
// d = is.read();
|
||||||
|
// if (-1 == d) {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// bb.put((byte) (d & 0xFF));
|
||||||
|
//
|
||||||
|
// //println(String.format("%d %d %s",len, bb.position() -1, Util.bytes2HexString(new byte[]{(byte) (d & 0xFF)})));
|
||||||
|
//
|
||||||
|
// if (bb.position() == len) {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
remaining = len - bb.position(); // 还需要读取的字节数
|
||||||
|
byte[] buffer = new byte[8192]; // 批量读取缓冲区
|
||||||
|
|
||||||
while (true) {
|
while (remaining > 0) {
|
||||||
d = is.read();
|
int toRead = Math.min(remaining, buffer.length);
|
||||||
if (-1 == d) {
|
int bytesRead = is.read(buffer, 0, toRead);
|
||||||
break;
|
if (bytesRead == -1) {
|
||||||
}
|
// 与原逻辑不同:这里抛异常,而不是静默退出
|
||||||
|
throw new EOFException("Unexpected end of stream; expected " + remaining + " more bytes");
|
||||||
bb.put((byte) (d & 0xFF));
|
|
||||||
|
|
||||||
//println(String.format("%d %d %s",len, bb.position() -1, Util.bytes2HexString(new byte[]{(byte) (d & 0xFF)})));
|
|
||||||
|
|
||||||
if (bb.position() == len) {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
bb.put(buffer, 0, bytesRead);
|
||||||
|
remaining -= bytesRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (null != builder && builder.isUseEBCDMode()) {
|
if (null != builder && builder.isUseEBCDMode()) {
|
||||||
// print("EBCD 数据: \t");
|
// print("EBCD 数据: \t");
|
||||||
// println(Util.bytes2HexString(bb.array()));
|
// println(Util.bytes2HexString(bb.array()));
|
||||||
@ -2662,8 +2682,10 @@ public class SydApi4j implements SydApi {
|
|||||||
ByteBuffer bb = read(socket);
|
ByteBuffer bb = read(socket);
|
||||||
return bb;
|
return bb;
|
||||||
|
|
||||||
} catch (SocketTimeoutException e) {
|
} catch (EOFException e) {
|
||||||
throw new SydApiException("接收数据超时", -2);
|
throw new SydApiException("接收数据不完整", -21, e);
|
||||||
|
}catch (SocketTimeoutException e) {
|
||||||
|
throw new SydApiException("接收数据超时", -2, e);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package cmbpoc;
|
package cmbpoc;
|
||||||
|
|
||||||
import com.sunyard.RetWrap;
|
import com.sunyard.RetWrap;
|
||||||
|
import com.sunyard.SydApi;
|
||||||
|
import com.sunyard.proto.PacketSection;
|
||||||
import com.sunyard.proto.Util;
|
import com.sunyard.proto.Util;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import racal.sunyard.main.SydApi4j;
|
import racal.sunyard.main.SydApi4j;
|
||||||
@ -14,7 +16,7 @@ public class FunctionTest {
|
|||||||
private byte[] publicKey4Sign;
|
private byte[] publicKey4Sign;
|
||||||
private byte[] privateKey4Ende;
|
private byte[] privateKey4Ende;
|
||||||
private byte[] publicKey4Ende;
|
private byte[] publicKey4Ende;
|
||||||
private byte[] orgData = new byte[2 * 1024];
|
private byte[] orgData = new byte[15];
|
||||||
private String sign;
|
private String sign;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@ -24,15 +26,19 @@ public class FunctionTest {
|
|||||||
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
System.setProperty("com.sunyard.sydapi4j.debug", "true");
|
||||||
|
|
||||||
// 建立链接(单台)
|
// 建立链接(单台)
|
||||||
this.api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8889, null, 5000);
|
this.api = (SydApi4j) new SydApi4j().connect("192.168.100.145", 8889, null, 5000);
|
||||||
|
|
||||||
RetWrap keypair = this.getPrivateKeyAndPublickKey(keypairIndex4Sign);
|
// RetWrap keypair = this.getPrivateKeyAndPublickKey(keypairIndex4Sign);
|
||||||
this.publicKey4Sign = Util.hexString2Bytes( keypair.get("pk").toString() );
|
// this.publicKey4Sign = Util.hexString2Bytes( keypair.get("pk").toString() );
|
||||||
this.privateKey4Sign = Util.hexString2Bytes( keypair.get("sk").toString() );
|
// this.privateKey4Sign = Util.hexString2Bytes( keypair.get("sk").toString() );
|
||||||
|
//
|
||||||
|
// RetWrap keypair4Ende = this.getPrivateKeyAndPublickKey(keypairIndex4Sign);
|
||||||
|
// this.publicKey4Ende = Util.hexString2Bytes( keypair4Ende.get("pk").toString() );
|
||||||
|
// this.privateKey4Ende = Util.hexString2Bytes( keypair4Ende.get("sk").toString() );
|
||||||
|
|
||||||
RetWrap keypair4Ende = this.getPrivateKeyAndPublickKey(keypairIndex4Sign);
|
|
||||||
this.publicKey4Ende = Util.hexString2Bytes( keypair4Ende.get("pk").toString() );
|
this.publicKey4Ende = Util.hexString2Bytes("03420004AF3D4E55D26564C6C937E6EA9232691C01AC5E7916AD2136F788CE7C1E4D0AE8C4754DEC2F7F6A78962D51A171A6F5B4F11823390AEC8B5B0246CD2CCF8052B7");
|
||||||
this.privateKey4Ende = Util.hexString2Bytes( keypair4Ende.get("sk").toString() );
|
this.privateKey4Ende = Util.hexString2Bytes("00010000963F7C3A98B7810F52D2861A060E18A9D4D59796CF33967DD61EEDA091E1AD9B0000000000000000000000000000000000000000000000000000000000000000");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -49,15 +55,21 @@ public class FunctionTest {
|
|||||||
@Ignore
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void genKeyPair(){
|
public void genKeyPair(){
|
||||||
RetWrap r = this.api.SYD_SM2GenKeyPair();
|
// RetWrap r = this.api.SYD_SM2GenKeyPair();
|
||||||
String pk = r.get("publicKey").toString();
|
// String pk = r.get("publicKey").toString();
|
||||||
String sk = r.get("privateKey").toString();
|
// String sk = r.get("privateKey").toString();
|
||||||
|
//
|
||||||
|
// System.out.println("pk=" + pk);
|
||||||
|
// System.out.println("sk=" + sk);
|
||||||
|
//
|
||||||
|
// this.privateKey4Sign = Util.hexString2Bytes(sk);
|
||||||
|
// this.publicKey4Sign = Util.hexString2Bytes(pk);
|
||||||
|
|
||||||
System.out.println("pk=" + pk);
|
RetWrap rw = this.api.SM2GenKeyPair();
|
||||||
System.out.println("sk=" + sk);
|
byte[] pk = (byte[]) rw.get(SydApi.RET_PUBLIC_KEY);
|
||||||
|
byte[] sk = (byte[]) rw.get(SydApi.RET_PRIVATE_KEY);
|
||||||
this.privateKey4Sign = Util.hexString2Bytes(sk);
|
System.out.println("pk=" + Util.bytes2HexString(pk));
|
||||||
this.publicKey4Sign = Util.hexString2Bytes(pk);
|
System.out.println("sk=" + Util.bytes2HexString(sk));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -86,8 +98,10 @@ public class FunctionTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void SYD_SM2_Encrypt(){
|
public void SYD_SM2_Encrypt(){
|
||||||
byte[] enData = this.api.SYD_SM2Encrypt(privateKey4Ende, orgData);
|
byte[] enData = this.api.SYD_SM2Encrypt(publicKey4Ende, orgData);
|
||||||
// byte[] deData = this.api.SYD_SM2Decrypt(publicKey4Ende, enData);
|
// byte[] deData = this.api.SYD_SM2Decrypt(publicKey4Ende, enData);
|
||||||
// Assert.assertArrayEquals(enData, deData);
|
// Assert.assertArrayEquals(enData, deData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user