diff --git a/SM2-MFMM-(2).md b/SM2-MFMM-(2).md index d18fd87..cc175be 100644 --- a/SM2-MFMM-(2).md +++ b/SM2-MFMM-(2).md @@ -563,3 +563,56 @@ $T_2=T_1 \ast O=Y \ast O= Y \ast 2^{256}-(Y \ast 2^{32}) \ast 2^{192} - Y \ast 2 $T_3=T + T_2=t_4 \ast 2^{256} + t_3 \ast 2^{192} + t_2 \ast 2^{128} + t_1 \ast 2^{64} + t_0 + Y \ast 2^{256}-(Y \ast 2^{32}) \ast 2^{192} - Y \ast 2^{128} + (Y \ast O_1) \ast 2^{64} + (Y \ast O_0) $ $T_3=(t_4+Y) \ast 2^{256}+(t_3 - Y \ast 2^{32}) \ast 2^{192} + (t_2 - Y) \ast 2^{128} + (t_1 + Y \ast O_1) \ast 2^{64} + (t_0 + Y \ast O_0) $ + +先处理加法,后处理减法,后五个加法是带进位加法 +$t_0=t_0 + Y \ast O_0$ +$t_1=t_1 + Y \ast O_1$ +$t_2=t_2 + 0$ +$t_3=t_3 + 0$ +$t_4=t_4 + t_0$ +$t_5=0 + 0$ + +接着处理减法,假定a0是 $Y \ast 2^{32}$ 的低64位,a1是 $Y \ast 2^{32}$ 的高64位。后四个减法是带借位减法: +$t_2=t_2 - Y$ +$t_3=t_3 - a_0$ +$t_4=t_4 - a_1$ +$t_5=t_5 - 0$ + +伪代码: +```asm + // First reduction step + MOVQ acc0, AX + MULQ p256ordK0<>(SB) + MOVQ AX, t0 + + MOVQ p256ord<>+0x00(SB), AX + MULQ t0 + ADDQ AX, acc0 + ADCQ $0, DX + MOVQ DX, BX + + MOVQ p256ord<>+0x08(SB), AX + MULQ t0 + ADDQ BX, acc1 + ADCQ $0, DX + ADDQ AX, acc1 + ADCQ DX, acc2 + ADCQ $0, acc3 + ADCQ t0, acc4 + ADCQ $0, acc5 + + MOVQ t0, AX + MOVQ t0, DX + SHLQ $32, AX + SHRQ $32, DX + + SUBQ t0, acc2 + SBBQ AX, acc3 + SBBQ DX, acc4 + SBBQ $0, acc5 +``` +乘法: 3 +移位:2 +加法:9 +减法:4 +