三类模式写
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
package com.sunyard.sge.database;
|
||||
|
||||
import com.sunyard.SydApiException;
|
||||
import com.sunyard.sge.bytes.BytesQueue;
|
||||
|
||||
|
||||
public class SydSM4 {
|
||||
|
||||
private SydApi api;
|
||||
private int iKeyIndex;
|
||||
private byte[] pcdataResult = new byte[0];
|
||||
private int iPkgNum = 1;
|
||||
private int iFlag;
|
||||
private boolean is_finished = false;
|
||||
private byte[] dataResult = new byte[0];
|
||||
private BytesQueue queue = new BytesQueue();
|
||||
|
||||
|
||||
public SydSM4(SydApi api, int iKeyIndex, int endeFlag) {
|
||||
this.api = api;
|
||||
this.iFlag = endeFlag;
|
||||
this.iKeyIndex = iKeyIndex;
|
||||
}
|
||||
|
||||
public byte[] update(byte[] pcData) {
|
||||
this.pcdataResult = pcData;
|
||||
// this.dataResult = pcData;
|
||||
if (null == pcData || pcData.length == 0) {
|
||||
return new byte[0];
|
||||
}
|
||||
int plength = pcData.length;
|
||||
if (is_finished) {
|
||||
throw new SydApiException(0);
|
||||
}
|
||||
if (plength > 4064) {
|
||||
throw new SydApiException(0);
|
||||
}
|
||||
if (iFlag == 1) {
|
||||
if (0 == queue.getLength()) {
|
||||
//加密
|
||||
if (plength < 16) {
|
||||
queue.push(pcData);
|
||||
byte[] pop = queue.pop(16, 0);
|
||||
pcdataResult = pop;
|
||||
return new byte[0];
|
||||
}
|
||||
if (plength % 16 != 0) {
|
||||
queue.push(pcData);
|
||||
byte[] pop = queue.pop(16, 0);
|
||||
pcdataResult = pop;
|
||||
}
|
||||
byte[] bytes = api.SYD_SM4_LongData(iKeyIndex, pcdataResult, iPkgNum, iFlag);
|
||||
iPkgNum = 2;
|
||||
return bytes;
|
||||
|
||||
} else {
|
||||
if (16 > (pcData.length + queue.getLength())) {
|
||||
queue.push(pcData);
|
||||
return new byte[0];
|
||||
}
|
||||
queue.push(pcData);
|
||||
byte[] pop = queue.pop(16, 0);
|
||||
byte[] bytes2 = api.SYD_SM4_LongData(iKeyIndex, pop, iPkgNum, iFlag);
|
||||
iPkgNum = 2;
|
||||
return bytes2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (null == queue || null == pcData) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
queue.push(pcData);
|
||||
if ((queue.getLength()) / 16 < 2) {
|
||||
return new byte[0];
|
||||
}
|
||||
byte[] pop = queue.pop(16, 16);
|
||||
byte[] bytes2 = api.SYD_SM4_LongData(iKeyIndex, pop, iPkgNum, iFlag);
|
||||
|
||||
iPkgNum = 2;
|
||||
return bytes2;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public byte[] finish() {
|
||||
if (is_finished) {
|
||||
throw new SydApiException(0);
|
||||
}
|
||||
this.is_finished = true;
|
||||
if (1 == this.iPkgNum) {
|
||||
this.iPkgNum = 0;
|
||||
} else if (2 == this.iPkgNum) {
|
||||
this.iPkgNum = 3;
|
||||
}
|
||||
|
||||
|
||||
byte[] pop = queue.pop();
|
||||
byte[] bytes = api.SYD_SM4_LongData(iKeyIndex, pop, iPkgNum, iFlag);
|
||||
queue = null;
|
||||
return bytes;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user