临时存储
This commit is contained in:
@@ -20,7 +20,7 @@ import static com.cscn.Zuc256Util.xor32;
|
||||
/**
|
||||
* ZUC-256 核心:状态初始化、密钥字生成、密钥流生成。
|
||||
*/
|
||||
public final class Zuc256Core {
|
||||
public class Zuc256Core {
|
||||
|
||||
private Zuc256Core() {}
|
||||
|
||||
@@ -42,21 +42,21 @@ public final class Zuc256Core {
|
||||
short[] LFSR_lo = state.LFSR_lo;
|
||||
|
||||
// 工作寄存器(32位值的临时 out32 缓冲,全用short[2])[lo, hi]
|
||||
short[] X0 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X3 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X0 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] X1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] X2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] X3 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
|
||||
short[] R1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] R2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] W1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] W2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] U = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] V = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] Z = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] TMP0 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] TMP1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] TMP2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] R1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] R2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] W1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] W2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] U = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] V = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] Z = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] TMP0 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] TMP1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] TMP2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
|
||||
// 载入 R1,R2
|
||||
R1[0] = state.R1_lo;
|
||||
@@ -66,22 +66,21 @@ public final class Zuc256Core {
|
||||
|
||||
|
||||
// BitReconstruction4
|
||||
// X0 = ((L15 & 0x7FFF8000) << 1) | (L14 & 0xFFFF)
|
||||
short c15 = (short)((LFSR_lo[15] & 0x8000) >>> 15); // 左移产生的进位
|
||||
X0[1] = (short)(((LFSR_hi[15] & 0x7FFF) << 1) | c15); // hi
|
||||
short c15 = (short)((LFSR_lo[15] & (short)0x8000) >>> 15); // 左移产生的进位
|
||||
X0[1] = (short)(((LFSR_hi[15] & (short)0x7FFF) << 1) | c15); // hi
|
||||
X0[0] = LFSR_lo[14]; // lo
|
||||
|
||||
// X1 = ((L11 & 0xFFFF) << 16) | (L9 >>> 15)
|
||||
X1[1] = LFSR_lo[11];
|
||||
X1[0] = (short)(((LFSR_lo[9] & 0x8000) >>> 15) | (LFSR_hi[9] << 1));
|
||||
X1[0] = (short)(((LFSR_lo[9] & (short)0x8000) >>> 15) | (LFSR_hi[9] << 1));
|
||||
|
||||
// X2 = ((L7 & 0xFFFF) << 16) | (L5 >>> 15)
|
||||
X2[1] = LFSR_lo[7];
|
||||
X2[0] = (short)(((LFSR_lo[5] & 0x8000) >>> 15) | (LFSR_hi[5] << 1));
|
||||
X2[0] = (short)(((LFSR_lo[5] & (short)0x8000) >>> 15) | (LFSR_hi[5] << 1));
|
||||
|
||||
// X3 = ((L2 & 0xFFFF) << 16) | (L0 >>> 15)
|
||||
X3[1] = LFSR_lo[2];
|
||||
X3[0] = (short)(((LFSR_lo[0] & 0x8000) >>> 15) | (LFSR_hi[0] << 1));
|
||||
X3[0] = (short)(((LFSR_lo[0] & (short)0x8000) >>> 15) | (LFSR_hi[0] << 1));
|
||||
|
||||
|
||||
|
||||
@@ -249,7 +248,7 @@ public final class Zuc256Core {
|
||||
short[] keystream_hi,
|
||||
short[] keystream_lo) {
|
||||
// 临时存放一个 32 位关键字
|
||||
short[] tmp = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] tmp = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
for (short i = 0; i < nwords; i++) {
|
||||
// 生成一个关键字 -> tmp[0]=lo, tmp[1]=hi
|
||||
zuc256GenerateKeyword(state, tmp);
|
||||
@@ -264,20 +263,20 @@ public final class Zuc256Core {
|
||||
|
||||
// 初始化MAC密钥
|
||||
private static void zuc256SetMacKey(Zuc256State state, byte[] K, byte[] IV, short macbits) {
|
||||
short[] D = JCSystem.makeTransientShortArray(Zuc256Tables.D_COLS, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] TMP = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X0 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] X2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] R1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] R2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] W = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] W1 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] W2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] U = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] V = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] T = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] T2 = JCSystem.makeTransientShortArray((short)2, JCSystem.CLEAR_ON_DESELECT);
|
||||
short[] D = JCSystem.makeTransientShortArray(Zuc256Tables.D_COLS, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] TMP = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] X0 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] X1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] X2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] R1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] R2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] W = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] W1 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] W2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] U = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] V = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] T = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
short[] T2 = JCSystem.makeTransientShortArray((short)2, JCSystem.MEMORY_TYPE_TRANSIENT_RESET);
|
||||
|
||||
|
||||
// int IV17 = (IV[17] & 0xFF) >> 2;
|
||||
@@ -376,19 +375,19 @@ public final class Zuc256Core {
|
||||
// BitReconstruction3
|
||||
// X0 = ((LFSR[15] & 0x7FFF8000) << 1) | (LFSR[14] & 0xFFFF);
|
||||
// X0 = ((L15 & 0x7FFF8000)<<1) | (L14 & 0xFFFF)
|
||||
short c15 = (short)((state.LFSR_lo[15] & 0x8000) >>> 15);
|
||||
X0[1] = (short)(((state.LFSR_hi[15] & 0x7FFF) << 1) | c15);
|
||||
short c15 = (short)((state.LFSR_lo[15] & (short)0x8000) >>> 15);
|
||||
X0[1] = (short)(((state.LFSR_hi[15] & (short)0x7FFF) << 1) | c15);
|
||||
X0[0] = state.LFSR_lo[14];
|
||||
|
||||
// X1 = ((LFSR[11] & 0xFFFF) << 16) | (LFSR[9] >>> 15);
|
||||
// X1 = ((L11 & 0xFFFF)<<16) | (L9>>>15)
|
||||
X1[1] = state.LFSR_lo[11];
|
||||
X1[0] = (short)(((state.LFSR_lo[9] & 0x8000) >>> 15) | (state.LFSR_hi[9] << 1));
|
||||
X1[0] = (short)(((state.LFSR_lo[9] & (short)0x8000) >>> 15) | (state.LFSR_hi[9] << 1));
|
||||
|
||||
// X2 = ((LFSR[7] & 0xFFFF) << 16) | (LFSR[5] >>> 15);
|
||||
// X2 = ((L7 & 0xFFFF)<<16) | (L5>>>15)
|
||||
X2[1] = state.LFSR_lo[7];
|
||||
X2[0] = (short)(((state.LFSR_lo[5] & 0x8000) >>> 15) | (state.LFSR_hi[5] << 1));
|
||||
X2[0] = (short)(((state.LFSR_lo[5] & (short)0x8000) >>> 15) | (state.LFSR_hi[5] << 1));
|
||||
|
||||
|
||||
|
||||
@@ -481,11 +480,11 @@ public final class Zuc256Core {
|
||||
// BitReconstruction2
|
||||
// X1 = ((LFSR[11] & 0xFFFF) << 16) | (LFSR[9] >>> 15);
|
||||
X1[1] = state.LFSR_lo[11];
|
||||
X1[0] = (short)(((state.LFSR_lo[9] & 0x8000) >>> 15) | (state.LFSR_hi[9] << 1));
|
||||
X1[0] = (short)(((state.LFSR_lo[9] & (short)0x8000) >>> 15) | (state.LFSR_hi[9] << 1));
|
||||
|
||||
// X2 = ((LFSR[7] & 0xFFFF) << 16) | (LFSR[5] >>> 15);
|
||||
X2[1] = state.LFSR_lo[7];
|
||||
X2[0] = (short)(((state.LFSR_lo[5] & 0x8000) >>> 15) | (state.LFSR_hi[5] << 1));
|
||||
X2[0] = (short)(((state.LFSR_lo[5] & (short)0x8000) >>> 15) | (state.LFSR_hi[5] << 1));
|
||||
|
||||
// F_(X1, X2)
|
||||
// W1 = R1 + X1;
|
||||
|
||||
@@ -6,6 +6,7 @@ package com.cscn;
|
||||
public final class Zuc256MacCtx {
|
||||
// LFSR: 原本 int[16],拆成 hi/lo 各 16 short
|
||||
short[] LFSR_hi = new short[16];
|
||||
//todo -> ram
|
||||
short[] LFSR_lo = new short[16];
|
||||
|
||||
// R1、R2: 原本 int,拆成 hi/lo
|
||||
|
||||
@@ -363,23 +363,28 @@ public final class Zuc256Util {
|
||||
*/
|
||||
static short add32_with_carry(short a_lo, short a_hi,
|
||||
short b_lo, short b_hi,
|
||||
short[] out /*len=2*/) {
|
||||
// 用你现成的 add32 得到结果
|
||||
add32(a_lo, a_hi, b_lo, b_hi, out);
|
||||
short[] out /* len=2 */) {
|
||||
// 低 16 位相加
|
||||
short lo = (short)(a_lo + b_lo);
|
||||
// 判断低 16 位是否溢出
|
||||
short carry_lo = (short)(((a_lo & 0xFFFF) + (b_lo & 0xFFFF)) >>> 16);
|
||||
|
||||
// 进位判断:如果结果 < 其中一个加数,则说明溢出
|
||||
// (因为 add32 是 mod 2^32 的)
|
||||
// 我们只看 hi 部分即可
|
||||
int sum_hi = (out[1] & 0xFFFF);
|
||||
int a_hi_u = (a_hi & 0xFFFF);
|
||||
int b_hi_u = (b_hi & 0xFFFF);
|
||||
// 高 16 位相加 + 低位进位
|
||||
short hi_tmp = (short)(a_hi + b_hi);
|
||||
short carry_hi1 = (short)(((a_hi & 0xFFFF) + (b_hi & 0xFFFF)) >>> 16);
|
||||
|
||||
if (sum_hi < a_hi_u || sum_hi < b_hi_u) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
short hi = (short)(hi_tmp + carry_lo);
|
||||
short carry_hi2 = (short)(((hi_tmp & 0xFFFF) + (carry_lo & 0xFFFF)) >>> 16);
|
||||
|
||||
// 输出结果
|
||||
out[0] = lo;
|
||||
out[1] = hi;
|
||||
|
||||
// 最终进位 = 高位相加本身的进位 + 高位再加低位进位的进位
|
||||
return (short)((carry_hi1 + carry_hi2) & 0x1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 64位加法: a4 + b4 -> a4
|
||||
* 输入输出: short[4],低到高 (a[0]=lo16, a[1]=hi16, a[2]=lo16 of high dword, a[3]=hi16 of high dword)
|
||||
|
||||
Reference in New Issue
Block a user