From 4070a7dcadbe933b5967bbef0b0c0d6d741bc4ad Mon Sep 17 00:00:00 2001 From: "junj2.liang" Date: Tue, 30 Aug 2022 10:24:05 +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 | 151 +++++++++--------- .../sunyard/sge/database/SydApi4Database.java | 22 +++ .../com/sunyard/sge/database/SydApiSM3.java | 52 ++++++ .../com/sunyard/sge/database/SydApiSM4.java | 89 +++++++++++ .../com/sunyard/sge/database/SydSM4Mac.java | 17 ++ 5 files changed, 257 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/sunyard/sge/database/SydApiSM3.java create mode 100644 src/main/java/com/sunyard/sge/database/SydApiSM4.java create mode 100644 src/main/java/com/sunyard/sge/database/SydSM4Mac.java diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index 017f5c0..a2b8231 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -14,23 +14,22 @@ public interface SydApi { /** * 设置全局日志相应的配置 * - *@param pcLogPath: 输入。日志存储路径 - *@param iLogLevel: 输入。日志级别设置 - * 0:不记录日志, - * 1:记录网络层错误日志, - * 2:记录接口错误日志及网络层错误日志, - * 3:记录正确日志及错误日志 - * + * @param pcLogPath: 输入。日志存储路径 + * @param iLogLevel: 输入。日志级别设置 + * 0:不记录日志, + * 1:记录网络层错误日志, + * 2:记录接口错误日志及网络层错误日志, + * 3:记录正确日志及错误日志 * @return 无 **/ static void SYD_SetLogConfig( String pcLogPath, int iLogLevel) { - if (pcLogPath==null||iLogLevel<0||iLogLevel>3){ - throw new IllegalArgumentException("地址不能为空且等级范围为0到3"); - } - Logger logger = LogFactory.createLogger(pcLogPath, iLogLevel); - SydApi4j.setLogger( logger ); + if (pcLogPath == null || iLogLevel < 0 || iLogLevel > 3) { + throw new IllegalArgumentException("地址不能为空且等级范围为0到3"); + } + Logger logger = LogFactory.createLogger(pcLogPath, iLogLevel); + SydApi4j.setLogger(logger); } /** @@ -102,14 +101,14 @@ public interface SydApi { * 长数据hash计算,对指定数据进行SM3 哈希处理。 * * @param pcData:输入。要加密的数据。 - * @param iPkgNum:输入。包序号:0 仅一包 pcHash为输出hash结果 - * 1 第一包 输出过程数据pcProcData - * 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据 - * 3 最后一包 pcHash为输出hash结果 + * @param iPkgNum:输入。包序号:0 仅一包 pcHash为输出hash结果 + * 1 第一包 输出过程数据pcProcData + * 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据 + * 3 最后一包 pcHash为输出hash结果 * @param pcProcData:输入。过程数据 (包序号为0或1时传入null,包序号为2或3时需要有值) - * @return LongDataReturn对象。属性如下: - * procData:过程数据 (包序号为1或2时有值)字符串格式 - * data:哈希值(固定长度32字节)转HEX 字符串格式 + * @return LongDataReturn对象。属性如下: + * procData:过程数据 (包序号为1或2时有值)字符串格式 + * data:哈希值(固定长度32字节)转HEX 字符串格式 */ LongDataReturn SYD_SM3_Hash_LongData( byte[] pcData, @@ -118,7 +117,6 @@ public interface SydApi { ); - /** * 短数据加解密 *

@@ -158,10 +156,9 @@ public interface SydApi { * 输入对指定的原始数据和公钥,通过 SM4 算法计算数据的散列值。 * * @param iKeyIndex:输入。会话密钥索引值 - * @param pcData: 输入。要加密的数据。(数据的长度第一包以及中间包时需为16的整数倍) + * @param pcData: 输入。要加密的数据。(数据的长度第一包以及中间包时需为16的整数倍) * @param iPkgNum:输入。包序号:0:仅一包,1:第一包,2:中间包,3:结束包 * @param iFlag:输入。加解密标识,0:表示ECB解密;1:表示ECB加密 - * * @return 输出数据; */ byte[] SYD_SM4_LongData( @@ -171,19 +168,25 @@ public interface SydApi { int iFlag ); + byte[] SYD_SM4_LongData2( + int iKeyIndex, + byte[] pcData, + int iPkgNum, + int iFlag + ); + /** - *批量数据MAC校验接口,对批量数据进行SM4 MAC计算。 + * 批量数据MAC校验接口,对批量数据进行SM4 MAC计算。 * * @param iKeyIndex:输入。计算mac所需要的密钥索引值数组 - * @param pcData: 输入。要做MAC的数据组 - * - * @return String[] 数组,长度等于 pcData List 的长度。 - * String[] 数组中的每个值为 mac值(固定长度16字节)的 HEX字符串。 + * @param pcData: 输入。要做MAC的数据组 + * @return String[] 数组,长度等于 pcData List 的长度。 + * String[] 数组中的每个值为 mac值(固定长度16字节)的 HEX字符串。 */ String[] SYD_SM4Mac_BatchData( - int[] iKeyIndex, - List pcData + int[] iKeyIndex, + List pcData ); @@ -191,16 +194,15 @@ public interface SydApi { * 对批量数据进行SM4 MAC校验。有一条数据失败则抛出异常。 * * @param iKeyIndex:输入。计算mac所需要的密钥索引值数组 - * @param pcData: 输入。 要做MAC的数据组 - * @param pcMac: 输入。输入的mac值数组组,每个 ma从(固定长度16字节)的HEX字符串。 - * + * @param pcData: 输入。 要做MAC的数据组 + * @param pcMac: 输入。输入的mac值数组组,每个 ma从(固定长度16字节)的HEX字符串。 * @return boolean[] 数组长度等于 pcData List 的长度。 - * boolean[] 数组中的每个值为对应索引 pcData 和 pcMac 的校验结果。 true表示校验成功,false 表示校验失败。 - * */ + * boolean[] 数组中的每个值为对应索引 pcData 和 pcMac 的校验结果。 true表示校验成功,false 表示校验失败。 + */ boolean[] SYD_SM4Mac_BatchData( - int[] iKeyIndex, - List pcData, - String[] pcMac + int[] iKeyIndex, + List pcData, + String[] pcMac ); @@ -209,19 +211,18 @@ public interface SydApi { * * @param iKeyIndex:输入。计算mac所需要的密钥索引值 * @param pcData:输入。要做MAC的数据 - * @param iPkgNum:输入。 包序号:0 仅一包 pcHash为输出hash结果 - * 1 第一包 输出过程数据pcProcData - * 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据 - * 3 最后一包 pcHash为输出hash结果 - * - * @return LongDataReturn 的对象, - * 属性 procData 过程数据 (包序号为1或2时有值)字符串, - * 属性 data 输出的mac值(固定长度16字节)HEX 字符串 - * */ + * @param iPkgNum:输入。 包序号:0 仅一包 pcHash为输出hash结果 + * 1 第一包 输出过程数据pcProcData + * 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据 + * 3 最后一包 pcHash为输出hash结果 + * @return LongDataReturn 的对象, + * 属性 procData 过程数据 (包序号为1或2时有值)字符串, + * 属性 data 输出的mac值(固定长度16字节)HEX 字符串 + */ LongDataReturn SYD_SM4Mac_LongData( - int iKeyIndex, + int iKeyIndex, byte[] pcData, - int iPkgNum, + int iPkgNum, String pcProcData ); @@ -229,40 +230,36 @@ public interface SydApi { /** * 长数据MAC数据校验接口,对长数据进行MAC SM4校验处理。 * - * * @param iKeyIndex:输入。计算mac所需要的密钥索引值 - * @param pcData: 输入。要做MAC的数据 - * @param iPkgNum: 输入。 包序号:0 仅一包 pcHash为输出hash结果 - * 1 第一包 输出过程数据pcProcData - * 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据 - * 3 最后一包 pcHash为输出hash结果 - * @param pcProcData:输入。过程数据 (包序号为1或2时有值) - * @param pcMac: 输入。输出的mac值(固定长度16字节) HEX 字符串 - * + * @param pcData: 输入。要做MAC的数据 + * @param iPkgNum: 输入。 包序号:0 仅一包 pcHash为输出hash结果 + * 1 第一包 输出过程数据pcProcData + * 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据 + * 3 最后一包 pcHash为输出hash结果 + * @param pcProcData:输入。过程数据 (包序号为1或2时有值) + * @param pcMac: 输入。输出的mac值(固定长度16字节) HEX 字符串 * @return LongDataReturn 的对象 - * 属性 procData 过程数据 (包序号为1或2时有值)字符串 - * 属性 data 输出的mac校验结果。Boolean 类型,true表示校验成功,false 表示校验失败。 - * */ - LongDataReturnSYD_SM4Mac_LongData( - int iKeyIndex, + * 属性 procData 过程数据 (包序号为1或2时有值)字符串 + * 属性 data 输出的mac校验结果。Boolean 类型,true表示校验成功,false 表示校验失败。 + */ + LongDataReturn SYD_SM4Mac_LongData( + int iKeyIndex, byte[] pcData, - int iPkgNum, + int iPkgNum, String pcProcData, - String pcMac + String pcMac ); - /** * 短数据MAC计算接口,对数据进行SM4 MAC计算 * * @param iKeyIndex:输入。计算mac所需要的密钥索引值 - * @param pcData: 输入。计算mac所需要的数据。 - * + * @param pcData: 输入。计算mac所需要的数据。 * @return mac值(固定长度16字节)转HEX 字符串格式 - * */ + */ String SYD_SM4Mac_ShortData( - int iKeyIndex, + int iKeyIndex, byte[] pcData ); @@ -271,14 +268,20 @@ public interface SydApi { * 短数据MAC验证接口,对数据进行SM4 MAC校验 * * @param iKeyIndex:输入,计算mac所需要的密钥索引值 - * @param pcData: 输入。计算mac所需要的数据。 - * @param pcMac: 输入。mac值(固定长度16字节)HEX字符串 - * + * @param pcData: 输入。计算mac所需要的数据。 + * @param pcMac: 输入。mac值(固定长度16字节)HEX字符串 * @return true表示校验成功,false 表示校验失败 - * */ + */ boolean SYD_SM4Mac_ShortData( - int iKeyIndex, + int iKeyIndex, byte[] pcData, String pcMac ); + + + public SydApiSM4 initSydApiSM4(int ende, int key); + + public SydApiSM3 initSydApiSM3(int ende, int key); + + public SydSM4Mac initSydSM4Mac(int ende, int key); } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index 7ddd17c..6f93b5a 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -766,4 +766,26 @@ public class SydApi4Database implements SydApi { return pcMac.equals(mac); } + + @Override + public SydApiSM4 initSydApiSM4(int ende, int key) { + + return new SydApiSM4(new SydApi4Database(),ende,key); + } + public SydApiSM3 initSydApiSM3(int ende, int key) { + + return new SydApiSM3(new SydApi4Database()); + } + public SydSM4Mac initSydSM4Mac(int ende, int key){ + + return new SydSM4Mac(new SydApi4Database()); + } + @Override + public byte[] SYD_SM4_LongData2(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { + SydApiSM4 sydApiSM4 = initSydApiSM4(1, pcData[0]); + byte[] update = sydApiSM4.update(iKeyIndex, pcData, iPkgNum, iFlag); + + return null; + + } } diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM3.java b/src/main/java/com/sunyard/sge/database/SydApiSM3.java new file mode 100644 index 0000000..1a60cb0 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/SydApiSM3.java @@ -0,0 +1,52 @@ +package com.sunyard.sge.database; + + + +import com.sunyard.SydApiException; + +import java.lang.reflect.Array; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SydApiSM3 { + private SydApi4Database api; + private boolean is_finished = false; + private String pcProcData; + + public SydApiSM3(SydApi4Database sydApi4Database) { + this.api = sydApi4Database; + } + public void update(byte[] pcData, int iPkgNum, String pcProcData) { + this.pcProcData = pcProcData; + if (is_finished){ + throw new SydApiException(0); + } + if (null == pcData||0 == pcData.length) { + pcData = new byte[0]; + } + if (pcData.length>4064){ + throw new IllegalArgumentException(); + } + if (null==pcProcData){ + LongDataReturn stringStringLongDataReturn = api.SYD_SM3_Hash_LongData(pcData, 1, null); + } + else { + LongDataReturn stringStringLongDataReturn = api.SYD_SM3_Hash_LongData(pcData, 2, pcProcData); + } + } + public LongDataReturn digest(){ + if (is_finished) { + throw new SydApiException(0); + } + this.is_finished = true; + if (null == pcProcData){ + return api.SYD_SM3_Hash_LongData(new byte[0], 0, null); + } + else { + return api.SYD_SM3_Hash_LongData(new byte[0], 3,pcProcData); + } + } +} + diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4.java b/src/main/java/com/sunyard/sge/database/SydApiSM4.java new file mode 100644 index 0000000..353afba --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/SydApiSM4.java @@ -0,0 +1,89 @@ +package com.sunyard.sge.database; + +import com.sunyard.sge.EntityCache; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SydApiSM4 { + + private SydApi4Database api; + // private phHandle + byte[] pcData; + int iDataLen; + String[] pcOutData; + //多余出的字节长度 + int piOutDataLen; + int key; + int endeFlag; + int ret = 0, i = 0; + int decloopnum = 0; + // int tmpdatalen = MAX_LIN * 8; + int alltmpdatalen = 0; + EntityCache entityCache = new EntityCache(); + int k = 0; + byte[] bytes = new byte[k]; + ByteBuffer byteBuffer; + + + + public SydApiSM4(SydApi4Database api, int key, int endeFlag) { + this.api = api; + this.key = key; + this.endeFlag = endeFlag; + } + + public byte[] update(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { + int plength = pcData.length; + byte[] pcDatas = pcData; + if (piOutDataLen == 0) { + if (iFlag == 1) { + if (plength < 16) { + int falg = piOutDataLen; + piOutDataLen += plength; + bytes = new byte[piOutDataLen]; + System.arraycopy(pcData,0,bytes,falg,pcData.length); + throw new IllegalArgumentException(); + } + int index = plength % 16; + int findex = plength - index; + if (index != 0) { + pcDatas = Arrays.copyOf(pcData, findex); + int falg = piOutDataLen; + piOutDataLen += plength-findex; + bytes = new byte[piOutDataLen]; + System.arraycopy(pcData,findex,bytes,falg,plength-findex); + } + byte[] bytes = api.SYD_SM4_LongData(iKeyIndex, pcDatas, iPkgNum, iFlag); + return bytes; + } else { + + } + + } else { + int combinationLength = piOutDataLen+ plength; + if (iFlag==1){ + if (combinationLength<16){ + piOutDataLen = piOutDataLen+combinationLength; + int falg = piOutDataLen; + bytes = new byte[piOutDataLen]; + + throw new IllegalArgumentException(); + } + } + } + + +// byte[] bytes = api.SYD_SM4_LongData(iKeyIndex, pcData, iPkgNum, iFlag); + + return null; + } + +// +// public finish(){ +// api.SYD_SM4_LongData(); +// } + +} diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java new file mode 100644 index 0000000..190342b --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java @@ -0,0 +1,17 @@ +package com.sunyard.sge.database; + +public class SydSM4Mac { + private SydApi4Database api; + + public SydSM4Mac(SydApi4Database api) { + this.api = api; + } + + public void update(int iKeyIndex, + byte[] pcData, + int iPkgNum, + String pcProcData) { + + } + +}