Function core::arch::riscv32::sm4ed

source ·
pub fn sm4ed<const BS: u8>(x: u32, a: u32) -> u32
🔬This is a nightly-only experimental API. (stdsimd #48556)
Available on RISC-V RV32 and target feature zksed only.
Expand description

加速 SM4 分组密码算法中的舍入函数 F

该指令包含在扩展 Zksed 中。它被定义为:

SM4ED(x, a, BS) = x ⊕ T(ai)
... where
ai = a.bytes[BS]
T(ai) = L(τ(ai))
bi = τ(ai) = SM4-S-Box(ai)
ci = L(bi) = bi ⊕ (bi ≪ 2) ⊕ (bi ≪ 10) ⊕ (bi ≪ 18) ⊕ (bi ≪ 24)
SM4ED = (ci ≪ (BS * 8)) ⊕ x

其中 表示 32 位异或,≪ k 表示左移 k 位。 如上所述,T 是非线性 S-Box 转换 τ 和线性层转换 L 的组合转换。

在 SM4 算法中,舍入函数 F 定义为:

F(x0, x1, x2, x3, rk) = x0 ⊕ T(x1 ⊕ x2 ⊕ x3 ⊕ rk)
... where
T(A) = L(τ(A))
B = τ(A) = (SM4-S-Box(a0), SM4-S-Box(a1), SM4-S-Box(a2), SM4-S-Box(a3))
C = L(B) = B ⊕ (B ≪ 2) ⊕ (B ≪ 10) ⊕ (B ≪ 18) ⊕ (B ≪ 24)

它可以通过 sm4ed 指令来实现,例如:

let a = x1 ^ x2 ^ x3 ^ rk;
let c0 = sm4ed::<0>(x0, a);
let c1 = sm4ed::<1>(c0, a); // c1 代表 c[0..=1],等。
let c2 = sm4ed::<2>(c1, a);
let c3 = sm4ed::<3>(c2, a);
return c3; // c3 代表 c[0..=3]
Run

根据 RISC-V Cryptography Extensions, Volume I,该指令的执行延迟必须始终独立于它所操作的数据。