增加init/update/digest/finish长数据操作

This commit is contained in:
junj2.liang 2022-08-30 10:24:05 +08:00
parent 35cbb5f65d
commit 4070a7dcad
5 changed files with 257 additions and 74 deletions

View File

@ -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<String, String>对象属性如下
* procData过程数据 包序号为1或2时有值字符串格式
* data哈希值固定长度32字节转HEX 字符串格式
* @return LongDataReturn<String, String>对象属性如下
* procData过程数据 包序号为1或2时有值字符串格式
* data哈希值固定长度32字节转HEX 字符串格式
*/
LongDataReturn<String, String> SYD_SM3_Hash_LongData(
byte[] pcData,
@ -118,7 +117,6 @@ public interface SydApi {
);
/**
* 短数据加解密
* <p>
@ -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<byte[]> pcData
int[] iKeyIndex,
List<byte[]> 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<byte[]> pcData,
String[] pcMac
int[] iKeyIndex,
List<byte[]> 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<String, String> 的对象
* 属性 procData 过程数据 包序号为1或2时有值字符串
* 属性 data 输出的mac值固定长度16字节HEX 字符串
* */
* @param iPkgNum输入 包序号0 仅一包 pcHash为输出hash结果
* 1 第一包 输出过程数据pcProcData
* 2 中间包 pcProcData为输入上一包返回的过程数据输出本包返回的过程数据
* 3 最后一包 pcHash为输出hash结果
* @return LongDataReturn<String, String> 的对象
* 属性 procData 过程数据 包序号为1或2时有值字符串
* 属性 data 输出的mac值固定长度16字节HEX 字符串
*/
LongDataReturn<String, String> 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<String, Boolean> 的对象
* 属性 procData 过程数据 包序号为1或2时有值字符串
* 属性 data 输出的mac校验结果Boolean 类型true表示校验成功false 表示校验失败
* */
LongDataReturn<String, Boolean>SYD_SM4Mac_LongData(
int iKeyIndex,
* 属性 procData 过程数据 包序号为1或2时有值字符串
* 属性 data 输出的mac校验结果Boolean 类型true表示校验成功false 表示校验失败
*/
LongDataReturn<String, Boolean> 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);
}

View File

@ -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;
}
}

View File

@ -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<String, String> stringStringLongDataReturn = api.SYD_SM3_Hash_LongData(pcData, 1, null);
}
else {
LongDataReturn<String, String> stringStringLongDataReturn = api.SYD_SM3_Hash_LongData(pcData, 2, pcProcData);
}
}
public LongDataReturn<String, String> 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);
}
}
}

View File

@ -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();
// }
}

View File

@ -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) {
}
}