diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index b065dc9..5a54330 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -7923,6 +7923,70 @@ public class SydApi4j implements SydApi { } } + + /** + * 自动 4k 分包 + * @param keyType + * @param mode + * @param key + * @param msg + * @return MAC 值 + */ + public String genMAB(int mode, int keyType, String key, byte[] msg){ + final int blockSize = 4 * 1024; + if ( null == msg || msg.length == 0 ) { + throw new SydApiException("输入数据为空", 21); + } + + if( msg.length <= blockSize ) { + // 唯一包 + RetWrap retWrap = this.genMAB(0, keyType, 2, key, null, msg ); + return new String( (byte[]) retWrap.get("MAB") ); + } + + int loop = 0; + int tailLen = 0; + + loop = msg.length / blockSize; + tailLen = msg.length % blockSize; + if (tailLen > 0) { + loop++; + } + + // loop 至少是 2 + + // 分包数据 + byte[] data = null; + + // 首包 + // 必然有 + data = new byte[ blockSize ]; + System.arraycopy( msg, 0, data, 0 , data.length ); + RetWrap retWrap = this.genMAB(1, keyType, 2, key, null, data ); + byte[] iv = (byte[]) retWrap.get("MAB"); + + + // 中间包 + for ( int i = 0 ; i < (loop - 2); i++ ) { + data = new byte[ blockSize ]; + System.arraycopy( msg, (i + 1) * blockSize , data, 0 , data.length ); + retWrap = this.genMAB(2, keyType, 2, key, iv, data ); + iv = (byte[]) retWrap.get("MAB"); + } + + + // 尾包 + // 必然有 + if( 0 == tailLen ) { + // 恰好是分包整倍数 + tailLen = blockSize; + } + data = new byte[ tailLen ]; + System.arraycopy( msg, (loop - 1) * blockSize , data, 0 , data.length ); + retWrap = this.genMAB(3, keyType, 2, key, iv , data); + return new String( (byte[]) retWrap.get("MAB") ); + } + /** * 8.3用对大消息生成MAC(MAB)(*) -> pass *