From 86a784c1ba08971b223b9f39a0b57222891ac795 Mon Sep 17 00:00:00 2001 From: "junj2.liang" Date: Wed, 31 Aug 2022 14:50:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0init/update/digest/finish?= =?UTF-8?q?=E9=95=BF=E6=95=B0=E6=8D=AE=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sunyard/sge/database/SydApi.java | 2 +- .../sunyard/sge/database/SydApi4Database.java | 4 +- .../com/sunyard/sge/database/SydApiSM4.java | 1 + .../com/sunyard/sge/database/SydSM4Mac.java | 121 +++++++++++++----- 4 files changed, 93 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index 0188647..6960133 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -276,5 +276,5 @@ public interface SydApi { public SydApiSM3 initSydApiSM3(SydApi sydApi,int ende, int key); - public SydSM4Mac initSydSM4Mac(SydApi sydApi,int iKeyIndex,int ende, int key); + public SydSM4Mac initSydSM4Mac(SydApi sydApi,int iKeyIndex,int ende, int key,String pcMac); } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index 1265555..6c4cb5b 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -778,8 +778,8 @@ public class SydApi4Database implements SydApi { } @Override - public SydSM4Mac initSydSM4Mac(SydApi sydApi, int iKeyIndex,int ende, int key) { - return new SydSM4Mac(sydApi,iKeyIndex,1,null); + public SydSM4Mac initSydSM4Mac(SydApi sydApi, int iKeyIndex,int ende, int key,String pcMac) { + return new SydSM4Mac(sydApi,iKeyIndex,1,null,pcMac); } public SydSM4Mac initSydSM4Mac(SydApi sydApi){ diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4.java b/src/main/java/com/sunyard/sge/database/SydApiSM4.java index 6a1d794..379ecc2 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM4.java +++ b/src/main/java/com/sunyard/sge/database/SydApiSM4.java @@ -31,6 +31,7 @@ public class SydApiSM4 { } public void update(byte[] pcData) { + this.pcdataResult = pcData; if (null==pcData||pcData.length==0){ return; } diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java index 8cc3cd2..664ab07 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java @@ -16,10 +16,11 @@ public class SydSM4Mac { private byte[] pcdataResult = new byte[0]; ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); - public SydSM4Mac(SydApi api, int iKeyIndex, int iPkgNum, String pcProcData) { + public SydSM4Mac(SydApi api, int iKeyIndex, int iPkgNum, String pcProcData,String pcMac) { this.api = api; this.iKeyIndex = iKeyIndex; this.pcProcData = pcProcData; + this.pcMac=pcMac; } public SydSM4Mac(SydApi api) { @@ -27,7 +28,7 @@ public class SydSM4Mac { } public SydSM4Mac update(byte[] pcData) { - if (null==pcData||0 == pcData.length) { + if (null == pcData || 0 == pcData.length) { return this; } int length = pcData.length; @@ -38,34 +39,89 @@ public class SydSM4Mac { if (length > 4064) { throw new SydApiException(0); } - - if (length < 16) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + length); - bufferResult.put(sourceWrap); - bufferResult.put(pcData); - sourceWrap = bufferResult; - } - 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, iKeyIndex, pcProcData); - pcProcData = stringStringLongDataReturn.getProcData(); - iPkgNum = 2; + 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 { - LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iKeyIndex, pcProcData, pcMac); - pcProcData = stringBooleanLongDataReturn.getProcData(); - iPkgNum = 2; + 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; } @@ -88,16 +144,17 @@ public class SydSM4Mac { return stringBooleanLongDataReturn; } } + public static byte[] bytebuffer2ByteArray(ByteBuffer buffer) { //重置 limit 和postion 值 buffer.flip(); //获取buffer中有效大小 - int len=buffer.limit() - buffer.position(); + int len = buffer.limit() - buffer.position(); - byte [] bytes=new byte[len]; + byte[] bytes = new byte[len]; for (int i = 0; i < bytes.length; i++) { - bytes[i]=buffer.get(); + bytes[i] = buffer.get(); } return bytes; }