From 0724e374e9dcf5a124f208fe20d3009940ea48bc Mon Sep 17 00:00:00 2001 From: "junj2.liang" Date: Fri, 2 Sep 2022 16:09:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sunyard/sge/database/SydSM4Mac.java | 110 ++++++------------ 1 file changed, 34 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java index 4ea3009..376ce49 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java @@ -1,10 +1,9 @@ package com.sunyard.sge.database; import com.sunyard.SydApiException; +import com.sunyard.sge.bytes.BytesQueue; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; public class SydSM4Mac { private SydApi api; @@ -15,7 +14,8 @@ public class SydSM4Mac { private boolean is_finished; private String pcMac; private byte[] pcdataResult = new byte[0]; - ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); + private String pcdataStr; + BytesQueue queue = new BytesQueue(); public SydSM4Mac(SydApi api, int iKeyIndex) { this.api = api; @@ -28,45 +28,32 @@ public class SydSM4Mac { this.api = api; } - public SydSM4Mac update(byte[] pcData) { + public void update(byte[] pcData) { if (null == pcData || 0 == pcData.length) { - return this; + return; } int length = pcData.length; this.pcdataResult = pcData; if (is_finished) { - throw new SydApiException(0); + throw new SydApiException(-1); } if (length > 4064) { - throw new SydApiException(0); + throw new SydApiException(-1); } - if (0 == sourceWrap.array().length) { + if (0 == queue.getLength()) { 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; - } + queue.push(pcData); } 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; + byte[] result = new byte[intercept]; + byte[] result2 = new byte[remainder]; + System.arraycopy(pcData,0,result,0,intercept); + System.arraycopy(pcData,intercept,result,0,remainder); + queue.push(result2); + pcdataResult=result; + } if (null == this.pcMac || "".equals(this.pcMac)) { LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData); @@ -78,55 +65,24 @@ public class SydSM4Mac { iPkgNum = 2; } } else { - if (16 > (pcData.length + sourceWrap.array().length)) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + pcData.length); - bufferResult.put(sourceWrap.array()); - bufferResult.put(pcData); - sourceWrap = bufferResult; + if (16 > (pcData.length + queue.getLength())) { + queue.push(pcData); } - else if (16<=(pcData.length + sourceWrap.array().length)&&(pcData.length + sourceWrap.array().length) % 16 == 0) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + pcData.length); - bufferResult.put(sourceWrap.array()); - 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; - } + queue.push(pcData); + byte[] pop = queue.pop(16, 0); + if (null == this.pcMac || "".equals(this.pcMac)) { + LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData); + pcProcData = stringStringLongDataReturn.getProcData(); + iPkgNum = 2; } else { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); - bufferResult.put(sourceWrap.array()); - 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; - } + LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData, pcMac); + pcProcData = stringBooleanLongDataReturn.getProcData(); + iPkgNum = 2; + } } - return this; + } public LongDataReturn disget() { @@ -139,16 +95,18 @@ public class SydSM4Mac { } else if (2 == this.iPkgNum) { this.iPkgNum = 3; } + byte[] pop = queue.pop(); + if (null == this.pcMac || "".equals(this.pcMac)) { - LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, this.sourceWrap.array(), iPkgNum, pcProcData); + LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData); return stringStringLongDataReturn; } else { - LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, this.sourceWrap.array(), iPkgNum, pcProcData, pcMac); + LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData, pcMac); return stringBooleanLongDataReturn; } - } + public static byte[] bytebuffer2ByteArray(ByteBuffer buffer) { //重置 limit 和postion 值 buffer.flip();