diff --git a/x86_64/serpent-decrypt.asm b/x86_64/serpent-decrypt.asm index 6836c7bec6fd4dbc2cf6859f5cd59be641fa5258..8cf914187d1338bcfb5f0421d2e2f58ecff090be 100644 --- a/x86_64/serpent-decrypt.asm +++ b/x86_64/serpent-decrypt.asm @@ -75,7 +75,7 @@ define(<SBOX0I>, < or $7, $1 xor $6, $1 mov $7, $2 - xor $1, $2 + and $1, $2 not $7 or $7, $4 xor $3, $4 @@ -88,7 +88,7 @@ define(<SBOX0I>, < define(<SBOX1I>, < mov $2, $6 or $4, $6 - xor $6, $3 + xor $3, $6 mov $1, $8 xor $2, $8 mov $1, $5 @@ -245,7 +245,7 @@ define(<SBOX7I>, < or $8, $7 mov $1, $6 or $4, $6 - and $4, $6 + and $3, $6 xor $6, $7 or $3, $8 mov $1, $5 @@ -310,7 +310,76 @@ PROLOGUE(nettle_serpent_decrypt) movl 8(SRC, N), x2 movl 12(SRC, N), x3 - + xor 512(CTX), x0 + xor 516(CTX), x1 + xor 520(CTX), x2 + xor 524(CTX), x3 + + mov $384, CNT + jmp .Lround_start + + ALIGN(4) +.Lround_loop: + LTI(x0,x1,x2,x3) +.Lround_start: + SBOX7I(x0,x1,x2,x3, y0,y1,y2,y3) + xor 112(CTX, CNT), y0 + xor 116(CTX, CNT), y1 + xor 120(CTX, CNT), y2 + xor 124(CTX, CNT), y3 + + LTI(y0,y1,y2,y3) + SBOX6I(y0,y1,y2,y3, x0,x1,x2,x3) + xor 96(CTX, CNT), x0 + xor 100(CTX, CNT), x1 + xor 104(CTX, CNT), x2 + xor 108(CTX, CNT), x3 + + LTI(x0,x1,x2,x3) + SBOX5I(x0,x1,x2,x3, y0,y1,y2,y3) + xor 80(CTX, CNT), y0 + xor 84(CTX, CNT), y1 + xor 88(CTX, CNT), y2 + xor 92(CTX, CNT), y3 + + LTI(y0,y1,y2,y3) + SBOX4I(y0,y1,y2,y3, x0,x1,x2,x3) + xor 64(CTX, CNT), x0 + xor 68(CTX, CNT), x1 + xor 72(CTX, CNT), x2 + xor 76(CTX, CNT), x3 + + LTI(x0,x1,x2,x3) + SBOX3I(x0,x1,x2,x3, y0,y1,y2,y3) + xor 48(CTX, CNT), y0 + xor 52(CTX, CNT), y1 + xor 56(CTX, CNT), y2 + xor 60(CTX, CNT), y3 + + LTI(y0,y1,y2,y3) + SBOX2I(y0,y1,y2,y3, x0,x1,x2,x3) + xor 32(CTX, CNT), x0 + xor 36(CTX, CNT), x1 + xor 40(CTX, CNT), x2 + xor 44(CTX, CNT), x3 + + C FIXME: Goes wrong in this round. + LTI(x0,x1,x2,x3) + SBOX1I(x0,x1,x2,x3, y0,y1,y2,y3) + xor 16(CTX, CNT), y0 + xor 20(CTX, CNT), y1 + xor 24(CTX, CNT), y2 + xor 28(CTX, CNT), y3 + + LTI(y0,y1,y2,y3) + SBOX0I(y0,y1,y2,y3, x0,x1,x2,x3) + xor (CTX, CNT), x0 + xor 4(CTX, CNT), x1 + xor 8(CTX, CNT), x2 + xor 12(CTX, CNT), x3 + sub $128, CNT + jnc .Lround_loop + movl x0, (DST, N) movl x1, 4(DST, N) movl x2, 8(DST, N)