diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4.java b/src/main/java/com/sunyard/sge/database/SydApiSM4.java index c5bfca1..cf06759 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM4.java +++ b/src/main/java/com/sunyard/sge/database/SydApiSM4.java @@ -12,7 +12,7 @@ public class SydApiSM4 { private int iPkgNum = 1; private int iFlag; private boolean is_finished = false; - private ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); + ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); public SydApiSM4(SydApi api, int iKeyIndex, int endeFlag) { @@ -21,87 +21,77 @@ public class SydApiSM4 { this.iKeyIndex = iKeyIndex; } - public byte[] update(byte[] pcData) { - try { - this.pcdataResult = pcData; - if (null == pcData || pcData.length == 0) { - return new byte[0]; - } - int plength = pcData.length; - if (is_finished) { - throw new SydApiException(0); - } - if (plength > 4064) { - throw new SydApiException(0); - } - if (0 == sourceWrap.array().length) { - //加密 - if (plength < 16) { - api.SYD_SM4_LongData(iKeyIndex, new byte[0], iPkgNum, iFlag); - if (iFlag == 0 && 1 == iPkgNum) { - throw new SydApiException("解密的首包不能小于 16 字节", 0); - } - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - sourceWrap = bufferResult; - } - if (plength % 16 != 0) { - ByteBuffer buffer = ByteBuffer.wrap(pcData); - int remainder = plength % 16; - int intercept = plength - remainder; - byte[] bytes = new byte[intercept]; - ByteBuffer byteBuffer = buffer.get(bytes, 0, intercept); - byte[] bytes1 = new byte[remainder]; - byteBuffer.get(bytes1); - this.pcdataResult = bytes; - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + remainder); - bufferResult.put(bytes1); - sourceWrap = bufferResult; - } - iPkgNum = 2; - return api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); - - } else { - if (16 > pcData.length + sourceWrap.array().length) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - sourceWrap = bufferResult; - } else if ((pcData.length + sourceWrap.array().length) % 16 == 0) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); - return api.SYD_SM4_LongData(iKeyIndex, bytes, iPkgNum, iFlag); - } else { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); - ByteBuffer buffer = ByteBuffer.wrap(bytes); - int remainder = bytes.length % 16; - int intercept = bytes.length - remainder; - byte[] pcdataByte = new byte[intercept]; - ByteBuffer byteBuffer = buffer.get(pcdataByte, 0, intercept); - byte[] bytes1 = new byte[remainder]; - byteBuffer.get(bytes1); - this.pcdataResult = pcdataByte; - ByteBuffer bufferResults = ByteBuffer.allocate(remainder); - bufferResults.put(bytes1); - sourceWrap = bufferResults; - iPkgNum = 2; - return api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); - - } - } - } catch (Exception e) { - e.printStackTrace(); - throw e; + public void update(byte[] pcData) { + this.pcdataResult = pcData; + if (null == pcData || pcData.length == 0) { + return; + } + int plength = pcData.length; + if (is_finished) { + throw new SydApiException(0); + } + if (plength > 4064) { + throw new SydApiException(0); + } + if (0 == sourceWrap.array().length) { + //加密 + if (plength < 16) { + api.SYD_SM4_LongData(iKeyIndex, new byte[0], iPkgNum, iFlag); + if (iFlag == 0 && 1 == iPkgNum) { + throw new SydApiException("解密的首包不能小于 16 字节", 0); + } + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(sourceWrap); + bufferResult.put(pcData); + sourceWrap = bufferResult; + } + if (plength % 16 != 0) { + ByteBuffer buffer = ByteBuffer.wrap(pcData); + int remainder = plength % 16; + int intercept = plength - remainder; + byte[] bytes = new byte[intercept]; + ByteBuffer byteBuffer = buffer.get(bytes, 0, intercept); + byte[] bytes1 = new byte[remainder]; + byteBuffer.get(bytes1); + this.pcdataResult = bytes; + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + remainder); + bufferResult.put(bytes1); + sourceWrap = bufferResult; + } + byte[] bytes = api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); + iPkgNum = 2; + } else { + if (16 > pcData.length + sourceWrap.array().length) { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(sourceWrap); + bufferResult.put(pcData); + sourceWrap = bufferResult; + } else if ((pcData.length + sourceWrap.array().length) % 16 == 0) { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(SydSM4Mac.bytebuffer2ByteArray(sourceWrap)); + bufferResult.put(pcData); + byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); + api.SYD_SM4_LongData(iKeyIndex, bytes, iPkgNum, iFlag); + } else { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(SydSM4Mac.bytebuffer2ByteArray(sourceWrap)); + bufferResult.put(pcData); + byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); + ByteBuffer buffer = ByteBuffer.wrap(bytes); + int remainder = bytes.length % 16; + int intercept = bytes.length - remainder; + byte[] pcdataByte = new byte[intercept]; + ByteBuffer byteBuffer = buffer.get(pcdataByte, 0, intercept); + byte[] bytes1 = new byte[remainder]; + byteBuffer.get(bytes1); + this.pcdataResult = pcdataByte; + ByteBuffer bufferResults = ByteBuffer.allocate(remainder); + bufferResults.put(bytes1); + sourceWrap = bufferResults; + api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); + iPkgNum = 2; + } } - - return null; - } public byte[] finish() { diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java index 9dbc80b..06fc0a1 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java @@ -3,22 +3,25 @@ package com.sunyard.sge.database; import com.sunyard.SydApiException; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; public class SydSM4Mac { private SydApi api; + private byte[] last_in_data; private int iKeyIndex; private int iPkgNum = 1; - private boolean isFinished; - - // 中间数据 private String pcProcData; - - - private ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); + private boolean is_finished; + private String pcMac; + private byte[] pcdataResult = new byte[0]; + ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); public SydSM4Mac(SydApi api, int iKeyIndex) { this.api = api; this.iKeyIndex = iKeyIndex; + this.pcProcData = pcProcData; + this.pcMac=pcMac; } public SydSM4Mac(SydApi api) { @@ -26,47 +29,94 @@ public class SydSM4Mac { } public SydSM4Mac update(byte[] pcData) { + if (null == pcData || 0 == pcData.length) { + return this; + } + int length = pcData.length; + this.pcdataResult = pcData; + if (is_finished) { + throw new SydApiException(0); + } + if (length > 4064) { + throw new SydApiException(0); + } + if (0 == sourceWrap.array().length) { + if (length < 16) { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); + bufferResult.put(sourceWrap); + bufferResult.put(pcData); + sourceWrap = bufferResult; + if (null == this.pcMac || "".equals(this.pcMac)) { + LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, 0, pcProcData); + pcProcData = stringStringLongDataReturn.getProcData(); + } else { + LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, 0, pcProcData, pcMac); + pcProcData = stringBooleanLongDataReturn.getProcData(); + return this; + } + } + if (length % 16 != 0) { + ByteBuffer buffer = ByteBuffer.wrap(pcData); + int remainder = length % 16; + int intercept = length - remainder; + byte[] bytes = new byte[intercept]; + ByteBuffer byteBuffer = buffer.get(bytes, 0, intercept); + byte[] bytes1 = new byte[remainder]; + byteBuffer.get(bytes1); + this.pcdataResult = bytes; + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + remainder); + bufferResult.put(bytes1); + sourceWrap = bufferResult; + } + if (null == this.pcMac || "".equals(this.pcMac)) { + LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData); + pcProcData = stringStringLongDataReturn.getProcData(); + iPkgNum = 2; + } else { + LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData, pcMac); + pcProcData = stringBooleanLongDataReturn.getProcData(); + iPkgNum = 2; + } + } else { + if (16 > (pcData.length + sourceWrap.array().length)) { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + pcData.length); + bufferResult.put(sourceWrap); + bufferResult.put(pcData); + sourceWrap = bufferResult; + } - try { - if (null == pcData || 0 == pcData.length) { - return this; - } - int length = pcData.length; - this.pcdataResult = pcData; - if (isFinished) { - throw new SydApiException(0); - } - if (length > 4064) { - throw new SydApiException(0); - } - if (0 == sourceWrap.array().length) { - if (length < 16) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - sourceWrap = bufferResult; - if (null == this.pcMac || "".equals(this.pcMac)) { - LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, 0, pcProcData); - pcProcData = stringStringLongDataReturn.getProcData(); - } else { - LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, 0, pcProcData, pcMac); - pcProcData = stringBooleanLongDataReturn.getProcData(); - return this; - } - } - if (length % 16 != 0) { - ByteBuffer buffer = ByteBuffer.wrap(pcData); - int remainder = length % 16; - int intercept = length - remainder; - byte[] bytes = new byte[intercept]; - ByteBuffer byteBuffer = buffer.get(bytes, 0, intercept); - byte[] bytes1 = new byte[remainder]; - byteBuffer.get(bytes1); - this.pcdataResult = bytes; - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + remainder); - bufferResult.put(bytes1); - sourceWrap = bufferResult; + else if (16<=(pcData.length + sourceWrap.array().length)&&(pcData.length + sourceWrap.array().length) % 16 == 0) { + int k2 = sourceWrap.array().length+pcData.length; + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + pcData.length); + byte[] bytes1 = bytebuffer2ByteArray(sourceWrap); + bufferResult.put(bytes1); + bufferResult.put(pcData); + byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); + if (null == this.pcMac || "".equals(this.pcMac)) { + LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, bytes, iPkgNum, pcProcData); + pcProcData = stringStringLongDataReturn.getProcData(); + iPkgNum = 2; + } else { + LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, bytes, iPkgNum, pcProcData, pcMac); + pcProcData = stringBooleanLongDataReturn.getProcData(); + iPkgNum = 2; } + } else { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); + bufferResult.put(bytebuffer2ByteArray(sourceWrap)); + bufferResult.put(pcData); + byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); + ByteBuffer buffer = ByteBuffer.wrap(bytes); + int remainder = bytes.length % 16; + int intercept = bytes.length - remainder; + byte[] pcdataByte = new byte[intercept]; + ByteBuffer byteBuffer = buffer.get(pcdataByte, 0, intercept); + byte[] bytes1 = new byte[remainder]; + byteBuffer.get(bytes1); + this.pcdataResult = pcdataByte; + ByteBuffer bufferResults = ByteBuffer.allocate(remainder); + bufferResults.put(bytes1); + sourceWrap = bufferResults; if (null == this.pcMac || "".equals(this.pcMac)) { LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData); pcProcData = stringStringLongDataReturn.getProcData(); @@ -76,68 +126,16 @@ public class SydSM4Mac { pcProcData = stringBooleanLongDataReturn.getProcData(); iPkgNum = 2; } - } else { - if (16 > pcData.length + sourceWrap.array().length) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - sourceWrap = bufferResult; - } else if ((pcData.length + sourceWrap.array().length) % 16 == 0) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); - if (null == this.pcMac || "".equals(this.pcMac)) { - LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, bytes, iPkgNum, pcProcData); - pcProcData = stringStringLongDataReturn.getProcData(); - iPkgNum = 2; - } else { - LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, bytes, iPkgNum, pcProcData, pcMac); - pcProcData = stringBooleanLongDataReturn.getProcData(); - iPkgNum = 2; - } - } else { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); - ByteBuffer buffer = ByteBuffer.wrap(bytes); - int remainder = bytes.length % 16; - int intercept = bytes.length - remainder; - byte[] pcdataByte = new byte[intercept]; - ByteBuffer byteBuffer = buffer.get(pcdataByte, 0, intercept); - byte[] bytes1 = new byte[remainder]; - byteBuffer.get(bytes1); - this.pcdataResult = pcdataByte; - ByteBuffer bufferResults = ByteBuffer.allocate(remainder); - bufferResults.put(bytes1); - sourceWrap = bufferResults; - if (null == this.pcMac || "".equals(this.pcMac)) { - LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData); - pcProcData = stringStringLongDataReturn.getProcData(); - iPkgNum = 2; - } else { - LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData, pcMac); - pcProcData = stringBooleanLongDataReturn.getProcData(); - iPkgNum = 2; - } - } } - return this; - }catch ( Exception e ) { - e.printStackTrace(); - throw e; } - + return this; } - - public LongDataReturn disget() { - if (isFinished) { + if (is_finished) { throw new SydApiException(0); } - this.isFinished = true; + this.is_finished = true; if (1 == this.iPkgNum) { this.iPkgNum = 0; } else if (2 == this.iPkgNum) { @@ -150,6 +148,7 @@ public class SydSM4Mac { LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, this.pcdataResult, iPkgNum, pcProcData, pcMac); return stringBooleanLongDataReturn; } + } public static byte[] bytebuffer2ByteArray(ByteBuffer buffer) { @@ -165,4 +164,5 @@ public class SydSM4Mac { } return bytes; } + }