From 6ff2df3857a494e0c5860c87f3c8311d33be71d1 Mon Sep 17 00:00:00 2001 From: "junj2.liang" Date: Thu, 1 Sep 2022 14:18:35 +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 --- .../com/sunyard/sge/database/SydApiSM4.java | 185 ++++++++++++------ 1 file changed, 130 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4.java b/src/main/java/com/sunyard/sge/database/SydApiSM4.java index 71d5528..893f60d 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM4.java +++ b/src/main/java/com/sunyard/sge/database/SydApiSM4.java @@ -13,6 +13,7 @@ public class SydApiSM4 { private int iFlag; private boolean is_finished = false; private byte[] dataResult = new byte[0]; + ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); @@ -35,67 +36,132 @@ public class SydApiSM4 { if (plength > 4064) { throw new SydApiException(0); } + if (iFlag == 1) { 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); + //加密 + if (plength < 16) { + 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; } - 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.array()); - bufferResult.put(pcData); - sourceWrap = bufferResult; - return new byte[0]; - } else if ((pcData.length + sourceWrap.array().length) % 16 == 0) { - ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); - bufferResult.put(sourceWrap.array()); - 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.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; iPkgNum = 2; - return api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); + 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.array()); + bufferResult.put(pcData); + sourceWrap = bufferResult; + return new byte[0]; + } else if ((pcData.length + sourceWrap.array().length) % 16 == 0) { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(sourceWrap.array()); + 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.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; + iPkgNum = 2; + return api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); + } } } + else { + if (0 == sourceWrap.array().length) { + if (plength<16){ + api.SYD_SM4_LongData(iKeyIndex, new byte[0], iPkgNum, iFlag); + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(sourceWrap); + bufferResult.put(pcData); + sourceWrap = bufferResult; + } + ByteBuffer buffer = ByteBuffer.wrap(pcData); + int remainder = plength % 16; + int intercept = plength - remainder - 16; + byte[] bytes = new byte[intercept]; + ByteBuffer byteBuffer = buffer.get(bytes, 0, intercept); + byte[] bytes1 = new byte[remainder]; + byteBuffer.get(bytes1); + byte[] bytes2 = new byte[16]; + ByteBuffer byte1 = buffer.get(bytes2,0,16); + dataResult=bytes2; + 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.array()); + bufferResult.put(pcData); + sourceWrap = bufferResult; + return new byte[0]; + } else if ((pcData.length + sourceWrap.array().length) % 16 == 0) { + ByteBuffer bufferResult = ByteBuffer.allocate(sourceWrap.array().length + plength); + bufferResult.put(sourceWrap.array()); + 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.array()); + bufferResult.put(pcData); + byte[] bytes = SydSM4Mac.bytebuffer2ByteArray(bufferResult); + ByteBuffer buffer = ByteBuffer.wrap(bytes); + int remainder = bytes.length % 16; + int intercept = bytes.length - remainder - 16; + byte[] pcdataByte = new byte[intercept]; + ByteBuffer byteBuffer = buffer.get(pcdataByte, 0, intercept); + byte[] bytes1 = new byte[remainder]; + byteBuffer.get(bytes1); + byte[] bytes2 = new byte[16]; + ByteBuffer byteBuffer2 = buffer.get(bytes2, 0, 16); + this.dataResult = bytes2; + this.pcdataResult = pcdataByte; + ByteBuffer bufferResults = ByteBuffer.allocate(remainder); + bufferResults.put(bytes1); + sourceWrap = bufferResults; + iPkgNum = 2; + return api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag); + } + } + } + } public byte[] finish() { @@ -109,6 +175,15 @@ public class SydApiSM4 { this.iPkgNum = 3; } + + if (iFlag == 0){ + ByteBuffer buffer = ByteBuffer.allocate(dataResult.length+sourceWrap.array().length); + buffer.put(dataResult); + buffer.put(sourceWrap.array()); + byte[] bytes = api.SYD_SM4_LongData(iKeyIndex,buffer.array(), iPkgNum, iFlag); + sourceWrap = null; + return bytes; + } byte[] bytes = api.SYD_SM4_LongData(iKeyIndex,sourceWrap.array(), iPkgNum, iFlag); sourceWrap = null; return bytes;