package com.sunyard; import com.sunyard.proto.Util; import com.sunyard.trans.Alg; import com.sunyard.trans.FullMode; import com.sunyard.trans.RoundMode; import racal.sunyard.main.SydApi4j; public class SYMEnDeLongData { private SydApi4j api; private String sykey = ""; private String keyValue = ""; private int keyType = 0; private int inType = 0; private int outType = 0; private byte[] iv = new byte[0]; private Alg alg = null; private RoundMode roundMode=null; private FullMode fullMode=null; private byte[] data=null; //private byte[] data=new byte[0]; private boolean isFirst = true; private boolean isFinal = false; private boolean isEn = true; public RoundMode getRoundMode() { return roundMode; } public SYMEnDeLongData setRoundMode(RoundMode roundMode) { this.roundMode = roundMode; return this; } public FullMode getFullMode() { return fullMode; } public SYMEnDeLongData setFullMode(FullMode fullMode) { this.fullMode = fullMode; return this; } public byte[] getIv() { return iv; } public SYMEnDeLongData setIv(byte[] iv) { this.iv = iv; return this; } public Alg getAlg() { return alg; } public void setAlg(Alg alg) { this.alg = alg; } public int getKeyType() { return keyType; } public SYMEnDeLongData setKeyType(int keyType) { this.keyType = keyType; return this; } public int getInType() { return inType; } public SYMEnDeLongData setInType(int inType) { this.inType = inType; return this; } public int getOutType() { return outType; } public SYMEnDeLongData setOutType(int outType) { this.outType = outType; return this; } public SYMEnDeLongData(SydApi4j api, Alg alg, RoundMode roundMode, FullMode fullMode) { this.api = api; this.alg=alg; this.roundMode=roundMode; this.fullMode=fullMode; } public String getKey() { return sykey; } public SYMEnDeLongData setKey(String sykey) { this.sykey = sykey; return this; } public String getKeyValue() { return keyValue; } public SYMEnDeLongData setKeyValue(String keyValue) { this.keyValue = keyValue; return this; } public SYMEnDeLongData en(){ this.isEn = true; return this; } public SYMEnDeLongData de(){ this.isEn = false; return this; } public byte[] update(byte[] data){ if ( isFinal ){ throw new SydApiException("此时已经不能再更新",370000); } if ( this.isEn ){ // this.data = this.api.SYMEncryptData(this.key,this.keyValue,this.alg,this.roundMode,this.fullMode,this.isFirst ? 1 : 2 , data); // System.out.println("块号block:"+(this.isFirst ? 1 : 2)); RetWrap en = this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, data, this.iv, this.isFirst ? 1 : 2); this.data = (byte[]) en.get("msg_all"); this.iv = (byte[]) en.get("iv"); // System.out.println("下一IV长度:"+this.iv.length); // System.out.println("iv---"+ Util.bytes2HexString(this.iv)); } else { RetWrap de = this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, data, this.iv, this.isFirst ? 1 : 2); this.data = (byte[]) de.get("msg_all"); this.iv = (byte[]) de.get("iv"); } this.isFirst = false; return this.data; } public byte[] calc(byte[] lastData ){ return calc( lastData, lastData.length ); } public byte[] calc(byte[] lastData, int len ) { if ( isFinal ){ throw new SydApiException("此时已经不能再计算",370000); } byte[] last = null; if( len < 0 ){ len = 0; } if ( 0 == lastData.length ){ last = new byte[0]; } else if ( lastData.length == len ){ last = lastData; } else { last = new byte[len]; System.arraycopy( lastData, 0, last, 0, len ); } this.isFinal = true; int block = 3; if ( null == this.data ){ block = 0; } if (last.length>0){ if ( this.isEn ){ // System.out.println("block:"+block); this.data = (byte[]) this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, last, this.iv, block).get("msg_all"); } else { // System.out.println("block:"+block); this.data = (byte[]) this.api.SM4EncDecDataCBC(this.isEn, this.keyType, this.keyValue, this.inType, this.outType, last, this.iv, block).get("msg_all"); } } return this.data; } }